Skip to content

Give code spans precedence over link brackets - #817

Open
flavorjones wants to merge 1 commit into
vmg:masterfrom
flavorjones:code-span-link-precedence
Open

Give code spans precedence over link brackets#817
flavorjones wants to merge 1 commit into
vmg:masterfrom
flavorjones:code-span-link-precedence

Conversation

@flavorjones

Copy link
Copy Markdown

Per the CommonMark spec, code spans, autolinks, and raw HTML bind more tightly than the brackets in link text. char_link in ext/redcarpet/markdown.c scanned for the closing ] of a link label without any awareness of code spans, so a ] inside a code span closed the label. Given the input:

[`text](/one)`](/two)

Redcarpet previously produced:

<p><a href="/one">`text</a>`](/two)</p>

Now it produces the link a compliant parser emits, matching cmark:

<p><a href="/two"><code>text](/one)</code></a></p>

The same label scan decided whether a character was escaped by testing a single preceding byte, which misread a backtick following an escaped backslash (\\). HTML-to-Markdown generators such as turndown emit exactly that sequence, so the naive check defeated the precedence fix on their output. The check now counts the run of preceding backslashes and treats a character as escaped only when that run has odd length.

Footnote identifiers are not inline content, so the precedence rule does not apply to them. The scan skips code spans only for ordinary link and image labels, leaving footnote references parsed as before.

Fixes #816.

Per the CommonMark spec, code spans, autolinks, and raw HTML bind more
tightly than the brackets in link text. `char_link` in
`ext/redcarpet/markdown.c` scanned for the closing `]` of a link label
without any awareness of code spans, so a `]` inside a code span closed
the label. Given `[`text](/one)`](/two)`, Redcarpet previously produced

    <p><a href="/one">`text</a>`](/two)</p>

Now it produces the link a compliant parser emits, matching `cmark`:

    <p><a href="/two"><code>text](/one)</code></a></p>

The same label scan decided whether a character was escaped by testing a
single preceding byte, which misread a backtick following an escaped
backslash (`\\`). HTML-to-Markdown generators such as `turndown` emit
exactly that sequence, so the naive check defeated the precedence fix on
their output. The check now counts the run of preceding backslashes and
treats a character as escaped only when that run has odd length.

Footnote identifiers are not inline content, so the precedence rule does
not apply to them. The scan skips code spans only for ordinary link and
image labels, leaving footnote references parsed as before.

Fixes vmg#816.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Code spans should take precedence over link brackets

1 participant