markdownlint/lib/md038.mjs

74 lines
2.8 KiB
JavaScript
Raw Normal View History

// @ts-check
import { addErrorContext } from "../helpers/helpers.cjs";
import { getDescendantsByType } from "../helpers/micromark-helpers.cjs";
import { filterByTypesCached } from "./cache.mjs";
/** @type {import("markdownlint").Rule} */
export default {
"names": [ "MD038", "no-space-in-code" ],
"description": "Spaces inside code span elements",
"tags": [ "whitespace", "code" ],
"parser": "micromark",
"function": function MD038(params, onError) {
const codeTexts = filterByTypesCached([ "codeText" ]);
for (const codeText of codeTexts) {
const datas = getDescendantsByType(codeText, [ "codeTextData" ]);
if (datas.length > 0) {
const paddings = getDescendantsByType(codeText, [ "codeTextPadding" ]);
// Check for extra space at start of code
const startPadding = paddings[0];
const startData = datas[0];
const startMatch = /^(\s+)(\S)/.exec(startData.text) || [ null, "", "" ];
const startBacktick = (startMatch[2] === "`");
const startCount = startMatch[1].length - ((startBacktick && !startPadding) ? 1 : 0);
const startSpaces = startCount > 0;
// Check for extra space at end of code
const endPadding = paddings[paddings.length - 1];
const endData = datas[datas.length - 1];
const endMatch = /(\S)(\s+)$/.exec(endData.text) || [ null, "", "" ];
const endBacktick = (endMatch[1] === "`");
const endCount = endMatch[2].length - ((endBacktick && !endPadding) ? 1 : 0);
const endSpaces = endCount > 0;
// Check if safe to remove 1-space padding
const removePadding = startSpaces && endSpaces && startPadding && endPadding && !startBacktick && !endBacktick;
const context = codeText.text;
// If extra space at start, report violation
if (startSpaces) {
const startColumn = (removePadding ? startPadding : startData).startColumn;
const length = startCount + (removePadding ? startPadding.text.length : 0);
addErrorContext(
onError,
startData.startLine,
context,
true,
false,
[ startColumn, length ],
{
"editColumn": startColumn,
"deleteCount": length
}
);
}
// If extra space at end, report violation
if (endSpaces) {
const endColumn = (removePadding ? endPadding : endData).endColumn;
const length = endCount + (removePadding ? endPadding.text.length : 0);
addErrorContext(
onError,
endData.endLine,
context,
false,
true,
[ endColumn - length, length ],
{
"editColumn": endColumn - length,
"deleteCount": length
}
);
}
}
}
}
};