mirror of
https://github.com/DavidAnson/markdownlint.git
synced 2025-12-16 14:00:13 +01:00
Update all rules to better handle wrongly-typed configuration parameters.
This commit is contained in:
parent
26ad0550ec
commit
3238ed4249
25 changed files with 134 additions and 39 deletions
|
|
@ -465,7 +465,7 @@ module.exports.frontMatterHasTitle =
|
||||||
const ignoreFrontMatter =
|
const ignoreFrontMatter =
|
||||||
(frontMatterTitlePattern !== undefined) && !frontMatterTitlePattern;
|
(frontMatterTitlePattern !== undefined) && !frontMatterTitlePattern;
|
||||||
const frontMatterTitleRe =
|
const frontMatterTitleRe =
|
||||||
new RegExp(frontMatterTitlePattern || "^\\s*title\\s*[:=]", "i");
|
new RegExp(String(frontMatterTitlePattern || "^\\s*title\\s*[:=]"), "i");
|
||||||
return !ignoreFrontMatter &&
|
return !ignoreFrontMatter &&
|
||||||
frontMatterLines.some((line) => frontMatterTitleRe.test(line));
|
frontMatterLines.some((line) => frontMatterTitleRe.test(line));
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ module.exports = {
|
||||||
"description": "First heading should be a top level heading",
|
"description": "First heading should be a top level heading",
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD002(params, onError) {
|
"function": function MD002(params, onError) {
|
||||||
const level = params.config.level || 1;
|
const level = Number(params.config.level || 1);
|
||||||
const tag = "h" + level;
|
const tag = "h" + level;
|
||||||
params.tokens.every(function forToken(token) {
|
params.tokens.every(function forToken(token) {
|
||||||
if (token.type === "heading_open") {
|
if (token.type === "heading_open") {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ module.exports = {
|
||||||
"description": "Heading style",
|
"description": "Heading style",
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD003(params, onError) {
|
"function": function MD003(params, onError) {
|
||||||
let style = params.config.style || "consistent";
|
let style = String(params.config.style || "consistent");
|
||||||
filterTokens(params, "heading_open", function forToken(token) {
|
filterTokens(params, "heading_open", function forToken(token) {
|
||||||
const styleForToken = headingStyleFor(token);
|
const styleForToken = headingStyleFor(token);
|
||||||
if (style === "consistent") {
|
if (style === "consistent") {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ module.exports = {
|
||||||
"description": "Unordered list style",
|
"description": "Unordered list style",
|
||||||
"tags": [ "bullet", "ul" ],
|
"tags": [ "bullet", "ul" ],
|
||||||
"function": function MD004(params, onError) {
|
"function": function MD004(params, onError) {
|
||||||
const style = params.config.style || "consistent";
|
const style = String(params.config.style || "consistent");
|
||||||
let expectedStyle = style;
|
let expectedStyle = style;
|
||||||
const nestingStyles = [];
|
const nestingStyles = [];
|
||||||
flattenedLists().forEach((list) => {
|
flattenedLists().forEach((list) => {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ module.exports = {
|
||||||
"description": "Unordered list indentation",
|
"description": "Unordered list indentation",
|
||||||
"tags": [ "bullet", "ul", "indentation" ],
|
"tags": [ "bullet", "ul", "indentation" ],
|
||||||
"function": function MD007(params, onError) {
|
"function": function MD007(params, onError) {
|
||||||
const indent = params.config.indent || 2;
|
const indent = Number(params.config.indent || 2);
|
||||||
const startIndented = !!params.config.start_indented;
|
const startIndented = !!params.config.start_indented;
|
||||||
flattenedLists().forEach((list) => {
|
flattenedLists().forEach((list) => {
|
||||||
if (list.unordered && list.parentsUnordered) {
|
if (list.unordered && list.parentsUnordered) {
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,7 @@ module.exports = {
|
||||||
"tags": [ "whitespace" ],
|
"tags": [ "whitespace" ],
|
||||||
"function": function MD009(params, onError) {
|
"function": function MD009(params, onError) {
|
||||||
let brSpaces = params.config.br_spaces;
|
let brSpaces = params.config.br_spaces;
|
||||||
if (brSpaces === undefined) {
|
brSpaces = Number((brSpaces === undefined) ? 2 : brSpaces);
|
||||||
brSpaces = 2;
|
|
||||||
}
|
|
||||||
const listItemEmptyLines = !!params.config.list_item_empty_lines;
|
const listItemEmptyLines = !!params.config.list_item_empty_lines;
|
||||||
const strict = !!params.config.strict;
|
const strict = !!params.config.strict;
|
||||||
const listItemLineNumbers = [];
|
const listItemLineNumbers = [];
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ module.exports = {
|
||||||
"description": "Multiple consecutive blank lines",
|
"description": "Multiple consecutive blank lines",
|
||||||
"tags": [ "whitespace", "blank_lines" ],
|
"tags": [ "whitespace", "blank_lines" ],
|
||||||
"function": function MD012(params, onError) {
|
"function": function MD012(params, onError) {
|
||||||
const maximum = params.config.maximum || 1;
|
const maximum = Number(params.config.maximum || 1);
|
||||||
let count = 0;
|
let count = 0;
|
||||||
forEachLine(lineMetadata(), (line, lineIndex, inCode) => {
|
forEachLine(lineMetadata(), (line, lineIndex, inCode) => {
|
||||||
count = (inCode || line.trim().length) ? 0 : count + 1;
|
count = (inCode || line.trim().length) ? 0 : count + 1;
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,11 @@ module.exports = {
|
||||||
"description": "Line length",
|
"description": "Line length",
|
||||||
"tags": [ "line_length" ],
|
"tags": [ "line_length" ],
|
||||||
"function": function MD013(params, onError) {
|
"function": function MD013(params, onError) {
|
||||||
const lineLength = params.config.line_length || 80;
|
const lineLength = Number(params.config.line_length || 80);
|
||||||
const headingLineLength = params.config.heading_line_length || lineLength;
|
const headingLineLength =
|
||||||
const codeLineLength = params.config.code_block_line_length || lineLength;
|
Number(params.config.heading_line_length || lineLength);
|
||||||
|
const codeLineLength =
|
||||||
|
Number(params.config.code_block_line_length || lineLength);
|
||||||
const strict = !!params.config.strict;
|
const strict = !!params.config.strict;
|
||||||
const longLineRePostfix =
|
const longLineRePostfix =
|
||||||
strict ? longLineRePostfixStrict : longLineRePostfixRelaxed;
|
strict ? longLineRePostfixStrict : longLineRePostfixRelaxed;
|
||||||
|
|
|
||||||
|
|
@ -10,13 +10,9 @@ module.exports = {
|
||||||
"tags": [ "headings", "headers", "blank_lines" ],
|
"tags": [ "headings", "headers", "blank_lines" ],
|
||||||
"function": function MD022(params, onError) {
|
"function": function MD022(params, onError) {
|
||||||
let linesAbove = params.config.lines_above;
|
let linesAbove = params.config.lines_above;
|
||||||
if (linesAbove === undefined) {
|
linesAbove = Number((linesAbove === undefined) ? 1 : linesAbove);
|
||||||
linesAbove = 1;
|
|
||||||
}
|
|
||||||
let linesBelow = params.config.lines_below;
|
let linesBelow = params.config.lines_below;
|
||||||
if (linesBelow === undefined) {
|
linesBelow = Number((linesBelow === undefined) ? 1 : linesBelow);
|
||||||
linesBelow = 1;
|
|
||||||
}
|
|
||||||
const { lines } = params;
|
const { lines } = params;
|
||||||
filterTokens(params, "heading_open", (token) => {
|
filterTokens(params, "heading_open", (token) => {
|
||||||
const [ topIndex, nextIndex ] = token.map;
|
const [ topIndex, nextIndex ] = token.map;
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ module.exports = {
|
||||||
"description": "Multiple headings with the same content",
|
"description": "Multiple headings with the same content",
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD024(params, onError) {
|
"function": function MD024(params, onError) {
|
||||||
const siblingsOnly = params.config.siblings_only ||
|
const siblingsOnly = !!params.config.siblings_only ||
|
||||||
params.config.allow_different_nesting || false;
|
!!params.config.allow_different_nesting || false;
|
||||||
const knownContents = [ null, [] ];
|
const knownContents = [ null, [] ];
|
||||||
let lastLevel = 1;
|
let lastLevel = 1;
|
||||||
let knownContent = knownContents[lastLevel];
|
let knownContent = knownContents[lastLevel];
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ module.exports = {
|
||||||
"description": "Multiple top level headings in the same document",
|
"description": "Multiple top level headings in the same document",
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD025(params, onError) {
|
"function": function MD025(params, onError) {
|
||||||
const level = params.config.level || 1;
|
const level = Number(params.config.level || 1);
|
||||||
const tag = "h" + level;
|
const tag = "h" + level;
|
||||||
const foundFrontMatterTitle =
|
const foundFrontMatterTitle =
|
||||||
frontMatterHasTitle(
|
frontMatterHasTitle(
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,8 @@ module.exports = {
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD026(params, onError) {
|
"function": function MD026(params, onError) {
|
||||||
let punctuation = params.config.punctuation;
|
let punctuation = params.config.punctuation;
|
||||||
if (punctuation === undefined) {
|
punctuation =
|
||||||
punctuation = allPunctuation;
|
String((punctuation === undefined) ? allPunctuation : punctuation);
|
||||||
}
|
|
||||||
const trailingPunctuationRe =
|
const trailingPunctuationRe =
|
||||||
new RegExp("\\s*[" + escapeForRegExp(punctuation) + "]+$");
|
new RegExp("\\s*[" + escapeForRegExp(punctuation) + "]+$");
|
||||||
forEachHeading(params, (heading) => {
|
forEachHeading(params, (heading) => {
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ module.exports = {
|
||||||
"description": "Ordered list item prefix",
|
"description": "Ordered list item prefix",
|
||||||
"tags": [ "ol" ],
|
"tags": [ "ol" ],
|
||||||
"function": function MD029(params, onError) {
|
"function": function MD029(params, onError) {
|
||||||
const style = params.config.style || "one_or_ordered";
|
const style = String(params.config.style || "one_or_ordered");
|
||||||
flattenedLists().forEach((list) => {
|
flattenedLists().forEach((list) => {
|
||||||
if (!list.unordered) {
|
if (!list.unordered) {
|
||||||
let listStyle = style;
|
let listStyle = style;
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,10 @@ module.exports = {
|
||||||
"description": "Spaces after list markers",
|
"description": "Spaces after list markers",
|
||||||
"tags": [ "ol", "ul", "whitespace" ],
|
"tags": [ "ol", "ul", "whitespace" ],
|
||||||
"function": function MD030(params, onError) {
|
"function": function MD030(params, onError) {
|
||||||
const ulSingle = params.config.ul_single || 1;
|
const ulSingle = Number(params.config.ul_single || 1);
|
||||||
const olSingle = params.config.ol_single || 1;
|
const olSingle = Number(params.config.ol_single || 1);
|
||||||
const ulMulti = params.config.ul_multi || 1;
|
const ulMulti = Number(params.config.ul_multi || 1);
|
||||||
const olMulti = params.config.ol_multi || 1;
|
const olMulti = Number(params.config.ol_multi || 1);
|
||||||
flattenedLists().forEach((list) => {
|
flattenedLists().forEach((list) => {
|
||||||
const lineCount = list.lastLineIndex - list.open.map[0];
|
const lineCount = list.lastLineIndex - list.open.map[0];
|
||||||
const allSingle = lineCount === list.items.length;
|
const allSingle = lineCount === list.items.length;
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,9 @@ module.exports = {
|
||||||
"description": "Inline HTML",
|
"description": "Inline HTML",
|
||||||
"tags": [ "html" ],
|
"tags": [ "html" ],
|
||||||
"function": function MD033(params, onError) {
|
"function": function MD033(params, onError) {
|
||||||
const allowedElements = (params.config.allowed_elements || [])
|
let allowedElements = params.config.allowed_elements;
|
||||||
.map((element) => element.toLowerCase());
|
allowedElements = Array.isArray(allowedElements) ? allowedElements : [];
|
||||||
|
allowedElements = allowedElements.map((element) => element.toLowerCase());
|
||||||
forEachLine(lineMetadata(), (line, lineIndex, inCode) => {
|
forEachLine(lineMetadata(), (line, lineIndex, inCode) => {
|
||||||
let match = null;
|
let match = null;
|
||||||
// eslint-disable-next-line no-unmodified-loop-condition
|
// eslint-disable-next-line no-unmodified-loop-condition
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ module.exports = {
|
||||||
"description": "Horizontal rule style",
|
"description": "Horizontal rule style",
|
||||||
"tags": [ "hr" ],
|
"tags": [ "hr" ],
|
||||||
"function": function MD035(params, onError) {
|
"function": function MD035(params, onError) {
|
||||||
let style = params.config.style || "consistent";
|
let style = String(params.config.style || "consistent");
|
||||||
filterTokens(params, "hr", function forToken(token) {
|
filterTokens(params, "hr", function forToken(token) {
|
||||||
const lineTrim = token.line.trim();
|
const lineTrim = token.line.trim();
|
||||||
if (style === "consistent") {
|
if (style === "consistent") {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,9 @@ module.exports = {
|
||||||
"description": "Emphasis used instead of a heading",
|
"description": "Emphasis used instead of a heading",
|
||||||
"tags": [ "headings", "headers", "emphasis" ],
|
"tags": [ "headings", "headers", "emphasis" ],
|
||||||
"function": function MD036(params, onError) {
|
"function": function MD036(params, onError) {
|
||||||
const punctuation = params.config.punctuation || allPunctuation;
|
let punctuation = params.config.punctuation;
|
||||||
|
punctuation =
|
||||||
|
String((punctuation === undefined) ? allPunctuation : punctuation);
|
||||||
const re = new RegExp("[" + punctuation + "]$");
|
const re = new RegExp("[" + punctuation + "]$");
|
||||||
// eslint-disable-next-line jsdoc/require-jsdoc
|
// eslint-disable-next-line jsdoc/require-jsdoc
|
||||||
function base(token) {
|
function base(token) {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ module.exports = {
|
||||||
"description": "First line in file should be a top level heading",
|
"description": "First line in file should be a top level heading",
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD041(params, onError) {
|
"function": function MD041(params, onError) {
|
||||||
const level = params.config.level || 1;
|
const level = Number(params.config.level || 1);
|
||||||
const tag = "h" + level;
|
const tag = "h" + level;
|
||||||
const foundFrontMatterTitle =
|
const foundFrontMatterTitle =
|
||||||
frontMatterHasTitle(
|
frontMatterHasTitle(
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ module.exports = {
|
||||||
"tags": [ "headings", "headers" ],
|
"tags": [ "headings", "headers" ],
|
||||||
"function": function MD043(params, onError) {
|
"function": function MD043(params, onError) {
|
||||||
const requiredHeadings = params.config.headings || params.config.headers;
|
const requiredHeadings = params.config.headings || params.config.headers;
|
||||||
if (requiredHeadings) {
|
if (Array.isArray(requiredHeadings)) {
|
||||||
const levels = {};
|
const levels = {};
|
||||||
[ 1, 2, 3, 4, 5, 6 ].forEach(function forLevel(level) {
|
[ 1, 2, 3, 4, 5, 6 ].forEach(function forLevel(level) {
|
||||||
levels["h" + level] = "######".substr(-level);
|
levels["h" + level] = "######".substr(-level);
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,8 @@ module.exports = {
|
||||||
"description": "Proper names should have the correct capitalization",
|
"description": "Proper names should have the correct capitalization",
|
||||||
"tags": [ "spelling" ],
|
"tags": [ "spelling" ],
|
||||||
"function": function MD044(params, onError) {
|
"function": function MD044(params, onError) {
|
||||||
const names = params.config.names || [];
|
let names = params.config.names;
|
||||||
|
names = Array.isArray(names) ? names : [];
|
||||||
const codeBlocks = params.config.code_blocks;
|
const codeBlocks = params.config.code_blocks;
|
||||||
const includeCodeBlocks = (codeBlocks === undefined) ? true : !!codeBlocks;
|
const includeCodeBlocks = (codeBlocks === undefined) ? true : !!codeBlocks;
|
||||||
names.forEach((name) => {
|
names.forEach((name) => {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ module.exports = {
|
||||||
"description": "Code block style",
|
"description": "Code block style",
|
||||||
"tags": [ "code" ],
|
"tags": [ "code" ],
|
||||||
"function": function MD046(params, onError) {
|
"function": function MD046(params, onError) {
|
||||||
let expectedStyle = params.config.style || "consistent";
|
let expectedStyle = String(params.config.style || "consistent");
|
||||||
params.tokens
|
params.tokens
|
||||||
.filter((token) => token.type === "code_block" || token.type === "fence")
|
.filter((token) => token.type === "code_block" || token.type === "fence")
|
||||||
.forEach((token) => {
|
.forEach((token) => {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ module.exports = {
|
||||||
"description": "Code fence style",
|
"description": "Code fence style",
|
||||||
"tags": [ "code" ],
|
"tags": [ "code" ],
|
||||||
"function": function MD048(params, onError) {
|
"function": function MD048(params, onError) {
|
||||||
const style = params.config.style || "consistent";
|
const style = String(params.config.style || "consistent");
|
||||||
let expectedStyle = style;
|
let expectedStyle = style;
|
||||||
params.tokens
|
params.tokens
|
||||||
.filter((token) => token.type === "fence")
|
.filter((token) => token.type === "fence")
|
||||||
|
|
|
||||||
|
|
@ -1589,12 +1589,14 @@ tape("validateConfigSchema", (test) => {
|
||||||
const jsonFileRe = /\.json$/i;
|
const jsonFileRe = /\.json$/i;
|
||||||
const resultsFileRe = /\.results\.json$/i;
|
const resultsFileRe = /\.results\.json$/i;
|
||||||
const jsConfigFileRe = /^jsconfig\.json$/i;
|
const jsConfigFileRe = /^jsconfig\.json$/i;
|
||||||
|
const wrongTypesFileRe = /wrong-types-in-config-file.json$/i;
|
||||||
const testDirectory = __dirname;
|
const testDirectory = __dirname;
|
||||||
const testFiles = fs.readdirSync(testDirectory);
|
const testFiles = fs.readdirSync(testDirectory);
|
||||||
testFiles.filter(function filterFile(file) {
|
testFiles.filter(function filterFile(file) {
|
||||||
return jsonFileRe.test(file) &&
|
return jsonFileRe.test(file) &&
|
||||||
!resultsFileRe.test(file) &&
|
!resultsFileRe.test(file) &&
|
||||||
!jsConfigFileRe.test(file);
|
!jsConfigFileRe.test(file) &&
|
||||||
|
!wrongTypesFileRe.test(file);
|
||||||
}).forEach(function forFile(file) {
|
}).forEach(function forFile(file) {
|
||||||
const data = fs.readFileSync(
|
const data = fs.readFileSync(
|
||||||
path.join(testDirectory, file),
|
path.join(testDirectory, file),
|
||||||
|
|
|
||||||
91
test/wrong-types-in-config-file.json
Normal file
91
test/wrong-types-in-config-file.json
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
{
|
||||||
|
"MD002": {
|
||||||
|
"level": "1"
|
||||||
|
},
|
||||||
|
"MD003": {
|
||||||
|
"style": 0
|
||||||
|
},
|
||||||
|
"MD004": {
|
||||||
|
"style": 0
|
||||||
|
},
|
||||||
|
"MD007": {
|
||||||
|
"indent": "2",
|
||||||
|
"start_indented": 0
|
||||||
|
},
|
||||||
|
"MD009": {
|
||||||
|
"br_spaces": "2",
|
||||||
|
"list_item_empty_lines": 0,
|
||||||
|
"strict": 0
|
||||||
|
},
|
||||||
|
"MD010": {
|
||||||
|
"code_blocks": 1
|
||||||
|
},
|
||||||
|
"MD012": {
|
||||||
|
"maximum": "1"
|
||||||
|
},
|
||||||
|
"MD013": {
|
||||||
|
"code_block_line_length": "80",
|
||||||
|
"code_blocks": 1,
|
||||||
|
"headers": 1,
|
||||||
|
"heading_line_length": "80",
|
||||||
|
"headings": 1,
|
||||||
|
"line_length": "80",
|
||||||
|
"strict": 0,
|
||||||
|
"tables": 1
|
||||||
|
},
|
||||||
|
"MD022": {
|
||||||
|
"lines_above": "1",
|
||||||
|
"lines_below": "1"
|
||||||
|
},
|
||||||
|
"MD024": {
|
||||||
|
"allow_different_nesting": 0,
|
||||||
|
"siblings_only": 0
|
||||||
|
},
|
||||||
|
"MD025": {
|
||||||
|
"front_matter_title": 0,
|
||||||
|
"level": "1"
|
||||||
|
},
|
||||||
|
"MD026": {
|
||||||
|
"punctuation": 0
|
||||||
|
},
|
||||||
|
"MD029": {
|
||||||
|
"style": 0
|
||||||
|
},
|
||||||
|
"MD030": {
|
||||||
|
"ol_multi": "1",
|
||||||
|
"ol_single": "1",
|
||||||
|
"ul_multi": "1",
|
||||||
|
"ul_single": "1"
|
||||||
|
},
|
||||||
|
"MD031": {
|
||||||
|
"list_items": 1
|
||||||
|
},
|
||||||
|
"MD033": {
|
||||||
|
"allowed_elements": 0
|
||||||
|
},
|
||||||
|
"MD035": {
|
||||||
|
"style": 0
|
||||||
|
},
|
||||||
|
"MD036": {
|
||||||
|
"punctuation": 0
|
||||||
|
},
|
||||||
|
"MD041": {
|
||||||
|
"front_matter_title": 0,
|
||||||
|
"level": "1"
|
||||||
|
},
|
||||||
|
"MD043": {
|
||||||
|
"headers": 0,
|
||||||
|
"headings": 0
|
||||||
|
},
|
||||||
|
"MD044": {
|
||||||
|
"code_blocks": 1,
|
||||||
|
"names": 0
|
||||||
|
},
|
||||||
|
"MD046": {
|
||||||
|
"style": 0
|
||||||
|
},
|
||||||
|
"MD048": {
|
||||||
|
"style": 0
|
||||||
|
},
|
||||||
|
"$schema": "../schema/markdownlint-config-schema.json"
|
||||||
|
}
|
||||||
3
test/wrong-types-in-config-file.md
Normal file
3
test/wrong-types-in-config-file.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# Wrong Types in Config File
|
||||||
|
|
||||||
|
Long line long line long line long line long line long line long line long line long line long line {MD013}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue