From e4b2aab2a38f3418c1871f38b2fb7d229d645fc8 Mon Sep 17 00:00:00 2001 From: Neil Date: Fri, 18 Sep 2026 23:38:06 -0700 Subject: [PATCH] fix(editor): match fence suffix whitespace rules --- .../components/editor/markdown-fence-scanner.ts | 17 ++++++++++------- .../editor/markdown-scanner-boundaries.test.ts | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/renderer/src/components/editor/markdown-fence-scanner.ts b/src/renderer/src/components/editor/markdown-fence-scanner.ts index 3d1de134eba..f01ffaacc30 100644 --- a/src/renderer/src/components/editor/markdown-fence-scanner.ts +++ b/src/renderer/src/components/editor/markdown-fence-scanner.ts @@ -10,17 +10,20 @@ export type MarkdownFenceTracker = { // Top-level fence delimiters may be indented by at most three spaces. const FENCE_LINE = /[ ]{0,3}(`{3,}|~{3,})/y function hasClosingSuffix(content: string, start: number, end: number): boolean { + let sawWhitespace = false for (let index = start; index < end; index += 1) { const character = content.charCodeAt(index) - if ( - character !== 126 && - character !== 96 && - character !== 32 && - character !== 9 && - character !== 13 - ) { + if (character === 32 || character === 9 || character === 13) { + sawWhitespace = true + continue + } + if ((character === 126 || character === 96) && !sawWhitespace) { + continue + } + if (character !== 126 && character !== 96) { return false } + return false } return true } diff --git a/src/renderer/src/components/editor/markdown-scanner-boundaries.test.ts b/src/renderer/src/components/editor/markdown-scanner-boundaries.test.ts index 4b965e09064..49b13152376 100644 --- a/src/renderer/src/components/editor/markdown-scanner-boundaries.test.ts +++ b/src/renderer/src/components/editor/markdown-scanner-boundaries.test.ts @@ -34,7 +34,7 @@ it.each(['\n', '\r\n', '\r'])('retains %j terminators while stripping code', (eo ) }) -it.each(['```~~~', ' ```'])('matches the parser on the closer %j', (closer) => { +it.each(['```~~~', '``` ~', ' ```'])('matches the parser on the closer %j', (closer) => { const source = `\`\`\`\ncode\n${closer}\n
after
\n` const code = marked.lexer(source)[0] expect(code.type).toBe('code')