mirror of
https://github.com/DavidAnson/markdownlint.git
synced 2025-09-22 05:40:48 +02:00
Remove regexp from rule definition to simplify API.
This commit is contained in:
parent
d47091078e
commit
a0e3b4db90
3 changed files with 67 additions and 154 deletions
136
lib/rules.js
136
lib/rules.js
|
@ -22,10 +22,6 @@ var tabRe = /\t+/;
|
|||
var trailingPunctuationRe = /.$/;
|
||||
var trailingSpaceRe = /\s+$/;
|
||||
var defaultLineLength = 80;
|
||||
function longLineReFunc(options) {
|
||||
var lineLength = options.line_length || defaultLineLength;
|
||||
return new RegExp("^(.{" + lineLength + "})(.*\\s.*)$");
|
||||
}
|
||||
|
||||
// Escapes a string for use in a RegExp
|
||||
function escapeForRegExp(str) {
|
||||
|
@ -219,12 +215,27 @@ function addErrorContext(onError, lineNumber, context, left, right, range) {
|
|||
addError(onError, lineNumber, null, context, range);
|
||||
}
|
||||
|
||||
// Returns a range object for a line by applying a RegExp
|
||||
function rangeFromRegExp(line, regexp) {
|
||||
var range = null;
|
||||
var match = line.match(regexp);
|
||||
if (match) {
|
||||
var column = match.index + 1;
|
||||
var length = match[0].length;
|
||||
if (match[2]) {
|
||||
column += match[1].length;
|
||||
length -= match[1].length;
|
||||
}
|
||||
range = [ column, length ];
|
||||
}
|
||||
return range;
|
||||
}
|
||||
|
||||
module.exports = [
|
||||
{
|
||||
"names": [ "MD001", "header-increment" ],
|
||||
"desc": "Header levels should only increment by one level at a time",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD001(params, onError) {
|
||||
var prevLevel = 0;
|
||||
filterTokens(params, "heading_open", function forToken(token) {
|
||||
|
@ -242,7 +253,6 @@ module.exports = [
|
|||
"names": [ "MD002", "first-header-h1" ],
|
||||
"desc": "First header should be a top level header",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD002(params, onError) {
|
||||
var level = params.options.level || 1;
|
||||
var tag = "h" + level;
|
||||
|
@ -260,7 +270,6 @@ module.exports = [
|
|||
"names": [ "MD003", "header-style" ],
|
||||
"desc": "Header style",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD003(params, onError) {
|
||||
var style = params.options.style || "consistent";
|
||||
filterTokens(params, "heading_open", function forToken(token) {
|
||||
|
@ -297,7 +306,6 @@ module.exports = [
|
|||
"names": [ "MD004", "ul-style" ],
|
||||
"desc": "Unordered list style",
|
||||
"tags": [ "bullet", "ul" ],
|
||||
"regexp": listItemMarkerRe,
|
||||
"func": function MD004(params, onError) {
|
||||
var style = params.options.style || "consistent";
|
||||
var expectedStyle = style;
|
||||
|
@ -316,11 +324,13 @@ module.exports = [
|
|||
nestingStyles[nesting] = itemStyle;
|
||||
} else {
|
||||
addErrorDetailIf(onError, item.lineNumber,
|
||||
nestingStyles[nesting], itemStyle);
|
||||
nestingStyles[nesting], itemStyle, null,
|
||||
rangeFromRegExp(item.line, listItemMarkerRe));
|
||||
}
|
||||
} else {
|
||||
addErrorDetailIf(onError, item.lineNumber,
|
||||
expectedStyle, itemStyle);
|
||||
expectedStyle, itemStyle, null,
|
||||
rangeFromRegExp(item.line, listItemMarkerRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -332,12 +342,12 @@ module.exports = [
|
|||
"names": [ "MD005", "list-indent" ],
|
||||
"desc": "Inconsistent indentation for list items at the same level",
|
||||
"tags": [ "bullet", "ul", "indentation" ],
|
||||
"regexp": listItemMarkerRe,
|
||||
"func": function MD005(params, onError) {
|
||||
flattenLists(params).forEach(function forList(list) {
|
||||
var indent = indentFor(list.items[0]);
|
||||
list.items.forEach(function forItem(item) {
|
||||
addErrorDetailIf(onError, item.lineNumber, indent, indentFor(item));
|
||||
addErrorDetailIf(onError, item.lineNumber, indent, indentFor(item),
|
||||
null, rangeFromRegExp(item.line, listItemMarkerRe));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -347,12 +357,12 @@ module.exports = [
|
|||
"names": [ "MD006", "ul-start-left" ],
|
||||
"desc": "Consider starting bulleted lists at the beginning of the line",
|
||||
"tags": [ "bullet", "ul", "indentation" ],
|
||||
"regexp": listItemMarkerRe,
|
||||
"func": function MD006(params, onError) {
|
||||
flattenLists(params).forEach(function forList(list) {
|
||||
if (list.unordered && !list.nesting) {
|
||||
addErrorDetailIf(onError, list.open.lineNumber,
|
||||
0, indentFor(list.open));
|
||||
0, indentFor(list.open), null,
|
||||
rangeFromRegExp(list.open.line, listItemMarkerRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -362,7 +372,6 @@ module.exports = [
|
|||
"names": [ "MD007", "ul-indent" ],
|
||||
"desc": "Unordered list indentation",
|
||||
"tags": [ "bullet", "ul", "indentation" ],
|
||||
"regexp": listItemMarkerRe,
|
||||
"func": function MD007(params, onError) {
|
||||
var optionsIndent = params.options.indent || 2;
|
||||
var prevIndent = 0;
|
||||
|
@ -371,7 +380,8 @@ module.exports = [
|
|||
var indent = indentFor(list.open);
|
||||
if (indent > prevIndent) {
|
||||
addErrorDetailIf(onError, list.open.lineNumber,
|
||||
prevIndent + optionsIndent, indent);
|
||||
prevIndent + optionsIndent, indent, null,
|
||||
rangeFromRegExp(list.open.line, listItemMarkerRe));
|
||||
}
|
||||
prevIndent = indent;
|
||||
}
|
||||
|
@ -383,7 +393,6 @@ module.exports = [
|
|||
"names": [ "MD009", "no-trailing-spaces" ],
|
||||
"desc": "Trailing spaces",
|
||||
"tags": [ "whitespace" ],
|
||||
"regexp": trailingSpaceRe,
|
||||
"func": function MD009(params, onError) {
|
||||
var brSpaces = params.options.br_spaces || 0;
|
||||
var listItemEmptyLines = params.options.list_item_empty_lines;
|
||||
|
@ -403,7 +412,8 @@ module.exports = [
|
|||
(listItemLineNumbers.indexOf(lineNumber) === -1)) {
|
||||
var expected = (brSpaces < 2) ? 0 : brSpaces;
|
||||
addErrorDetailIf(onError, lineNumber,
|
||||
expected, line.length - shared.trimRight(line).length);
|
||||
expected, line.length - shared.trimRight(line).length, null,
|
||||
rangeFromRegExp(line, trailingSpaceRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -413,14 +423,14 @@ module.exports = [
|
|||
"names": [ "MD010", "no-hard-tabs" ],
|
||||
"desc": "Hard tabs",
|
||||
"tags": [ "whitespace", "hard_tab" ],
|
||||
"regexp": tabRe,
|
||||
"func": function MD010(params, onError) {
|
||||
var codeBlocks = params.options.code_blocks;
|
||||
var includeCodeBlocks = (codeBlocks === undefined) ? true : !!codeBlocks;
|
||||
forEachLine(params, function forLine(line, lineIndex, inCode) {
|
||||
if (tabRe.test(line) && (!inCode || includeCodeBlocks)) {
|
||||
addError(onError, lineIndex + 1,
|
||||
"Column: " + (line.indexOf("\t") + 1));
|
||||
"Column: " + (line.indexOf("\t") + 1), null,
|
||||
rangeFromRegExp(line, tabRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -430,12 +440,12 @@ module.exports = [
|
|||
"names": [ "MD011", "no-reversed-links" ],
|
||||
"desc": "Reversed link syntax",
|
||||
"tags": [ "links" ],
|
||||
"regexp": reversedLinkRe,
|
||||
"func": function MD011(params, onError) {
|
||||
forEachInlineChild(params, "text", function forToken(token) {
|
||||
var match = reversedLinkRe.exec(token.content);
|
||||
if (match) {
|
||||
addError(onError, token.lineNumber, match[0]);
|
||||
addError(onError, token.lineNumber, match[0], null,
|
||||
rangeFromRegExp(token.line, reversedLinkRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -445,7 +455,6 @@ module.exports = [
|
|||
"names": [ "MD012", "no-multiple-blanks" ],
|
||||
"desc": "Multiple consecutive blank lines",
|
||||
"tags": [ "whitespace", "blank_lines" ],
|
||||
"regexp": null,
|
||||
"func": function MD012(params, onError) {
|
||||
var maximum = params.options.maximum || 1;
|
||||
var count = 0;
|
||||
|
@ -462,7 +471,6 @@ module.exports = [
|
|||
"names": [ "MD013", "line-length" ],
|
||||
"desc": "Line length",
|
||||
"tags": [ "line_length" ],
|
||||
"regexp": longLineReFunc,
|
||||
"func": function MD013(params, onError) {
|
||||
var lineLength = params.options.line_length || defaultLineLength;
|
||||
var codeBlocks = params.options.code_blocks;
|
||||
|
@ -498,7 +506,7 @@ module.exports = [
|
|||
linkOnlyLineNumbers.push(token.lineNumber);
|
||||
}
|
||||
});
|
||||
var longLineRe = longLineReFunc(params.options);
|
||||
var longLineRe = new RegExp("^(.{" + lineLength + "})(.*\\s.*)$");
|
||||
var labelRe = /^\s*\[.*[^\\]]:/;
|
||||
forEachLine(params,
|
||||
function forLine(line, lineIndex, inCode, onFence, inTable) {
|
||||
|
@ -509,7 +517,8 @@ module.exports = [
|
|||
(linkOnlyLineNumbers.indexOf(lineNumber) < 0) &&
|
||||
longLineRe.test(line) &&
|
||||
!labelRe.test(line)) {
|
||||
addErrorDetailIf(onError, lineNumber, lineLength, line.length);
|
||||
addErrorDetailIf(onError, lineNumber, lineLength, line.length, null,
|
||||
rangeFromRegExp(line, longLineRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -519,7 +528,6 @@ module.exports = [
|
|||
"names": [ "MD014", "commands-show-output" ],
|
||||
"desc": "Dollar signs used before commands without showing output",
|
||||
"tags": [ "code" ],
|
||||
"regexp": dollarCommandRe,
|
||||
"func": function MD014(params, onError) {
|
||||
[ "code_block", "fence" ].forEach(function forType(type) {
|
||||
filterTokens(params, type, function forToken(token) {
|
||||
|
@ -529,7 +537,8 @@ module.exports = [
|
|||
return !line || (allBlank = false) || dollarCommandRe.test(line);
|
||||
}) && !allBlank) {
|
||||
addErrorContext(onError, token.lineNumber,
|
||||
token.content.split(shared.newLineRe)[0].trim());
|
||||
token.content.split(shared.newLineRe)[0].trim(), null, null,
|
||||
rangeFromRegExp(token.line, dollarCommandRe));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -540,11 +549,11 @@ module.exports = [
|
|||
"names": [ "MD018", "no-missing-space-atx" ],
|
||||
"desc": "No space after hash on atx style header",
|
||||
"tags": [ "headers", "atx", "spaces" ],
|
||||
"regexp": atxHeaderSpaceRe,
|
||||
"func": function MD018(params, onError) {
|
||||
forEachLine(params, function forLine(line, lineIndex, inCode) {
|
||||
if (!inCode && /^#+[^#\s]/.test(line) && !/#$/.test(line)) {
|
||||
addErrorContext(onError, lineIndex + 1, line.trim());
|
||||
addErrorContext(onError, lineIndex + 1, line.trim(), null, null,
|
||||
rangeFromRegExp(line, atxHeaderSpaceRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -554,12 +563,12 @@ module.exports = [
|
|||
"names": [ "MD019", "no-multiple-space-atx" ],
|
||||
"desc": "Multiple spaces after hash on atx style header",
|
||||
"tags": [ "headers", "atx", "spaces" ],
|
||||
"regexp": atxHeaderSpaceRe,
|
||||
"func": function MD019(params, onError) {
|
||||
filterTokens(params, "heading_open", function forToken(token) {
|
||||
if ((headingStyleFor(token) === "atx") &&
|
||||
/^#+\s\s/.test(token.line)) {
|
||||
addErrorContext(onError, token.lineNumber, token.line.trim());
|
||||
addErrorContext(onError, token.lineNumber, token.line.trim(),
|
||||
null, null, rangeFromRegExp(token.line, atxHeaderSpaceRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -569,14 +578,14 @@ module.exports = [
|
|||
"names": [ "MD020", "no-missing-space-closed-atx" ],
|
||||
"desc": "No space inside hashes on closed atx style header",
|
||||
"tags": [ "headers", "atx_closed", "spaces" ],
|
||||
"regexp": atxClosedHeaderNoSpaceRe,
|
||||
"func": function MD020(params, onError) {
|
||||
forEachLine(params, function forLine(line, lineIndex, inCode) {
|
||||
if (!inCode && /^#+[^#]*[^\\]#+$/.test(line)) {
|
||||
var left = /^#+[^#\s]/.test(line);
|
||||
var right = /[^#\s]#+$/.test(line);
|
||||
if (left || right) {
|
||||
addErrorContext(onError, lineIndex + 1, line.trim(), left, right);
|
||||
addErrorContext(onError, lineIndex + 1, line.trim(), left, right,
|
||||
rangeFromRegExp(line, atxClosedHeaderNoSpaceRe));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -587,15 +596,14 @@ module.exports = [
|
|||
"names": [ "MD021", "no-multiple-space-closed-atx" ],
|
||||
"desc": "Multiple spaces inside hashes on closed atx style header",
|
||||
"tags": [ "headers", "atx_closed", "spaces" ],
|
||||
"regexp": atxClosedHeaderSpaceRe,
|
||||
"func": function MD021(params, onError) {
|
||||
filterTokens(params, "heading_open", function forToken(token) {
|
||||
if (headingStyleFor(token) === "atx_closed") {
|
||||
var left = /^#+\s\s/.test(token.line);
|
||||
var right = /\s\s#+$/.test(token.line);
|
||||
if (left || right) {
|
||||
addErrorContext(onError, token.lineNumber,
|
||||
token.line.trim(), left, right);
|
||||
addErrorContext(onError, token.lineNumber, token.line.trim(),
|
||||
left, right, rangeFromRegExp(token.line, atxClosedHeaderSpaceRe));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -606,7 +614,6 @@ module.exports = [
|
|||
"names": [ "MD022", "blanks-around-headers" ],
|
||||
"desc": "Headers should be surrounded by blank lines",
|
||||
"tags": [ "headers", "blank_lines" ],
|
||||
"regexp": null,
|
||||
"func": function MD022(params, onError) {
|
||||
var prevHeadingLineNumber = 0;
|
||||
var prevMaxLineIndex = -1;
|
||||
|
@ -640,11 +647,11 @@ module.exports = [
|
|||
"names": [ "MD023", "header-start-left" ],
|
||||
"desc": "Headers must start at the beginning of the line",
|
||||
"tags": [ "headers", "spaces" ],
|
||||
"regexp": spaceBeforeHeaderRe,
|
||||
"func": function MD023(params, onError) {
|
||||
filterTokens(params, "heading_open", function forToken(token) {
|
||||
if (spaceBeforeHeaderRe.test(token.line)) {
|
||||
addErrorContext(onError, token.lineNumber, token.line);
|
||||
addErrorContext(onError, token.lineNumber, token.line, null, null,
|
||||
rangeFromRegExp(token.line, spaceBeforeHeaderRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -654,7 +661,6 @@ module.exports = [
|
|||
"names": [ "MD024", "no-duplicate-header" ],
|
||||
"desc": "Multiple headers with the same content",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD024(params, onError) {
|
||||
var knownContent = [];
|
||||
forEachHeading(params, function forHeading(heading, content) {
|
||||
|
@ -671,7 +677,6 @@ module.exports = [
|
|||
"names": [ "MD025", "single-h1" ],
|
||||
"desc": "Multiple top level headers in the same document",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD025(params, onError) {
|
||||
var level = params.options.level || 1;
|
||||
var tag = "h" + level;
|
||||
|
@ -692,7 +697,6 @@ module.exports = [
|
|||
"names": [ "MD026", "no-trailing-punctuation" ],
|
||||
"desc": "Trailing punctuation in header",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": trailingPunctuationRe,
|
||||
"func": function MD026(params, onError) {
|
||||
var punctuation = params.options.punctuation || ".,;:!?";
|
||||
var re = new RegExp("[" + punctuation + "]$");
|
||||
|
@ -700,7 +704,8 @@ module.exports = [
|
|||
var match = re.exec(content);
|
||||
if (match) {
|
||||
addError(onError, heading.lineNumber,
|
||||
"Punctuation: '" + match[0] + "'");
|
||||
"Punctuation: '" + match[0] + "'", null,
|
||||
rangeFromRegExp(heading.line, trailingPunctuationRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -710,7 +715,6 @@ module.exports = [
|
|||
"names": [ "MD027", "no-multiple-space-blockquote" ],
|
||||
"desc": "Multiple spaces after blockquote symbol",
|
||||
"tags": [ "blockquote", "whitespace", "indentation" ],
|
||||
"regexp": spaceAfterBlockQuote,
|
||||
"func": function MD027(params, onError) {
|
||||
var blockquoteNesting = 0;
|
||||
var listItemNesting = 0;
|
||||
|
@ -728,13 +732,15 @@ module.exports = [
|
|||
/^(\s*>)+\s\s+>/.test(token.line) :
|
||||
/^(\s*>)+\s\s/.test(token.line);
|
||||
if (multipleSpaces) {
|
||||
addErrorContext(onError, token.lineNumber, token.line);
|
||||
addErrorContext(onError, token.lineNumber, token.line, null, null,
|
||||
rangeFromRegExp(token.line, spaceAfterBlockQuote));
|
||||
}
|
||||
token.content.split(shared.newLineRe)
|
||||
.forEach(function forLine(line, offset) {
|
||||
if (/^\s/.test(line)) {
|
||||
addErrorContext(onError, token.lineNumber + offset,
|
||||
"> " + line);
|
||||
"> " + line, null, null,
|
||||
rangeFromRegExp(line, spaceAfterBlockQuote));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -746,7 +752,6 @@ module.exports = [
|
|||
"names": [ "MD028", "no-blanks-blockquote" ],
|
||||
"desc": "Blank line inside blockquote",
|
||||
"tags": [ "blockquote", "whitespace" ],
|
||||
"regexp": null,
|
||||
"func": function MD028(params, onError) {
|
||||
var prevToken = {};
|
||||
params.tokens.forEach(function forToken(token) {
|
||||
|
@ -763,7 +768,6 @@ module.exports = [
|
|||
"names": [ "MD029", "ol-prefix" ],
|
||||
"desc": "Ordered list item prefix",
|
||||
"tags": [ "ol" ],
|
||||
"regexp": listItemMarkerRe,
|
||||
"func": function MD029(params, onError) {
|
||||
var style = params.options.style || "one_or_ordered";
|
||||
var numberRe = /^[\s>]*([^.)]*)[.)]/;
|
||||
|
@ -780,7 +784,8 @@ module.exports = [
|
|||
var match = numberRe.exec(item.line);
|
||||
addErrorDetailIf(onError, item.lineNumber,
|
||||
String(number), !match || match[1],
|
||||
"Style: " + (listStyle === "one" ? "1/1/1" : "1/2/3"));
|
||||
"Style: " + (listStyle === "one" ? "1/1/1" : "1/2/3"),
|
||||
rangeFromRegExp(item.line, listItemMarkerRe));
|
||||
if (listStyle === "ordered") {
|
||||
number++;
|
||||
}
|
||||
|
@ -794,7 +799,6 @@ module.exports = [
|
|||
"names": [ "MD030", "list-marker-space" ],
|
||||
"desc": "Spaces after list markers",
|
||||
"tags": [ "ol", "ul", "whitespace" ],
|
||||
"regexp": listItemMarkerRe,
|
||||
"func": function MD030(params, onError) {
|
||||
var ulSingle = params.options.ul_single || 1;
|
||||
var olSingle = params.options.ol_single || 1;
|
||||
|
@ -809,7 +813,8 @@ module.exports = [
|
|||
list.items.forEach(function forItem(item) {
|
||||
var match = /^[\s>]*\S+(\s+)/.exec(item.line);
|
||||
addErrorDetailIf(onError, item.lineNumber,
|
||||
expectedSpaces, (match ? match[1].length : 0));
|
||||
expectedSpaces, (match ? match[1].length : 0), null,
|
||||
rangeFromRegExp(item.line, listItemMarkerRe));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -819,7 +824,6 @@ module.exports = [
|
|||
"names": [ "MD031", "blanks-around-fences" ],
|
||||
"desc": "Fenced code blocks should be surrounded by blank lines",
|
||||
"tags": [ "code", "blank_lines" ],
|
||||
"regexp": null,
|
||||
"func": function MD031(params, onError) {
|
||||
var lines = params.lines;
|
||||
forEachLine(params, function forLine(line, i, inCode, onFence) {
|
||||
|
@ -835,7 +839,6 @@ module.exports = [
|
|||
"names": [ "MD032", "blanks-around-lists" ],
|
||||
"desc": "Lists should be surrounded by blank lines",
|
||||
"tags": [ "bullet", "ul", "ol", "blank_lines" ],
|
||||
"regexp": null,
|
||||
"func": function MD032(params, onError) {
|
||||
var blankOrListRe = /^[\s>]*($|\s)/;
|
||||
var inList = false;
|
||||
|
@ -865,7 +868,6 @@ module.exports = [
|
|||
"names": [ "MD033", "no-inline-html" ],
|
||||
"desc": "Inline HTML",
|
||||
"tags": [ "html" ],
|
||||
"regexp": htmlRe,
|
||||
"func": function MD033(params, onError) {
|
||||
var allowedElements = (params.options.allowed_elements || [])
|
||||
.map(function forElement(element) {
|
||||
|
@ -886,7 +888,8 @@ module.exports = [
|
|||
});
|
||||
if (allowed.length) {
|
||||
addError(onError, token.lineNumber + offset,
|
||||
"Element: " + allowed[0]);
|
||||
"Element: " + allowed[0], null,
|
||||
rangeFromRegExp(token.line, htmlRe));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -899,7 +902,6 @@ module.exports = [
|
|||
"names": [ "MD034", "no-bare-urls" ],
|
||||
"desc": "Bare URL used",
|
||||
"tags": [ "links", "url" ],
|
||||
"regexp": bareUrlRe,
|
||||
"func": function MD034(params, onError) {
|
||||
filterTokens(params, "inline", function forToken(token) {
|
||||
var inLink = false;
|
||||
|
@ -912,7 +914,8 @@ module.exports = [
|
|||
} else if ((child.type === "text") &&
|
||||
!inLink &&
|
||||
(match = bareUrlRe.exec(child.content))) {
|
||||
addErrorContext(onError, child.lineNumber, match[0]);
|
||||
addErrorContext(onError, child.lineNumber, match[0], null, null,
|
||||
rangeFromRegExp(child.line, bareUrlRe));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -923,7 +926,6 @@ module.exports = [
|
|||
"names": [ "MD035", "hr-style" ],
|
||||
"desc": "Horizontal rule style",
|
||||
"tags": [ "hr" ],
|
||||
"regexp": null,
|
||||
"func": function MD035(params, onError) {
|
||||
var style = params.options.style || "consistent";
|
||||
filterTokens(params, "hr", function forToken(token) {
|
||||
|
@ -940,7 +942,6 @@ module.exports = [
|
|||
"names": [ "MD036", "no-emphasis-as-header" ],
|
||||
"desc": "Emphasis used instead of a header",
|
||||
"tags": [ "headers", "emphasis" ],
|
||||
"regexp": null,
|
||||
"func": function MD036(params, onError) {
|
||||
var punctuation = params.options.punctuation || ".,;:!?";
|
||||
var re = new RegExp("[" + punctuation + "]$");
|
||||
|
@ -989,7 +990,6 @@ module.exports = [
|
|||
"names": [ "MD037", "no-space-in-emphasis" ],
|
||||
"desc": "Spaces inside emphasis markers",
|
||||
"tags": [ "whitespace", "emphasis" ],
|
||||
"regexp": null,
|
||||
"func": function MD037(params, onError) {
|
||||
forEachInlineChild(params, "text", function forToken(token) {
|
||||
var left = true;
|
||||
|
@ -1014,7 +1014,6 @@ module.exports = [
|
|||
"names": [ "MD038", "no-space-in-code" ],
|
||||
"desc": "Spaces inside code span elements",
|
||||
"tags": [ "whitespace", "code" ],
|
||||
"regexp": null,
|
||||
"func": function MD038(params, onError) {
|
||||
var inlineCodeSpansRe = /(?:^|[^\\])((`+)((?:.*?[^`])|)\2(?!`))/g;
|
||||
forEachInlineChild(params, "code_inline",
|
||||
|
@ -1043,7 +1042,6 @@ module.exports = [
|
|||
"names": [ "MD039", "no-space-in-links" ],
|
||||
"desc": "Spaces inside link text",
|
||||
"tags": [ "whitespace", "links" ],
|
||||
"regexp": spaceInsideLinkRe,
|
||||
"func": function MD039(params, onError) {
|
||||
filterTokens(params, "inline", function forToken(token) {
|
||||
var inLink = false;
|
||||
|
@ -1058,7 +1056,8 @@ module.exports = [
|
|||
var right = shared.trimRight(linkText).length !== linkText.length;
|
||||
if (left || right) {
|
||||
addErrorContext(onError, token.lineNumber,
|
||||
"[" + linkText + "]", left, right);
|
||||
"[" + linkText + "]", left, right,
|
||||
rangeFromRegExp(token.line, spaceInsideLinkRe));
|
||||
}
|
||||
} else if (inLink) {
|
||||
linkText += child.content;
|
||||
|
@ -1072,7 +1071,6 @@ module.exports = [
|
|||
"names": [ "MD040", "fenced-code-language" ],
|
||||
"desc": "Fenced code blocks should have a language specified",
|
||||
"tags": [ "code", "language" ],
|
||||
"regexp": null,
|
||||
"func": function MD040(params, onError) {
|
||||
filterTokens(params, "fence", function forToken(token) {
|
||||
if (!token.info.trim()) {
|
||||
|
@ -1086,7 +1084,6 @@ module.exports = [
|
|||
"names": [ "MD041", "first-line-h1" ],
|
||||
"desc": "First line in file should be a top level header",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD041(params, onError) {
|
||||
var level = params.options.level || 1;
|
||||
var frontMatterTitle = params.options.front_matter_title;
|
||||
|
@ -1118,7 +1115,6 @@ module.exports = [
|
|||
"names": [ "MD042", "no-empty-links" ],
|
||||
"desc": "No empty links",
|
||||
"tags": [ "links" ],
|
||||
"regexp": emptyLinkRe,
|
||||
"func": function MD042(params, onError) {
|
||||
filterTokens(params, "inline", function forToken(token) {
|
||||
var inLink = false;
|
||||
|
@ -1137,7 +1133,8 @@ module.exports = [
|
|||
inLink = false;
|
||||
if (emptyLink) {
|
||||
addErrorContext(onError, child.lineNumber,
|
||||
"[" + linkText + "]()");
|
||||
"[" + linkText + "]()", null, null,
|
||||
rangeFromRegExp(child.line, emptyLinkRe));
|
||||
}
|
||||
} else if (inLink) {
|
||||
linkText += child.content;
|
||||
|
@ -1151,7 +1148,6 @@ module.exports = [
|
|||
"names": [ "MD043", "required-headers" ],
|
||||
"desc": "Required header structure",
|
||||
"tags": [ "headers" ],
|
||||
"regexp": null,
|
||||
"func": function MD043(params, onError) {
|
||||
var requiredHeaders = params.options.headers;
|
||||
if (requiredHeaders) {
|
||||
|
@ -1189,7 +1185,6 @@ module.exports = [
|
|||
"names": [ "MD044", "proper-names" ],
|
||||
"desc": "Proper names should have the correct capitalization",
|
||||
"tags": [ "spelling" ],
|
||||
"regexp": null,
|
||||
"func": function MD044(params, onError) {
|
||||
var names = params.options.names || [];
|
||||
var codeBlocks = params.options.code_blocks;
|
||||
|
@ -1231,7 +1226,6 @@ module.exports = [
|
|||
"names": [ "MD045", "no-alt-text" ],
|
||||
"desc": "Images should have alternate text (alt text)",
|
||||
"tags": [ "accessibility", "images" ],
|
||||
"regexp": null,
|
||||
"func": function MD045(params, onError) {
|
||||
forEachInlineChild(params, "image", function forToken(token) {
|
||||
if (token.content === "") {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue