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):