You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2019/05/16 20:25:42 UTC
[allura] 01/02: [#8281] Added an makrdown extension for detecting
user mentions
This is an automated email from the ASF dual-hosted git repository.
brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git
commit d940160b42251bcb4e0c084644f79bea956dd92e
Author: Shalitha Suranga <sh...@gmail.com>
AuthorDate: Sun May 12 17:17:24 2019 +0530
[#8281] Added an makrdown extension for detecting user mentions
---
Allura/allura/lib/app_globals.py | 5 +++--
Allura/allura/lib/markdown_extensions.py | 30 ++++++++++++++++++++++++++++++
Allura/allura/tests/test_globals.py | 11 +++++++++++
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/Allura/allura/lib/app_globals.py b/Allura/allura/lib/app_globals.py
index 4b0a282..2a2581f 100644
--- a/Allura/allura/lib/app_globals.py
+++ b/Allura/allura/lib/app_globals.py
@@ -55,7 +55,8 @@ from allura import model as M
from allura.lib.markdown_extensions import (
ForgeExtension,
CommitMessageExtension,
- EmojiExtension
+ EmojiExtension,
+ UserMentionExtension
)
from allura.eventslistener import PostEvent
@@ -426,7 +427,7 @@ class Globals(object):
# 'fenced_code'
extensions=['fenced_code', 'codehilite',
ForgeExtension(
- **kwargs), EmojiExtension(), 'tables', 'toc', 'nl2br', 'markdown_checklist.extension'],
+ **kwargs), EmojiExtension(), UserMentionExtension(), 'tables', 'toc', 'nl2br', 'markdown_checklist.extension'],
output_format='html4')
@property
diff --git a/Allura/allura/lib/markdown_extensions.py b/Allura/allura/lib/markdown_extensions.py
index 09ff02a..5b6b27b 100644
--- a/Allura/allura/lib/markdown_extensions.py
+++ b/Allura/allura/lib/markdown_extensions.py
@@ -296,6 +296,36 @@ class EmojiInlinePattern(markdown.inlinepatterns.Pattern):
emoji_code = m.group(2)
return emoji.emojize(emoji_code, use_aliases=True)
+class UserMentionExtension(markdown.Extension):
+
+ UM_RE = r'(@(?![0-9]+$)(?!-)[a-z0-9-]{2,14}[a-z0-9])'
+
+ def __init__(self, **kwargs):
+ markdown.Extension.__init__(self)
+
+ def extendMarkdown(self, md, md_globals):
+ md.inlinePatterns["user_mentions"] = UserMentionInlinePattern(self.UM_RE)
+
+class UserMentionInlinePattern(markdown.inlinepatterns.Pattern):
+
+ def __init__(self, pattern):
+ markdown.inlinepatterns.Pattern.__init__(self, pattern)
+
+ def handleMatch(self, m):
+ user_name = m.group(2).replace("@", "")
+ user = M.User.by_username(user_name)
+ result = markdown.util.etree.Element('a')
+ result.text = "@%s" % user_name
+ classes = 'user-mention'
+
+ if user:
+ result.set('href', user.url())
+ else:
+ result.set('href', '#')
+ classes += ' notfound'
+
+ result.set('class', classes)
+ return result
class ForgeLinkPattern(markdown.inlinepatterns.LinkPattern):
diff --git a/Allura/allura/tests/test_globals.py b/Allura/allura/tests/test_globals.py
index b233479..a98ff04 100644
--- a/Allura/allura/tests/test_globals.py
+++ b/Allura/allura/tests/test_globals.py
@@ -782,6 +782,17 @@ class TestEmojis(unittest.TestCase):
output = g.markdown.convert(u'More emojis :+1::camel::three_o’clock: wow!')
assert u'More emojis \U0001F44D\U0001F42B\U0001F552 wow!' in output
+class TestUserMentions(unittest.TestCase):
+
+ def test_markdown_user_mention(self):
+ output = g.markdown.convert('@nouserthere')
+ assert 'class="user-mention notfound"' in output
+ u = M.User.register(dict(username='admin1'), make_project=True)
+ ThreadLocalORMSession.flush_all()
+ output = g.markdown.convert('@admin1')
+ assert 'class="user-mention"' in output
+ assert ('href="%s"' % u.url()) in output
+
class TestHandlePaging(unittest.TestCase):
def setUp(self):