diff --git a/packages/super-editor/src/core/super-converter/exporter.js b/packages/super-editor/src/core/super-converter/exporter.js index 56920b9b97..6a03349004 100644 --- a/packages/super-editor/src/core/super-converter/exporter.js +++ b/packages/super-editor/src/core/super-converter/exporter.js @@ -945,7 +945,13 @@ function translateLineBreak(params) { } return { - name: 'w:br', + name: 'w:r', + elements: [ + { + name: 'w:br', + attributes, + }, + ], attributes, }; } diff --git a/packages/super-editor/src/tests/data/line-break.docx b/packages/super-editor/src/tests/data/line-break.docx new file mode 100644 index 0000000000..c013968882 Binary files /dev/null and b/packages/super-editor/src/tests/data/line-break.docx differ diff --git a/packages/super-editor/src/tests/export/lineBreakExporter.test.js b/packages/super-editor/src/tests/export/lineBreakExporter.test.js new file mode 100644 index 0000000000..40523484f3 --- /dev/null +++ b/packages/super-editor/src/tests/export/lineBreakExporter.test.js @@ -0,0 +1,41 @@ +import { getExportedResult } from './export-helpers/index'; + +describe('LineBreakExporter', () => { + let result; + let body; + + beforeAll(async () => { + result = await getExportedResult('line-break.docx'); + }); + + beforeEach(() => { + body = result.elements?.find((el) => el.name === 'w:body'); + }); + + it('exports lineBreak nodes wrapped in w:r (run) elements', () => { + // Grab the first paragraph that contains line breaks + const paragraphWithLineBreaks = body.elements?.find( + (el) => + el.name === 'w:p' && + el.elements?.some((run) => run.name === 'w:r' && run.elements?.some((element) => element.name === 'w:br')), + ); + + expect(paragraphWithLineBreaks).toBeDefined(); + expect(paragraphWithLineBreaks.name).toBe('w:p'); + + const runs = paragraphWithLineBreaks.elements?.filter((el) => el.name === 'w:r') || []; + expect(runs.length).toBeGreaterThan(0); + + const runsWithLineBreaks = runs.filter((run) => run.elements?.some((element) => element.name === 'w:br')); + + expect(runsWithLineBreaks.length).toBeGreaterThan(0); + + // Verify the structure: w:r -> w:br + runsWithLineBreaks.forEach((run) => { + expect(run.name).toBe('w:r'); + const lineBreak = run.elements?.find((element) => element.name === 'w:br'); + expect(lineBreak).toBeDefined(); + expect(lineBreak.name).toBe('w:br'); + }); + }); +});