Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/super-editor/src/editors/v1/core/Editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3248,7 +3248,7 @@ export class Editor extends EventEmitter<EditorEventMap> {
});

const numberingData = this.converter.convertedXml['word/numbering.xml'];
const numbering = this.converter.schemaToXml(numberingData.elements[0]);
const numbering = numberingData?.elements?.[0] ? this.converter.schemaToXml(numberingData.elements[0]) : null;

const appXmlData = this.converter.convertedXml['docProps/app.xml'];
const appXml = appXmlData?.elements?.[0] ? this.converter.schemaToXml(appXmlData.elements[0]) : null;
Expand All @@ -3262,7 +3262,7 @@ export class Editor extends EventEmitter<EditorEventMap> {
'word/document.xml': String(documentXml),
'docProps/custom.xml': String(customXml),
'word/_rels/document.xml.rels': String(rels),
'word/numbering.xml': String(numbering),
...(numbering ? { 'word/numbering.xml': String(numbering) } : {}),
'word/styles.xml': String(styles),
...updatedHeadersFooters,
...(appXml ? { 'docProps/app.xml': String(appXml) } : {}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@ import {
syncBibliographyPartToPackage,
getBibliographyPartExportPaths,
} from './citation-sources.js';
import {
collectReferencedNumIds,
filterOrphanedNumberingDefinitions,
} from './export-helpers/strip-orphaned-numbering.js';

const FONT_FAMILY_FALLBACKS = Object.freeze({
swiss: 'Arial, sans-serif',
roman: 'Times New Roman, serif',
Expand Down Expand Up @@ -1429,23 +1424,27 @@ class SuperConverter {

#exportNumberingFile() {
const numberingPath = 'word/numbering.xml';
// SD-2911: source presence must be captured before the baseNumbering fallback —
// the importer fills `this.numbering` from baseNumbering when the source had no
// numbering part, so it can't be inferred from `this.numbering` at write time.
const sourceHadNumberingXml = Boolean(this.convertedXml[numberingPath]);
let numberingXml = this.convertedXml[numberingPath];

if (!numberingXml) numberingXml = baseNumbering;
const currentNumberingXml = numberingXml.elements[0];

// D7: Strip orphaned numbering definitions (entries not referenced by any
// paragraph in the exported document parts).
const referencedNumIds = collectReferencedNumIds(this.convertedXml);
if (!sourceHadNumberingXml && !hasBodyNumberingReferences(this.convertedXml['word/document.xml'])) {
return;
}

if (this.numbering?.definitions && this.numbering?.abstracts) {
const { liveAbstracts, liveDefinitions } = filterOrphanedNumberingDefinitions(this.numbering, referencedNumIds);
currentNumberingXml.elements = [...liveAbstracts, ...liveDefinitions];
const abstracts = Object.values(this.numbering.abstracts);
const definitions = Object.values(this.numbering.definitions);
currentNumberingXml.elements = [...abstracts, ...definitions];
} else {
currentNumberingXml.elements = [];
}

// Update the numbering file
this.convertedXml[numberingPath] = numberingXml;
}

Expand Down Expand Up @@ -1738,4 +1737,17 @@ function generateCustomXml() {
return DEFAULT_CUSTOM_XML;
}

export { SuperConverter };
/** @returns {boolean} True if any descendant of `documentXml` is a `w:numPr` element. */
function hasBodyNumberingReferences(documentXml) {
if (!documentXml || typeof documentXml !== 'object') return false;
const stack = Array.isArray(documentXml.elements) ? [...documentXml.elements] : [];
while (stack.length) {
const node = stack.pop();
if (!node || typeof node !== 'object') continue;
if (node.name === 'w:numPr') return true;
if (Array.isArray(node.elements)) stack.push(...node.elements);
}
return false;
}

export { SuperConverter, hasBodyNumberingReferences };

This file was deleted.

Loading
Loading