Initial implementation of MD051/valid-link-fragments (refs #253, closes #495).

This commit is contained in:
Divlo 2022-01-26 00:21:08 +01:00 committed by David Anson
parent 62f5c85238
commit 33ee1cd85e
13 changed files with 250 additions and 24 deletions

46
lib/md051.js Normal file
View file

@ -0,0 +1,46 @@
// @ts-check
"use strict";
const { addError, forEachHeading, filterTokens } = require("../helpers");
/**
* Converts a Markdown heading into an HTML fragment
* according to the rules used by GitHub.
*
* @param {string} string The string to convert.
* @returns {string} The converted string.
*/
function convertHeadingToHTMLFragment(string) {
return "#" + string
.toLowerCase()
.replace(/ /g, "-")
.replace(/[^-_a-z0-9]/g, "");
}
module.exports = {
"names": [ "MD051", "valid-link-fragments" ],
"description": "Link fragments should be valid",
"tags": [ "links" ],
"function": function MD051(params, onError) {
const validLinkFragments = [];
forEachHeading(params, (_heading, content) => {
validLinkFragments.push(convertHeadingToHTMLFragment(content));
});
filterTokens(params, "inline", (token) => {
token.children.forEach((child) => {
const { lineNumber, type, attrs } = child;
if (type === "link_open") {
const href = attrs.find((attr) => attr[0] === "href");
if (href !== undefined &&
href[1].startsWith("#") &&
!validLinkFragments.includes(href[1])
) {
const detail = "Link Fragment is invalid";
addError(onError, lineNumber, detail, href[1]);
}
}
});
});
}
};