Update MD031/blanks-around-fences and MD032/blanks-around-lists to ignore comments and blockquotes (fixes #171, fixes #172).

This commit is contained in:
David Anson 2019-03-20 21:48:18 -07:00
parent df2507f030
commit 1db87ef0c6
5 changed files with 120 additions and 16 deletions

View file

@ -3,17 +3,19 @@
"use strict";
const shared = require("./shared");
const { addErrorContext, forEachLine, isBlankLine } = shared;
module.exports = {
"names": [ "MD031", "blanks-around-fences" ],
"description": "Fenced code blocks should be surrounded by blank lines",
"tags": [ "code", "blank_lines" ],
"function": function MD031(params, onError) {
const lines = params.lines;
shared.forEachLine(function forLine(line, i, inCode, onFence) {
if (((onFence > 0) && (i - 1 >= 0) && lines[i - 1].length) ||
((onFence < 0) && (i + 1 < lines.length) && lines[i + 1].length)) {
shared.addErrorContext(onError, i + 1, lines[i].trim());
const { lines } = params;
const { length } = lines;
forEachLine(function forLine(line, i, inCode, onFence) {
if (((onFence > 0) && (i - 1 >= 0) && !isBlankLine(lines[i - 1])) ||
((onFence < 0) && (i + 1 < length) && !isBlankLine(lines[i + 1]))) {
addErrorContext(onError, i + 1, lines[i].trim());
}
});
}

View file

@ -3,24 +3,22 @@
"use strict";
const shared = require("./shared");
const blankLineRe = /^[\s>]*$/;
const { addErrorContext, flattenLists, isBlankLine } = shared;
module.exports = {
"names": [ "MD032", "blanks-around-lists" ],
"description": "Lists should be surrounded by blank lines",
"tags": [ "bullet", "ul", "ol", "blank_lines" ],
"function": function MD032(params, onError) {
shared.flattenLists().filter((list) => !list.nesting).forEach((list) => {
const firstLineIndex = list.open.map[0];
if (!blankLineRe.test(params.lines[firstLineIndex - 1] || "")) {
shared.addErrorContext(
onError, firstLineIndex + 1, params.lines[firstLineIndex].trim());
const { lines } = params;
flattenLists().filter((list) => !list.nesting).forEach((list) => {
const firstIndex = list.open.map[0];
if (!isBlankLine(lines[firstIndex - 1])) {
addErrorContext(onError, firstIndex + 1, lines[firstIndex].trim());
}
const bottomLineIndex = list.lastLineIndex - 1;
if (!blankLineRe.test(params.lines[bottomLineIndex + 1] || "")) {
shared.addErrorContext(
onError, bottomLineIndex + 1, params.lines[bottomLineIndex].trim());
const lastIndex = list.lastLineIndex - 1;
if (!isBlankLine(lines[lastIndex + 1])) {
addErrorContext(onError, lastIndex + 1, lines[lastIndex].trim());
}
});
}

View file

@ -64,6 +64,13 @@ module.exports.isEmptyString = function isEmptyString(str) {
return str.length === 0;
};
// Returns true iff the input line is blank (no content)
// Example: Contains nothing, whitespace, or comments
const blankLineRe = />|(?:<!--.*?-->)/g;
module.exports.isBlankLine = function isBlankLine(line) {
return !line || !line.trim() || !line.replace(blankLineRe, "").trim();
};
// Replaces the text of all properly-formatted HTML comments with whitespace
// This preserves the line/column information for the rest of the document
// Trailing whitespace is avoided with a '\' character in the last column

61
test/blanks-around.md Normal file
View file

@ -0,0 +1,61 @@
# Blanks Around
---
## MD022/blanks-around-headings
>
### Alpha {MD022}
> >
<!-- comment -->
### Beta {MD022}
<!-- comments --><!-- comments -->
> Text
>
> ### Gamma
> >
> > Text
---
## MD031/blanks-around-fences
> >
```js
console.log();
```
>
<!-- prettier-ignore -->
```js
console.log();
```
<!-- prettier-ignore -->
> Text
>
> ```js
> console.log();
> ```
> >
> >Text
---
## MD032/blanks-around-lists
>
- List item
>>
<!--comments--><!-- comments -->
- List item
<!--comment-->
> Text
>
> - List item
>>
>> Text

View file

@ -1396,6 +1396,42 @@ function clearHtmlCommentTextEmbedded(test) {
test.done();
};
module.exports.isBlankLine = function isBlankLine(test) {
test.expect(25);
const blankLines = [
null,
"",
" ",
" ",
"\t\t\t",
"\r",
"\n",
"\t\r\n",
" <!-- text --> ",
"<!--text-->",
"<!---->",
"<!-- text -->\t<!-- text -->",
">",
"> ",
"> > > \t",
"> <!--text-->",
">><!--text-->"
];
blankLines.forEach((line) => test.ok(shared.isBlankLine(line), line));
const nonBlankLines = [
"text",
" text ",
".",
"> .",
"<!--text--> text",
"<!--->",
"<!--",
"-->"
];
nonBlankLines.forEach((line) => test.ok(!shared.isBlankLine(line), line));
test.done();
};
module.exports.trimLeftRight = function trimLeftRight(test) {
const inputs = [
"text text",