From 7668b0a263c5d48aa6d5f057774c1d8c06f40dee Mon Sep 17 00:00:00 2001 From: David Anson Date: Mon, 17 Nov 2025 21:32:18 -0800 Subject: [PATCH] Update MD011/no-reversed-links to ignore content of math blocks and spans (fixes #1864). --- lib/md011.mjs | 14 ++++---- test/markdownlint-test.mjs | 2 +- .../markdownlint-test-scenarios.mjs.md | 30 ++++++++++++++++++ .../markdownlint-test-scenarios.mjs.snap | Bin 326801 -> 326922 bytes test/texmath-content.md | 30 ++++++++++++++++++ 5 files changed, 69 insertions(+), 7 deletions(-) diff --git a/lib/md011.mjs b/lib/md011.mjs index 32df13d6..f9cce643 100644 --- a/lib/md011.mjs +++ b/lib/md011.mjs @@ -4,6 +4,8 @@ import { addError, hasOverlap } from "../helpers/helpers.cjs"; import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; +/** @typedef {import("micromark-extension-math")} */ + const reversedLinkRe = /(^|[^\\])\(([^()]+)\)\[([^\]^][^\]]*)\](?!\()/g; /** @type {import("markdownlint").Rule} */ @@ -13,14 +15,14 @@ export default { "tags": [ "links" ], "parser": "micromark", "function": function MD011(params, onError) { - const codeBlockLineNumbers = new Set(); - for (const codeBlock of filterByTypesCached([ "codeFenced", "codeIndented" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); + const ignoreBlockLineNumbers = new Set(); + for (const ignoreBlock of filterByTypesCached([ "codeFenced", "codeIndented", "mathFlow" ])) { + addRangeToSet(ignoreBlockLineNumbers, ignoreBlock.startLine, ignoreBlock.endLine); } - const codeTexts = filterByTypesCached([ "codeText" ]); + const ignoreTexts = filterByTypesCached([ "codeText", "mathText" ]); for (const [ lineIndex, line ] of params.lines.entries()) { const lineNumber = lineIndex + 1; - if (!codeBlockLineNumbers.has(lineNumber)) { + if (!ignoreBlockLineNumbers.has(lineNumber)) { let match = null; while ((match = reversedLinkRe.exec(line)) !== null) { const [ reversedLink, preChar, linkText, linkDestination ] = match; @@ -32,7 +34,7 @@ export default { const length = match[0].length - preChar.length; /** @type {import("../helpers/helpers.cjs").FileRange} */ const range = { "startLine": lineNumber, "startColumn": column, "endLine": lineNumber, "endColumn": column + length - 1 }; - if (!codeTexts.some((codeText) => hasOverlap(codeText, range))) { + if (!ignoreTexts.some((ignoreText) => hasOverlap(ignoreText, range))) { addError( onError, lineNumber, diff --git a/test/markdownlint-test.mjs b/test/markdownlint-test.mjs index a10497a9..f53bf9a0 100644 --- a/test/markdownlint-test.mjs +++ b/test/markdownlint-test.mjs @@ -1101,7 +1101,7 @@ test("readme", async(t) => { }); test("validateJsonUsingConfigSchemaStrict", async(t) => { - t.plan(218); + t.plan(219); // @ts-ignore const ajv = new Ajv(ajvOptions); const validateSchemaStrict = ajv.compile(configSchemaStrict); diff --git a/test/snapshots/markdownlint-test-scenarios.mjs.md b/test/snapshots/markdownlint-test-scenarios.mjs.md index dc7c2f22..da599a58 100644 --- a/test/snapshots/markdownlint-test-scenarios.mjs.md +++ b/test/snapshots/markdownlint-test-scenarios.mjs.md @@ -75717,6 +75717,36 @@ Generated by [AVA](https://avajs.dev). $$␊ x * y = x * y␊ $$␊ + ␊ + ## Content␊ + ␊ + $$␊ + ␊ + Text (reversed)[link] text␊ + ␊ + Text [invalid](#link) text␊ + ␊ + Text [link](not-descriptive-link-text) text␊ + ␊ + Text javascript text␊ + ␊ + $$␊ + ␊ + Text $ (reversed)[link] $ text␊ + ␊ + Text $ [invalid](#link) $ text␊ + ␊ + Text $ [link](not-descriptive-link-text) $ text␊ + ␊ + Text $ javascript $ text␊ + ␊ + ␊ `, } diff --git a/test/snapshots/markdownlint-test-scenarios.mjs.snap b/test/snapshots/markdownlint-test-scenarios.mjs.snap index 1a3c83590bdcba37b806d826f0a18314cc5a2984..38d5fd737467479bfd8dc76c4863119be3c1c6f1 100644 GIT binary patch delta 8705 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 uO2PpOS^umf@o8ske$ep{o+;Qs*8lc>P} delta 8583 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