// @vitest-environment jsdom import { describe, expect, it } from 'vitest'; import { createTextDocument, serializeTextDocument, } from '../../../src/react/text/prosemirror/document'; describe('renderer ProseMirror schema', () => { it('round-trips legacy rich-text nodes and marks', () => { const html = '

MAIC

  1. One

'; const output = serializeTextDocument(createTextDocument(html)); expect(output).toContain('
'); expect(output).toContain(' { const output = serializeTextDocument( createTextDocument('

Text

'), ); expect(output).toMatch(/

{ const output = serializeTextDocument( createTextDocument( '

Indented text

', ), ); expect(output).toContain('text-indent: 78px'); expect(output).toContain('letter-spacing: 1.5pt'); }); it('preserves rem first-line indentation without converting its unit', () => { const output = serializeTextDocument( createTextDocument('

Indented text

'), ); expect(output).toContain('text-indent: 1rem'); expect(output).not.toContain('text-indent: 1em'); }); it('preserves an empty inline-block spacer used for PPTX first-line indentation', () => { const output = serializeTextDocument( createTextDocument( '

Indented text

', ), ); expect(output).toContain('display: inline-block'); expect(output).toContain('width: 1.5em'); expect(output).toContain('Indented text'); }); it('preserves PPTX text-container and paragraph geometry while editing', () => { const output = serializeTextDocument( createTextDocument( '

Text

', ), ); expect(output).toContain('padding: 4.8px 9.6px'); expect(output).toContain('margin-left: 78px'); expect(output).toContain('text-indent: -30px'); expect(output).toContain('padding-top: 7.3px'); expect(output).toContain('margin-top: 8px'); expect(output).toContain('margin-bottom: 5px'); }); it('preserves no-wrap paragraphs imported from PPTX', () => { const output = serializeTextDocument( createTextDocument('

在集体中成长,与集体共成长

'), ); expect(output).toContain('white-space: nowrap'); }); it('preserves a sized inline-block slot containing a PPTX bullet glyph', () => { const output = serializeTextDocument( createTextDocument( '

■1954年清华大学首创

', ), ); expect(output).toContain('display: inline-block'); expect(output).toContain('width: 30px'); expect(output).toContain('text-indent: 0'); expect(output).toContain('box-sizing: border-box'); expect(output).toContain('■'); }); it('preserves inline-block layout styles used by imported PPTX text', () => { const output = serializeTextDocument( createTextDocument( '

■•Text

', ), ); expect(output).toContain('display: inline-block'); expect(output).toContain('height: 24px'); expect(output).toContain('vertical-align: middle'); expect(output).toContain('margin: 1px 2px'); expect(output).toContain('margin-left: 5px'); expect(output).toContain('padding: 3px 4px'); expect(output).toContain('padding-right: 6px'); }); it('preserves explicit PPTX line breaks instead of reflowing them', () => { const output = serializeTextDocument( createTextDocument( '

1954年清华大学首创“先进集体”
评选制度

', ), ); expect(output).toMatch(/1954年清华大学首创“先进集体”<\/span>
]*>评选制度/); }); it('turns literal plain-text newlines into explicit line breaks', () => { const output = serializeTextDocument(createTextDocument('First line\nSecond line')); expect(output).toContain('First line
Second line'); }); it('decodes plain-text HTML entities while preserving literal line breaks', () => { const output = serializeTextDocument(createTextDocument('A \nB & C')); expect(output).toContain('A 
B & C'); }); });