From 152720f00e76f5f38c28c04a6f45d55a36fab0a8 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 21 Apr 2022 21:02:46 -0700 Subject: [PATCH] Update MD051/link-fragments to support indexing of repated headings. --- demo/markdownlint-browser.js | 11 ++++++++--- lib/md051.js | 11 ++++++++--- test/link-fragments.md | 21 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js index caf3146e..b6ff07ec 100644 --- a/demo/markdownlint-browser.js +++ b/demo/markdownlint-browser.js @@ -4421,10 +4421,15 @@ module.exports = { "description": "Link fragments should be valid", "tags": ["links"], "function": function MD051(params, onError) { - var fragments = new Set(); + var fragments = new Map(); // Process headings forEachHeading(params, function (heading, content, inline) { - fragments.add(convertHeadingToHTMLFragment(inline)); + var fragment = convertHeadingToHTMLFragment(inline); + var count = fragments.get(fragment) || 0; + if (count) { + fragments.set("".concat(fragment, "-").concat(count), 0); + } + fragments.set(fragment, count + 1); }); // Process HTML anchors var processHtmlToken = function (token) { @@ -4434,7 +4439,7 @@ module.exports = { if (element.toLowerCase() === "a") { var idMatch = identifierRe.exec(tag); if (idMatch) { - fragments.add("#".concat(idMatch[1])); + fragments.set("#".concat(idMatch[1]), 0); } } } diff --git a/lib/md051.js b/lib/md051.js index 69da0a55..70dbce65 100644 --- a/lib/md051.js +++ b/lib/md051.js @@ -37,10 +37,15 @@ module.exports = { "description": "Link fragments should be valid", "tags": [ "links" ], "function": function MD051(params, onError) { - const fragments = new Set(); + const fragments = new Map(); // Process headings forEachHeading(params, (heading, content, inline) => { - fragments.add(convertHeadingToHTMLFragment(inline)); + const fragment = convertHeadingToHTMLFragment(inline); + const count = fragments.get(fragment) || 0; + if (count) { + fragments.set(`${fragment}-${count}`, 0); + } + fragments.set(fragment, count + 1); }); // Process HTML anchors const processHtmlToken = (token) => { @@ -50,7 +55,7 @@ module.exports = { if (element.toLowerCase() === "a") { const idMatch = identifierRe.exec(tag); if (idMatch) { - fragments.add(`#${idMatch[1]}`); + fragments.set(`#${idMatch[1]}`, 0); } } } diff --git a/test/link-fragments.md b/test/link-fragments.md index 850e0866..e15855fa 100644 --- a/test/link-fragments.md +++ b/test/link-fragments.md @@ -26,6 +26,12 @@ [Valid](#valid-setext-heading) +[Valid](#valid-repeated-heading) + +[Valid](#valid-repeated-heading-1) + +[Valid](#valid-repeated-heading-2) + [Valid](#namedlink) [Valid](#idlink) @@ -77,6 +83,16 @@ Valid Setext Heading Text +### Valid Repeated Heading + +Text + +### Valid Repeated Heading + +Text + +### Valid Repeated Heading + @@ -89,7 +105,9 @@ Text ## Invalid Fragments -[Inalid](#valid-heading-2004-) {MD051} +[Invalid](#valid-heading-2004-) {MD051} + +[Invalid](#valid-repeated-heading-3) {MD051} [Invalid](#invalid-fragment) {MD051} @@ -104,5 +122,6 @@ Text