Add MD044 proper-names "Proper names should have the correct capitalization" (fixes #39).

This commit is contained in:
David Anson 2016-12-22 13:34:18 -08:00
parent 46cbcfa55e
commit d8975282dc
13 changed files with 185 additions and 5 deletions

View file

@ -84,6 +84,7 @@ playground for learning and exploring.
* **MD041** *first-line-h1* - First line in file should be a top level header * **MD041** *first-line-h1* - First line in file should be a top level header
* **MD042** *no-empty-links* - No empty links * **MD042** *no-empty-links* - No empty links
* **MD043** *required-headers* - Required header structure * **MD043** *required-headers* - Required header structure
* **MD044** *proper-names* - Proper names should have the correct capitalization
See [Rules.md](doc/Rules.md) for more details. See [Rules.md](doc/Rules.md) for more details.
@ -107,6 +108,7 @@ See [Rules.md](doc/Rules.md) for more details.
* **links** - MD011, MD034, MD039, MD042 * **links** - MD011, MD034, MD039, MD042
* **ol** - MD029, MD030, MD032 * **ol** - MD029, MD030, MD032
* **spaces** - MD018, MD019, MD020, MD021, MD023 * **spaces** - MD018, MD019, MD020, MD021, MD023
* **spelling** - MD044
* **ul** - MD004, MD005, MD006, MD007, MD030, MD032 * **ul** - MD004, MD005, MD006, MD007, MD030, MD032
* **url** - MD034 * **url** - MD034
* **whitespace** - MD009, MD010, MD012, MD027, MD028, MD030, MD037, MD038, MD039 * **whitespace** - MD009, MD010, MD012, MD027, MD028, MD030, MD037, MD038, MD039

View file

@ -1119,3 +1119,23 @@ problematic header (otherwise, it outputs the last line number of the file).
Note that while the `headers` parameter uses the "## Text" ATX header style for Note that while the `headers` parameter uses the "## Text" ATX header style for
simplicity, a file may use any supported header style. simplicity, a file may use any supported header style.
## MD044 - Proper names should have the correct capitalization
Tags: spelling
Aliases: proper-names
Parameters: names (array of string; default `null` for disabled)
This rule is triggered when any of the strings in the `names` array do not have
the specified capitalization. It can be used to enforce a standard letter case
for the names of projects and products.
For example, the language "JavaScript" is usually written with both the 'J' and
'S' capitalized - though sometimes the 's' or 'j' appear in lower-case. To enforce
the proper capitalization, specify the desired letter case in the `names` array:
[
"JavaScript"
]

View file

@ -1090,5 +1090,27 @@ module.exports = [
} }
} }
} }
},
{
"name": "MD044",
"desc": "Proper names should have the correct capitalization",
"tags": [ "spelling" ],
"aliases": [ "proper-names" ],
"regexp": null,
"func": function MD044(params, errors) {
var names = params.options.names || [];
names.forEach(function forName(name) {
var escapedName = escapeForRegExp(name);
var namePattern = "\\b" + escapedName + "\\b";
var anyNameRe = new RegExp(namePattern, "gi");
forEachLine(params, function forLine(line, lineIndex) {
var matches = line.match(anyNameRe) || [];
matches.forEach(function forMatch(match) {
errors.addDetailIf(lineIndex + 1, name, match);
});
});
});
}
} }
]; ];

View file

@ -212,6 +212,18 @@ rules.forEach(function forRule(rule) {
} }
}; };
break; break;
case "MD044":
scheme.properties = {
"names": {
"description": "List of proper names",
"type": "array",
"items": {
"type": "string"
},
"default": null
}
};
break;
default: default:
custom = false; custom = false;
break; break;

View file

@ -871,6 +871,44 @@
}, },
"additionalProperties": false "additionalProperties": false
}, },
"MD044": {
"description": "MD044/proper-names - Proper names should have the correct capitalization",
"type": [
"boolean",
"object"
],
"default": true,
"properties": {
"names": {
"description": "List of proper names",
"type": "array",
"items": {
"type": "string"
},
"default": null
}
},
"additionalProperties": false
},
"proper-names": {
"description": "MD044/proper-names - Proper names should have the correct capitalization",
"type": [
"boolean",
"object"
],
"default": true,
"properties": {
"names": {
"description": "List of proper names",
"type": "array",
"items": {
"type": "string"
},
"default": null
}
},
"additionalProperties": false
},
"headers": { "headers": {
"description": "headers - MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", "description": "headers - MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043",
"type": "boolean", "type": "boolean",
@ -970,6 +1008,11 @@
"description": "language - MD040", "description": "language - MD040",
"type": "boolean", "type": "boolean",
"default": true "default": true
},
"spelling": {
"description": "spelling - MD044",
"type": "boolean",
"default": true
} }
}, },
"additionalProperties": false "additionalProperties": false

