Handle parser inconsistency for "u@.com" to avoid repeatedly wrapping with "<>" when fixing the bare URL (email) (fixes #1140).

This commit is contained in:
David Anson 2024-03-03 19:06:14 -08:00
parent 902783df21
commit 2b73095ebd
5 changed files with 49 additions and 3 deletions

View file

@ -5090,7 +5090,28 @@ module.exports = {
const literalAutolinks = (tokens) => ( const literalAutolinks = (tokens) => (
filterByPredicate( filterByPredicate(
tokens, tokens,
(token) => (token.type === "literalAutolink") && !inHtmlFlow(token), (token) => {
if ((token.type === "literalAutolink") && !inHtmlFlow(token)) {
// Detect and ignore https://github.com/micromark/micromark/issues/164
const siblings = token.parent?.children;
// Commented-out due to not being able to exercise in test/code coverage
// || micromarkTokens;
const index = siblings?.indexOf(token);
// @ts-ignore
const prev = siblings?.at(index - 1);
// @ts-ignore
const next = siblings?.at(index + 1);
return !(
prev &&
next &&
(prev.type === "data") &&
(next.type === "data") &&
prev.text.endsWith("<") &&
next.text.startsWith(">")
);
}
return false;
},
(token) => { (token) => {
const { children } = token; const { children } = token;
const result = []; const result = [];

View file

@ -21,7 +21,28 @@ module.exports = {
const literalAutolinks = (tokens) => ( const literalAutolinks = (tokens) => (
filterByPredicate( filterByPredicate(
tokens, tokens,
(token) => (token.type === "literalAutolink") && !inHtmlFlow(token), (token) => {
if ((token.type === "literalAutolink") && !inHtmlFlow(token)) {
// Detect and ignore https://github.com/micromark/micromark/issues/164
const siblings = token.parent?.children;
// Commented-out due to not being able to exercise in test/code coverage
// || micromarkTokens;
const index = siblings?.indexOf(token);
// @ts-ignore
const prev = siblings?.at(index - 1);
// @ts-ignore
const next = siblings?.at(index + 1);
return !(
prev &&
next &&
(prev.type === "data") &&
(next.type === "data") &&
prev.text.endsWith("<") &&
next.text.startsWith(">")
);
}
return false;
},
(token) => { (token) => {
const { children } = token; const { children } = token;
const result = []; const result = [];

View file

@ -97,6 +97,8 @@ Email addresses are treated similarly: user@example.com {MD034}
Angle brackets work the same for email: <user@example.com> Angle brackets work the same for email: <user@example.com>
Unusual email addresses are handled: <user@.com>
--- ---
[is-a-valid]: https://example.com [is-a-valid]: https://example.com

View file

@ -3539,7 +3539,7 @@ Generated by [AVA](https://avajs.dev).
editColumn: 59, editColumn: 59,
insertText: '<https://example.com>', insertText: '<https://example.com>',
}, },
lineNumber: 104, lineNumber: 106,
ruleDescription: 'Bare URL used', ruleDescription: 'Bare URL used',
ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md034.md', ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md034.md',
ruleNames: [ ruleNames: [
@ -3647,6 +3647,8 @@ Generated by [AVA](https://avajs.dev).
Angle brackets work the same for email: <user@example.com> Angle brackets work the same for email: <user@example.com>
Unusual email addresses are handled: <user@.com>
---␊ ---␊
[is-a-valid]: https://example.com␊ [is-a-valid]: https://example.com␊