Update to only invoke rules that are used at least once by the content.

This commit is contained in:
David Anson 2024-08-22 20:35:01 -07:00
parent 6870a48829
commit 85e704f32a
3 changed files with 48 additions and 10 deletions

View file

@ -2063,10 +2063,18 @@ function getEnabledRulesPerLineNumber(
handleInlineConfig(lines, enableDisableFile); handleInlineConfig(lines, enableDisableFile);
handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState); handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(lines, disableLineNextLine); handleInlineConfig(lines, disableLineNextLine);
// Create the list of rules that are used at least once
const enabledRuleList = [];
for (const [ index, ruleName ] of allRuleNames.entries()) {
if (enabledRulesPerLineNumber.some((enabledRulesForLine) => enabledRulesForLine[ruleName])) {
enabledRuleList.push(ruleList[index]);
}
}
// Return results // Return results
return { return {
effectiveConfig, effectiveConfig,
enabledRulesPerLineNumber enabledRulesPerLineNumber,
enabledRuleList
}; };
} }
@ -2108,7 +2116,7 @@ function lintContent(
const { frontMatterLines } = removeFrontMatterResult; const { frontMatterLines } = removeFrontMatterResult;
content = removeFrontMatterResult.content; content = removeFrontMatterResult.content;
// Get enabled rules per line (with HTML comments present) // Get enabled rules per line (with HTML comments present)
const { effectiveConfig, enabledRulesPerLineNumber } = const { effectiveConfig, enabledRulesPerLineNumber, enabledRuleList } =
getEnabledRulesPerLineNumber( getEnabledRulesPerLineNumber(
ruleList, ruleList,
content.split(helpers.newLineRe), content.split(helpers.newLineRe),
@ -2118,7 +2126,7 @@ function lintContent(
configParsers, configParsers,
aliasToRuleNames aliasToRuleNames
); );
const needMarkdownItTokens = ruleList.some( const needMarkdownItTokens = enabledRuleList.some(
(rule) => (rule.parser === "markdownit") || (rule.parser === undefined) (rule) => (rule.parser === "markdownit") || (rule.parser === undefined)
); );
// Parse content into parser tokens // Parse content into parser tokens
@ -2350,8 +2358,8 @@ function lintContent(
return results; return results;
} }
// Run all rules // Run all rules
const ruleListAsync = ruleList.filter((rule) => rule.asynchronous); const ruleListAsync = enabledRuleList.filter((rule) => rule.asynchronous);
const ruleListSync = ruleList.filter((rule) => !rule.asynchronous); const ruleListSync = enabledRuleList.filter((rule) => !rule.asynchronous);
const ruleListAsyncFirst = [ const ruleListAsyncFirst = [
...ruleListAsync, ...ruleListAsync,
...ruleListSync ...ruleListSync

View file

@ -510,10 +510,18 @@ function getEnabledRulesPerLineNumber(
handleInlineConfig(lines, enableDisableFile); handleInlineConfig(lines, enableDisableFile);
handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState); handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(lines, disableLineNextLine); handleInlineConfig(lines, disableLineNextLine);
// Create the list of rules that are used at least once
const enabledRuleList = [];
for (const [ index, ruleName ] of allRuleNames.entries()) {
if (enabledRulesPerLineNumber.some((enabledRulesForLine) => enabledRulesForLine[ruleName])) {
enabledRuleList.push(ruleList[index]);
}
}
// Return results // Return results
return { return {
effectiveConfig, effectiveConfig,
enabledRulesPerLineNumber enabledRulesPerLineNumber,
enabledRuleList
}; };
} }
@ -555,7 +563,7 @@ function lintContent(
const { frontMatterLines } = removeFrontMatterResult; const { frontMatterLines } = removeFrontMatterResult;
content = removeFrontMatterResult.content; content = removeFrontMatterResult.content;
// Get enabled rules per line (with HTML comments present) // Get enabled rules per line (with HTML comments present)
const { effectiveConfig, enabledRulesPerLineNumber } = const { effectiveConfig, enabledRulesPerLineNumber, enabledRuleList } =
getEnabledRulesPerLineNumber( getEnabledRulesPerLineNumber(
ruleList, ruleList,
content.split(helpers.newLineRe), content.split(helpers.newLineRe),
@ -565,7 +573,7 @@ function lintContent(
configParsers, configParsers,
aliasToRuleNames aliasToRuleNames
); );
const needMarkdownItTokens = ruleList.some( const needMarkdownItTokens = enabledRuleList.some(
(rule) => (rule.parser === "markdownit") || (rule.parser === undefined) (rule) => (rule.parser === "markdownit") || (rule.parser === undefined)
); );
// Parse content into parser tokens // Parse content into parser tokens
@ -797,8 +805,8 @@ function lintContent(
return results; return results;
} }
// Run all rules // Run all rules
const ruleListAsync = ruleList.filter((rule) => rule.asynchronous); const ruleListAsync = enabledRuleList.filter((rule) => rule.asynchronous);
const ruleListSync = ruleList.filter((rule) => !rule.asynchronous); const ruleListSync = enabledRuleList.filter((rule) => !rule.asynchronous);
const ruleListAsyncFirst = [ const ruleListAsyncFirst = [
...ruleListAsync, ...ruleListAsync,
...ruleListSync ...ruleListSync

View file

@ -1161,6 +1161,28 @@ test("markdownItPluginsNoMarkdownIt", (t) => new Promise((resolve) => {
}); });
})); }));
test("markdownItPluginsUnusedUncalled", (t) => new Promise((resolve) => {
t.plan(2);
markdownlint({
"config": {
"default": false
},
"strings": {
"string": "# Heading\n\nText\n"
},
// Use a markdown-it custom rule so the markdown-it plugin will be run
"customRules": customRules.anyBlockquote,
"markdownItPlugins": [
[ pluginInline, "check_text_plugin", "text", () => t.fail() ]
]
}, function callback(err, actual) {
t.falsy(err);
const expected = { "string": [] };
t.deepEqual(actual, expected, "Unexpected issues.");
resolve();
});
}));
test("Pandoc footnote", (t) => new Promise((resolve) => { test("Pandoc footnote", (t) => new Promise((resolve) => {
t.plan(2); t.plan(2);
markdownlint({ markdownlint({