-
Notifications
You must be signed in to change notification settings - Fork 71
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
♻️ Refactor: Add linkifier rule to inline chain for full links (#279)
Fixes collision of emphasis and linkifier (so `http://example.org/foo._bar_-_baz` is now a single link, not emphasized). Emails and fuzzy links are not affected by this. Implements upstream: markdown-it/markdown-it@6b58ec4
- Loading branch information
1 parent
ba96f34
commit ea27cc8
Showing
11 changed files
with
234 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
"""Process links like https://example.org/""" | ||
import re | ||
|
||
from .state_inline import StateInline | ||
|
||
# RFC3986: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) | ||
SCHEME_RE = re.compile(r"(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$", re.IGNORECASE) | ||
|
||
|
||
def linkify(state: StateInline, silent: bool) -> bool: | ||
"""Rule for identifying plain-text links.""" | ||
if not state.md.options.linkify: | ||
return False | ||
if state.linkLevel > 0: | ||
return False | ||
if not state.md.linkify: | ||
raise ModuleNotFoundError("Linkify enabled but not installed.") | ||
|
||
pos = state.pos | ||
maximum = state.posMax | ||
|
||
if ( | ||
(pos + 3) > maximum | ||
or state.src[pos] != ":" | ||
or state.src[pos + 1] != "/" | ||
or state.src[pos + 2] != "/" | ||
): | ||
return False | ||
|
||
if not (match := SCHEME_RE.match(state.pending)): | ||
return False | ||
|
||
proto = match.group(1) | ||
if not (link := state.md.linkify.match_at_start(state.src[pos - len(proto) :])): | ||
return False | ||
url: str = link.url | ||
|
||
# disallow '*' at the end of the link (conflicts with emphasis) | ||
url = url.rstrip("*") | ||
|
||
full_url = state.md.normalizeLink(url) | ||
if not state.md.validateLink(full_url): | ||
return False | ||
|
||
if not silent: | ||
state.pending = state.pending[: -len(proto)] | ||
|
||
token = state.push("link_open", "a", 1) | ||
token.attrs = {"href": full_url} | ||
token.markup = "linkify" | ||
token.info = "auto" | ||
|
||
token = state.push("text", "", 0) | ||
token.content = state.md.normalizeLinkText(url) | ||
|
||
token = state.push("link_close", "a", -1) | ||
token.markup = "linkify" | ||
token.info = "auto" | ||
|
||
state.pos += len(url) - len(proto) | ||
return True |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,6 +30,7 @@ def test_get_rules(): | |
], | ||
"inline": [ | ||
"text", | ||
"linkify", | ||
"newline", | ||
"escape", | ||
"backticks", | ||
|
Oops, something went wrong.