]> git.openstreetmap.org Git - osqa.git/blob - forum/markdownext/mdx_urlize.py
Adding autolinking functionality, using mdx_urlize markdown extension.
[osqa.git] / forum / markdownext / mdx_urlize.py
1 """A more liberal autolinker
2
3 Inspired by Django's urlize function.
4
5 Positive examples:
6
7 >>> import markdown
8 >>> md = markdown.Markdown(extensions=['urlize'])
9
10 >>> md.convert('http://example.com/')
11 u'<p><a href="http://example.com/">http://example.com/</a></p>'
12
13 >>> md.convert('go to http://example.com')
14 u'<p>go to <a href="http://example.com">http://example.com</a></p>'
15
16 >>> md.convert('example.com')
17 u'<p><a href="http://example.com">example.com</a></p>'
18
19 >>> md.convert('example.net')
20 u'<p><a href="http://example.net">example.net</a></p>'
21
22 >>> md.convert('www.example.us')
23 u'<p><a href="http://www.example.us">www.example.us</a></p>'
24
25 >>> md.convert('(www.example.us/path/?name=val)')
26 u'<p>(<a href="http://www.example.us/path/?name=val">www.example.us/path/?name=val</a>)</p>'
27
28 >>> md.convert('go to <http://example.com> now!')
29 u'<p>go to <a href="http://example.com">http://example.com</a> now!</p>'
30
31 Negative examples:
32
33 >>> md.convert('del.icio.us')
34 u'<p>del.icio.us</p>'
35
36 """
37
38 import markdown
39
40 # Global Vars
41 URLIZE_RE = '(%s)' % '|'.join([
42     r'<(?:f|ht)tps?://[^>]*>',
43     r'\b(?:f|ht)tps?://[^)<>\s]+[^.,)<>\s]',
44     r'\bwww\.[^)<>\s]+[^.,)<>\s]',
45     r'[^(<\s]+\.(?:com|net|org)\b',
46 ])
47
48 class UrlizePattern(markdown.inlinepatterns.Pattern):
49     """ Return a link Element given an autolink (`http://example/com`). """
50     def handleMatch(self, m):
51         url = m.group(2)
52         
53         if url.startswith('<'):
54             url = url[1:-1]
55             
56         text = url
57         
58         if not url.split('://')[0] in ('http','https','ftp'):
59             if '@' in url and not '/' in url:
60                 url = 'mailto:' + url
61             else:
62                 url = 'http://' + url
63     
64         el = markdown.etree.Element("a")
65         el.set('href', url)
66         el.text = markdown.AtomicString(text)
67         return el
68
69 class UrlizeExtension(markdown.Extension):
70     """ Urlize Extension for Python-Markdown. """
71
72     def extendMarkdown(self, md, md_globals):
73         """ Replace autolink with UrlizePattern """
74         md.inlinePatterns['autolink'] = UrlizePattern(URLIZE_RE, md)
75
76 def makeExtension(configs=None):
77     return UrlizeExtension(configs=configs)
78
79 if __name__ == "__main__":
80     import doctest
81     doctest.testmod()