From 8d4166160dd87d1530b4660253ecbe3b1dcf6f58 Mon Sep 17 00:00:00 2001 From: Luccas Correa Date: Tue, 3 Feb 2026 15:31:20 -0300 Subject: [PATCH] fix: load alternative style definitions when main one is missing --- .../core/super-converter/SuperConverter.js | 8 ++++ .../super-converter/SuperConverter.test.js | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/packages/super-editor/src/core/super-converter/SuperConverter.js b/packages/super-editor/src/core/super-converter/SuperConverter.js index b8f1b74912..64752213fa 100644 --- a/packages/super-editor/src/core/super-converter/SuperConverter.js +++ b/packages/super-editor/src/core/super-converter/SuperConverter.js @@ -269,6 +269,14 @@ class SuperConverter { this.convertedXml[file.name] = addDefaultStylesIfMissing(this.convertedXml[file.name]); } }); + if (!this.convertedXml['word/styles.xml']) { + for (let i = 1; i <= 5; i += 1) { + if (this.convertedXml[`word/styles${i}.xml`] != null) { + this.convertedXml['word/styles.xml'] = addDefaultStylesIfMissing(this.convertedXml[`word/styles${i}.xml`]); + break; + } + } + } this.initialJSON = this.convertedXml['word/document.xml']; if (!this.initialJSON) this.initialJSON = this.parseXmlToJson(this.xml); diff --git a/packages/super-editor/src/core/super-converter/SuperConverter.test.js b/packages/super-editor/src/core/super-converter/SuperConverter.test.js index 07c13c6a99..cb0cee48c5 100644 --- a/packages/super-editor/src/core/super-converter/SuperConverter.test.js +++ b/packages/super-editor/src/core/super-converter/SuperConverter.test.js @@ -927,3 +927,51 @@ describe('XML whitespace preservation', () => { expect(textNodes[2].elements[0].text).toBe('Trimmed text '); }); }); + +describe('SuperConverter styles fallback', () => { + const baseDocumentXml = { + name: 'word/document.xml', + content: ` + + Test + `, + }; + + const buildStylesXml = (styleId) => ({ + name: 'word/styles2.xml', + content: ` + + + + + `, + }); + + it('uses styles2.xml when styles.xml is missing', () => { + const styles2Xml = buildStylesXml('AltStyle2'); + const converter = new SuperConverter({ docx: [baseDocumentXml, styles2Xml] }); + const styles = converter.convertedXml['word/styles.xml']; + + expect(styles).toBeTruthy(); + expect(styles.elements?.[0]?.name).toBe('w:styles'); + expect(styles.elements?.[0]?.elements?.[0]?.attributes?.['w:styleId']).toBe('AltStyle2'); + }); + + it('prefers the lowest-indexed styles file when multiple exist', () => { + const styles2Xml = buildStylesXml('AltStyle2'); + const styles4Xml = { + name: 'word/styles4.xml', + content: ` + + + + + `, + }; + + const converter = new SuperConverter({ docx: [baseDocumentXml, styles4Xml, styles2Xml] }); + const styles = converter.convertedXml['word/styles.xml']; + + expect(styles?.elements?.[0]?.elements?.[0]?.attributes?.['w:styleId']).toBe('AltStyle2'); + }); +});