bgneal@356: """
bgneal@356: Taken from: https://github.com/r0wb0t/markdown-urlize
bgneal@356: 
bgneal@356: A more liberal autolinker
bgneal@356: 
bgneal@356: Inspired by Django's urlize function.
bgneal@356: 
bgneal@356: Positive examples:
bgneal@356: 
bgneal@356: >>> import markdown
bgneal@356: >>> md = markdown.Markdown(extensions=['urlize'])
bgneal@356: 
bgneal@356: >>> md.convert('http://example.com/')
bgneal@356: u'<p><a href="http://example.com/">http://example.com/</a></p>'
bgneal@356: 
bgneal@356: >>> md.convert('go to http://example.com')
bgneal@356: u'<p>go to <a href="http://example.com">http://example.com</a></p>'
bgneal@356: 
bgneal@356: >>> md.convert('example.com')
bgneal@356: u'<p><a href="http://example.com">example.com</a></p>'
bgneal@356: 
bgneal@356: >>> md.convert('example.net')
bgneal@356: u'<p><a href="http://example.net">example.net</a></p>'
bgneal@356: 
bgneal@356: >>> md.convert('www.example.us')
bgneal@356: u'<p><a href="http://www.example.us">www.example.us</a></p>'
bgneal@356: 
bgneal@356: >>> md.convert('(www.example.us/path/?name=val)')
bgneal@356: u'<p>(<a href="http://www.example.us/path/?name=val">www.example.us/path/?name=val</a>)</p>'
bgneal@356: 
bgneal@356: >>> md.convert('go to <http://example.com> now!')
bgneal@356: u'<p>go to <a href="http://example.com">http://example.com</a> now!</p>'
bgneal@356: 
bgneal@356: Negative examples:
bgneal@356: 
bgneal@356: >>> md.convert('del.icio.us')
bgneal@356: u'<p>del.icio.us</p>'
bgneal@356: 
bgneal@356: """
bgneal@356: 
bgneal@356: import markdown
bgneal@356: 
bgneal@356: # Global Vars
bgneal@356: URLIZE_RE = '(%s)' % '|'.join([
bgneal@356:     r'<(?:f|ht)tps?://[^>]*>',
bgneal@356:     r'\b(?:f|ht)tps?://[^)<>\s]+[^.,)<>\s]',
bgneal@356:     r'\bwww\.[^)<>\s]+[^.,)<>\s]',
bgneal@356:     r'[^(<\s]+\.(?:com|net|org)\b',
bgneal@356: ])
bgneal@356: 
bgneal@356: class UrlizePattern(markdown.inlinepatterns.Pattern):
bgneal@356:     """ Return a link Element given an autolink (`http://example/com`). """
bgneal@356:     def handleMatch(self, m):
bgneal@356:         url = m.group(2)
bgneal@356:         
bgneal@356:         if url.startswith('<'):
bgneal@356:             url = url[1:-1]
bgneal@356:             
bgneal@356:         text = url
bgneal@356:         
bgneal@356:         if not url.split('://')[0] in ('http','https','ftp'):
bgneal@356:             if '@' in url and not '/' in url:
bgneal@356:                 url = 'mailto:' + url
bgneal@356:             else:
bgneal@356:                 url = 'http://' + url
bgneal@356:     
bgneal@356:         el = markdown.etree.Element("a")
bgneal@356:         el.set('href', url)
bgneal@356:         el.text = markdown.AtomicString(text)
bgneal@356:         return el
bgneal@356: 
bgneal@356: class UrlizeExtension(markdown.Extension):
bgneal@356:     """ Urlize Extension for Python-Markdown. """
bgneal@356: 
bgneal@356:     def extendMarkdown(self, md, md_globals):
bgneal@356:         """ Replace autolink with UrlizePattern """
bgneal@356:         md.inlinePatterns['autolink'] = UrlizePattern(URLIZE_RE, md)
bgneal@356: 
bgneal@356: def makeExtension(configs=None):
bgneal@356:     return UrlizeExtension(configs=configs)
bgneal@356: 
bgneal@356: if __name__ == "__main__":
bgneal@356:     import doctest
bgneal@356:     doctest.testmod()