Refactor to simplify and generalize rule name handling.

This commit is contained in:
David Anson 2018-02-04 20:27:20 -08:00
parent bc8776c582
commit fda309df2f

View file

@ -8,42 +8,38 @@ var md = require("markdown-it")({ "html": true });
var rules = require("./rules"); var rules = require("./rules");
var shared = require("./shared"); var shared = require("./shared");
// Mappings from rule to description and name/tag to rules // Mapping from rule names/tags to canonical rule name
var allRuleNames = []; var aliasToRuleNames = {};
var ruleNameToRule = {};
var idUpperToRuleNames = {};
// var tagToRuleNames = {}; // var tagToRuleNames = {};
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
var ruleName = rule.names[0]; var ruleName = rule.names[0].toUpperCase();
var ruleAliases = rule.names.slice(1);
allRuleNames.push(ruleName);
ruleNameToRule[ruleName] = rule;
// The following is useful for updating README.md // The following is useful for updating README.md
// console.log( // console.log(
// "* **[" + ruleName + "](doc/Rules.md#" + ruleName.toLowerCase() + // "* **[" + ruleName + "](doc/Rules.md#" + ruleName.toLowerCase() +
// ")** *" + ruleAliases.join(", ") + "* - " + rule.description); // ")** *" + rule.names.slice(1).join(", ") + "* - " + rule.description);
rule.names.forEach(function forName(name) {
var nameUpper = name.toUpperCase();
aliasToRuleNames[nameUpper] = [ ruleName ];
});
rule.tags.forEach(function forTag(tag) { rule.tags.forEach(function forTag(tag) {
var tagUpper = tag.toUpperCase(); var tagUpper = tag.toUpperCase();
var ruleNames = idUpperToRuleNames[tagUpper] || []; var ruleNames = aliasToRuleNames[tagUpper] || [];
ruleNames.push(ruleName); ruleNames.push(ruleName);
idUpperToRuleNames[tagUpper] = ruleNames; aliasToRuleNames[tagUpper] = ruleNames;
// tagToRuleNames[tag] = ruleName; // tagToRuleNames[tag] = ruleName;
}); });
ruleAliases.forEach(function forAlias(alias) {
var aliasUpper = alias.toUpperCase();
idUpperToRuleNames[aliasUpper] = [ ruleName ];
});
}); });
// The following is useful for updating README.md // The following is useful for updating README.md
// Object.keys(tagToRuleNames).sort().forEach(function forTag(tag) { // Object.keys(tagToRuleNames).sort().forEach(function forTag(tag) {
// console.log("* **" + tag + "** - " + // console.log("* **" + tag + "** - " +
// idUpperToRuleNames[tag.toUpperCase()].join(", ")); // aliasToRuleNames[tag.toUpperCase()].join(", "));
// }); // });
// Class for results with toString for pretty display // Class for results with toString for pretty display
function Results() {} function Results() {}
Results.prototype.toString = function resultsToString(useAlias) { Results.prototype.toString = function resultsToString(useAlias) {
var that = this; var that = this;
var ruleNameToRule = null;
var results = []; var results = [];
Object.keys(that).forEach(function forFile(file) { Object.keys(that).forEach(function forFile(file) {
var fileResults = that[file]; var fileResults = that[file];
@ -65,6 +61,13 @@ Results.prototype.toString = function resultsToString(useAlias) {
"")); ""));
}); });
} else { } else {
if (!ruleNameToRule) {
ruleNameToRule = {};
rules.forEach(function forRule(rule) {
var ruleName = rule.names[0].toUpperCase();
ruleNameToRule[ruleName] = rule;
});
}
Object.keys(fileResults).forEach(function forRule(ruleName) { Object.keys(fileResults).forEach(function forRule(ruleName) {
var rule = ruleNameToRule[ruleName]; var rule = ruleNameToRule[ruleName];
var ruleResults = fileResults[ruleName]; var ruleResults = fileResults[ruleName];
@ -163,7 +166,7 @@ function lintContent(
var ruleDefault = (defaultKey.length === 0) || !!config[defaultKey[0]]; var ruleDefault = (defaultKey.length === 0) || !!config[defaultKey[0]];
var mergedRules = {}; var mergedRules = {};
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
var ruleName = rule.names[0]; var ruleName = rule.names[0].toUpperCase();
mergedRules[ruleName] = ruleDefault; mergedRules[ruleName] = ruleDefault;
}); });
Object.keys(config).forEach(function forKey(key) { Object.keys(config).forEach(function forKey(key) {
@ -176,18 +179,16 @@ function lintContent(
value = false; value = false;
} }
var keyUpper = key.toUpperCase(); var keyUpper = key.toUpperCase();
if (ruleNameToRule[keyUpper]) { (aliasToRuleNames[keyUpper] || []).forEach(function forRule(ruleName) {
mergedRules[keyUpper] = value;
} else if (idUpperToRuleNames[keyUpper]) {
idUpperToRuleNames[keyUpper].forEach(function forRule(ruleName) {
mergedRules[ruleName] = value; mergedRules[ruleName] = value;
}); });
}
}); });
// Create mapping of enabled rules per line // Create mapping of enabled rules per line
var enabledRules = {}; var enabledRules = {};
var allRuleNames = [];
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
var ruleName = rule.names[0]; var ruleName = rule.names[0].toUpperCase();
allRuleNames.push(ruleName);
enabledRules[ruleName] = !!mergedRules[ruleName]; enabledRules[ruleName] = !!mergedRules[ruleName];
}); });
function forMatch(match) { function forMatch(match) {
@ -196,13 +197,9 @@ function lintContent(
match[2].trim().toUpperCase().split(/\s+/) : match[2].trim().toUpperCase().split(/\s+/) :
allRuleNames; allRuleNames;
items.forEach(function forItem(nameUpper) { items.forEach(function forItem(nameUpper) {
if (ruleNameToRule[nameUpper]) { (aliasToRuleNames[nameUpper] || []).forEach(function forRule(ruleName) {
enabledRules[nameUpper] = enabled;
} else if (idUpperToRuleNames[nameUpper]) {
idUpperToRuleNames[nameUpper].forEach(function forRule(ruleName) {
enabledRules[ruleName] = enabled; enabledRules[ruleName] = enabled;
}); });
}
}); });
} }
var enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length); var enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length);
@ -230,7 +227,7 @@ function lintContent(
var result = (resultVersion === 0) ? {} : []; var result = (resultVersion === 0) ? {} : [];
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
// Configure rule // Configure rule
var ruleName = rule.names[0]; var ruleName = rule.names[0].toUpperCase();
params.config = mergedRules[ruleName]; params.config = mergedRules[ruleName];
var errors = []; var errors = [];
function onError(errorInfo) { function onError(errorInfo) {