Merge branch 'nwparker/markdown-better' into stack-structure

This commit is contained in:
Neil
2026-09-18 17:01:04 -07:00
2 changed files with 18 additions and 14 deletions
@@ -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 ')
})
})
@@ -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
}
}
})