]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/markdownext/mdx_auto_linker.py
Merge pull request #11 from udacity/make_faq_settings_translatable
[osqa.git] / forum / markdownext / mdx_auto_linker.py
index 9d77c38df68f0c15e4c78e3c12c7353d6b909d00..c1ec9aa5f29f8f82198b4380736615e572823875 100644 (file)
@@ -14,26 +14,28 @@ TLDS = ('gw', 'gu', 'gt', 'gs', 'gr', 'gq', 'gp', 'gy', 'gg', 'gf', 'ge', 'gd',
         'mu', 'mt', 'mw', 'mv', 'mq', 'ms', 'mr', 'im', 'ug', 'my', 'mx', 'il', 'pro', 'ac', 'sa', 'ae', 'ad', 'ag',
         'af', 'ai', 'vi', 'is', 'ir', 'am', 'al', 'ao', 'an', 'aq', 'as', 'ar', 'au', 'at', 'aw', 'in', 'ax', 'az',
         'ie', 'id', 'sr', 'nl', 'mil', 'no', 'na', 'travel', 'nc', 'ne', 'nf', 'ng', 'nz', 'dm', 'np',
-        'so', 'nr', 'nu', 'fr', 'io', 'ni', 'ye', 'sv', 'jsp', 'kz', 'fi', 'fj', 'php', 'fm', 'fo', 'tj', 'sz', 'sy',
+        'so', 'nr', 'nu', 'fr', 'io', 'ni', 'ye', 'sv', 'kz', 'fi', 'fj', 'fm', 'fo', 'tj', 'sz', 'sy',
         'mobi', 'kg', 'ke', 'doc', 'ki', 'kh', 'kn', 'km', 'st', 'sk', 'kr', 'si', 'kp', 'kw', 'sn', 'sm', 'sl', 'sc',
         'biz', 'ky', 'sg', 'se', 'sd')
 
 AUTO_LINK_RE = re.compile(r"""
     (?P<ws>.?\s*)
     (?P<url>
-        (?P<format1>
+        (?:(?P<format1>
             ((?P<protocol1>[a-z][a-z]+)://)?
             (?P<domain1>\w(?:[\w-]*\w)?\.\w(?:[\w-]*\w)?(?:\.\w(?:[\w-]*\w)?)*)
         ) | (?P<format2>
             ((?P<protocol2>[a-z][a-z]+)://)
             (?P<domain2>\w(?:[\w-]*\w)?(?:\.\w(?:[\w-]*\w)?)*)
-        )
+        ))
         (?P<port>:\d+)?
         (?P<uri>/[^\s<]*)?
     )
 
 """, re.X | re.I)
 
+EMAIL_LINK_REPLACE_RE = re.compile("(?<= href=\")[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})(?=\")")
+
 def is_ip(addr):
     try:
         socket.inet_aton(addr)
@@ -45,7 +47,7 @@ def replacer(m):
 
     ws = m.group('ws')
 
-    if ws and ws[0] in ("'", '"'):
+    if ws and ws[0] in ("'", '"', "@"):
         return m.group(0)
 
     elif not ws:
@@ -62,7 +64,7 @@ def replacer(m):
     if not protocol:
         domain_chunks = domain.split('.')
 
-        if not ((len(domain_chunks) == 1 and domain_chunks[0].lower() == 'localhost') or (domain_chunks[-1].lower() in TLDS)):
+        if not (len(domain_chunks) == 1 and domain_chunks[0].lower() == 'localhost') or (domain_chunks[-1].lower() in TLDS):
             return m.group(0)
 
     if (not protocol) and is_ip(domain):
@@ -92,7 +94,10 @@ def replacer(m):
 class AutoLinker(markdown.postprocessors.Postprocessor):
 
     def run(self, text):
-        return AUTO_LINK_RE.sub(replacer, text)
+        text = AUTO_LINK_RE.sub(replacer, text)
+        text = EMAIL_LINK_REPLACE_RE.sub(lambda m: "mailto:%s" % m.group(0), text)
+
+        return text
 
 class AutoLinkerExtension(markdown.Extension):