]> git.openstreetmap.org Git - osqa.git/commitdiff
Adding autolinking functionality, using mdx_urlize markdown extension.
authorjordan <jordan@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Mon, 27 Dec 2010 21:54:14 +0000 (21:54 +0000)
committerjordan <jordan@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Mon, 27 Dec 2010 21:54:14 +0000 (21:54 +0000)
git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@635 0cfe37f9-358a-4d5e-be75-b63607b5c754

forum/markdownext/mdx_urlize.py [new file with mode: 0644]
forum/models/node.py

diff --git a/forum/markdownext/mdx_urlize.py b/forum/markdownext/mdx_urlize.py
new file mode 100644 (file)
index 0000000..071e6b2
--- /dev/null
@@ -0,0 +1,81 @@
+"""A more liberal autolinker
+
+Inspired by Django's urlize function.
+
+Positive examples:
+
+>>> import markdown
+>>> md = markdown.Markdown(extensions=['urlize'])
+
+>>> md.convert('http://example.com/')
+u'<p><a href="http://example.com/">http://example.com/</a></p>'
+
+>>> md.convert('go to http://example.com')
+u'<p>go to <a href="http://example.com">http://example.com</a></p>'
+
+>>> md.convert('example.com')
+u'<p><a href="http://example.com">example.com</a></p>'
+
+>>> md.convert('example.net')
+u'<p><a href="http://example.net">example.net</a></p>'
+
+>>> md.convert('www.example.us')
+u'<p><a href="http://www.example.us">www.example.us</a></p>'
+
+>>> md.convert('(www.example.us/path/?name=val)')
+u'<p>(<a href="http://www.example.us/path/?name=val">www.example.us/path/?name=val</a>)</p>'
+
+>>> md.convert('go to <http://example.com> now!')
+u'<p>go to <a href="http://example.com">http://example.com</a> now!</p>'
+
+Negative examples:
+
+>>> md.convert('del.icio.us')
+u'<p>del.icio.us</p>'
+
+"""
+
+import markdown
+
+# Global Vars
+URLIZE_RE = '(%s)' % '|'.join([
+    r'<(?:f|ht)tps?://[^>]*>',
+    r'\b(?:f|ht)tps?://[^)<>\s]+[^.,)<>\s]',
+    r'\bwww\.[^)<>\s]+[^.,)<>\s]',
+    r'[^(<\s]+\.(?:com|net|org)\b',
+])
+
+class UrlizePattern(markdown.inlinepatterns.Pattern):
+    """ Return a link Element given an autolink (`http://example/com`). """
+    def handleMatch(self, m):
+        url = m.group(2)
+        
+        if url.startswith('<'):
+            url = url[1:-1]
+            
+        text = url
+        
+        if not url.split('://')[0] in ('http','https','ftp'):
+            if '@' in url and not '/' in url:
+                url = 'mailto:' + url
+            else:
+                url = 'http://' + url
+    
+        el = markdown.etree.Element("a")
+        el.set('href', url)
+        el.text = markdown.AtomicString(text)
+        return el
+
+class UrlizeExtension(markdown.Extension):
+    """ Urlize Extension for Python-Markdown. """
+
+    def extendMarkdown(self, md, md_globals):
+        """ Replace autolink with UrlizePattern """
+        md.inlinePatterns['autolink'] = UrlizePattern(URLIZE_RE, md)
+
+def makeExtension(configs=None):
+    return UrlizeExtension(configs=configs)
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()
index 6a181659956e735158ccffd257c799841668852e..2c72e81a105fdb0d2304a94d77690d46af38c07d 100644 (file)
@@ -331,10 +331,10 @@ class Node(BaseModel, NodeContent):
     def create_revision(self, user, **kwargs):
         number = self.revisions.aggregate(last=models.Max('revision'))['last'] + 1
         revision = self._create_revision(user, number, **kwargs)
-        self.activate_revision(user, revision)
+        self.activate_revision(user, revision, extensions=['urlize'])
         return revision
 
-    def activate_revision(self, user, revision, *extensions):
+    def activate_revision(self, user, revision, extensions):
         self.title = revision.title
         self.tagnames = revision.tagnames
         self.body = self._as_markdown(revision.body, *extensions)