View file

@ -7,5 +7,10 @@
"#### Header 2 {MD001}", "#### Header 2 {MD001}",
"# Broken" "# Broken"
] ]
},
"MD044": {
"names": [
"markdownlint"
]
} }
} }

View file

@ -75,3 +75,5 @@ code fence without language {MD040:73}
``` ```
[empty link]() {MD042} [empty link]() {MD042}
markdownLint {MD044}

View file

@ -5,5 +5,10 @@
"headers": [ "headers": [
"# Header" "# Header"
] ]
},
"MD044": {
"names": [
"markdownlint"
]
} }
} }

View file

@ -1,3 +1,5 @@
Not a header Not a header
An [empty]() link An [empty]() link
This is a test file for the MARKDOWNLINT package.

View file

@ -18,12 +18,21 @@
"errorRange": [4, 7] "errorRange": [4, 7]
}, },
{ {
"lineNumber": 4, "lineNumber": 6,
"ruleName": "MD043", "ruleName": "MD043",
"ruleAlias": "required-headers", "ruleAlias": "required-headers",
"ruleDescription": "Required header structure", "ruleDescription": "Required header structure",
"errorDetail": null, "errorDetail": null,
"errorContext": "# Header", "errorContext": "# Header",
"errorRange": null "errorRange": null
},
{
"lineNumber": 5,
"ruleName": "MD044",
"ruleAlias": "proper-names",
"ruleDescription": "Proper names should have the correct capitalization",
"errorDetail": "Expected: markdownlint; Actual: MARKDOWNLINT",
"errorContext": null,
"errorRange": null
} }
] ]

View file

@ -905,7 +905,7 @@ module.exports.missingStringValue = function missingStringValue(test) {
}; };
module.exports.ruleNamesUpperCase = function ruleNamesUpperCase(test) { module.exports.ruleNamesUpperCase = function ruleNamesUpperCase(test) {
test.expect(39); test.expect(40);
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
test.equal(rule.name, rule.name.toUpperCase(), "Rule name not upper-case."); test.equal(rule.name, rule.name.toUpperCase(), "Rule name not upper-case.");
}); });
@ -913,7 +913,7 @@ module.exports.ruleNamesUpperCase = function ruleNamesUpperCase(test) {
}; };
module.exports.uniqueAliases = function uniqueAliases(test) { module.exports.uniqueAliases = function uniqueAliases(test) {
test.expect(78); test.expect(80);
var tags = []; var tags = [];
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
Array.prototype.push.apply(tags, rule.tags); Array.prototype.push.apply(tags, rule.tags);
@ -930,7 +930,7 @@ module.exports.uniqueAliases = function uniqueAliases(test) {
}; };
module.exports.readme = function readme(test) { module.exports.readme = function readme(test) {
test.expect(101); test.expect(104);
var tagToRules = {}; var tagToRules = {};
rules.forEach(function forRule(rule) { rules.forEach(function forRule(rule) {
rule.tags.forEach(function forTag(tag) { rule.tags.forEach(function forTag(tag) {
@ -991,7 +991,7 @@ module.exports.readme = function readme(test) {
}; };
module.exports.doc = function doc(test) { module.exports.doc = function doc(test) {
test.expect(295); test.expect(303);
fs.readFile("doc/Rules.md", shared.utf8Encoding, fs.readFile("doc/Rules.md", shared.utf8Encoding,
function readFile(err, contents) { function readFile(err, contents) {
test.ifError(err); test.ifError(err);

13
test/proper-names.json Normal file
View file

@ -0,0 +1,13 @@
{
"default": true,
"MD044": {
"names": [
"markdownlint",
"JavaScript",
"Node.js",
"GitHub",
"npm",
"Internet Explorer"
]
}
}

45
test/proper-names.md Normal file
View file

@ -0,0 +1,45 @@
# markdownlint test file
Markdownlint is a tool {MD044}
JavaScript is a language
JavaScript is not Java
Nor is it Javascript. {MD044}
markdownlint runs on Node.js via npm
Node is an environment
Install into it with NPM {MD044}
Node.JSX is not a real thing
Nor is nodesjs or NPMI
npm can npm stand npm for npm many npm things
Writing npm is right, but NPM is wrong {MD044}
Get excited about Github! {MD044}
Share code on GitHub via Git
Internet Explorer is a web browser
OTOH, "internet explorer" is a job {MD044}
## node.js instructions {MD044}
Code in `javascript` {MD044}
Execute `via the node.js engine` {MD044}
* Use NPM {MD044}
> Run Markdownlint on your README {MD044}
Upload the code (to github) {MD044}
Link to [github](https://github.com/). {MD044}