From 65b19b703b565ccb431bd864fa1dad9ef184b2ca Mon Sep 17 00:00:00 2001 From: David Anson Date: Mon, 6 Apr 2020 20:43:38 -0700 Subject: [PATCH] Update MD038/no-space-in-code to allow the "single leading and trailing space" scenario (fixes #271). --- doc/Rules.md | 13 ++- lib/md038.js | 4 +- test/detailed-results-MD031-MD040.md | 4 +- .../detailed-results-MD031-MD040.results.json | 8 +- test/inline-capture-restore.md | 84 +++++++++---------- test/inline-disable-enable-file.md | 16 ++-- test/inline-disable-enable.md | 36 ++++---- test/spaces_inside_codespan_elements.md | 16 ++++ 8 files changed, 102 insertions(+), 79 deletions(-) diff --git a/doc/Rules.md b/doc/Rules.md index d4419fc9..9cea0fc2 100644 --- a/doc/Rules.md +++ b/doc/Rules.md @@ -1401,23 +1401,28 @@ Tags: whitespace, code Aliases: no-space-in-code -This rule is triggered on code span elements that have spaces right inside the +This rule is triggered for code span elements that have spaces adjacent to the backticks: ```markdown -` some text ` - `some text ` ` some text` ``` -To fix this, remove the spaces inside the codespan markers: +To fix this, remove any spaces adjacent to the backticks: ```markdown `some text` ``` +Note: A single leading and trailing space is allowed by the specification and +automatically trimmed (to allow for embedded backticks): + +```markdown +`` `backticks` `` +``` + Note: A single leading or trailing space is allowed if used to separate codespan markers from an embedded backtick: diff --git a/lib/md038.js b/lib/md038.js index dd8bac28..a3381e64 100644 --- a/lib/md038.js +++ b/lib/md038.js @@ -7,6 +7,7 @@ const { addErrorContext, filterTokens, forEachInlineCodeSpan, newLineRe } = const leftSpaceRe = /^\s([^`]|$)/; const rightSpaceRe = /[^`]\s$/; +const singleLeftRightSpaceRe = /^\s\S+\s$/; module.exports = { "names": [ "MD038", "no-space-in-code" ], @@ -32,7 +33,8 @@ module.exports = { rangeLineOffset = codeLines.length - 1; fixIndex = 0; } - if (left || right) { + const allowed = singleLeftRightSpaceRe.test(code); + if ((left || right) && !allowed) { const codeLinesRange = codeLines[rangeLineOffset]; if (codeLines.length > 1) { rangeLength = codeLinesRange.length + tickCount; diff --git a/test/detailed-results-MD031-MD040.md b/test/detailed-results-MD031-MD040.md index 31b18371..47f11d5c 100644 --- a/test/detailed-results-MD031-MD040.md +++ b/test/detailed-results-MD031-MD040.md @@ -14,14 +14,14 @@ Bare https://example.com link Space * inside * emphasis -Space ` inside ` code span +Space ` inside` code span Space [ inside ](link) text ``` ``` -space `` inside `` code +space `` inside`` code space `inside` of ` code` elements `space` inside `of` code ` elements` space ``inside`` of `` code`` elements diff --git a/test/detailed-results-MD031-MD040.results.json b/test/detailed-results-MD031-MD040.results.json index 13da02e5..059d825a 100644 --- a/test/detailed-results-MD031-MD040.results.json +++ b/test/detailed-results-MD031-MD040.results.json @@ -122,8 +122,8 @@ "ruleDescription": "Spaces inside code span elements", "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md038", "errorDetail": null, - "errorContext": "` inside `", - "errorRange": [ 7, 10 ] + "errorContext": "` inside`", + "errorRange": [ 7, 9 ] }, { "lineNumber": 24, @@ -131,8 +131,8 @@ "ruleDescription": "Spaces inside code span elements", "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/Rules.md#md038", "errorDetail": null, - "errorContext": "`` inside ``", - "errorRange": [ 7, 12 ] + "errorContext": "`` inside``", + "errorRange": [ 7, 11 ] }, { "lineNumber": 25, diff --git a/test/inline-capture-restore.md b/test/inline-capture-restore.md index 56355eba..1ccc2c30 100644 --- a/test/inline-capture-restore.md +++ b/test/inline-capture-restore.md @@ -1,118 +1,118 @@ # Inline Capture/Restore hard tab -space * in * emphasis {MD037} -space ` in ` code {MD038} +space *in * emphasis {MD037} +space `in ` code {MD038} hard tab -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab -space * in * emphasis {MD037} -space ` in ` code {MD038} +space *in * emphasis {MD037} +space `in ` code {MD038} hard tab -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab -space * in * emphasis {MD037} -space ` in ` code {MD038} +space *in * emphasis {MD037} +space `in ` code {MD038} hard tab -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis {MD037} -space ` in ` code {MD038} +space *in * emphasis {MD037} +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis -space ` in ` code {MD038} +space *in * emphasis +space `in ` code {MD038} hard tab {MD010} -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab {MD010} -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab -space * in * emphasis -space ` in ` code +space *in * emphasis +space `in ` code hard tab {MD010} -space * in * emphasis {MD037} -space ` in ` code +space *in * emphasis {MD037} +space `in ` code diff --git a/test/inline-disable-enable-file.md b/test/inline-disable-enable-file.md index 109983bd..1b7be69b 100644 --- a/test/inline-disable-enable-file.md +++ b/test/inline-disable-enable-file.md @@ -2,31 +2,31 @@ hard tab {MD010} -space * in * emphasis {MD037} +space *in * emphasis {MD037} -space ` in ` code +space `in ` code hard tab -space * in * emphasis {MD037} +space *in * emphasis {MD037} -space ` in ` code +space `in ` code hard tab -space * in * emphasis {MD037} +space *in * emphasis {MD037} -space ` in ` code {MD038} +space `in ` code {MD038} hard tab -space * in * emphasis {MD037} +space *in * emphasis {MD037} -space ` in ` code {MD038} +space `in ` code {MD038} diff --git a/test/inline-disable-enable.md b/test/inline-disable-enable.md index 50a13da6..8fa8948f 100644 --- a/test/inline-disable-enable.md +++ b/test/inline-disable-enable.md @@ -1,69 +1,69 @@ # Heading -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab / space * in * emphasis / space ` in ` code +hard tab / space *in * emphasis / space `in ` code -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab / space * in * emphasis {MD037} / space ` in ` code +hard tab / space *in * emphasis {MD037} / space `in ` code -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} before after -hard tab / space * in * emphasis {MD037} / space ` in ` code +hard tab / space *in * emphasis {MD037} / space `in ` code beforeafter -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab / space * in * emphasis {MD037} / space ` in ` code +hard tab / space *in * emphasis {MD037} / space `in ` code -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} hard tab {MD010} -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} hard tab -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab / space * in * emphasis / space ` in ` code +hard tab / space *in * emphasis / space `in ` code -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code -hard tab {MD010} / space * in * emphasis {MD037} / space ` in ` code {MD038} +hard tab {MD010} / space *in * emphasis {MD037} / space `in ` code {MD038} embedded {MD033} HTML diff --git a/test/spaces_inside_codespan_elements.md b/test/spaces_inside_codespan_elements.md index 2412a9d9..eec2f855 100644 --- a/test/spaces_inside_codespan_elements.md +++ b/test/spaces_inside_codespan_elements.md @@ -95,3 +95,19 @@ Text [link](#link(link`link) text `code`. {MD038} Text [`link`](xref:custom.link`1) text `code`. Text ``code [link](#link`link) code`` text `code`. + +No space, start or end: `code` + +Start space, no end space: ` code` {MD038} + +No start space, end space: `code ` {MD038} + +Single start and end space: ` code ` (explicitly allowed/trimmed by the specification) + +All spaces: ` ` {MD038} + +Double start and single end space: ` code ` {MD038} + +Single start and double end spaces: ` code ` {MD038} + +Double start and end spaces: ` code ` {MD038}