// @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 = '
One
'); 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( '', ), ); 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('Text
在集体中成长,与集体共成长
'), ); 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'); }); });