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

1""" 

2A more liberal autolinker 

3 

4Inspired by Django's urlize function. 

5 

6Positive examples: 

7 

8>>> import markdown 

9>>> md = markdown.Markdown(extensions=['urlize']) 

10 

11>>> md.convert('http://example.com/') 

12u'<p><a href="http://example.com/">http://example.com/</a></p>' 

13 

14>>> md.convert('go to http://example.com') 

15u'<p>go to <a href="http://example.com">http://example.com</a></p>' 

16 

17>>> md.convert('example.com') 

18u'<p><a href="http://example.com">example.com</a></p>' 

19 

20>>> md.convert('example.net') 

21u'<p><a href="http://example.net">example.net</a></p>' 

22 

23>>> md.convert('www.example.us') 

24u'<p><a href="http://www.example.us">www.example.us</a></p>' 

25 

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>' 

28 

29>>> md.convert('go to <http://example.com> now!') 

30u'<p>go to <a href="http://example.com">http://example.com</a> now!</p>' 

31 

32Negative examples: 

33 

34>>> md.convert('del.icio.us') 

35u'<p>del.icio.us</p>' 

36 

37""" 

38from xml.etree.ElementTree import Element 

39 

40import markdown 

41 

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]) 

49 

50 

51class UrlizePattern(markdown.inlinepatterns.Pattern): 

52 """ Return a link Element given an autolink (`http://example/com`). """ 

53 

54 def handleMatch(self, m): 

55 url = m.group(2) 

56 

57 if url.startswith('<'): 

58 url = url[1:-1] 

59 

60 text = url 

61 

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 

67 

68 el = Element("a") 

69 el.set('href', url) 

70 el.text = markdown.util.AtomicString(text) 

71 return el 

72 

73 

74class UrlizeExtension(markdown.Extension): 

75 """ Urlize Extension for Python-Markdown. """ 

76 

77 def extendMarkdown(self, md): 

78 """ Replace autolink with UrlizePattern """ 

79 md.inlinePatterns.register(UrlizePattern(URLIZE_RE, md), 'autolink', 120) 

80 

81 

82def makeExtension(*args, **kwargs): 

83 return UrlizeExtension(*args, **kwargs) 

84 

85 

86if __name__ == "__main__": 

87 import doctest 

88 

89 doctest.testmod()