mirror of
https://github.com/DavidAnson/markdownlint.git
synced 2025-12-17 14:30:12 +01:00
Add level parameter to MD002/MD025/MD041 (fixes #19).
This commit is contained in:
parent
7a1773ea77
commit
f2060b4607
6 changed files with 51 additions and 15 deletions
|
|
@ -45,7 +45,7 @@ playground for learning and exploring.
|
||||||
## Rules / Aliases
|
## Rules / Aliases
|
||||||
|
|
||||||
* **MD001** *header-increment* - Header levels should only increment by one level at a time
|
* **MD001** *header-increment* - Header levels should only increment by one level at a time
|
||||||
* **MD002** *first-header-h1* - First header should be a h1 header
|
* **MD002** *first-header-h1* - First header should be a top level header
|
||||||
* **MD003** *header-style* - Header style
|
* **MD003** *header-style* - Header style
|
||||||
* **MD004** *ul-style* - Unordered list style
|
* **MD004** *ul-style* - Unordered list style
|
||||||
* **MD005** *list-indent* - Inconsistent indentation for list items at the same level
|
* **MD005** *list-indent* - Inconsistent indentation for list items at the same level
|
||||||
|
|
|
||||||
17
doc/Rules.md
17
doc/Rules.md
|
|
@ -34,12 +34,14 @@ level at a time:
|
||||||
|
|
||||||
### Another Header 3
|
### Another Header 3
|
||||||
|
|
||||||
## MD002 - First header should be a h1 header
|
## MD002 - First header should be a top level header
|
||||||
|
|
||||||
Tags: headers
|
Tags: headers
|
||||||
|
|
||||||
Aliases: first-header-h1
|
Aliases: first-header-h1
|
||||||
|
|
||||||
|
Parameters: level (number; default 1)
|
||||||
|
|
||||||
This rule is triggered when the first header in the document isn't a h1 header:
|
This rule is triggered when the first header in the document isn't a h1 header:
|
||||||
|
|
||||||
## This isn't a H1 header
|
## This isn't a H1 header
|
||||||
|
|
@ -52,6 +54,9 @@ The first header in the document should be a h1 header:
|
||||||
|
|
||||||
## Then use a H2 for subsections
|
## Then use a H2 for subsections
|
||||||
|
|
||||||
|
Note: The `level` parameter can be used to change the top level (ex: to h2) in
|
||||||
|
cases where an h1 is added externally.
|
||||||
|
|
||||||
## MD003 - Header style
|
## MD003 - Header style
|
||||||
|
|
||||||
Tags: headers
|
Tags: headers
|
||||||
|
|
@ -535,6 +540,8 @@ Tags: headers
|
||||||
|
|
||||||
Aliases: single-h1
|
Aliases: single-h1
|
||||||
|
|
||||||
|
Parameters: level (number; default 1)
|
||||||
|
|
||||||
This rule is triggered when a top level header is in use (the first line of
|
This rule is triggered when a top level header is in use (the first line of
|
||||||
the file is a h1 header), and more than one h1 header is in use in the
|
the file is a h1 header), and more than one h1 header is in use in the
|
||||||
document:
|
document:
|
||||||
|
|
@ -558,6 +565,9 @@ serves as the title for the document. If this convention is in use, then there
|
||||||
can not be more than one title for the document, and the entire document
|
can not be more than one title for the document, and the entire document
|
||||||
should be contained within this header.
|
should be contained within this header.
|
||||||
|
|
||||||
|
Note: The `level` parameter can be used to change the top level (ex: to h2) in
|
||||||
|
cases where an h1 is added externally.
|
||||||
|
|
||||||
## MD026 - Trailing punctuation in header
|
## MD026 - Trailing punctuation in header
|
||||||
|
|
||||||
Tags: headers
|
Tags: headers
|
||||||
|
|
@ -1001,6 +1011,8 @@ Tags: headers
|
||||||
|
|
||||||
Aliases: first-line-h1
|
Aliases: first-line-h1
|
||||||
|
|
||||||
|
Parameters: level (number; default 1)
|
||||||
|
|
||||||
This rule is triggered when the first line in the file isn't a top level (h1)
|
This rule is triggered when the first line in the file isn't a top level (h1)
|
||||||
header:
|
header:
|
||||||
|
|
||||||
|
|
@ -1016,6 +1028,9 @@ To fix this, add a header to the top of your file:
|
||||||
This is a file with a top level header
|
This is a file with a top level header
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note: The `level` parameter can be used to change the top level (ex: to h2) in
|
||||||
|
cases where an h1 is added externally.
|
||||||
|
|
||||||
## MD042 - No empty links
|
## MD042 - No empty links
|
||||||
|
|
||||||
Tags: links
|
Tags: links
|
||||||
|
|
|
||||||
14
lib/rules.js
14
lib/rules.js
|
|
@ -170,13 +170,15 @@ module.exports = [
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "MD002",
|
"name": "MD002",
|
||||||
"desc": "First header should be a h1 header",
|
"desc": "First header should be a top level header",
|
||||||
"tags": [ "headers" ],
|
"tags": [ "headers" ],
|
||||||
"aliases": [ "first-header-h1" ],
|
"aliases": [ "first-header-h1" ],
|
||||||
"func": function MD002(params, errors) {
|
"func": function MD002(params, errors) {
|
||||||
|
var level = params.options.level || 1;
|
||||||
|
var tag = "h" + level;
|
||||||
params.tokens.every(function forToken(token) {
|
params.tokens.every(function forToken(token) {
|
||||||
if (token.type === "heading_open") {
|
if (token.type === "heading_open") {
|
||||||
if (token.tag !== "h1") {
|
if (token.tag !== tag) {
|
||||||
errors.push(token.lineNumber);
|
errors.push(token.lineNumber);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -536,9 +538,11 @@ module.exports = [
|
||||||
"tags": [ "headers" ],
|
"tags": [ "headers" ],
|
||||||
"aliases": [ "single-h1" ],
|
"aliases": [ "single-h1" ],
|
||||||
"func": function MD025(params, errors) {
|
"func": function MD025(params, errors) {
|
||||||
|
var level = params.options.level || 1;
|
||||||
|
var tag = "h" + level;
|
||||||
var hasTopLevelHeading = false;
|
var hasTopLevelHeading = false;
|
||||||
filterTokens(params, "heading_open", function forToken(token) {
|
filterTokens(params, "heading_open", function forToken(token) {
|
||||||
if (token.tag === "h1") {
|
if (token.tag === tag) {
|
||||||
if (hasTopLevelHeading) {
|
if (hasTopLevelHeading) {
|
||||||
errors.push(token.lineNumber);
|
errors.push(token.lineNumber);
|
||||||
} else if (token.lineNumber === 1) {
|
} else if (token.lineNumber === 1) {
|
||||||
|
|
@ -886,6 +890,8 @@ module.exports = [
|
||||||
"tags": [ "headers" ],
|
"tags": [ "headers" ],
|
||||||
"aliases": [ "first-line-h1" ],
|
"aliases": [ "first-line-h1" ],
|
||||||
"func": function MD041(params, errors) {
|
"func": function MD041(params, errors) {
|
||||||
|
var level = params.options.level || 1;
|
||||||
|
var tag = "h" + level;
|
||||||
var firstHeader = null;
|
var firstHeader = null;
|
||||||
params.tokens.every(function forToken(token) {
|
params.tokens.every(function forToken(token) {
|
||||||
if (token.type === "heading_open") {
|
if (token.type === "heading_open") {
|
||||||
|
|
@ -898,7 +904,7 @@ module.exports = [
|
||||||
});
|
});
|
||||||
if (!firstHeader ||
|
if (!firstHeader ||
|
||||||
(firstHeader.lineNumber !== 1) ||
|
(firstHeader.lineNumber !== 1) ||
|
||||||
(firstHeader.tag !== "h1")) {
|
(firstHeader.tag !== tag)) {
|
||||||
errors.push(1);
|
errors.push(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
test/alternate-top-level-header.json
Normal file
12
test/alternate-top-level-header.json
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"default": true,
|
||||||
|
"MD002": {
|
||||||
|
"level": 2
|
||||||
|
},
|
||||||
|
"MD025": {
|
||||||
|
"level": 2
|
||||||
|
},
|
||||||
|
"MD041": {
|
||||||
|
"level": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
3
test/alternate-top-level-header.md
Normal file
3
test/alternate-top-level-header.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
## A level 2 top level header
|
||||||
|
|
||||||
|
## Another one {MD025}
|
||||||
|
|
@ -114,7 +114,7 @@ module.exports.resultFormatting = function resultFormatting(test) {
|
||||||
var actualMessage = actualResult.toString();
|
var actualMessage = actualResult.toString();
|
||||||
var expectedMessage =
|
var expectedMessage =
|
||||||
"./test/atx_header_spacing.md: 3: MD002" +
|
"./test/atx_header_spacing.md: 3: MD002" +
|
||||||
" First header should be a h1 header\n" +
|
" First header should be a top level header\n" +
|
||||||
"./test/atx_header_spacing.md: 1: MD018" +
|
"./test/atx_header_spacing.md: 1: MD018" +
|
||||||
" No space after hash on atx style header\n" +
|
" No space after hash on atx style header\n" +
|
||||||
"./test/atx_header_spacing.md: 3: MD019" +
|
"./test/atx_header_spacing.md: 3: MD019" +
|
||||||
|
|
@ -122,12 +122,12 @@ module.exports.resultFormatting = function resultFormatting(test) {
|
||||||
"./test/atx_header_spacing.md: 5: MD019" +
|
"./test/atx_header_spacing.md: 5: MD019" +
|
||||||
" Multiple spaces after hash on atx style header\n" +
|
" Multiple spaces after hash on atx style header\n" +
|
||||||
"./test/first_header_bad_atx.md: 1: MD002" +
|
"./test/first_header_bad_atx.md: 1: MD002" +
|
||||||
" First header should be a h1 header";
|
" First header should be a top level header";
|
||||||
test.equal(actualMessage, expectedMessage, "Incorrect message (name).");
|
test.equal(actualMessage, expectedMessage, "Incorrect message (name).");
|
||||||
actualMessage = actualResult.toString(true);
|
actualMessage = actualResult.toString(true);
|
||||||
expectedMessage =
|
expectedMessage =
|
||||||
"./test/atx_header_spacing.md: 3: first-header-h1" +
|
"./test/atx_header_spacing.md: 3: first-header-h1" +
|
||||||
" First header should be a h1 header\n" +
|
" First header should be a top level header\n" +
|
||||||
"./test/atx_header_spacing.md: 1: no-missing-space-atx" +
|
"./test/atx_header_spacing.md: 1: no-missing-space-atx" +
|
||||||
" No space after hash on atx style header\n" +
|
" No space after hash on atx style header\n" +
|
||||||
"./test/atx_header_spacing.md: 3: no-multiple-space-atx" +
|
"./test/atx_header_spacing.md: 3: no-multiple-space-atx" +
|
||||||
|
|
@ -135,7 +135,7 @@ module.exports.resultFormatting = function resultFormatting(test) {
|
||||||
"./test/atx_header_spacing.md: 5: no-multiple-space-atx" +
|
"./test/atx_header_spacing.md: 5: no-multiple-space-atx" +
|
||||||
" Multiple spaces after hash on atx style header\n" +
|
" Multiple spaces after hash on atx style header\n" +
|
||||||
"./test/first_header_bad_atx.md: 1: first-header-h1" +
|
"./test/first_header_bad_atx.md: 1: first-header-h1" +
|
||||||
" First header should be a h1 header";
|
" First header should be a top level header";
|
||||||
test.equal(actualMessage, expectedMessage, "Incorrect message (alias).");
|
test.equal(actualMessage, expectedMessage, "Incorrect message (alias).");
|
||||||
test.done();
|
test.done();
|
||||||
});
|
});
|
||||||
|
|
@ -165,7 +165,7 @@ module.exports.resultFormattingSync = function resultFormattingSync(test) {
|
||||||
var actualMessage = actualResult.toString();
|
var actualMessage = actualResult.toString();
|
||||||
var expectedMessage =
|
var expectedMessage =
|
||||||
"./test/atx_header_spacing.md: 3: MD002" +
|
"./test/atx_header_spacing.md: 3: MD002" +
|
||||||
" First header should be a h1 header\n" +
|
" First header should be a top level header\n" +
|
||||||
"./test/atx_header_spacing.md: 1: MD018" +
|
"./test/atx_header_spacing.md: 1: MD018" +
|
||||||
" No space after hash on atx style header\n" +
|
" No space after hash on atx style header\n" +
|
||||||
"./test/atx_header_spacing.md: 3: MD019" +
|
"./test/atx_header_spacing.md: 3: MD019" +
|
||||||
|
|
@ -173,12 +173,12 @@ module.exports.resultFormattingSync = function resultFormattingSync(test) {
|
||||||
"./test/atx_header_spacing.md: 5: MD019" +
|
"./test/atx_header_spacing.md: 5: MD019" +
|
||||||
" Multiple spaces after hash on atx style header\n" +
|
" Multiple spaces after hash on atx style header\n" +
|
||||||
"./test/first_header_bad_atx.md: 1: MD002" +
|
"./test/first_header_bad_atx.md: 1: MD002" +
|
||||||
" First header should be a h1 header";
|
" First header should be a top level header";
|
||||||
test.equal(actualMessage, expectedMessage, "Incorrect message (name).");
|
test.equal(actualMessage, expectedMessage, "Incorrect message (name).");
|
||||||
actualMessage = actualResult.toString(true);
|
actualMessage = actualResult.toString(true);
|
||||||
expectedMessage =
|
expectedMessage =
|
||||||
"./test/atx_header_spacing.md: 3: first-header-h1" +
|
"./test/atx_header_spacing.md: 3: first-header-h1" +
|
||||||
" First header should be a h1 header\n" +
|
" First header should be a top level header\n" +
|
||||||
"./test/atx_header_spacing.md: 1: no-missing-space-atx" +
|
"./test/atx_header_spacing.md: 1: no-missing-space-atx" +
|
||||||
" No space after hash on atx style header\n" +
|
" No space after hash on atx style header\n" +
|
||||||
"./test/atx_header_spacing.md: 3: no-multiple-space-atx" +
|
"./test/atx_header_spacing.md: 3: no-multiple-space-atx" +
|
||||||
|
|
@ -186,7 +186,7 @@ module.exports.resultFormattingSync = function resultFormattingSync(test) {
|
||||||
"./test/atx_header_spacing.md: 5: no-multiple-space-atx" +
|
"./test/atx_header_spacing.md: 5: no-multiple-space-atx" +
|
||||||
" Multiple spaces after hash on atx style header\n" +
|
" Multiple spaces after hash on atx style header\n" +
|
||||||
"./test/first_header_bad_atx.md: 1: first-header-h1" +
|
"./test/first_header_bad_atx.md: 1: first-header-h1" +
|
||||||
" First header should be a h1 header";
|
" First header should be a top level header";
|
||||||
test.equal(actualMessage, expectedMessage, "Incorrect message (alias).");
|
test.equal(actualMessage, expectedMessage, "Incorrect message (alias).");
|
||||||
test.done();
|
test.done();
|
||||||
};
|
};
|
||||||
|
|
@ -857,7 +857,7 @@ module.exports.readme = function readme(test) {
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports.doc = function doc(test) {
|
module.exports.doc = function doc(test) {
|
||||||
test.expect(289);
|
test.expect(292);
|
||||||
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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue