Coverage for cookbook/helper/mdx_urlize.py: 40%
25 statements
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 01:02 +0100
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 01:02 +0100
1"""
2A more liberal autolinker
4Inspired by Django's urlize function.
6Positive examples:
8>>> import markdown
9>>> md = markdown.Markdown(extensions=['urlize'])
11>>> md.convert('http://example.com/')
12u'<p><a href="http://example.com/">http://example.com/</a></p>'
14>>> md.convert('go to http://example.com')
15u'<p>go to <a href="http://example.com">http://example.com</a></p>'
17>>> md.convert('example.com')
18u'<p><a href="http://example.com">example.com</a></p>'
20>>> md.convert('example.net')
21u'<p><a href="http://example.net">example.net</a></p>'
23>>> md.convert('www.example.us')
24u'<p><a href="http://www.example.us">www.example.us</a></p>'
26>>> md.convert('(www.example.us/path/?name=val)')
27u'<p>(<a href="http://www.example.us/path/?name=val">www.example.us/path/?name=val</a>)</p>'
29>>> md.convert('go to <http://example.com> now!')
30u'<p>go to <a href="http://example.com">http://example.com</a> now!</p>'
32Negative examples:
34>>> md.convert('del.icio.us')
35u'<p>del.icio.us</p>'
37"""
38from xml.etree.ElementTree import Element
40import markdown
42# Global Vars
43URLIZE_RE = '(%s)' % '|'.join([
44 r'<(?:f|ht)tps?://[^>]*>',
45 r'\b(?:f|ht)tps?://[^)<>\s]+[^.,)<>\s]',
46 r'\bwww\.[^)<>\s]+[^.,)<>\s]',
47 r'[^(<\s]+\.(?:com|net|org)\b',
48])
51class UrlizePattern(markdown.inlinepatterns.Pattern):
52 """ Return a link Element given an autolink (`http://example/com`). """
54 def handleMatch(self, m):
55 url = m.group(2)
57 if url.startswith('<'):
58 url = url[1:-1]
60 text = url
62 if not url.split('://')[0] in ('http', 'https', 'ftp'):
63 if '@' in url and '/' not in url:
64 url = 'mailto:' + url
65 else:
66 url = 'http://' + url
68 el = Element("a")
69 el.set('href', url)
70 el.text = markdown.util.AtomicString(text)
71 return el
74class UrlizeExtension(markdown.Extension):
75 """ Urlize Extension for Python-Markdown. """
77 def extendMarkdown(self, md):
78 """ Replace autolink with UrlizePattern """
79 md.inlinePatterns.register(UrlizePattern(URLIZE_RE, md), 'autolink', 120)
82def makeExtension(*args, **kwargs):
83 return UrlizeExtension(*args, **kwargs)
86if __name__ == "__main__":
87 import doctest
89 doctest.testmod()