|
|
|
import re |
|
|
|
from .state_inline import StateInline |
|
|
|
EMAIL_RE = re.compile( |
|
r"^([a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$" |
|
) |
|
AUTOLINK_RE = re.compile(r"^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$") |
|
|
|
|
|
def autolink(state: StateInline, silent: bool) -> bool: |
|
pos = state.pos |
|
|
|
if state.src[pos] != "<": |
|
return False |
|
|
|
start = state.pos |
|
maximum = state.posMax |
|
|
|
while True: |
|
pos += 1 |
|
if pos >= maximum: |
|
return False |
|
|
|
ch = state.src[pos] |
|
|
|
if ch == "<": |
|
return False |
|
if ch == ">": |
|
break |
|
|
|
url = state.src[start + 1 : pos] |
|
|
|
if AUTOLINK_RE.search(url) is not None: |
|
fullUrl = state.md.normalizeLink(url) |
|
if not state.md.validateLink(fullUrl): |
|
return False |
|
|
|
if not silent: |
|
token = state.push("link_open", "a", 1) |
|
token.attrs = {"href": fullUrl} |
|
token.markup = "autolink" |
|
token.info = "auto" |
|
|
|
token = state.push("text", "", 0) |
|
token.content = state.md.normalizeLinkText(url) |
|
|
|
token = state.push("link_close", "a", -1) |
|
token.markup = "autolink" |
|
token.info = "auto" |
|
|
|
state.pos += len(url) + 2 |
|
return True |
|
|
|
if EMAIL_RE.search(url) is not None: |
|
fullUrl = state.md.normalizeLink("mailto:" + url) |
|
if not state.md.validateLink(fullUrl): |
|
return False |
|
|
|
if not silent: |
|
token = state.push("link_open", "a", 1) |
|
token.attrs = {"href": fullUrl} |
|
token.markup = "autolink" |
|
token.info = "auto" |
|
|
|
token = state.push("text", "", 0) |
|
token.content = state.md.normalizeLinkText(url) |
|
|
|
token = state.push("link_close", "a", -1) |
|
token.markup = "autolink" |
|
token.info = "auto" |
|
|
|
state.pos += len(url) + 2 |
|
return True |
|
|
|
return False |
|
|