diff --git a/lib/md037.js b/lib/md037.js index 1e4b77c3..95cd2c31 100644 --- a/lib/md037.js +++ b/lib/md037.js @@ -13,31 +13,37 @@ module.exports = { "tags": [ "whitespace", "emphasis" ], "function": function MD037(params, onError) { forEachInlineChild(params, "text", (token) => { + const { content, lineNumber } = token; + const columnsReported = []; [ leftSpaceRe, rightSpaceRe ].forEach((spaceRe, index) => { let match = null; - while ((match = spaceRe.exec(token.content)) !== null) { + while ((match = spaceRe.exec(content)) !== null) { const [ fullText, marker ] = match; - const line = params.lines[token.lineNumber - 1]; + const line = params.lines[lineNumber - 1]; if (line.includes(fullText)) { const text = fullText.trim(); const column = line.indexOf(text) + 1; - const length = text.length; - const markerLength = marker.length; - const emphasized = text.slice(markerLength, length - markerLength); - const fixedText = `${marker}${emphasized.trim()}${marker}`; - addErrorContext( - onError, - token.lineNumber, - text, - index === 0, - index !== 0, - [ column, length ], - { - "editColumn": column, - "deleteCount": length, - "insertText": fixedText - } - ); + if (!columnsReported.includes(column)) { + const length = text.length; + const markerLength = marker.length; + const emphasized = + text.slice(markerLength, length - markerLength); + const fixedText = `${marker}${emphasized.trim()}${marker}`; + addErrorContext( + onError, + lineNumber, + text, + index === 0, + index !== 0, + [ column, length ], + { + "editColumn": column, + "deleteCount": length, + "insertText": fixedText + } + ); + columnsReported.push(column); + } } } }); diff --git a/test/markdownlint-test.js b/test/markdownlint-test.js index c34dc559..05d84696 100644 --- a/test/markdownlint-test.js +++ b/test/markdownlint-test.js @@ -522,7 +522,8 @@ module.exports.resultFormattingV3 = function resultFormattingV3(test) { "input": "# Heading \n" + "\n" + - "Text\ttext\t\ttext" + "Text\ttext\t\ttext\n" + + "Text * emphasis * text" }, "resultVersion": 3 }; @@ -572,16 +573,30 @@ module.exports.resultFormattingV3 = function resultFormattingV3(test) { } }, { - "lineNumber": 3, + "lineNumber": 4, + "ruleNames": [ "MD037", "no-space-in-emphasis" ], + "ruleDescription": "Spaces inside emphasis markers", + "ruleInformation": `${homepage}/blob/v${version}/doc/Rules.md#md037`, + "errorDetail": null, + "errorContext": "* emphasis *", + "errorRange": [ 6, 12 ], + "fixInfo": { + "editColumn": 6, + "deleteCount": 12, + "insertText": "*emphasis*" + } + }, + { + "lineNumber": 4, "ruleNames": [ "MD047", "single-trailing-newline" ], "ruleDescription": "Files should end with a single newline character", "ruleInformation": `${homepage}/blob/v${version}/doc/Rules.md#md047`, "errorDetail": null, "errorContext": null, - "errorRange": [ 15, 1 ], + "errorRange": [ 22, 1 ], "fixInfo": { "insertText": "\n", - "editColumn": 16 + "editColumn": 23 } } ] @@ -595,7 +610,9 @@ module.exports.resultFormattingV3 = function resultFormattingV3(test) { " Hard tabs [Column: 5]\n" + "input: 3: MD010/no-hard-tabs" + " Hard tabs [Column: 10]\n" + - "input: 3: MD047/single-trailing-newline" + + "input: 4: MD037/no-space-in-emphasis" + + " Spaces inside emphasis markers [Context: \"* emphasis *\"]\n" + + "input: 4: MD047/single-trailing-newline" + " Files should end with a single newline character"; test.equal(actualMessage, expectedMessage, "Incorrect message."); test.done();