2018-01-21 21:44:25 -08:00
|
|
|
// @ts-check
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
2018-04-27 22:05:34 -07:00
|
|
|
const shared = require("./shared");
|
2019-03-28 22:06:42 -07:00
|
|
|
const { addError, filterTokens, forEachLine, includesSorted, rangeFromRegExp,
|
|
|
|
trimRight } = shared;
|
2018-01-21 21:44:25 -08:00
|
|
|
|
2018-04-27 22:05:34 -07:00
|
|
|
const trailingSpaceRe = /\s+$/;
|
2018-01-21 21:44:25 -08:00
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
"names": [ "MD009", "no-trailing-spaces" ],
|
|
|
|
"description": "Trailing spaces",
|
|
|
|
"tags": [ "whitespace" ],
|
|
|
|
"function": function MD009(params, onError) {
|
2018-04-30 21:34:19 -07:00
|
|
|
let brSpaces = params.config.br_spaces;
|
|
|
|
if (brSpaces === undefined) {
|
|
|
|
brSpaces = 2;
|
|
|
|
}
|
2018-04-27 22:05:34 -07:00
|
|
|
const listItemEmptyLines = params.config.list_item_empty_lines;
|
|
|
|
const allowListItemEmptyLines =
|
2018-01-21 21:44:25 -08:00
|
|
|
(listItemEmptyLines === undefined) ? false : !!listItemEmptyLines;
|
2018-04-27 22:05:34 -07:00
|
|
|
const listItemLineNumbers = [];
|
2018-01-21 21:44:25 -08:00
|
|
|
if (allowListItemEmptyLines) {
|
2019-03-28 22:06:42 -07:00
|
|
|
filterTokens(params, "list_item_open", (token) => {
|
2018-04-27 22:05:34 -07:00
|
|
|
for (let i = token.map[0]; i < token.map[1]; i++) {
|
2018-01-21 21:44:25 -08:00
|
|
|
listItemLineNumbers.push(i + 1);
|
|
|
|
}
|
|
|
|
});
|
2019-03-28 22:06:42 -07:00
|
|
|
listItemLineNumbers.sort((a, b) => a - b);
|
2018-01-21 21:44:25 -08:00
|
|
|
}
|
2018-04-30 21:34:19 -07:00
|
|
|
const expected = (brSpaces < 2) ? 0 : brSpaces;
|
2019-03-28 22:06:42 -07:00
|
|
|
forEachLine((line, lineIndex) => {
|
2018-04-27 22:05:34 -07:00
|
|
|
const lineNumber = lineIndex + 1;
|
2018-01-21 21:44:25 -08:00
|
|
|
if (trailingSpaceRe.test(line) &&
|
2019-03-28 22:06:42 -07:00
|
|
|
!includesSorted(listItemLineNumbers, lineNumber)) {
|
|
|
|
const actual = line.length - trimRight(line).length;
|
2018-04-30 21:34:19 -07:00
|
|
|
if (expected !== actual) {
|
2019-03-28 22:06:42 -07:00
|
|
|
addError(onError, lineNumber,
|
2018-04-30 21:34:19 -07:00
|
|
|
"Expected: " + (expected === 0 ? "" : "0 or ") +
|
|
|
|
expected + "; Actual: " + actual,
|
2019-03-28 22:06:42 -07:00
|
|
|
null, rangeFromRegExp(line, trailingSpaceRe));
|
2018-04-30 21:34:19 -07:00
|
|
|
}
|
2018-01-21 21:44:25 -08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|