Update MD043/required-headings to standardize early-return flow.

This commit is contained in:
David Anson 2023-08-29 23:00:27 -07:00
parent b13d6a49ee
commit acd8c6ff28
2 changed files with 84 additions and 80 deletions

View file

@ -5635,52 +5635,54 @@ module.exports = {
"tags": ["headings", "headers"], "tags": ["headings", "headers"],
"function": function MD043(params, onError) { "function": function MD043(params, onError) {
var requiredHeadings = params.config.headings || params.config.headers; var requiredHeadings = params.config.headings || params.config.headers;
if (!Array.isArray(requiredHeadings)) {
// Nothing to check; avoid doing any work
return;
}
var matchCase = params.config.match_case || false; var matchCase = params.config.match_case || false;
if (Array.isArray(requiredHeadings)) { var levels = {};
var levels = {}; for (var _i = 0, _arr = [1, 2, 3, 4, 5, 6]; _i < _arr.length; _i++) {
for (var _i = 0, _arr = [1, 2, 3, 4, 5, 6]; _i < _arr.length; _i++) { var level = _arr[_i];
var level = _arr[_i]; levels["h" + level] = "######".substr(-level);
levels["h" + level] = "######".substr(-level); }
} var i = 0;
var i = 0; var matchAny = false;
var matchAny = false; var hasError = false;
var hasError = false; var anyHeadings = false;
var anyHeadings = false; var getExpected = function getExpected() {
var getExpected = function getExpected() { return requiredHeadings[i++] || "[None]";
return requiredHeadings[i++] || "[None]"; };
}; var handleCase = function handleCase(str) {
var handleCase = function handleCase(str) { return matchCase ? str : str.toLowerCase();
return matchCase ? str : str.toLowerCase(); };
}; forEachHeading(params, function (heading, content) {
forEachHeading(params, function (heading, content) { if (!hasError) {
if (!hasError) { anyHeadings = true;
anyHeadings = true; var actual = levels[heading.tag] + " " + content;
var actual = levels[heading.tag] + " " + content; var expected = getExpected();
var expected = getExpected(); if (expected === "*") {
if (expected === "*") { var nextExpected = getExpected();
var nextExpected = getExpected(); if (handleCase(nextExpected) !== handleCase(actual)) {
if (handleCase(nextExpected) !== handleCase(actual)) {
matchAny = true;
i--;
}
} else if (expected === "+") {
matchAny = true; matchAny = true;
} else if (handleCase(expected) === handleCase(actual)) {
matchAny = false;
} else if (matchAny) {
i--; i--;
} else {
addErrorDetailIf(onError, heading.lineNumber, expected, actual);
hasError = true;
} }
} else if (expected === "+") {
matchAny = true;
} else if (handleCase(expected) === handleCase(actual)) {
matchAny = false;
} else if (matchAny) {
i--;
} else {
addErrorDetailIf(onError, heading.lineNumber, expected, actual);
hasError = true;
} }
});
var extraHeadings = requiredHeadings.length - i;
if (!hasError && (extraHeadings > 1 || extraHeadings === 1 && requiredHeadings[i] !== "*") && (anyHeadings || !requiredHeadings.every(function (heading) {
return heading === "*";
}))) {
addErrorContext(onError, params.lines.length, requiredHeadings[i]);
} }
});
var extraHeadings = requiredHeadings.length - i;
if (!hasError && (extraHeadings > 1 || extraHeadings === 1 && requiredHeadings[i] !== "*") && (anyHeadings || !requiredHeadings.every(function (heading) {
return heading === "*";
}))) {
addErrorContext(onError, params.lines.length, requiredHeadings[i]);
} }
} }
}; };

View file

@ -11,52 +11,54 @@ module.exports = {
"tags": [ "headings", "headers" ], "tags": [ "headings", "headers" ],
"function": function MD043(params, onError) { "function": function MD043(params, onError) {
const requiredHeadings = params.config.headings || params.config.headers; const requiredHeadings = params.config.headings || params.config.headers;
if (!Array.isArray(requiredHeadings)) {
// Nothing to check; avoid doing any work
return;
}
const matchCase = params.config.match_case || false; const matchCase = params.config.match_case || false;
if (Array.isArray(requiredHeadings)) { const levels = {};
const levels = {}; for (const level of [ 1, 2, 3, 4, 5, 6 ]) {
for (const level of [ 1, 2, 3, 4, 5, 6 ]) { levels["h" + level] = "######".substr(-level);
levels["h" + level] = "######".substr(-level); }
} let i = 0;
let i = 0; let matchAny = false;
let matchAny = false; let hasError = false;
let hasError = false; let anyHeadings = false;
let anyHeadings = false; const getExpected = () => requiredHeadings[i++] || "[None]";
const getExpected = () => requiredHeadings[i++] || "[None]"; const handleCase = (str) => (matchCase ? str : str.toLowerCase());
const handleCase = (str) => (matchCase ? str : str.toLowerCase()); forEachHeading(params, (heading, content) => {
forEachHeading(params, (heading, content) => { if (!hasError) {
if (!hasError) { anyHeadings = true;
anyHeadings = true; const actual = levels[heading.tag] + " " + content;
const actual = levels[heading.tag] + " " + content; const expected = getExpected();
const expected = getExpected(); if (expected === "*") {
if (expected === "*") { const nextExpected = getExpected();
const nextExpected = getExpected(); if (handleCase(nextExpected) !== handleCase(actual)) {
if (handleCase(nextExpected) !== handleCase(actual)) {
matchAny = true;
i--;
}
} else if (expected === "+") {
matchAny = true; matchAny = true;
} else if (handleCase(expected) === handleCase(actual)) {
matchAny = false;
} else if (matchAny) {
i--; i--;
} else {
addErrorDetailIf(onError, heading.lineNumber,
expected, actual);
hasError = true;
} }
} else if (expected === "+") {
matchAny = true;
} else if (handleCase(expected) === handleCase(actual)) {
matchAny = false;
} else if (matchAny) {
i--;
} else {
addErrorDetailIf(onError, heading.lineNumber,
expected, actual);
hasError = true;
} }
});
const extraHeadings = requiredHeadings.length - i;
if (
!hasError &&
((extraHeadings > 1) ||
((extraHeadings === 1) && (requiredHeadings[i] !== "*"))) &&
(anyHeadings || !requiredHeadings.every((heading) => heading === "*"))
) {
addErrorContext(onError, params.lines.length,
requiredHeadings[i]);
} }
});
const extraHeadings = requiredHeadings.length - i;
if (
!hasError &&
((extraHeadings > 1) ||
((extraHeadings === 1) && (requiredHeadings[i] !== "*"))) &&
(anyHeadings || !requiredHeadings.every((heading) => heading === "*"))
) {
addErrorContext(onError, params.lines.length,
requiredHeadings[i]);
} }
} }
}; };