From a55d5499e2f97f9a902f554b1f03d6496c2b42af Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 11 Oct 2025 17:28:04 -0700 Subject: [PATCH] Update MD009/no-trailing-spaces with code_blocks parameter to allow reporting/fixing trailing spaces in indented/fenced code blocks (fixes #1181). --- doc-build/md009.md | 16 +- doc/Rules.md | 17 +- doc/md009.md | 17 +- lib/configuration-strict.d.ts | 8 + lib/md009.mjs | 14 +- schema/.markdownlint.jsonc | 2 + schema/.markdownlint.yaml | 2 + schema/build-config-schema.mjs | 6 + schema/markdownlint-config-schema-strict.json | 10 + schema/markdownlint-config-schema.json | 10 + test/markdownlint-test.mjs | 10 +- .../markdownlint-test-scenarios.mjs.md | 421 ++++++++++++++++++ .../markdownlint-test-scenarios.mjs.snap | Bin 325331 -> 326801 bytes test/trailing-spaces-in-code-default.md | 27 ++ test/trailing-spaces-in-code-false.md | 30 ++ test/trailing-spaces-in-code-true.md | 34 ++ 16 files changed, 590 insertions(+), 34 deletions(-) create mode 100644 test/trailing-spaces-in-code-default.md create mode 100644 test/trailing-spaces-in-code-false.md create mode 100644 test/trailing-spaces-in-code-true.md diff --git a/doc-build/md009.md b/doc-build/md009.md index 5eabc577..8ff10ca6 100644 --- a/doc-build/md009.md +++ b/doc-build/md009.md @@ -1,21 +1,19 @@ This rule is triggered on any lines that end with unexpected whitespace. To fix this, remove the trailing space from the end of the line. -Note: Trailing space is allowed in indented and fenced code blocks because some -languages require it. - The `br_spaces` parameter allows an exception to this rule for a specific number of trailing spaces, typically used to insert an explicit line break. The default -value allows 2 spaces to indicate a hard break (\
element). +value allows 2 spaces to indicate a hard break (\
element). (You must set +`br_spaces` to a value >= 2 for this parameter to take effect. Setting +`br_spaces` to 1 behaves the same as 0, disallowing any trailing spaces.) -Note: You must set `br_spaces` to a value >= 2 for this parameter to take -effect. Setting `br_spaces` to 1 behaves the same as 0, disallowing any trailing -spaces. +By default, trailing space is allowed in indented and fenced code blocks because +some programming languages require that. To report such instances, set the +`code_blocks` parameter to `true`. By default, this rule will not trigger when the allowed number of spaces is used, even when it doesn't create a hard break (for example, at the end of a -paragraph). To report such instances as well, set the `strict` parameter to -`true`. +paragraph). To report such instances, set the `strict` parameter to `true`. ```markdown Text text text diff --git a/doc/Rules.md b/doc/Rules.md index eda7730e..a9a675b3 100644 --- a/doc/Rules.md +++ b/doc/Rules.md @@ -295,6 +295,7 @@ Aliases: `no-trailing-spaces` Parameters: - `br_spaces`: Spaces for line break (`integer`, default `2`) +- `code_blocks`: Include code blocks (`boolean`, default `false`) - `list_item_empty_lines`: Allow spaces for empty lines in list items (`boolean`, default `false`) - `strict`: Include unnecessary breaks (`boolean`, default `false`) @@ -304,21 +305,19 @@ Fixable: Some violations can be fixed by tooling This rule is triggered on any lines that end with unexpected whitespace. To fix this, remove the trailing space from the end of the line. -Note: Trailing space is allowed in indented and fenced code blocks because some -languages require it. - The `br_spaces` parameter allows an exception to this rule for a specific number of trailing spaces, typically used to insert an explicit line break. The default -value allows 2 spaces to indicate a hard break (\
element). +value allows 2 spaces to indicate a hard break (\
element). (You must set +`br_spaces` to a value >= 2 for this parameter to take effect. Setting +`br_spaces` to 1 behaves the same as 0, disallowing any trailing spaces.) -Note: You must set `br_spaces` to a value >= 2 for this parameter to take -effect. Setting `br_spaces` to 1 behaves the same as 0, disallowing any trailing -spaces. +By default, trailing space is allowed in indented and fenced code blocks because +some programming languages require that. To report such instances, set the +`code_blocks` parameter to `true`. By default, this rule will not trigger when the allowed number of spaces is used, even when it doesn't create a hard break (for example, at the end of a -paragraph). To report such instances as well, set the `strict` parameter to -`true`. +paragraph). To report such instances, set the `strict` parameter to `true`. ```markdown Text text text diff --git a/doc/md009.md b/doc/md009.md index 180008bc..115a2e88 100644 --- a/doc/md009.md +++ b/doc/md009.md @@ -7,6 +7,7 @@ Aliases: `no-trailing-spaces` Parameters: - `br_spaces`: Spaces for line break (`integer`, default `2`) +- `code_blocks`: Include code blocks (`boolean`, default `false`) - `list_item_empty_lines`: Allow spaces for empty lines in list items (`boolean`, default `false`) - `strict`: Include unnecessary breaks (`boolean`, default `false`) @@ -16,21 +17,19 @@ Fixable: Some violations can be fixed by tooling This rule is triggered on any lines that end with unexpected whitespace. To fix this, remove the trailing space from the end of the line. -Note: Trailing space is allowed in indented and fenced code blocks because some -languages require it. - The `br_spaces` parameter allows an exception to this rule for a specific number of trailing spaces, typically used to insert an explicit line break. The default -value allows 2 spaces to indicate a hard break (\
element). +value allows 2 spaces to indicate a hard break (\
element). (You must set +`br_spaces` to a value >= 2 for this parameter to take effect. Setting +`br_spaces` to 1 behaves the same as 0, disallowing any trailing spaces.) -Note: You must set `br_spaces` to a value >= 2 for this parameter to take -effect. Setting `br_spaces` to 1 behaves the same as 0, disallowing any trailing -spaces. +By default, trailing space is allowed in indented and fenced code blocks because +some programming languages require that. To report such instances, set the +`code_blocks` parameter to `true`. By default, this rule will not trigger when the allowed number of spaces is used, even when it doesn't create a hard break (for example, at the end of a -paragraph). To report such instances as well, set the `strict` parameter to -`true`. +paragraph). To report such instances, set the `strict` parameter to `true`. ```markdown Text text text diff --git a/lib/configuration-strict.d.ts b/lib/configuration-strict.d.ts index d356278b..73055d21 100644 --- a/lib/configuration-strict.d.ts +++ b/lib/configuration-strict.d.ts @@ -245,6 +245,10 @@ export interface ConfigurationStrict { * Spaces for line break */ br_spaces?: number; + /** + * Include code blocks + */ + code_blocks?: boolean; /** * Allow spaces for empty lines in list items */ @@ -273,6 +277,10 @@ export interface ConfigurationStrict { * Spaces for line break */ br_spaces?: number; + /** + * Include code blocks + */ + code_blocks?: boolean; /** * Allow spaces for empty lines in list items */ diff --git a/lib/md009.mjs b/lib/md009.mjs index 55394ad6..f27a641b 100644 --- a/lib/md009.mjs +++ b/lib/md009.mjs @@ -13,14 +13,18 @@ export default { "function": function MD009(params, onError) { let brSpaces = params.config.br_spaces; brSpaces = Number((brSpaces === undefined) ? 2 : brSpaces); + const codeBlocks = params.config.code_blocks; + const includeCode = (codeBlocks === undefined) ? false : !!codeBlocks; const listItemEmptyLines = !!params.config.list_item_empty_lines; const strict = !!params.config.strict; const codeBlockLineNumbers = new Set(); - for (const codeBlock of filterByTypesCached([ "codeFenced" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine + 1, codeBlock.endLine - 1); - } - for (const codeBlock of filterByTypesCached([ "codeIndented" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); + if (!includeCode) { + for (const codeBlock of filterByTypesCached([ "codeFenced" ])) { + addRangeToSet(codeBlockLineNumbers, codeBlock.startLine + 1, codeBlock.endLine - 1); + } + for (const codeBlock of filterByTypesCached([ "codeIndented" ])) { + addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); + } } const listItemLineNumbers = new Set(); if (listItemEmptyLines) { diff --git a/schema/.markdownlint.jsonc b/schema/.markdownlint.jsonc index f89ccd80..def3ba78 100644 --- a/schema/.markdownlint.jsonc +++ b/schema/.markdownlint.jsonc @@ -42,6 +42,8 @@ "MD009": { // Spaces for line break "br_spaces": 2, + // Include code blocks + "code_blocks": false, // Allow spaces for empty lines in list items "list_item_empty_lines": false, // Include unnecessary breaks diff --git a/schema/.markdownlint.yaml b/schema/.markdownlint.yaml index d9d0b188..097e9994 100644 --- a/schema/.markdownlint.yaml +++ b/schema/.markdownlint.yaml @@ -37,6 +37,8 @@ MD007: MD009: # Spaces for line break br_spaces: 2 + # Include code blocks + code_blocks: false # Allow spaces for empty lines in list items list_item_empty_lines: false # Include unnecessary breaks diff --git a/schema/build-config-schema.mjs b/schema/build-config-schema.mjs index 56ab797d..3b5a7c2b 100644 --- a/schema/build-config-schema.mjs +++ b/schema/build-config-schema.mjs @@ -161,6 +161,12 @@ for (const rule of rules) { "default": 2 }; // @ts-ignore + subscheme.properties.code_blocks = { + "description": "Include code blocks", + "type": "boolean", + "default": false + }; + // @ts-ignore subscheme.properties.list_item_empty_lines = { "description": "Allow spaces for empty lines in list items", "type": "boolean", diff --git a/schema/markdownlint-config-schema-strict.json b/schema/markdownlint-config-schema-strict.json index 3fdc7176..3ba059ad 100644 --- a/schema/markdownlint-config-schema-strict.json +++ b/schema/markdownlint-config-schema-strict.json @@ -512,6 +512,11 @@ "minimum": 0, "default": 2 }, + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": false + }, "list_item_empty_lines": { "description": "Allow spaces for empty lines in list items", "type": "boolean", @@ -563,6 +568,11 @@ "minimum": 0, "default": 2 }, + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": false + }, "list_item_empty_lines": { "description": "Allow spaces for empty lines in list items", "type": "boolean", diff --git a/schema/markdownlint-config-schema.json b/schema/markdownlint-config-schema.json index f1b8341f..85dff84f 100644 --- a/schema/markdownlint-config-schema.json +++ b/schema/markdownlint-config-schema.json @@ -512,6 +512,11 @@ "minimum": 0, "default": 2 }, + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": false + }, "list_item_empty_lines": { "description": "Allow spaces for empty lines in list items", "type": "boolean", @@ -563,6 +568,11 @@ "minimum": 0, "default": 2 }, + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": false + }, "list_item_empty_lines": { "description": "Allow spaces for empty lines in list items", "type": "boolean", diff --git a/test/markdownlint-test.mjs b/test/markdownlint-test.mjs index b9f70572..a10497a9 100644 --- a/test/markdownlint-test.mjs +++ b/test/markdownlint-test.mjs @@ -984,6 +984,9 @@ test("customFileSystemSync", (t) => { t.plan(2); const file = "/dir/file.md"; const fsApi = { + "access": () => { throw new Error("access"); }, + "accessSync": () => { throw new Error("accessSync"); }, + "readFile": () => { throw new Error("readFile"); }, // @ts-ignore "readFileSync": (p) => { t.is(p, file); @@ -1001,11 +1004,14 @@ test("customFileSystemAsync", (t) => new Promise((resolve) => { t.plan(3); const file = "/dir/file.md"; const fsApi = { + "access": () => { throw new Error("access"); }, + "accessSync": () => { throw new Error("accessSync"); }, // @ts-ignore "readFile": (p, o, cb) => { t.is(p, file); cb(null, "# Heading"); - } + }, + "readFileSync": () => { throw new Error("readFileSync"); } }; lintAsync({ "files": file, @@ -1095,7 +1101,7 @@ test("readme", async(t) => { }); test("validateJsonUsingConfigSchemaStrict", async(t) => { - t.plan(215); + t.plan(218); // @ts-ignore const ajv = new Ajv(ajvOptions); const validateSchemaStrict = ajv.compile(configSchemaStrict); diff --git a/test/snapshots/markdownlint-test-scenarios.mjs.md b/test/snapshots/markdownlint-test-scenarios.mjs.md index b2ac0def..dc7c2f22 100644 --- a/test/snapshots/markdownlint-test-scenarios.mjs.md +++ b/test/snapshots/markdownlint-test-scenarios.mjs.md @@ -75772,6 +75772,427 @@ Generated by [AVA](https://avajs.dev). `, } +## trailing-spaces-in-code-default.md + +> Snapshot 1 + + { + errors: [ + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 1', + errorRange: [ + 14, + 1, + ], + fixInfo: { + deleteCount: 1, + editColumn: 14, + }, + lineNumber: 4, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 3', + errorRange: [ + 14, + 3, + ], + fixInfo: { + deleteCount: 3, + editColumn: 14, + }, + lineNumber: 6, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 4', + errorRange: [ + 14, + 4, + ], + fixInfo: { + deleteCount: 4, + editColumn: 14, + }, + lineNumber: 7, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + ], + fixed: `# Trailing Spaces in Code - Default␊ + ␊ + const a = 10;␊ + const b = 10;␊ + const c = 10; ␊ + const d = 10;␊ + const e = 10;␊ + ␊ + {MD009:-5} {MD009:-3} {MD009:-2}␊ + ␊ + const a = 10;␊ + const b = 10; ␊ + const c = 10; ␊ + const d = 10; ␊ + const e = 10; ␊ + ␊ + \`\`\`js␊ + const a = 10;␊ + const b = 10; ␊ + const c = 10; ␊ + const d = 10; ␊ + const e = 10; ␊ + \`\`\`␊ + ␊ + ␊ + `, + } + +## trailing-spaces-in-code-false.md + +> Snapshot 1 + + { + errors: [ + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 1', + errorRange: [ + 14, + 1, + ], + fixInfo: { + deleteCount: 1, + editColumn: 14, + }, + lineNumber: 4, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 3', + errorRange: [ + 14, + 3, + ], + fixInfo: { + deleteCount: 3, + editColumn: 14, + }, + lineNumber: 6, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 4', + errorRange: [ + 14, + 4, + ], + fixInfo: { + deleteCount: 4, + editColumn: 14, + }, + lineNumber: 7, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + ], + fixed: `# Trailing Spaces in Code - False␊ + ␊ + const a = 10;␊ + const b = 10;␊ + const c = 10; ␊ + const d = 10;␊ + const e = 10;␊ + ␊ + {MD009:-5} {MD009:-3} {MD009:-2}␊ + ␊ + const a = 10;␊ + const b = 10; ␊ + const c = 10; ␊ + const d = 10; ␊ + const e = 10; ␊ + ␊ + \`\`\`js␊ + const a = 10;␊ + const b = 10; ␊ + const c = 10; ␊ + const d = 10; ␊ + const e = 10; ␊ + \`\`\`␊ + ␊ + ␊ + `, + } + +## trailing-spaces-in-code-true.md + +> Snapshot 1 + + { + errors: [ + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 1', + errorRange: [ + 14, + 1, + ], + fixInfo: { + deleteCount: 1, + editColumn: 14, + }, + lineNumber: 4, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 3', + errorRange: [ + 14, + 3, + ], + fixInfo: { + deleteCount: 3, + editColumn: 14, + }, + lineNumber: 6, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 4', + errorRange: [ + 14, + 4, + ], + fixInfo: { + deleteCount: 4, + editColumn: 14, + }, + lineNumber: 7, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 1', + errorRange: [ + 18, + 1, + ], + fixInfo: { + deleteCount: 1, + editColumn: 18, + }, + lineNumber: 12, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 3', + errorRange: [ + 18, + 3, + ], + fixInfo: { + deleteCount: 3, + editColumn: 18, + }, + lineNumber: 14, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 4', + errorRange: [ + 18, + 4, + ], + fixInfo: { + deleteCount: 4, + editColumn: 18, + }, + lineNumber: 15, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 1', + errorRange: [ + 14, + 1, + ], + fixInfo: { + deleteCount: 1, + editColumn: 14, + }, + lineNumber: 21, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 3', + errorRange: [ + 14, + 3, + ], + fixInfo: { + deleteCount: 3, + editColumn: 14, + }, + lineNumber: 23, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + { + errorContext: null, + errorDetail: 'Expected: 0 or 2; Actual: 4', + errorRange: [ + 14, + 4, + ], + fixInfo: { + deleteCount: 4, + editColumn: 14, + }, + lineNumber: 24, + ruleDescription: 'Trailing spaces', + ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md009.md', + ruleNames: [ + 'MD009', + 'no-trailing-spaces', + ], + severity: 'error', + }, + ], + fixed: `# Trailing Spaces in Code - True␊ + ␊ + const a = 10;␊ + const b = 10;␊ + const c = 10; ␊ + const d = 10;␊ + const e = 10;␊ + ␊ + {MD009:-5} {MD009:-3} {MD009:-2}␊ + ␊ + const a = 10;␊ + const b = 10;␊ + const c = 10; ␊ + const d = 10;␊ + const e = 10;␊ + ␊ + {MD009:-5} {MD009:-3} {MD009:-2}␊ + ␊ + \`\`\`js␊ + const a = 10;␊ + const b = 10;␊ + const c = 10; ␊ + const d = 10;␊ + const e = 10;␊ + \`\`\`␊ + ␊ + {MD009:-6} {MD009:-4} {MD009:-3}␊ + ␊ + ␊ + `, + } + ## trailing-spaces-in-lists-allowed-strict.md > Snapshot 1 diff --git a/test/snapshots/markdownlint-test-scenarios.mjs.snap b/test/snapshots/markdownlint-test-scenarios.mjs.snap index 3e71001af7a7237b5867b22fdcb470e393ae360b..1a3c83590bdcba37b806d826f0a18314cc5a2984 100644 GIT binary patch delta 8603 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 IqT#{$KYWmme*gdg delta 7122 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 diff --git a/test/trailing-spaces-in-code-default.md b/test/trailing-spaces-in-code-default.md new file mode 100644 index 00000000..cad8c611 --- /dev/null +++ b/test/trailing-spaces-in-code-default.md @@ -0,0 +1,27 @@ +# Trailing Spaces in Code - Default + +const a = 10; +const b = 10; +const c = 10; +const d = 10; +const e = 10; + +{MD009:-5} {MD009:-3} {MD009:-2} + + const a = 10; + const b = 10; + const c = 10; + const d = 10; + const e = 10; + +```js +const a = 10; +const b = 10; +const c = 10; +const d = 10; +const e = 10; +``` + + diff --git a/test/trailing-spaces-in-code-false.md b/test/trailing-spaces-in-code-false.md new file mode 100644 index 00000000..d217f231 --- /dev/null +++ b/test/trailing-spaces-in-code-false.md @@ -0,0 +1,30 @@ +# Trailing Spaces in Code - False + +const a = 10; +const b = 10; +const c = 10; +const d = 10; +const e = 10; + +{MD009:-5} {MD009:-3} {MD009:-2} + + const a = 10; + const b = 10; + const c = 10; + const d = 10; + const e = 10; + +```js +const a = 10; +const b = 10; +const c = 10; +const d = 10; +const e = 10; +``` + + diff --git a/test/trailing-spaces-in-code-true.md b/test/trailing-spaces-in-code-true.md new file mode 100644 index 00000000..f7a27c08 --- /dev/null +++ b/test/trailing-spaces-in-code-true.md @@ -0,0 +1,34 @@ +# Trailing Spaces in Code - True + +const a = 10; +const b = 10; +const c = 10; +const d = 10; +const e = 10; + +{MD009:-5} {MD009:-3} {MD009:-2} + + const a = 10; + const b = 10; + const c = 10; + const d = 10; + const e = 10; + +{MD009:-5} {MD009:-3} {MD009:-2} + +```js +const a = 10; +const b = 10; +const c = 10; +const d = 10; +const e = 10; +``` + +{MD009:-6} {MD009:-4} {MD009:-3} + +