diff --git a/packages/super-editor/src/core/super-converter/SuperConverter.js b/packages/super-editor/src/core/super-converter/SuperConverter.js index 09742b7fbe..902d3e4a54 100644 --- a/packages/super-editor/src/core/super-converter/SuperConverter.js +++ b/packages/super-editor/src/core/super-converter/SuperConverter.js @@ -163,7 +163,9 @@ class SuperConverter { } parseXmlToJson(xml) { - return JSON.parse(xmljs.xml2json(xml, null, 2)); + // We need to preserve nodes with xml:space="preserve" and only have empty spaces + const newXml = xml.replace(/()(\s+)(<\/w:t>)/g, '$1[[sdspace]]$2[[sdspace]]$3'); + return JSON.parse(xmljs.xml2json(newXml, null, 2)); } static getStoredSuperdocVersion(docx) { diff --git a/packages/super-editor/src/core/super-converter/v2/importer/textNodeImporter.js b/packages/super-editor/src/core/super-converter/v2/importer/textNodeImporter.js index 5c0a3c5d73..a2dea2fcff 100644 --- a/packages/super-editor/src/core/super-converter/v2/importer/textNodeImporter.js +++ b/packages/super-editor/src/core/super-converter/v2/importer/textNodeImporter.js @@ -16,7 +16,11 @@ export const handleTextNode = (params) => { // Text nodes have no children. Only text, and there should only be one child let text; - if (elements.length === 1) text = elements[0].text; + if (elements.length === 1) { + text = elements[0].text; + // Handle the removal of a temporary wrapper that we added to preserve empty spaces + text = text.replace(/\[\[sdspace\]\]/g, ''); + } // Word sometimes will have an empty text node with a space attribute, in that case it should be a space else if (!elements.length && 'attributes' in node && node.attributes['xml:space'] === 'preserve') { text = ' ';