diff --git a/src/renderer/src/components/editor/rich-markdown-code-span-padding.test.ts b/src/renderer/src/components/editor/rich-markdown-code-span-padding.test.ts index 8946ea4efbb..4fe833311d3 100644 --- a/src/renderer/src/components/editor/rich-markdown-code-span-padding.test.ts +++ b/src/renderer/src/components/editor/rich-markdown-code-span-padding.test.ts @@ -23,20 +23,20 @@ function roundTrip(source: string): string { describe('maskCodeSpanPadding', () => { it('leaves a node without a code mark alone', () => { const nodes = [{ type: 'text', text: ' padded ', marks: [] }] - expect(maskCodeSpanPadding(nodes)).toEqual(nodes) + expect(maskCodeSpanPadding(nodes).nodes).toEqual(nodes) }) it('leaves an unpadded code span alone', () => { const nodes = [{ type: 'text', text: 'code', marks: [{ type: 'code' }] }] - expect(maskCodeSpanPadding(nodes)).toEqual(nodes) + expect(maskCodeSpanPadding(nodes).nodes).toEqual(nodes) }) it('round-trips the padding it masks', () => { - const [masked] = maskCodeSpanPadding([ + const masked = maskCodeSpanPadding([ { type: 'text', text: ' code ', marks: [{ type: 'code' }] } ]) - expect(masked.text).not.toContain(' ') - expect(restoreCodeSpanPadding(masked.text ?? '')).toBe(' code ') + expect(masked.nodes[0]?.text).not.toContain(' ') + expect(restoreCodeSpanPadding(masked.nodes[0]?.text ?? '', masked.placeholder)).toBe(' code ') }) }) diff --git a/src/renderer/src/components/editor/rich-markdown-code-span-padding.ts b/src/renderer/src/components/editor/rich-markdown-code-span-padding.ts index 6042dc743b5..4ad7c0e10bd 100644 --- a/src/renderer/src/components/editor/rich-markdown-code-span-padding.ts +++ b/src/renderer/src/components/editor/rich-markdown-code-span-padding.ts @@ -37,11 +37,12 @@ function paddingPlaceholder(nodes: MarkdownNodeLike[]): string { return placeholder } -export function maskCodeSpanPadding( - nodes: MarkdownNodeLike[], - placeholder = paddingPlaceholder(nodes) -): MarkdownNodeLike[] { - return nodes.map((node) => { +export function maskCodeSpanPadding(nodes: MarkdownNodeLike[]): { + nodes: MarkdownNodeLike[] + placeholder: string +} { + const placeholder = paddingPlaceholder(nodes) + const masked = nodes.map((node) => { if (node?.type !== 'text' || !hasCodeMark(node)) { return node } @@ -57,9 +58,10 @@ export function maskCodeSpanPadding( text: placeholder.repeat(leading.length) + body + placeholder.repeat(trailing.length) } }) + return { nodes: masked, placeholder } } -export function restoreCodeSpanPadding(markdown: string, placeholder = '\uE000'): string { +export function restoreCodeSpanPadding(markdown: string, placeholder: string): string { return markdown.split(placeholder).join(' ') } @@ -87,9 +89,11 @@ export const RichMarkdownCodeSpanPadding = Extension.create({ nodes: MarkdownNodeLike[], ...rest: unknown[] ) { - const placeholder = paddingPlaceholder(nodes ?? []) - const rendered = walk.call(this, maskCodeSpanPadding(nodes ?? [], placeholder), ...rest) - return typeof rendered === 'string' ? restoreCodeSpanPadding(rendered, placeholder) : rendered + const masked = maskCodeSpanPadding(nodes ?? []) + const rendered = walk.call(this, masked.nodes, ...rest) + return typeof rendered === 'string' + ? restoreCodeSpanPadding(rendered, masked.placeholder) + : rendered } } })