[3/4] Reintroduce backwards-compatible hyperlink syntax

Message ID 20170423165302.25025-4-lfleischer@archlinux.org
State Accepted, archived
Headers show
Series
  • Add Markdown syntax to comments
Related show

Commit Message

Lukas Fleischer April 23, 2017, 4:53 p.m. UTC
Before switching to the new comment rendering script and Markdown, no
special syntax was needed to make URLs clickable. Reintroduce this
feature and automatically detect links in addition to the hyperlink
syntax already supported by Markdown.

Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
---
 aurweb/scripts/rendercomment.py | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Patch

diff --git a/aurweb/scripts/rendercomment.py b/aurweb/scripts/rendercomment.py
index 7e8a16b..c8921f8 100755
--- a/aurweb/scripts/rendercomment.py
+++ b/aurweb/scripts/rendercomment.py
@@ -1,5 +1,6 @@ 
 #!/usr/bin/python3
 
+import re
 import sys
 import bleach
 import markdown
@@ -7,6 +8,19 @@  import markdown
 import aurweb.db
 
 
+class LinkifyPreprocessor(markdown.preprocessors.Preprocessor):
+    _urlre = re.compile(r'(\b(?:https?|ftp):\/\/[\w\/\#~:.?+=&%@!\-;,]+?'
+                        r'(?=[.:?\-;,]*(?:[^\w\/\#~:.?+=&%@!\-;,]|$)))')
+
+    def run(self, lines):
+        return [self._urlre.sub(r'<\1>', line) for line in lines]
+
+
+class LinkifyExtension(markdown.extensions.Extension):
+    def extendMarkdown(self, md, md_globals):
+        md.preprocessors.add('linkify', LinkifyPreprocessor(md), '_end')
+
+
 def get_comment(conn, commentid):
     cur = conn.execute('SELECT Comments FROM PackageComments WHERE ID = ?',
                        [commentid])
@@ -24,7 +38,7 @@  def main():
     conn = aurweb.db.Connection()
 
     text = get_comment(conn, commentid)
-    html = markdown.markdown(text, extensions=['nl2br'])
+    html = markdown.markdown(text, extensions=['nl2br', LinkifyExtension()])
     allowed_tags = bleach.sanitizer.ALLOWED_TAGS + ['p', 'br']
     html = bleach.clean(html, tags=allowed_tags)
     save_rendered_comment(conn, commentid, html)