diff --git a/lib/rules.js b/lib/rules.js index 2e2f5d32..efb64898 100644 --- a/lib/rules.js +++ b/lib/rules.js @@ -270,7 +270,7 @@ module.exports = [ "desc": "No space after hash on atx style header", "func": function MD018(params, errors) { params.lines.forEach(function forLine(line, lineIndex) { - if (/^#+[^#\s]/.test(line)) { + if (/^#+[^#\s]/.test(line) && !/#$/.test(line)) { errors.push(lineIndex + 1); } }); @@ -291,6 +291,33 @@ module.exports = [ } }, + { + "name": "MD020", + "desc": "No space inside hashes on closed atx style header", + "func": function MD020(params, errors) { + params.lines.forEach(function forLine(line, lineIndex) { + if (/^#+[^#]*[^\\]#+$/.test(line) && + (/^#+[^#\s]/.test(line) || /[^#\s]#+$/.test(line))) { + errors.push(lineIndex + 1); + } + }); + } + }, + + { + "name": "MD021", + "desc": "Multiple spaces inside hashes on closed atx style header", + "func": function MD021(params, errors) { + filterTokens(params.tokens, "heading_open") + .forEach(function forToken(token) { + if ((headingStyleFor(token) === "atx_closed") && + (/^#+\s\s/.test(token.line) || /\s\s#+$/.test(token.line))) { + errors.push(token.lineNumber); + } + }); + } + }, + { "name": "MD028", "desc": "Blank line inside blockquote", diff --git a/test/atx_closed_header_spacing.json b/test/atx_closed_header_spacing.json new file mode 100644 index 00000000..2f37f5bb --- /dev/null +++ b/test/atx_closed_header_spacing.json @@ -0,0 +1,4 @@ +{ + "default": true, + "MD002": false +} diff --git a/test/atx_closed_header_spacing.md b/test/atx_closed_header_spacing.md new file mode 100644 index 00000000..e9a296b3 --- /dev/null +++ b/test/atx_closed_header_spacing.md @@ -0,0 +1,17 @@ +#Header 1 {MD020} # + +## Header 2 {MD020}## + +##Header 3 {MD020}## + +## Header 4 {MD021} ## + +## Header 5 {MD021} ## + +## Header 6 {MD021} ## + +## Header 7 {MD021} ## + +## Header 8 \# + +## Header 9 \#