docxmlater 10.2.2 → 10.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +44 -0
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +6 -4
- package/dist/elements/Field.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +24 -4
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/package.json +1 -1
- package/src/core/DocumentParser.ts +50 -1
- package/src/elements/Field.ts +10 -7
- package/src/utils/InMemoryRevisionAcceptor.ts +31 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/elements/Field.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/elements/Field.ts"],"names":[],"mappings":"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"}
|
package/dist/elements/Field.js
CHANGED
|
@@ -484,10 +484,12 @@ class ComplexField {
|
|
|
484
484
|
children: resultChildren,
|
|
485
485
|
});
|
|
486
486
|
}
|
|
487
|
-
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
|
|
487
|
+
if (this.resultContent.length === 0) {
|
|
488
|
+
for (const revision of this.resultRevisions) {
|
|
489
|
+
const revisionXml = revision.toXML();
|
|
490
|
+
if (revisionXml) {
|
|
491
|
+
runs.push(revisionXml);
|
|
492
|
+
}
|
|
491
493
|
}
|
|
492
494
|
}
|
|
493
495
|
runs.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.js","sourceRoot":"","sources":["../../src/elements/Field.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Field - Represents a dynamic field in a Word document\n *\n * Fields are used for dynamic content like page numbers, dates, document properties, etc.\n * They are represented using the <w:fldSimple> element with field codes.\n */\n\nimport { XMLElement } from '../xml/XMLBuilder';\nimport { RunFormatting, FormFieldData } from './Run';\nimport {\n ParsedHyperlinkInstruction,\n parseHyperlinkInstruction,\n isHyperlinkInstruction,\n} from './FieldHelpers';\nimport type { Revision } from './Revision';\nimport { pointsToHalfPoints } from '../utils/units';\n\n/**\n * Common field types\n */\nexport type FieldType =\n | 'PAGE' // Current page number\n | 'NUMPAGES' // Total number of pages\n | 'DATE' // Current date\n | 'TIME' // Current time\n | 'AUTHOR' // Document author\n | 'TITLE' // Document title\n | 'FILENAME' // Document filename\n | 'FILENAMEWITHPATH' // Document filename with path\n | 'SUBJECT' // Document subject\n | 'KEYWORDS' // Document keywords\n | 'CREATEDATE' // Document creation date\n | 'SAVEDATE' // Last save date\n | 'PRINTDATE' // Last print date\n | 'SECTIONPAGES' // Pages in current section\n | 'SECTION' // Current section number\n | 'REF' // Cross-reference to bookmark\n | 'HYPERLINK' // Hyperlink field\n | 'SEQ' // Sequence numbering\n | 'TC' // Table of contents entry\n | 'XE' // Index entry\n | 'IF' // Conditional field\n | 'MERGEFIELD' // Mail merge field\n | 'INCLUDE' // Include text from external file\n | 'INCLUDETEXT' // Include text from external file (alias)\n | 'CUSTOM'; // Custom field type for unknown/specialized fields\n\n/**\n * Field properties\n */\nexport interface FieldProperties {\n /** Field type */\n type: FieldType;\n /** Field instruction (e.g., 'PAGE \\* MERGEFORMAT') */\n instruction?: string;\n /** Format switches (e.g., '\\\\* MERGEFORMAT') */\n format?: string;\n /** Date/time format (e.g., 'MMMM d, yyyy') */\n dateFormat?: string;\n /** Preserve formatting during updates */\n preserveFormatting?: boolean;\n /** Run formatting for field result */\n formatting?: RunFormatting;\n}\n\n/**\n * Represents a dynamic field\n */\nexport class Field {\n private type: FieldType;\n private instruction: string;\n private formatting?: RunFormatting;\n\n /**\n * Creates a new field\n * @param properties Field properties\n */\n constructor(properties: FieldProperties) {\n this.type = properties.type;\n this.formatting = properties.formatting;\n\n // Build field instruction\n if (properties.instruction) {\n this.instruction = properties.instruction;\n } else {\n this.instruction = this.buildInstruction(properties);\n }\n }\n\n /**\n * Builds field instruction from properties\n */\n private buildInstruction(properties: FieldProperties): string {\n let instruction = properties.type;\n\n // Add date format for date/time fields\n if (properties.dateFormat && this.isDateField(properties.type)) {\n instruction += ` \\\\@ \"${properties.dateFormat}\"`;\n }\n\n // Add format switch\n if (properties.format) {\n instruction += ` ${properties.format}`;\n } else if (properties.preserveFormatting !== false) {\n // Add MERGEFORMAT by default to preserve formatting\n instruction += ' \\\\* MERGEFORMAT';\n }\n\n return instruction;\n }\n\n /**\n * Checks if field type is a date field\n */\n private isDateField(type: FieldType): boolean {\n return ['DATE', 'TIME', 'CREATEDATE', 'SAVEDATE', 'PRINTDATE'].includes(type);\n }\n\n /**\n * Gets the field type\n */\n getType(): FieldType {\n return this.type;\n }\n\n /**\n * Gets the field instruction\n */\n getInstruction(): string {\n return this.instruction;\n }\n\n /**\n * Sets run formatting for the field\n */\n setFormatting(formatting: RunFormatting): this {\n this.formatting = formatting;\n return this;\n }\n\n /**\n * Gets run formatting\n */\n getFormatting(): RunFormatting | undefined {\n return this.formatting;\n }\n\n /**\n * Checks if this field is a HYPERLINK field\n * @returns True if the field type is HYPERLINK or instruction starts with HYPERLINK\n */\n isHyperlinkField(): boolean {\n return (\n this.type === 'HYPERLINK' || this.instruction.trim().toUpperCase().startsWith('HYPERLINK')\n );\n }\n\n /**\n * Sets text color for the field\n * @param color Color in hex format (e.g., '0000FF')\n * @returns This field for chaining\n */\n setColor(color: string): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n this.formatting.color = color.replace('#', '');\n return this;\n }\n\n /**\n * Generates XML for the field.\n * Per ECMA-376, w:fldSimple is a paragraph-level element that CONTAINS w:r children.\n * Structure: <w:fldSimple w:instr=\"...\"><w:r><w:rPr/><w:t>...</w:t></w:r></w:fldSimple>\n * The fldSimple element should be added directly to paragraph children (not wrapped in w:r).\n */\n toXML(): XMLElement {\n // Build the inner run with optional formatting\n const runChildren: XMLElement[] = [];\n if (this.formatting) {\n runChildren.push(this.createRunProperties());\n }\n runChildren.push({\n name: 'w:t',\n children: [this.getPlaceholderText()],\n });\n\n return {\n name: 'w:fldSimple',\n attributes: {\n 'w:instr': this.instruction,\n },\n children: [\n {\n name: 'w:r',\n children: runChildren,\n },\n ],\n };\n }\n\n /**\n * Gets placeholder text for the field\n */\n private getPlaceholderText(): string {\n switch (this.type) {\n case 'PAGE':\n return '1';\n case 'NUMPAGES':\n return '1';\n case 'SECTIONPAGES':\n return '1';\n case 'SECTION':\n return '1';\n case 'DATE':\n return new Date().toLocaleDateString();\n case 'TIME':\n return new Date().toLocaleTimeString();\n case 'CREATEDATE':\n case 'SAVEDATE':\n case 'PRINTDATE':\n return new Date().toLocaleDateString();\n case 'FILENAME':\n return 'Document';\n case 'FILENAMEWITHPATH':\n return 'C:\\\\Document.docx';\n case 'AUTHOR':\n return 'Author';\n case 'TITLE':\n return 'Title';\n case 'SUBJECT':\n return 'Subject';\n case 'KEYWORDS':\n return 'Keywords';\n case 'REF':\n return '1'; // Reference typically shows page number or heading text\n case 'HYPERLINK':\n return 'Link'; // Hyperlink displays the link text\n case 'SEQ':\n return '1'; // Sequence shows the current number\n case 'TC':\n return ''; // TC fields are hidden\n case 'XE':\n return ''; // XE fields are hidden\n default:\n return '';\n }\n }\n\n /**\n * Creates run properties XML\n */\n private createRunProperties(): XMLElement {\n const children: XMLElement[] = [];\n\n if (!this.formatting) {\n return { name: 'w:rPr', children };\n }\n\n // Per ECMA-376 CT_RPr ordering:\n // rFonts → b → i → strike → color → sz/szCs → highlight → u\n\n if (this.formatting.font) {\n children.push({\n name: 'w:rFonts',\n attributes: {\n 'w:ascii': this.formatting.font,\n 'w:hAnsi': this.formatting.font,\n 'w:cs': this.formatting.font,\n },\n selfClosing: true,\n });\n }\n\n if (this.formatting.bold) {\n children.push({ name: 'w:b', selfClosing: true });\n }\n\n if (this.formatting.italic) {\n children.push({ name: 'w:i', selfClosing: true });\n }\n\n if (this.formatting.strike) {\n children.push({ name: 'w:strike', selfClosing: true });\n }\n\n if (this.formatting.color) {\n const color = this.formatting.color.replace('#', '');\n children.push({\n name: 'w:color',\n attributes: { 'w:val': color },\n selfClosing: true,\n });\n }\n\n if (this.formatting.size) {\n const sizeValue = pointsToHalfPoints(this.formatting.size).toString();\n children.push({\n name: 'w:sz',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n children.push({\n name: 'w:szCs',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n }\n\n if (this.formatting.highlight) {\n children.push({\n name: 'w:highlight',\n attributes: { 'w:val': this.formatting.highlight },\n selfClosing: true,\n });\n }\n\n if (this.formatting.underline) {\n const val =\n typeof this.formatting.underline === 'string' ? this.formatting.underline : 'single';\n children.push({\n name: 'w:u',\n attributes: { 'w:val': val },\n selfClosing: true,\n });\n }\n\n return { name: 'w:rPr', children };\n }\n\n /**\n * Creates a page number field\n * @param formatting Optional run formatting\n */\n static createPageNumber(formatting?: RunFormatting): Field {\n return new Field({\n type: 'PAGE',\n formatting,\n });\n }\n\n /**\n * Creates a total pages field\n * @param formatting Optional run formatting\n */\n static createTotalPages(formatting?: RunFormatting): Field {\n return new Field({\n type: 'NUMPAGES',\n formatting,\n });\n }\n\n /**\n * Creates a date field\n * @param format Date format (e.g., 'MMMM d, yyyy')\n * @param formatting Optional run formatting\n */\n static createDate(format?: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'DATE',\n dateFormat: format,\n formatting,\n });\n }\n\n /**\n * Creates a time field\n * @param format Time format\n * @param formatting Optional run formatting\n */\n static createTime(format?: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'TIME',\n dateFormat: format,\n formatting,\n });\n }\n\n /**\n * Creates a filename field\n * @param includePath Whether to include full path\n * @param formatting Optional run formatting\n */\n static createFilename(includePath = false, formatting?: RunFormatting): Field {\n return new Field({\n type: includePath ? 'FILENAMEWITHPATH' : 'FILENAME',\n formatting,\n });\n }\n\n /**\n * Creates an author field\n * @param formatting Optional run formatting\n */\n static createAuthor(formatting?: RunFormatting): Field {\n return new Field({\n type: 'AUTHOR',\n formatting,\n });\n }\n\n /**\n * Creates a title field\n * @param formatting Optional run formatting\n */\n static createTitle(formatting?: RunFormatting): Field {\n return new Field({\n type: 'TITLE',\n formatting,\n });\n }\n\n /**\n * Creates a section pages field (pages in current section)\n * @param formatting Optional run formatting\n */\n static createSectionPages(formatting?: RunFormatting): Field {\n return new Field({\n type: 'SECTIONPAGES',\n formatting,\n });\n }\n\n /**\n * Creates a cross-reference field\n * @param bookmark Bookmark name to reference\n * @param format Reference format (\\h for hyperlink, \\p for page number, etc.)\n * @param formatting Optional run formatting\n */\n static createRef(bookmark: string, format?: string, formatting?: RunFormatting): Field {\n const formatSwitch = format || '\\\\h'; // Default to hyperlink format\n const instruction = `REF ${bookmark} ${formatSwitch} \\\\* MERGEFORMAT`;\n\n return new Field({\n type: 'REF',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a hyperlink field\n * @param url The URL to link to\n * @param displayText The text to display\n * @param tooltip Optional tooltip text\n * @param formatting Optional run formatting\n */\n static createHyperlink(\n url: string,\n displayText: string = url,\n tooltip?: string,\n formatting?: RunFormatting\n ): Field {\n let instruction = `HYPERLINK \"${url}\"`;\n\n if (tooltip) {\n instruction += ` \\\\o \"${tooltip}\"`;\n }\n\n instruction += ' \\\\* MERGEFORMAT';\n\n return new Field({\n type: 'HYPERLINK',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a sequence numbering field\n * @param identifier Sequence identifier (e.g., 'Figure', 'Table')\n * @param format Number format (\\* ARABIC, \\* ROMAN, etc.)\n * @param formatting Optional run formatting\n */\n static createSeq(identifier: string, format?: string, formatting?: RunFormatting): Field {\n let instruction = `SEQ ${identifier}`;\n\n if (format) {\n instruction += ` ${format}`;\n } else {\n instruction += ' \\\\* ARABIC'; // Default to Arabic numerals\n }\n\n instruction += ' \\\\* MERGEFORMAT';\n\n return new Field({\n type: 'SEQ',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a table of contents entry field (TC)\n * @param text Entry text\n * @param level TOC level (1-9)\n * @param formatting Optional run formatting\n */\n static createTCEntry(text: string, level = 1, formatting?: RunFormatting): Field {\n if (level < 1 || level > 9) {\n throw new Error('TC level must be between 1 and 9');\n }\n\n const instruction = `TC \"${text}\" \\\\f C \\\\l ${level}`;\n\n return new Field({\n type: 'TC',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates an index entry field (XE)\n * @param text Entry text\n * @param subEntry Optional sub-entry text\n * @param formatting Optional run formatting\n */\n static createXEEntry(text: string, subEntry?: string, formatting?: RunFormatting): Field {\n let instruction = `XE \"${text}\"`;\n\n if (subEntry) {\n instruction += `:${subEntry}`;\n }\n\n return new Field({\n type: 'XE',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a custom field with instruction\n * @param instruction Field instruction code\n * @param formatting Optional run formatting\n */\n static createCustom(instruction: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'PAGE', // Placeholder type\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a field from properties\n * @param properties Field properties\n */\n static create(properties: FieldProperties): Field {\n return new Field(properties);\n }\n}\n\n/**\n * Field character type for complex fields\n */\nexport type FieldCharType = 'begin' | 'separate' | 'end';\n\n/**\n * Complex field properties\n * Complex fields use begin/separate/end structure instead of fldSimple\n */\nexport interface ComplexFieldProperties {\n /** Field instruction (e.g., \" TOC \\\\o \\\"1-3\\\" \\\\h \\\\z \\\\u \") */\n instruction: string;\n\n /** Current field result text (optional) */\n result?: string;\n\n /** Run formatting for instruction */\n instructionFormatting?: RunFormatting;\n\n /** Run formatting for result */\n resultFormatting?: RunFormatting;\n\n /** Nested fields to include within this field */\n nestedFields?: ComplexField[];\n\n /** Custom XML content for result section */\n resultContent?: XMLElement[];\n\n /** Whether field spans multiple paragraphs */\n multiParagraph?: boolean;\n\n /** Parsed HYPERLINK instruction components (auto-populated if instruction is HYPERLINK) */\n parsedHyperlink?: ParsedHyperlinkInstruction;\n\n /**\n * Whether the field has a result section (w:fldSep was present during parsing)\n * Per ECMA-376, fields without results skip the separator element.\n * This flag distinguishes between:\n * - hasResult=true, result=\"\" → Field had separator but result was empty\n * - hasResult=false, result=\"\" → Field never had a result section (empty field)\n */\n hasResult?: boolean;\n\n /** Form field data (w:ffData) from begin field char per ECMA-376 §17.16.17 */\n formFieldData?: FormFieldData;\n}\n\n/**\n * Represents a complex field (begin/separate/end structure)\n * Used for TOC, cross-references, and other advanced fields\n *\n * Structure:\n * <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n * <w:r><w:instrText>INSTRUCTION</w:instrText></w:r>\n * <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n * <w:r><w:t>RESULT</w:t></w:r>\n * <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n */\nexport class ComplexField {\n private instruction: string;\n private result?: string;\n private instructionFormatting?: RunFormatting;\n private resultFormatting?: RunFormatting;\n private nestedFields: ComplexField[];\n private resultContent: XMLElement[];\n private multiParagraph: boolean;\n private parsedHyperlink?: ParsedHyperlinkInstruction;\n /** Revisions that wrap the result section (for tracked changes in field content) */\n private resultRevisions: Revision[] = [];\n /**\n * Whether the field has a result section (w:fldSep was present during parsing)\n * Per ECMA-376, fields without results skip the separator element.\n */\n private _hasResultSection = false;\n private _formFieldData?: FormFieldData;\n\n /**\n * Creates a new complex field\n * @param properties Complex field properties\n */\n constructor(properties: ComplexFieldProperties) {\n this.instruction = properties.instruction;\n this.result = properties.result;\n this.instructionFormatting = properties.instructionFormatting;\n this.resultFormatting = properties.resultFormatting;\n this.nestedFields = properties.nestedFields || [];\n this.resultContent = properties.resultContent || [];\n this.multiParagraph = properties.multiParagraph || false;\n this._hasResultSection = properties.hasResult ?? false;\n this._formFieldData = properties.formFieldData;\n\n // Auto-parse HYPERLINK instruction if provided or detected\n if (properties.parsedHyperlink) {\n this.parsedHyperlink = properties.parsedHyperlink;\n } else if (isHyperlinkInstruction(this.instruction)) {\n this.parsedHyperlink = parseHyperlinkInstruction(this.instruction) || undefined;\n }\n }\n\n /**\n * Gets the field instruction\n */\n getInstruction(): string {\n return this.instruction;\n }\n\n /**\n * Sets the field instruction\n */\n setInstruction(instruction: string): this {\n this.instruction = instruction;\n return this;\n }\n\n /**\n * Gets form field data (w:ffData) if present\n */\n getFormFieldData(): FormFieldData | undefined {\n return this._formFieldData;\n }\n\n /**\n * Gets the field result text\n */\n getResult(): string | undefined {\n return this.result;\n }\n\n /**\n * Sets the field result text\n */\n setResult(result: string): this {\n this.result = result;\n this.resultRevisions = []; // Clear orphaned revisions from old text\n this.resultContent = []; // Clear raw XML content since we have new text\n return this;\n }\n\n /**\n * Checks if the field has a result section\n *\n * Per ECMA-376, complex fields may or may not have a result section.\n * Fields without results (like TOC markers or empty PAGE fields) skip\n * the w:fldSep (separator) element entirely.\n *\n * This method distinguishes between:\n * - `hasResultSection() === true && getResult() === \"\"` → Field had separator but result was empty\n * - `hasResultSection() === false && getResult() === undefined` → Field never had a result section\n *\n * @returns True if the field has a result section (w:fldSep was present)\n *\n * @example\n * ```typescript\n * const field = paragraph.getFields()[0];\n * if (field instanceof ComplexField) {\n * if (field.hasResultSection()) {\n * console.log('Field result:', field.getResult());\n * } else {\n * console.log('Field has no result section (empty field)');\n * }\n * }\n * ```\n */\n hasResultSection(): boolean {\n return this._hasResultSection;\n }\n\n /**\n * Sets instruction formatting\n */\n setInstructionFormatting(formatting: RunFormatting): this {\n this.instructionFormatting = formatting;\n return this;\n }\n\n /**\n * Sets result formatting\n */\n setResultFormatting(formatting: RunFormatting): this {\n this.resultFormatting = formatting;\n return this;\n }\n\n /**\n * Gets the parsed HYPERLINK instruction components\n * Returns undefined if this is not a HYPERLINK field\n */\n getParsedHyperlink(): ParsedHyperlinkInstruction | undefined {\n return this.parsedHyperlink;\n }\n\n /**\n * Checks if this field is a HYPERLINK field\n */\n isHyperlinkField(): boolean {\n return this.parsedHyperlink !== undefined;\n }\n\n /**\n * Gets the full URL for HYPERLINK fields (combining base URL and anchor)\n * Returns undefined if not a HYPERLINK field\n */\n getHyperlinkUrl(): string | undefined {\n return this.parsedHyperlink?.fullUrl;\n }\n\n /**\n * Adds a nested field within this field\n * Nested fields appear between instruction and separator\n */\n addNestedField(field: ComplexField): this {\n this.nestedFields.push(field);\n return this;\n }\n\n /**\n * Gets all nested fields\n */\n getNestedFields(): ComplexField[] {\n return [...this.nestedFields];\n }\n\n /**\n * Removes a nested field at the specified index\n * @param index - Index of the nested field to remove (0-based)\n * @returns True if removed, false if index out of bounds\n *\n * @example\n * ```typescript\n * const field = new ComplexField({ instruction: 'TOC' });\n * field.addNestedField(nested1);\n * field.addNestedField(nested2);\n * field.removeNestedField(0); // Removes nested1\n * ```\n */\n removeNestedField(index: number): boolean {\n if (index < 0 || index >= this.nestedFields.length) {\n return false;\n }\n this.nestedFields.splice(index, 1);\n return true;\n }\n\n /**\n * Gets the count of nested fields\n * @returns Number of nested fields\n */\n getNestedFieldCount(): number {\n return this.nestedFields.length;\n }\n\n /**\n * Clears all nested fields\n * @returns This field for chaining\n */\n clearNestedFields(): this {\n this.nestedFields = [];\n return this;\n }\n\n /**\n * Updates the field instruction\n * @param instruction - New field instruction (e.g., 'TOC \\\\o \"1-3\"')\n * @returns This field for chaining\n *\n * @example\n * ```typescript\n * const field = new ComplexField({ instruction: 'DATE' });\n * field.updateInstruction('DATE \\\\@ \"yyyy-MM-dd\"');\n * ```\n */\n updateInstruction(instruction: string): this {\n this.instruction = instruction;\n return this;\n }\n\n /**\n * Adds custom XML content to the result section\n */\n addResultContent(content: XMLElement): this {\n this.resultContent.push(content);\n return this;\n }\n\n /**\n * Gets result content XML elements\n */\n getResultContent(): XMLElement[] {\n return [...this.resultContent];\n }\n\n /**\n * Sets whether this field spans multiple paragraphs\n */\n setMultiParagraph(multiParagraph: boolean): this {\n this.multiParagraph = multiParagraph;\n return this;\n }\n\n /**\n * Gets whether this field spans multiple paragraphs\n */\n isMultiParagraph(): boolean {\n return this.multiParagraph;\n }\n\n /**\n * Sets revisions that wrap the result section\n * These are tracked changes (w:ins, w:del) that need to wrap the result AND end marker\n * @param revisions Array of Revision objects\n */\n setResultRevisions(revisions: Revision[]): this {\n this.resultRevisions = revisions;\n return this;\n }\n\n /**\n * Adds a revision to the result section\n * @param revision Revision to add\n */\n addResultRevision(revision: Revision): this {\n this.resultRevisions.push(revision);\n return this;\n }\n\n /**\n * Gets revisions that wrap the result section\n */\n getResultRevisions(): Revision[] {\n return [...this.resultRevisions];\n }\n\n /**\n * Checks if this field has revisions in the result section\n */\n hasResultRevisions(): boolean {\n return this.resultRevisions.length > 0;\n }\n\n /**\n * Generates XML for the complex field\n * Returns array of run elements (begin, instr, sep, result, end)\n */\n toXML(): XMLElement[] {\n const runs: XMLElement[] = [];\n\n // 1. Begin marker run\n const beginFldChar: XMLElement = this._formFieldData\n ? this.buildFldCharWithFfData()\n : {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'begin' },\n selfClosing: true,\n };\n runs.push({\n name: 'w:r',\n children: [beginFldChar],\n });\n\n // 2. Instruction run\n const instrChildren: XMLElement[] = [];\n if (this.instructionFormatting) {\n instrChildren.push(this.createRunProperties(this.instructionFormatting));\n }\n instrChildren.push({\n name: 'w:instrText',\n attributes: { 'xml:space': 'preserve' },\n children: [this.instruction],\n });\n runs.push({\n name: 'w:r',\n children: instrChildren,\n });\n\n // 2a. Nested fields (if any)\n for (const nestedField of this.nestedFields) {\n runs.push(...nestedField.toXML());\n }\n\n // 3. Separator run\n runs.push({\n name: 'w:r',\n children: [\n {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'separate' },\n selfClosing: true,\n },\n ],\n });\n\n // 4. Result content (prioritize custom XML content, then simple text)\n // Design note: For INCLUDEPICTURE fields, the parser stores the w:drawing\n // content in resultContent so it survives the parser→generator round-trip.\n // When flattenFieldCodes() is active, the full field structure is emitted\n // here, then _postProcessDocumentXml() strips the INCLUDEPICTURE scaffolding\n // (fldChar/instrText runs) from the final XML while preserving the drawing.\n // Non-INCLUDEPICTURE fields emit their complete structure unchanged.\n if (this.resultContent.length > 0) {\n // Use custom XML content\n runs.push(...this.resultContent);\n } else if (this.result) {\n // Use simple text result\n const resultChildren: XMLElement[] = [];\n if (this.resultFormatting) {\n resultChildren.push(this.createRunProperties(this.resultFormatting));\n }\n resultChildren.push({\n name: 'w:t',\n attributes: { 'xml:space': 'preserve' },\n children: [this.result],\n });\n runs.push({\n name: 'w:r',\n children: resultChildren,\n });\n }\n\n // 4a. Result revisions (tracked changes within the result section)\n // These MUST appear between the separator and end marker per ECMA-376\n // The revisions contain the actual field result content wrapped in w:ins or w:del\n for (const revision of this.resultRevisions) {\n const revisionXml = revision.toXML();\n if (revisionXml) {\n runs.push(revisionXml);\n }\n }\n\n // 5. End marker run\n runs.push({\n name: 'w:r',\n children: [\n {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'end' },\n selfClosing: true,\n },\n ],\n });\n\n return runs;\n }\n\n /**\n * Creates run properties XML from formatting\n */\n private createRunProperties(formatting: RunFormatting): XMLElement {\n const children: XMLElement[] = [];\n\n if (formatting.bold) {\n children.push({ name: 'w:b', selfClosing: true });\n }\n\n if (formatting.italic) {\n children.push({ name: 'w:i', selfClosing: true });\n }\n\n if (formatting.underline) {\n const val = typeof formatting.underline === 'string' ? formatting.underline : 'single';\n children.push({\n name: 'w:u',\n attributes: { 'w:val': val },\n selfClosing: true,\n });\n }\n\n if (formatting.strike) {\n children.push({ name: 'w:strike', selfClosing: true });\n }\n\n if (formatting.font) {\n children.push({\n name: 'w:rFonts',\n attributes: {\n 'w:ascii': formatting.font,\n 'w:hAnsi': formatting.font,\n 'w:cs': formatting.font,\n },\n selfClosing: true,\n });\n }\n\n if (formatting.size) {\n const sizeValue = pointsToHalfPoints(formatting.size).toString();\n children.push({\n name: 'w:sz',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n children.push({\n name: 'w:szCs',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n }\n\n if (formatting.color) {\n const color = formatting.color.replace('#', '');\n children.push({\n name: 'w:color',\n attributes: { 'w:val': color },\n selfClosing: true,\n });\n }\n\n if (formatting.highlight) {\n children.push({\n name: 'w:highlight',\n attributes: { 'w:val': formatting.highlight },\n selfClosing: true,\n });\n }\n\n return { name: 'w:rPr', children };\n }\n\n /**\n * Builds a w:fldChar begin element with w:ffData child\n */\n private buildFldCharWithFfData(): XMLElement {\n const ffd = this._formFieldData!;\n const ffDataChildren: (string | XMLElement)[] = [];\n\n if (ffd.name) {\n ffDataChildren.push({ name: 'w:name', attributes: { 'w:val': ffd.name }, selfClosing: true });\n }\n if (ffd.enabled !== undefined) {\n if (ffd.enabled) {\n ffDataChildren.push({ name: 'w:enabled', selfClosing: true });\n } else {\n ffDataChildren.push({ name: 'w:enabled', attributes: { 'w:val': '0' }, selfClosing: true });\n }\n }\n if (ffd.calcOnExit !== undefined) {\n ffDataChildren.push({\n name: 'w:calcOnExit',\n attributes: { 'w:val': ffd.calcOnExit ? '1' : '0' },\n selfClosing: true,\n });\n }\n if (ffd.helpText) {\n ffDataChildren.push({\n name: 'w:helpText',\n attributes: { 'w:type': 'text', 'w:val': ffd.helpText },\n selfClosing: true,\n });\n }\n if (ffd.statusText) {\n ffDataChildren.push({\n name: 'w:statusText',\n attributes: { 'w:type': 'text', 'w:val': ffd.statusText },\n selfClosing: true,\n });\n }\n if (ffd.entryMacro) {\n ffDataChildren.push({\n name: 'w:entryMacro',\n attributes: { 'w:val': ffd.entryMacro },\n selfClosing: true,\n });\n }\n if (ffd.exitMacro) {\n ffDataChildren.push({\n name: 'w:exitMacro',\n attributes: { 'w:val': ffd.exitMacro },\n selfClosing: true,\n });\n }\n\n if (ffd.fieldType) {\n switch (ffd.fieldType.type) {\n case 'textInput': {\n const tiChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.inputType)\n tiChildren.push({\n name: 'w:type',\n attributes: { 'w:val': ffd.fieldType.inputType },\n selfClosing: true,\n });\n if (ffd.fieldType.defaultValue)\n tiChildren.push({\n name: 'w:default',\n attributes: { 'w:val': ffd.fieldType.defaultValue },\n selfClosing: true,\n });\n if (ffd.fieldType.maxLength !== undefined)\n tiChildren.push({\n name: 'w:maxLength',\n attributes: { 'w:val': String(ffd.fieldType.maxLength) },\n selfClosing: true,\n });\n if (ffd.fieldType.format)\n tiChildren.push({\n name: 'w:format',\n attributes: { 'w:val': ffd.fieldType.format },\n selfClosing: true,\n });\n ffDataChildren.push({ name: 'w:textInput', children: tiChildren });\n break;\n }\n case 'checkBox': {\n const cbChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.size === 'auto') {\n cbChildren.push({ name: 'w:sizeAuto', selfClosing: true });\n } else if (ffd.fieldType.size !== undefined) {\n cbChildren.push({\n name: 'w:size',\n attributes: { 'w:val': String(ffd.fieldType.size) },\n selfClosing: true,\n });\n }\n if (ffd.fieldType.defaultChecked !== undefined)\n cbChildren.push({\n name: 'w:default',\n attributes: { 'w:val': ffd.fieldType.defaultChecked ? '1' : '0' },\n selfClosing: true,\n });\n if (ffd.fieldType.checked !== undefined)\n cbChildren.push({\n name: 'w:checked',\n attributes: { 'w:val': ffd.fieldType.checked ? '1' : '0' },\n selfClosing: true,\n });\n ffDataChildren.push({ name: 'w:checkBox', children: cbChildren });\n break;\n }\n case 'dropDownList': {\n const ddChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.result !== undefined)\n ddChildren.push({\n name: 'w:result',\n attributes: { 'w:val': String(ffd.fieldType.result) },\n selfClosing: true,\n });\n if (ffd.fieldType.defaultResult !== undefined)\n ddChildren.push({\n name: 'w:default',\n attributes: { 'w:val': String(ffd.fieldType.defaultResult) },\n selfClosing: true,\n });\n if (ffd.fieldType.listEntries) {\n for (const entry of ffd.fieldType.listEntries) {\n ddChildren.push({\n name: 'w:listEntry',\n attributes: { 'w:val': entry },\n selfClosing: true,\n });\n }\n }\n ffDataChildren.push({ name: 'w:ddList', children: ddChildren });\n break;\n }\n }\n }\n\n return {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'begin' },\n children: [{ name: 'w:ffData', children: ffDataChildren }],\n };\n }\n}\n\n/**\n * TOC field options\n */\nexport interface TOCFieldOptions {\n /** Heading levels to include (e.g., \"1-3\" for levels 1-3) */\n levels?: string;\n\n /** Make entries hyperlinks (\\h switch) */\n hyperlinks?: boolean;\n\n /** Hide tab leaders and page numbers in Web Layout (\\z switch) */\n hideInWebLayout?: boolean;\n\n /** Use outline levels (\\u switch) */\n useOutlineLevels?: boolean;\n\n /** Omit page numbers (\\n switch) */\n omitPageNumbers?: boolean;\n\n /** Custom styles to use (\\t switch) */\n customStyles?: string;\n}\n\n/**\n * Creates a TOC (Table of Contents) complex field\n * Generates proper field instruction with switches\n *\n * @param options TOC field options\n * @returns ComplexField configured for TOC\n *\n * @example\n * const toc = createTOCField({ levels: '1-3', hyperlinks: true });\n * // Generates: TOC \\o \"1-3\" \\h \\z \\u\n */\nexport function createTOCField(options: TOCFieldOptions = {}): ComplexField {\n // Build instruction string\n let instruction = ' TOC';\n\n // Add outline levels switch\n if (options.levels !== undefined) {\n instruction += ` \\\\o \"${options.levels}\"`;\n } else {\n instruction += ' \\\\o \"1-3\"'; // Default: levels 1-3\n }\n\n // Add hyperlinks switch\n if (options.hyperlinks !== false) {\n instruction += ' \\\\h';\n }\n\n // Add hide in web layout switch\n if (options.hideInWebLayout !== false) {\n instruction += ' \\\\z';\n }\n\n // Add use outline levels switch\n if (options.useOutlineLevels !== false) {\n instruction += ' \\\\u';\n }\n\n // Add omit page numbers switch\n if (options.omitPageNumbers) {\n instruction += ' \\\\n';\n }\n\n // Add custom styles switch\n if (options.customStyles) {\n instruction += ` \\\\t \"${options.customStyles}\"`;\n }\n\n instruction += ' '; // Trailing space per Microsoft convention\n\n return new ComplexField({\n instruction,\n result: 'Table of Contents', // Placeholder result\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Field.js","sourceRoot":"","sources":["../../src/elements/Field.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Field - Represents a dynamic field in a Word document\n *\n * Fields are used for dynamic content like page numbers, dates, document properties, etc.\n * They are represented using the <w:fldSimple> element with field codes.\n */\n\nimport { XMLElement } from '../xml/XMLBuilder';\nimport { RunFormatting, FormFieldData } from './Run';\nimport {\n ParsedHyperlinkInstruction,\n parseHyperlinkInstruction,\n isHyperlinkInstruction,\n} from './FieldHelpers';\nimport type { Revision } from './Revision';\nimport { pointsToHalfPoints } from '../utils/units';\n\n/**\n * Common field types\n */\nexport type FieldType =\n | 'PAGE' // Current page number\n | 'NUMPAGES' // Total number of pages\n | 'DATE' // Current date\n | 'TIME' // Current time\n | 'AUTHOR' // Document author\n | 'TITLE' // Document title\n | 'FILENAME' // Document filename\n | 'FILENAMEWITHPATH' // Document filename with path\n | 'SUBJECT' // Document subject\n | 'KEYWORDS' // Document keywords\n | 'CREATEDATE' // Document creation date\n | 'SAVEDATE' // Last save date\n | 'PRINTDATE' // Last print date\n | 'SECTIONPAGES' // Pages in current section\n | 'SECTION' // Current section number\n | 'REF' // Cross-reference to bookmark\n | 'HYPERLINK' // Hyperlink field\n | 'SEQ' // Sequence numbering\n | 'TC' // Table of contents entry\n | 'XE' // Index entry\n | 'IF' // Conditional field\n | 'MERGEFIELD' // Mail merge field\n | 'INCLUDE' // Include text from external file\n | 'INCLUDETEXT' // Include text from external file (alias)\n | 'CUSTOM'; // Custom field type for unknown/specialized fields\n\n/**\n * Field properties\n */\nexport interface FieldProperties {\n /** Field type */\n type: FieldType;\n /** Field instruction (e.g., 'PAGE \\* MERGEFORMAT') */\n instruction?: string;\n /** Format switches (e.g., '\\\\* MERGEFORMAT') */\n format?: string;\n /** Date/time format (e.g., 'MMMM d, yyyy') */\n dateFormat?: string;\n /** Preserve formatting during updates */\n preserveFormatting?: boolean;\n /** Run formatting for field result */\n formatting?: RunFormatting;\n}\n\n/**\n * Represents a dynamic field\n */\nexport class Field {\n private type: FieldType;\n private instruction: string;\n private formatting?: RunFormatting;\n\n /**\n * Creates a new field\n * @param properties Field properties\n */\n constructor(properties: FieldProperties) {\n this.type = properties.type;\n this.formatting = properties.formatting;\n\n // Build field instruction\n if (properties.instruction) {\n this.instruction = properties.instruction;\n } else {\n this.instruction = this.buildInstruction(properties);\n }\n }\n\n /**\n * Builds field instruction from properties\n */\n private buildInstruction(properties: FieldProperties): string {\n let instruction = properties.type;\n\n // Add date format for date/time fields\n if (properties.dateFormat && this.isDateField(properties.type)) {\n instruction += ` \\\\@ \"${properties.dateFormat}\"`;\n }\n\n // Add format switch\n if (properties.format) {\n instruction += ` ${properties.format}`;\n } else if (properties.preserveFormatting !== false) {\n // Add MERGEFORMAT by default to preserve formatting\n instruction += ' \\\\* MERGEFORMAT';\n }\n\n return instruction;\n }\n\n /**\n * Checks if field type is a date field\n */\n private isDateField(type: FieldType): boolean {\n return ['DATE', 'TIME', 'CREATEDATE', 'SAVEDATE', 'PRINTDATE'].includes(type);\n }\n\n /**\n * Gets the field type\n */\n getType(): FieldType {\n return this.type;\n }\n\n /**\n * Gets the field instruction\n */\n getInstruction(): string {\n return this.instruction;\n }\n\n /**\n * Sets run formatting for the field\n */\n setFormatting(formatting: RunFormatting): this {\n this.formatting = formatting;\n return this;\n }\n\n /**\n * Gets run formatting\n */\n getFormatting(): RunFormatting | undefined {\n return this.formatting;\n }\n\n /**\n * Checks if this field is a HYPERLINK field\n * @returns True if the field type is HYPERLINK or instruction starts with HYPERLINK\n */\n isHyperlinkField(): boolean {\n return (\n this.type === 'HYPERLINK' || this.instruction.trim().toUpperCase().startsWith('HYPERLINK')\n );\n }\n\n /**\n * Sets text color for the field\n * @param color Color in hex format (e.g., '0000FF')\n * @returns This field for chaining\n */\n setColor(color: string): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n this.formatting.color = color.replace('#', '');\n return this;\n }\n\n /**\n * Generates XML for the field.\n * Per ECMA-376, w:fldSimple is a paragraph-level element that CONTAINS w:r children.\n * Structure: <w:fldSimple w:instr=\"...\"><w:r><w:rPr/><w:t>...</w:t></w:r></w:fldSimple>\n * The fldSimple element should be added directly to paragraph children (not wrapped in w:r).\n */\n toXML(): XMLElement {\n // Build the inner run with optional formatting\n const runChildren: XMLElement[] = [];\n if (this.formatting) {\n runChildren.push(this.createRunProperties());\n }\n runChildren.push({\n name: 'w:t',\n children: [this.getPlaceholderText()],\n });\n\n return {\n name: 'w:fldSimple',\n attributes: {\n 'w:instr': this.instruction,\n },\n children: [\n {\n name: 'w:r',\n children: runChildren,\n },\n ],\n };\n }\n\n /**\n * Gets placeholder text for the field\n */\n private getPlaceholderText(): string {\n switch (this.type) {\n case 'PAGE':\n return '1';\n case 'NUMPAGES':\n return '1';\n case 'SECTIONPAGES':\n return '1';\n case 'SECTION':\n return '1';\n case 'DATE':\n return new Date().toLocaleDateString();\n case 'TIME':\n return new Date().toLocaleTimeString();\n case 'CREATEDATE':\n case 'SAVEDATE':\n case 'PRINTDATE':\n return new Date().toLocaleDateString();\n case 'FILENAME':\n return 'Document';\n case 'FILENAMEWITHPATH':\n return 'C:\\\\Document.docx';\n case 'AUTHOR':\n return 'Author';\n case 'TITLE':\n return 'Title';\n case 'SUBJECT':\n return 'Subject';\n case 'KEYWORDS':\n return 'Keywords';\n case 'REF':\n return '1'; // Reference typically shows page number or heading text\n case 'HYPERLINK':\n return 'Link'; // Hyperlink displays the link text\n case 'SEQ':\n return '1'; // Sequence shows the current number\n case 'TC':\n return ''; // TC fields are hidden\n case 'XE':\n return ''; // XE fields are hidden\n default:\n return '';\n }\n }\n\n /**\n * Creates run properties XML\n */\n private createRunProperties(): XMLElement {\n const children: XMLElement[] = [];\n\n if (!this.formatting) {\n return { name: 'w:rPr', children };\n }\n\n // Per ECMA-376 CT_RPr ordering:\n // rFonts → b → i → strike → color → sz/szCs → highlight → u\n\n if (this.formatting.font) {\n children.push({\n name: 'w:rFonts',\n attributes: {\n 'w:ascii': this.formatting.font,\n 'w:hAnsi': this.formatting.font,\n 'w:cs': this.formatting.font,\n },\n selfClosing: true,\n });\n }\n\n if (this.formatting.bold) {\n children.push({ name: 'w:b', selfClosing: true });\n }\n\n if (this.formatting.italic) {\n children.push({ name: 'w:i', selfClosing: true });\n }\n\n if (this.formatting.strike) {\n children.push({ name: 'w:strike', selfClosing: true });\n }\n\n if (this.formatting.color) {\n const color = this.formatting.color.replace('#', '');\n children.push({\n name: 'w:color',\n attributes: { 'w:val': color },\n selfClosing: true,\n });\n }\n\n if (this.formatting.size) {\n const sizeValue = pointsToHalfPoints(this.formatting.size).toString();\n children.push({\n name: 'w:sz',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n children.push({\n name: 'w:szCs',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n }\n\n if (this.formatting.highlight) {\n children.push({\n name: 'w:highlight',\n attributes: { 'w:val': this.formatting.highlight },\n selfClosing: true,\n });\n }\n\n if (this.formatting.underline) {\n const val =\n typeof this.formatting.underline === 'string' ? this.formatting.underline : 'single';\n children.push({\n name: 'w:u',\n attributes: { 'w:val': val },\n selfClosing: true,\n });\n }\n\n return { name: 'w:rPr', children };\n }\n\n /**\n * Creates a page number field\n * @param formatting Optional run formatting\n */\n static createPageNumber(formatting?: RunFormatting): Field {\n return new Field({\n type: 'PAGE',\n formatting,\n });\n }\n\n /**\n * Creates a total pages field\n * @param formatting Optional run formatting\n */\n static createTotalPages(formatting?: RunFormatting): Field {\n return new Field({\n type: 'NUMPAGES',\n formatting,\n });\n }\n\n /**\n * Creates a date field\n * @param format Date format (e.g., 'MMMM d, yyyy')\n * @param formatting Optional run formatting\n */\n static createDate(format?: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'DATE',\n dateFormat: format,\n formatting,\n });\n }\n\n /**\n * Creates a time field\n * @param format Time format\n * @param formatting Optional run formatting\n */\n static createTime(format?: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'TIME',\n dateFormat: format,\n formatting,\n });\n }\n\n /**\n * Creates a filename field\n * @param includePath Whether to include full path\n * @param formatting Optional run formatting\n */\n static createFilename(includePath = false, formatting?: RunFormatting): Field {\n return new Field({\n type: includePath ? 'FILENAMEWITHPATH' : 'FILENAME',\n formatting,\n });\n }\n\n /**\n * Creates an author field\n * @param formatting Optional run formatting\n */\n static createAuthor(formatting?: RunFormatting): Field {\n return new Field({\n type: 'AUTHOR',\n formatting,\n });\n }\n\n /**\n * Creates a title field\n * @param formatting Optional run formatting\n */\n static createTitle(formatting?: RunFormatting): Field {\n return new Field({\n type: 'TITLE',\n formatting,\n });\n }\n\n /**\n * Creates a section pages field (pages in current section)\n * @param formatting Optional run formatting\n */\n static createSectionPages(formatting?: RunFormatting): Field {\n return new Field({\n type: 'SECTIONPAGES',\n formatting,\n });\n }\n\n /**\n * Creates a cross-reference field\n * @param bookmark Bookmark name to reference\n * @param format Reference format (\\h for hyperlink, \\p for page number, etc.)\n * @param formatting Optional run formatting\n */\n static createRef(bookmark: string, format?: string, formatting?: RunFormatting): Field {\n const formatSwitch = format || '\\\\h'; // Default to hyperlink format\n const instruction = `REF ${bookmark} ${formatSwitch} \\\\* MERGEFORMAT`;\n\n return new Field({\n type: 'REF',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a hyperlink field\n * @param url The URL to link to\n * @param displayText The text to display\n * @param tooltip Optional tooltip text\n * @param formatting Optional run formatting\n */\n static createHyperlink(\n url: string,\n displayText: string = url,\n tooltip?: string,\n formatting?: RunFormatting\n ): Field {\n let instruction = `HYPERLINK \"${url}\"`;\n\n if (tooltip) {\n instruction += ` \\\\o \"${tooltip}\"`;\n }\n\n instruction += ' \\\\* MERGEFORMAT';\n\n return new Field({\n type: 'HYPERLINK',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a sequence numbering field\n * @param identifier Sequence identifier (e.g., 'Figure', 'Table')\n * @param format Number format (\\* ARABIC, \\* ROMAN, etc.)\n * @param formatting Optional run formatting\n */\n static createSeq(identifier: string, format?: string, formatting?: RunFormatting): Field {\n let instruction = `SEQ ${identifier}`;\n\n if (format) {\n instruction += ` ${format}`;\n } else {\n instruction += ' \\\\* ARABIC'; // Default to Arabic numerals\n }\n\n instruction += ' \\\\* MERGEFORMAT';\n\n return new Field({\n type: 'SEQ',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a table of contents entry field (TC)\n * @param text Entry text\n * @param level TOC level (1-9)\n * @param formatting Optional run formatting\n */\n static createTCEntry(text: string, level = 1, formatting?: RunFormatting): Field {\n if (level < 1 || level > 9) {\n throw new Error('TC level must be between 1 and 9');\n }\n\n const instruction = `TC \"${text}\" \\\\f C \\\\l ${level}`;\n\n return new Field({\n type: 'TC',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates an index entry field (XE)\n * @param text Entry text\n * @param subEntry Optional sub-entry text\n * @param formatting Optional run formatting\n */\n static createXEEntry(text: string, subEntry?: string, formatting?: RunFormatting): Field {\n let instruction = `XE \"${text}\"`;\n\n if (subEntry) {\n instruction += `:${subEntry}`;\n }\n\n return new Field({\n type: 'XE',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a custom field with instruction\n * @param instruction Field instruction code\n * @param formatting Optional run formatting\n */\n static createCustom(instruction: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'PAGE', // Placeholder type\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a field from properties\n * @param properties Field properties\n */\n static create(properties: FieldProperties): Field {\n return new Field(properties);\n }\n}\n\n/**\n * Field character type for complex fields\n */\nexport type FieldCharType = 'begin' | 'separate' | 'end';\n\n/**\n * Complex field properties\n * Complex fields use begin/separate/end structure instead of fldSimple\n */\nexport interface ComplexFieldProperties {\n /** Field instruction (e.g., \" TOC \\\\o \\\"1-3\\\" \\\\h \\\\z \\\\u \") */\n instruction: string;\n\n /** Current field result text (optional) */\n result?: string;\n\n /** Run formatting for instruction */\n instructionFormatting?: RunFormatting;\n\n /** Run formatting for result */\n resultFormatting?: RunFormatting;\n\n /** Nested fields to include within this field */\n nestedFields?: ComplexField[];\n\n /** Custom XML content for result section */\n resultContent?: XMLElement[];\n\n /** Whether field spans multiple paragraphs */\n multiParagraph?: boolean;\n\n /** Parsed HYPERLINK instruction components (auto-populated if instruction is HYPERLINK) */\n parsedHyperlink?: ParsedHyperlinkInstruction;\n\n /**\n * Whether the field has a result section (w:fldSep was present during parsing)\n * Per ECMA-376, fields without results skip the separator element.\n * This flag distinguishes between:\n * - hasResult=true, result=\"\" → Field had separator but result was empty\n * - hasResult=false, result=\"\" → Field never had a result section (empty field)\n */\n hasResult?: boolean;\n\n /** Form field data (w:ffData) from begin field char per ECMA-376 §17.16.17 */\n formFieldData?: FormFieldData;\n}\n\n/**\n * Represents a complex field (begin/separate/end structure)\n * Used for TOC, cross-references, and other advanced fields\n *\n * Structure:\n * <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n * <w:r><w:instrText>INSTRUCTION</w:instrText></w:r>\n * <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n * <w:r><w:t>RESULT</w:t></w:r>\n * <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n */\nexport class ComplexField {\n private instruction: string;\n private result?: string;\n private instructionFormatting?: RunFormatting;\n private resultFormatting?: RunFormatting;\n private nestedFields: ComplexField[];\n private resultContent: XMLElement[];\n private multiParagraph: boolean;\n private parsedHyperlink?: ParsedHyperlinkInstruction;\n /** Revisions that wrap the result section (for tracked changes in field content) */\n private resultRevisions: Revision[] = [];\n /**\n * Whether the field has a result section (w:fldSep was present during parsing)\n * Per ECMA-376, fields without results skip the separator element.\n */\n private _hasResultSection = false;\n private _formFieldData?: FormFieldData;\n\n /**\n * Creates a new complex field\n * @param properties Complex field properties\n */\n constructor(properties: ComplexFieldProperties) {\n this.instruction = properties.instruction;\n this.result = properties.result;\n this.instructionFormatting = properties.instructionFormatting;\n this.resultFormatting = properties.resultFormatting;\n this.nestedFields = properties.nestedFields || [];\n this.resultContent = properties.resultContent || [];\n this.multiParagraph = properties.multiParagraph || false;\n this._hasResultSection = properties.hasResult ?? false;\n this._formFieldData = properties.formFieldData;\n\n // Auto-parse HYPERLINK instruction if provided or detected\n if (properties.parsedHyperlink) {\n this.parsedHyperlink = properties.parsedHyperlink;\n } else if (isHyperlinkInstruction(this.instruction)) {\n this.parsedHyperlink = parseHyperlinkInstruction(this.instruction) || undefined;\n }\n }\n\n /**\n * Gets the field instruction\n */\n getInstruction(): string {\n return this.instruction;\n }\n\n /**\n * Sets the field instruction\n */\n setInstruction(instruction: string): this {\n this.instruction = instruction;\n return this;\n }\n\n /**\n * Gets form field data (w:ffData) if present\n */\n getFormFieldData(): FormFieldData | undefined {\n return this._formFieldData;\n }\n\n /**\n * Gets the field result text\n */\n getResult(): string | undefined {\n return this.result;\n }\n\n /**\n * Sets the field result text\n */\n setResult(result: string): this {\n this.result = result;\n this.resultRevisions = []; // Clear orphaned revisions from old text\n this.resultContent = []; // Clear raw XML content since we have new text\n return this;\n }\n\n /**\n * Checks if the field has a result section\n *\n * Per ECMA-376, complex fields may or may not have a result section.\n * Fields without results (like TOC markers or empty PAGE fields) skip\n * the w:fldSep (separator) element entirely.\n *\n * This method distinguishes between:\n * - `hasResultSection() === true && getResult() === \"\"` → Field had separator but result was empty\n * - `hasResultSection() === false && getResult() === undefined` → Field never had a result section\n *\n * @returns True if the field has a result section (w:fldSep was present)\n *\n * @example\n * ```typescript\n * const field = paragraph.getFields()[0];\n * if (field instanceof ComplexField) {\n * if (field.hasResultSection()) {\n * console.log('Field result:', field.getResult());\n * } else {\n * console.log('Field has no result section (empty field)');\n * }\n * }\n * ```\n */\n hasResultSection(): boolean {\n return this._hasResultSection;\n }\n\n /**\n * Sets instruction formatting\n */\n setInstructionFormatting(formatting: RunFormatting): this {\n this.instructionFormatting = formatting;\n return this;\n }\n\n /**\n * Sets result formatting\n */\n setResultFormatting(formatting: RunFormatting): this {\n this.resultFormatting = formatting;\n return this;\n }\n\n /**\n * Gets the parsed HYPERLINK instruction components\n * Returns undefined if this is not a HYPERLINK field\n */\n getParsedHyperlink(): ParsedHyperlinkInstruction | undefined {\n return this.parsedHyperlink;\n }\n\n /**\n * Checks if this field is a HYPERLINK field\n */\n isHyperlinkField(): boolean {\n return this.parsedHyperlink !== undefined;\n }\n\n /**\n * Gets the full URL for HYPERLINK fields (combining base URL and anchor)\n * Returns undefined if not a HYPERLINK field\n */\n getHyperlinkUrl(): string | undefined {\n return this.parsedHyperlink?.fullUrl;\n }\n\n /**\n * Adds a nested field within this field\n * Nested fields appear between instruction and separator\n */\n addNestedField(field: ComplexField): this {\n this.nestedFields.push(field);\n return this;\n }\n\n /**\n * Gets all nested fields\n */\n getNestedFields(): ComplexField[] {\n return [...this.nestedFields];\n }\n\n /**\n * Removes a nested field at the specified index\n * @param index - Index of the nested field to remove (0-based)\n * @returns True if removed, false if index out of bounds\n *\n * @example\n * ```typescript\n * const field = new ComplexField({ instruction: 'TOC' });\n * field.addNestedField(nested1);\n * field.addNestedField(nested2);\n * field.removeNestedField(0); // Removes nested1\n * ```\n */\n removeNestedField(index: number): boolean {\n if (index < 0 || index >= this.nestedFields.length) {\n return false;\n }\n this.nestedFields.splice(index, 1);\n return true;\n }\n\n /**\n * Gets the count of nested fields\n * @returns Number of nested fields\n */\n getNestedFieldCount(): number {\n return this.nestedFields.length;\n }\n\n /**\n * Clears all nested fields\n * @returns This field for chaining\n */\n clearNestedFields(): this {\n this.nestedFields = [];\n return this;\n }\n\n /**\n * Updates the field instruction\n * @param instruction - New field instruction (e.g., 'TOC \\\\o \"1-3\"')\n * @returns This field for chaining\n *\n * @example\n * ```typescript\n * const field = new ComplexField({ instruction: 'DATE' });\n * field.updateInstruction('DATE \\\\@ \"yyyy-MM-dd\"');\n * ```\n */\n updateInstruction(instruction: string): this {\n this.instruction = instruction;\n return this;\n }\n\n /**\n * Adds custom XML content to the result section\n */\n addResultContent(content: XMLElement): this {\n this.resultContent.push(content);\n return this;\n }\n\n /**\n * Gets result content XML elements\n */\n getResultContent(): XMLElement[] {\n return [...this.resultContent];\n }\n\n /**\n * Sets whether this field spans multiple paragraphs\n */\n setMultiParagraph(multiParagraph: boolean): this {\n this.multiParagraph = multiParagraph;\n return this;\n }\n\n /**\n * Gets whether this field spans multiple paragraphs\n */\n isMultiParagraph(): boolean {\n return this.multiParagraph;\n }\n\n /**\n * Sets revisions that wrap the result section\n * These are tracked changes (w:ins, w:del) that need to wrap the result AND end marker\n * @param revisions Array of Revision objects\n */\n setResultRevisions(revisions: Revision[]): this {\n this.resultRevisions = revisions;\n return this;\n }\n\n /**\n * Adds a revision to the result section\n * @param revision Revision to add\n */\n addResultRevision(revision: Revision): this {\n this.resultRevisions.push(revision);\n return this;\n }\n\n /**\n * Gets revisions that wrap the result section\n */\n getResultRevisions(): Revision[] {\n return [...this.resultRevisions];\n }\n\n /**\n * Checks if this field has revisions in the result section\n */\n hasResultRevisions(): boolean {\n return this.resultRevisions.length > 0;\n }\n\n /**\n * Generates XML for the complex field\n * Returns array of run elements (begin, instr, sep, result, end)\n */\n toXML(): XMLElement[] {\n const runs: XMLElement[] = [];\n\n // 1. Begin marker run\n const beginFldChar: XMLElement = this._formFieldData\n ? this.buildFldCharWithFfData()\n : {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'begin' },\n selfClosing: true,\n };\n runs.push({\n name: 'w:r',\n children: [beginFldChar],\n });\n\n // 2. Instruction run\n const instrChildren: XMLElement[] = [];\n if (this.instructionFormatting) {\n instrChildren.push(this.createRunProperties(this.instructionFormatting));\n }\n instrChildren.push({\n name: 'w:instrText',\n attributes: { 'xml:space': 'preserve' },\n children: [this.instruction],\n });\n runs.push({\n name: 'w:r',\n children: instrChildren,\n });\n\n // 2a. Nested fields (if any)\n for (const nestedField of this.nestedFields) {\n runs.push(...nestedField.toXML());\n }\n\n // 3. Separator run\n runs.push({\n name: 'w:r',\n children: [\n {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'separate' },\n selfClosing: true,\n },\n ],\n });\n\n // 4. Result content (prioritize custom XML content, then simple text)\n // Design note: For INCLUDEPICTURE fields, the parser stores the w:drawing\n // content in resultContent so it survives the parser→generator round-trip.\n // When flattenFieldCodes() is active, the full field structure is emitted\n // here, then _postProcessDocumentXml() strips the INCLUDEPICTURE scaffolding\n // (fldChar/instrText runs) from the final XML while preserving the drawing.\n // Non-INCLUDEPICTURE fields emit their complete structure unchanged.\n if (this.resultContent.length > 0) {\n // Use custom XML content\n runs.push(...this.resultContent);\n } else if (this.result) {\n // Use simple text result\n const resultChildren: XMLElement[] = [];\n if (this.resultFormatting) {\n resultChildren.push(this.createRunProperties(this.resultFormatting));\n }\n resultChildren.push({\n name: 'w:t',\n attributes: { 'xml:space': 'preserve' },\n children: [this.result],\n });\n runs.push({\n name: 'w:r',\n children: resultChildren,\n });\n }\n\n // 4a. Result revisions — only when NOT using resultContent\n // When resultContent is populated (e.g., by DocumentParser with interleaved revision XML),\n // it already includes revision elements in the correct interleaved position.\n // Emitting them again here would cause duplication.\n if (this.resultContent.length === 0) {\n for (const revision of this.resultRevisions) {\n const revisionXml = revision.toXML();\n if (revisionXml) {\n runs.push(revisionXml);\n }\n }\n }\n\n // 5. End marker run\n runs.push({\n name: 'w:r',\n children: [\n {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'end' },\n selfClosing: true,\n },\n ],\n });\n\n return runs;\n }\n\n /**\n * Creates run properties XML from formatting\n */\n private createRunProperties(formatting: RunFormatting): XMLElement {\n const children: XMLElement[] = [];\n\n if (formatting.bold) {\n children.push({ name: 'w:b', selfClosing: true });\n }\n\n if (formatting.italic) {\n children.push({ name: 'w:i', selfClosing: true });\n }\n\n if (formatting.underline) {\n const val = typeof formatting.underline === 'string' ? formatting.underline : 'single';\n children.push({\n name: 'w:u',\n attributes: { 'w:val': val },\n selfClosing: true,\n });\n }\n\n if (formatting.strike) {\n children.push({ name: 'w:strike', selfClosing: true });\n }\n\n if (formatting.font) {\n children.push({\n name: 'w:rFonts',\n attributes: {\n 'w:ascii': formatting.font,\n 'w:hAnsi': formatting.font,\n 'w:cs': formatting.font,\n },\n selfClosing: true,\n });\n }\n\n if (formatting.size) {\n const sizeValue = pointsToHalfPoints(formatting.size).toString();\n children.push({\n name: 'w:sz',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n children.push({\n name: 'w:szCs',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n }\n\n if (formatting.color) {\n const color = formatting.color.replace('#', '');\n children.push({\n name: 'w:color',\n attributes: { 'w:val': color },\n selfClosing: true,\n });\n }\n\n if (formatting.highlight) {\n children.push({\n name: 'w:highlight',\n attributes: { 'w:val': formatting.highlight },\n selfClosing: true,\n });\n }\n\n return { name: 'w:rPr', children };\n }\n\n /**\n * Builds a w:fldChar begin element with w:ffData child\n */\n private buildFldCharWithFfData(): XMLElement {\n const ffd = this._formFieldData!;\n const ffDataChildren: (string | XMLElement)[] = [];\n\n if (ffd.name) {\n ffDataChildren.push({ name: 'w:name', attributes: { 'w:val': ffd.name }, selfClosing: true });\n }\n if (ffd.enabled !== undefined) {\n if (ffd.enabled) {\n ffDataChildren.push({ name: 'w:enabled', selfClosing: true });\n } else {\n ffDataChildren.push({ name: 'w:enabled', attributes: { 'w:val': '0' }, selfClosing: true });\n }\n }\n if (ffd.calcOnExit !== undefined) {\n ffDataChildren.push({\n name: 'w:calcOnExit',\n attributes: { 'w:val': ffd.calcOnExit ? '1' : '0' },\n selfClosing: true,\n });\n }\n if (ffd.helpText) {\n ffDataChildren.push({\n name: 'w:helpText',\n attributes: { 'w:type': 'text', 'w:val': ffd.helpText },\n selfClosing: true,\n });\n }\n if (ffd.statusText) {\n ffDataChildren.push({\n name: 'w:statusText',\n attributes: { 'w:type': 'text', 'w:val': ffd.statusText },\n selfClosing: true,\n });\n }\n if (ffd.entryMacro) {\n ffDataChildren.push({\n name: 'w:entryMacro',\n attributes: { 'w:val': ffd.entryMacro },\n selfClosing: true,\n });\n }\n if (ffd.exitMacro) {\n ffDataChildren.push({\n name: 'w:exitMacro',\n attributes: { 'w:val': ffd.exitMacro },\n selfClosing: true,\n });\n }\n\n if (ffd.fieldType) {\n switch (ffd.fieldType.type) {\n case 'textInput': {\n const tiChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.inputType)\n tiChildren.push({\n name: 'w:type',\n attributes: { 'w:val': ffd.fieldType.inputType },\n selfClosing: true,\n });\n if (ffd.fieldType.defaultValue)\n tiChildren.push({\n name: 'w:default',\n attributes: { 'w:val': ffd.fieldType.defaultValue },\n selfClosing: true,\n });\n if (ffd.fieldType.maxLength !== undefined)\n tiChildren.push({\n name: 'w:maxLength',\n attributes: { 'w:val': String(ffd.fieldType.maxLength) },\n selfClosing: true,\n });\n if (ffd.fieldType.format)\n tiChildren.push({\n name: 'w:format',\n attributes: { 'w:val': ffd.fieldType.format },\n selfClosing: true,\n });\n ffDataChildren.push({ name: 'w:textInput', children: tiChildren });\n break;\n }\n case 'checkBox': {\n const cbChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.size === 'auto') {\n cbChildren.push({ name: 'w:sizeAuto', selfClosing: true });\n } else if (ffd.fieldType.size !== undefined) {\n cbChildren.push({\n name: 'w:size',\n attributes: { 'w:val': String(ffd.fieldType.size) },\n selfClosing: true,\n });\n }\n if (ffd.fieldType.defaultChecked !== undefined)\n cbChildren.push({\n name: 'w:default',\n attributes: { 'w:val': ffd.fieldType.defaultChecked ? '1' : '0' },\n selfClosing: true,\n });\n if (ffd.fieldType.checked !== undefined)\n cbChildren.push({\n name: 'w:checked',\n attributes: { 'w:val': ffd.fieldType.checked ? '1' : '0' },\n selfClosing: true,\n });\n ffDataChildren.push({ name: 'w:checkBox', children: cbChildren });\n break;\n }\n case 'dropDownList': {\n const ddChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.result !== undefined)\n ddChildren.push({\n name: 'w:result',\n attributes: { 'w:val': String(ffd.fieldType.result) },\n selfClosing: true,\n });\n if (ffd.fieldType.defaultResult !== undefined)\n ddChildren.push({\n name: 'w:default',\n attributes: { 'w:val': String(ffd.fieldType.defaultResult) },\n selfClosing: true,\n });\n if (ffd.fieldType.listEntries) {\n for (const entry of ffd.fieldType.listEntries) {\n ddChildren.push({\n name: 'w:listEntry',\n attributes: { 'w:val': entry },\n selfClosing: true,\n });\n }\n }\n ffDataChildren.push({ name: 'w:ddList', children: ddChildren });\n break;\n }\n }\n }\n\n return {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'begin' },\n children: [{ name: 'w:ffData', children: ffDataChildren }],\n };\n }\n}\n\n/**\n * TOC field options\n */\nexport interface TOCFieldOptions {\n /** Heading levels to include (e.g., \"1-3\" for levels 1-3) */\n levels?: string;\n\n /** Make entries hyperlinks (\\h switch) */\n hyperlinks?: boolean;\n\n /** Hide tab leaders and page numbers in Web Layout (\\z switch) */\n hideInWebLayout?: boolean;\n\n /** Use outline levels (\\u switch) */\n useOutlineLevels?: boolean;\n\n /** Omit page numbers (\\n switch) */\n omitPageNumbers?: boolean;\n\n /** Custom styles to use (\\t switch) */\n customStyles?: string;\n}\n\n/**\n * Creates a TOC (Table of Contents) complex field\n * Generates proper field instruction with switches\n *\n * @param options TOC field options\n * @returns ComplexField configured for TOC\n *\n * @example\n * const toc = createTOCField({ levels: '1-3', hyperlinks: true });\n * // Generates: TOC \\o \"1-3\" \\h \\z \\u\n */\nexport function createTOCField(options: TOCFieldOptions = {}): ComplexField {\n // Build instruction string\n let instruction = ' TOC';\n\n // Add outline levels switch\n if (options.levels !== undefined) {\n instruction += ` \\\\o \"${options.levels}\"`;\n } else {\n instruction += ' \\\\o \"1-3\"'; // Default: levels 1-3\n }\n\n // Add hyperlinks switch\n if (options.hyperlinks !== false) {\n instruction += ' \\\\h';\n }\n\n // Add hide in web layout switch\n if (options.hideInWebLayout !== false) {\n instruction += ' \\\\z';\n }\n\n // Add use outline levels switch\n if (options.useOutlineLevels !== false) {\n instruction += ' \\\\u';\n }\n\n // Add omit page numbers switch\n if (options.omitPageNumbers) {\n instruction += ' \\\\n';\n }\n\n // Add custom styles switch\n if (options.customStyles) {\n instruction += ` \\\\t \"${options.customStyles}\"`;\n }\n\n instruction += ' '; // Trailing space per Microsoft convention\n\n return new ComplexField({\n instruction,\n result: 'Table of Contents', // Placeholder result\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAoB9D,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,qBAAqB;IAEpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAoCD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkEzD;AAaD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CA2PvB;
|
|
1
|
+
{"version":3,"file":"InMemoryRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAoB9D,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,qBAAqB;IAEpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAoCD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkEzD;AAaD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CA2PvB;AAkMD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAWnE;AAKD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE,CAG1E;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAa7E"}
|
|
@@ -352,16 +352,36 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
352
352
|
}
|
|
353
353
|
else if (item instanceof Field_1.ComplexField && item.hasResultRevisions()) {
|
|
354
354
|
const fieldRevisions = item.getResultRevisions();
|
|
355
|
+
let mergedResult = item.getResult() || '';
|
|
356
|
+
const revisionsToKeep = [];
|
|
355
357
|
for (const rev of fieldRevisions) {
|
|
356
358
|
const revType = rev.getType();
|
|
357
|
-
if (revType === 'insert' && options.acceptInsertions)
|
|
359
|
+
if (revType === 'insert' && options.acceptInsertions) {
|
|
360
|
+
for (const child of rev.getRuns()) {
|
|
361
|
+
mergedResult += child.getText() || '';
|
|
362
|
+
}
|
|
358
363
|
result.insertionsAccepted++;
|
|
359
|
-
|
|
364
|
+
}
|
|
365
|
+
else if (revType === 'delete' && options.acceptDeletions) {
|
|
360
366
|
result.deletionsAccepted++;
|
|
361
|
-
|
|
367
|
+
}
|
|
368
|
+
else if (revType === 'moveTo' && options.acceptMoves) {
|
|
369
|
+
for (const child of rev.getRuns()) {
|
|
370
|
+
mergedResult += child.getText() || '';
|
|
371
|
+
}
|
|
362
372
|
result.movesAccepted++;
|
|
373
|
+
}
|
|
374
|
+
else if (revType === 'moveFrom' && options.acceptMoves) {
|
|
375
|
+
result.movesAccepted++;
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
revisionsToKeep.push(rev);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
item.setResult(mergedResult);
|
|
382
|
+
if (revisionsToKeep.length > 0) {
|
|
383
|
+
item.setResultRevisions(revisionsToKeep);
|
|
363
384
|
}
|
|
364
|
-
item.setResultRevisions([]);
|
|
365
385
|
newContent.push(item);
|
|
366
386
|
}
|
|
367
387
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * InMemoryRevisionAcceptor - Accept revisions by transforming the in-memory object model\n *\n * This approach follows the industry standard (OpenXML PowerTools, Aspose.Words):\n * - Transforms Revision objects in paragraph.content[] to their \"accepted\" state\n * - For insertions: Unwrap - extract child Runs/Hyperlinks into parent paragraph\n * - For deletions: Remove - delete the revision and its content from the model\n * - For property changes: Remove the change metadata, keep the current formatting\n *\n * Unlike the raw XML approach (acceptRevisions.ts), this allows subsequent modifications\n * to the in-memory model to be correctly serialized on save().\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\n */\n\nimport type { Document } from '../core/Document';\nimport { Paragraph } from '../elements/Paragraph';\nimport type { ParagraphContent } from '../elements/Paragraph';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport type { Run } from '../elements/Run';\nimport type { Hyperlink } from '../elements/Hyperlink';\nimport { isRunContent, isHyperlinkContent, isImageRunContent } from '../elements/RevisionContent';\nimport type { ImageRun } from '../elements/ImageRun';\nimport { ComplexField } from '../elements/Field';\nimport { Table } from '../elements/Table';\nimport { Section } from '../elements/Section';\nimport { getGlobalLogger, createScopedLogger, ILogger } from './logger';\n\n/**\n * Get scoped logger for this module\n */\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'InMemoryRevisionAcceptor');\n}\n\n/**\n * Options for accepting revisions\n */\nexport interface AcceptRevisionsOptions {\n /** Accept insertion revisions (w:ins) - default: true */\n acceptInsertions?: boolean;\n /** Accept deletion revisions (w:del) - default: true */\n acceptDeletions?: boolean;\n /** Accept move operations (w:moveFrom, w:moveTo) - default: true */\n acceptMoves?: boolean;\n /** Accept property change revisions (rPrChange, pPrChange, etc.) - default: true */\n acceptPropertyChanges?: boolean;\n /** Remove empty tables after revision acceptance - default: true */\n cleanupEmptyTables?: boolean;\n}\n\n/**\n * Result of accepting revisions\n */\nexport interface AcceptRevisionsResult {\n /** Number of insertions accepted */\n insertionsAccepted: number;\n /** Number of deletions accepted */\n deletionsAccepted: number;\n /** Number of move operations accepted */\n movesAccepted: number;\n /** Number of property changes accepted */\n propertyChangesAccepted: number;\n /** Total revisions processed */\n totalAccepted: number;\n /** Number of empty tables removed during cleanup */\n emptyTablesRemoved: number;\n}\n\n/**\n * Revision types that represent content changes (contain actual text/runs)\n */\nconst CONTENT_REVISION_TYPES: RevisionType[] = ['insert', 'delete', 'moveFrom', 'moveTo'];\n\n/**\n * Revision types that represent property/formatting changes\n */\nconst PROPERTY_REVISION_TYPES: RevisionType[] = [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n];\n\n/**\n * Strip revision markup from raw XML string.\n * Used for nested tables stored as raw XML that cannot be processed via the in-memory model.\n *\n * Follows the same rules as the main revision acceptor:\n * - Insertions: Keep content, remove wrapper tags\n * - Deletions: Remove entirely (content and tags)\n * - MoveFrom: Remove entirely (source of move)\n * - MoveTo: Keep content, remove wrapper\n * - Property changes: Remove change tracking elements\n * - Range markers: Remove boundary markers\n *\n * @param xml - Raw XML string containing revision markup\n * @returns Cleaned XML with revisions accepted\n */\nexport function stripRevisionsFromXml(xml: string): string {\n let result = xml;\n\n // Step 1: Remove range markers (must be done first)\n const rangePatterns = [\n /<w:moveFromRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeStart>)/gs,\n /<w:moveFromRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeEnd>)/gs,\n /<w:moveToRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveToRangeStart>)/gs,\n /<w:moveToRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveToRangeEnd>)/gs,\n /<w:customXmlInsRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeStart>)/gs,\n /<w:customXmlInsRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeEnd>)/gs,\n /<w:customXmlDelRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeStart>)/gs,\n /<w:customXmlDelRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeEnd>)/gs,\n ];\n for (const pattern of rangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 2: Remove property change elements\n const propChangePatterns = [\n /<w:rPrChange[^>]*>[\\s\\S]*?<\\/w:rPrChange>/g,\n /<w:pPrChange[^>]*>[\\s\\S]*?<\\/w:pPrChange>/g,\n /<w:tblPrChange[^>]*>[\\s\\S]*?<\\/w:tblPrChange>/g,\n /<w:tblPrExChange[^>]*>[\\s\\S]*?<\\/w:tblPrExChange>/g,\n /<w:tcPrChange[^>]*>[\\s\\S]*?<\\/w:tcPrChange>/g,\n /<w:trPrChange[^>]*>[\\s\\S]*?<\\/w:trPrChange>/g,\n /<w:sectPrChange[^>]*>[\\s\\S]*?<\\/w:sectPrChange>/g,\n /<w:tblGridChange[^>]*>[\\s\\S]*?<\\/w:tblGridChange>/g,\n /<w:numberingChange[^>]*>[\\s\\S]*?<\\/w:numberingChange>/g,\n ];\n for (const pattern of propChangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 3: Remove deletions entirely (including content)\n // Iterate until no more deletions (handles nested cases)\n let prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:del\\b[^>]*>[\\s\\S]*?<\\/w:del>/g, '');\n }\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n\n // Step 4: Remove moveFrom entirely (source of moved content)\n prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:moveFrom\\b[^>]*>[\\s\\S]*?<\\/w:moveFrom>/g, '');\n }\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n\n // Step 5: Unwrap moveTo (keep content, remove wrapper)\n result = result.replace(/<\\/w:moveTo>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*>/g, '');\n\n // Step 6: Unwrap insertions (keep content, remove wrapper)\n result = result.replace(/<\\/w:ins>/g, '');\n result = result.replace(/<w:ins\\b[^>]*>/g, '');\n\n // Step 7: Clean up orphaned tags\n result = result.replace(/<w:ins\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*\\/>/g, '');\n\n return result;\n}\n\n/**\n * Accept all revisions in the document by transforming the in-memory model.\n *\n * This is the industry-standard approach used by OpenXML PowerTools, Aspose.Words,\n * and other production DOCX libraries. It allows subsequent modifications to the\n * document to work correctly.\n *\n * @param doc - Document to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nexport function acceptRevisionsInMemory(\n doc: Document,\n options: AcceptRevisionsOptions = {}\n): AcceptRevisionsResult {\n const logger = getLogger();\n const opts: Required<AcceptRevisionsOptions> = {\n acceptInsertions: options.acceptInsertions ?? true,\n acceptDeletions: options.acceptDeletions ?? true,\n acceptMoves: options.acceptMoves ?? true,\n acceptPropertyChanges: options.acceptPropertyChanges ?? true,\n cleanupEmptyTables: options.cleanupEmptyTables ?? true,\n };\n\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n logger.info('Accepting revisions in-memory', { options: opts });\n\n // Validate move pairs before accepting if moves are being accepted\n // Orphaned moves could result in content loss (moveFrom without moveTo = content deleted)\n if (opts.acceptMoves) {\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const movePairValidation = revisionManager.validateMovePairs();\n if (!movePairValidation.valid) {\n if (movePairValidation.orphanedMoveFrom.length > 0) {\n logger.warn(\n 'Orphaned moveFrom revisions detected - accepting these will DELETE content permanently ' +\n '(content was moved from here but no moveTo destination exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveFrom }\n );\n }\n if (movePairValidation.orphanedMoveTo.length > 0) {\n logger.warn(\n 'Orphaned moveTo revisions detected - content may be duplicated ' +\n '(content moved to here but no moveFrom source exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveTo }\n );\n }\n }\n }\n }\n\n // Process all paragraphs in the document body\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process paragraphs in tables and clear table/row/cell property changes\n const tables = doc.getTables();\n for (const table of tables) {\n // Clear tblPrChange on table\n if (opts.acceptPropertyChanges && table.getTblPrChange()) {\n table.clearTblPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const row of table.getRows()) {\n // Clear trPrChange on row\n if (opts.acceptPropertyChanges && row.getTrPrChange()) {\n row.clearTrPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const cell of row.getCells()) {\n // Clear tcPrChange on cell\n if (opts.acceptPropertyChanges && cell.getTcPrChange()) {\n cell.clearTcPrChange();\n result.propertyChangesAccepted++;\n }\n\n // Clear cell structural revision markers (cellIns/cellDel/cellMerge)\n if (opts.acceptPropertyChanges && cell.getCellRevision()) {\n cell.clearCellRevision();\n result.propertyChangesAccepted++;\n }\n\n // Process paragraphs in the cell\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process raw nested content (nested tables stored as XML)\n // These cannot be processed via the in-memory model, so we use XML-based stripping\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n // Count revisions stripped from nested content\n // We can't distinguish types in raw XML, so count as property changes\n result.propertyChangesAccepted++;\n logger.debug('Stripped revisions from nested content', {\n type: item.type,\n position: item.position,\n originalLength: item.xml.length,\n cleanedLength: cleanedXml.length,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in headers\n const headerFooterManager = doc.getHeaderFooterManager();\n if (headerFooterManager) {\n const headers = headerFooterManager.getAllHeaders();\n for (const headerEntry of headers) {\n const elements = headerEntry.header.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in header tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in footers\n const footers = headerFooterManager.getAllFooters();\n for (const footerEntry of footers) {\n const elements = footerEntry.footer.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in footer tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Clear sectPrChange on document section\n if (opts.acceptPropertyChanges) {\n const section = doc.getSection();\n if (section?.getSectPrChange()) {\n section.clearSectPrChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear revision manager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n revisionManager.clear();\n }\n\n // Disable track changes setting\n doc.disableTrackChanges();\n\n // Cleanup empty tables if enabled\n // This removes tables that have no visible content after revision acceptance\n // (e.g., tables where all content was deleted via tracked changes)\n if (opts.cleanupEmptyTables) {\n result.emptyTablesRemoved = cleanupEmptyTables(doc, logger);\n }\n\n result.totalAccepted =\n result.insertionsAccepted +\n result.deletionsAccepted +\n result.movesAccepted +\n result.propertyChangesAccepted;\n\n logger.info('Revisions accepted in-memory', {\n insertions: result.insertionsAccepted,\n deletions: result.deletionsAccepted,\n moves: result.movesAccepted,\n propertyChanges: result.propertyChangesAccepted,\n total: result.totalAccepted,\n emptyTablesRemoved: result.emptyTablesRemoved,\n });\n\n return result;\n}\n\n/**\n * Accept revisions in a single paragraph by transforming its content array.\n *\n * The transformation follows these rules:\n * - Insertions (w:ins): Unwrap - extract child content into parent position\n * - Deletions (w:del): Remove - delete revision and its content\n * - MoveFrom (w:moveFrom): Remove - content exists at moveTo destination\n * - MoveTo (w:moveTo): Unwrap - keep content, remove wrapper\n * - Property changes: Remove from model (current formatting is kept)\n *\n * @param paragraph - Paragraph to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nfunction acceptRevisionsInParagraph(\n paragraph: Paragraph,\n options: Required<AcceptRevisionsOptions>\n): AcceptRevisionsResult {\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionType = item.getType();\n\n // Handle insertion revisions (w:ins)\n if (revisionType === 'insert' && options.acceptInsertions) {\n // Unwrap: Extract child content into parent position\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.insertionsAccepted++;\n continue;\n }\n\n // Handle deletion revisions (w:del)\n if (revisionType === 'delete' && options.acceptDeletions) {\n // Remove: Don't add to newContent - content is deleted\n result.deletionsAccepted++;\n continue;\n }\n\n // Handle moveFrom revisions (source of moved content)\n if (revisionType === 'moveFrom' && options.acceptMoves) {\n // Remove: Content exists at moveTo destination\n result.movesAccepted++;\n continue;\n }\n\n // Handle moveTo revisions (destination of moved content)\n if (revisionType === 'moveTo' && options.acceptMoves) {\n // Unwrap: Keep content, remove wrapper\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.movesAccepted++;\n continue;\n }\n\n // Handle property change revisions\n if (PROPERTY_REVISION_TYPES.includes(revisionType) && options.acceptPropertyChanges) {\n // For property changes, the revision is metadata attached to runs\n // The current formatting (newProperties) is already applied to the run\n // We just need to remove the change tracking metadata\n // The content inside should be preserved\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.propertyChangesAccepted++;\n continue;\n }\n\n // If we reach here, this revision type is not being accepted\n // Keep it in the content\n newContent.push(item);\n } else if (item instanceof ComplexField && item.hasResultRevisions()) {\n // Accept revisions nested inside ComplexField result sections\n const fieldRevisions = item.getResultRevisions();\n for (const rev of fieldRevisions) {\n const revType = rev.getType();\n if (revType === 'insert' && options.acceptInsertions) result.insertionsAccepted++;\n else if (revType === 'delete' && options.acceptDeletions) result.deletionsAccepted++;\n else if ((revType === 'moveFrom' || revType === 'moveTo') && options.acceptMoves)\n result.movesAccepted++;\n }\n item.setResultRevisions([]); // Clear after acceptance\n newContent.push(item);\n } else {\n // Non-revision content - keep as-is\n newContent.push(item);\n }\n }\n\n // Replace paragraph content with the transformed content\n paragraph.setContent(newContent);\n\n // Clear paragraph property change tracking (pPrChange) if accepting property changes\n // This removes the w:pPrChange element from the paragraph's formatting\n if (options.acceptPropertyChanges) {\n const formatting = paragraph.getFormatting();\n if (formatting.pPrChange) {\n paragraph.clearParagraphPropertiesChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear paragraph mark deletion tracking if accepting deletions\n // This removes the w:del element from w:pPr/w:rPr\n if (options.acceptDeletions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n paragraph.clearParagraphMarkDeletion();\n result.deletionsAccepted++;\n }\n }\n\n // Clear paragraph mark insertion tracking if accepting insertions\n // This removes the w:ins element from w:pPr/w:rPr\n if (options.acceptInsertions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkInsertion) {\n paragraph.clearParagraphMarkInsertion();\n result.insertionsAccepted++;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a paragraph has any revisions\n */\nexport function paragraphHasRevisions(paragraph: Paragraph): boolean {\n const content = paragraph.getContent();\n if (content.some((item) => item instanceof Revision)) {\n return true;\n }\n // Also check paragraph mark revision markers in w:pPr/w:rPr\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion || formatting.paragraphMarkInsertion) {\n return true;\n }\n return false;\n}\n\n/**\n * Get all revisions from a paragraph\n */\nexport function getRevisionsFromParagraph(paragraph: Paragraph): Revision[] {\n const content = paragraph.getContent();\n return content.filter((item): item is Revision => item instanceof Revision);\n}\n\n/**\n * Count revisions by type in a document\n */\nexport function countRevisionsByType(doc: Document): Map<RevisionType, number> {\n const counts = new Map<RevisionType, number>();\n\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const revisions = getRevisionsFromParagraph(paragraph);\n for (const revision of revisions) {\n const type = revision.getType();\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n }\n\n return counts;\n}\n\n/**\n * Remove tables that have no visible content after revision acceptance.\n *\n * A table is considered empty if ALL cells in ALL rows have no text content.\n * This handles cases where all table content was deleted via tracked changes -\n * the deletion markers are stripped but the empty table structure remains.\n *\n * @param doc - Document to clean up\n * @param logger - Logger instance for debug output\n * @returns Number of empty tables removed\n */\nfunction cleanupEmptyTables(doc: Document, logger: ILogger): number {\n const tables = doc.getTables();\n let removedCount = 0;\n const tablesToRemove: number[] = [];\n\n for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {\n const table = tables[tableIndex];\n if (!table) continue;\n\n let hasContent = false;\n const rows = table.getRows();\n\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const paragraphs = cell.getParagraphs();\n for (const para of paragraphs) {\n const text = para.getText().trim();\n if (text.length > 0) {\n hasContent = true;\n break;\n }\n }\n if (hasContent) break;\n }\n if (hasContent) break;\n }\n\n if (!hasContent) {\n // Mark this table for removal (store index)\n tablesToRemove.push(tableIndex);\n logger.debug('Found empty table for removal', { tableIndex });\n }\n }\n\n // Remove tables in reverse order to preserve indices\n for (let i = tablesToRemove.length - 1; i >= 0; i--) {\n const tableIndex = tablesToRemove[i];\n if (tableIndex !== undefined && doc.removeTable(tableIndex)) {\n removedCount++;\n logger.debug('Removed empty table', { tableIndex });\n }\n }\n\n if (removedCount > 0) {\n logger.info('Empty table cleanup complete', { tablesRemoved: removedCount });\n }\n\n return removedCount;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"InMemoryRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * InMemoryRevisionAcceptor - Accept revisions by transforming the in-memory object model\n *\n * This approach follows the industry standard (OpenXML PowerTools, Aspose.Words):\n * - Transforms Revision objects in paragraph.content[] to their \"accepted\" state\n * - For insertions: Unwrap - extract child Runs/Hyperlinks into parent paragraph\n * - For deletions: Remove - delete the revision and its content from the model\n * - For property changes: Remove the change metadata, keep the current formatting\n *\n * Unlike the raw XML approach (acceptRevisions.ts), this allows subsequent modifications\n * to the in-memory model to be correctly serialized on save().\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\n */\n\nimport type { Document } from '../core/Document';\nimport { Paragraph } from '../elements/Paragraph';\nimport type { ParagraphContent } from '../elements/Paragraph';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport type { Run } from '../elements/Run';\nimport type { Hyperlink } from '../elements/Hyperlink';\nimport { isRunContent, isHyperlinkContent, isImageRunContent } from '../elements/RevisionContent';\nimport type { ImageRun } from '../elements/ImageRun';\nimport { ComplexField } from '../elements/Field';\nimport { Table } from '../elements/Table';\nimport { Section } from '../elements/Section';\nimport { getGlobalLogger, createScopedLogger, ILogger } from './logger';\n\n/**\n * Get scoped logger for this module\n */\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'InMemoryRevisionAcceptor');\n}\n\n/**\n * Options for accepting revisions\n */\nexport interface AcceptRevisionsOptions {\n /** Accept insertion revisions (w:ins) - default: true */\n acceptInsertions?: boolean;\n /** Accept deletion revisions (w:del) - default: true */\n acceptDeletions?: boolean;\n /** Accept move operations (w:moveFrom, w:moveTo) - default: true */\n acceptMoves?: boolean;\n /** Accept property change revisions (rPrChange, pPrChange, etc.) - default: true */\n acceptPropertyChanges?: boolean;\n /** Remove empty tables after revision acceptance - default: true */\n cleanupEmptyTables?: boolean;\n}\n\n/**\n * Result of accepting revisions\n */\nexport interface AcceptRevisionsResult {\n /** Number of insertions accepted */\n insertionsAccepted: number;\n /** Number of deletions accepted */\n deletionsAccepted: number;\n /** Number of move operations accepted */\n movesAccepted: number;\n /** Number of property changes accepted */\n propertyChangesAccepted: number;\n /** Total revisions processed */\n totalAccepted: number;\n /** Number of empty tables removed during cleanup */\n emptyTablesRemoved: number;\n}\n\n/**\n * Revision types that represent content changes (contain actual text/runs)\n */\nconst CONTENT_REVISION_TYPES: RevisionType[] = ['insert', 'delete', 'moveFrom', 'moveTo'];\n\n/**\n * Revision types that represent property/formatting changes\n */\nconst PROPERTY_REVISION_TYPES: RevisionType[] = [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n];\n\n/**\n * Strip revision markup from raw XML string.\n * Used for nested tables stored as raw XML that cannot be processed via the in-memory model.\n *\n * Follows the same rules as the main revision acceptor:\n * - Insertions: Keep content, remove wrapper tags\n * - Deletions: Remove entirely (content and tags)\n * - MoveFrom: Remove entirely (source of move)\n * - MoveTo: Keep content, remove wrapper\n * - Property changes: Remove change tracking elements\n * - Range markers: Remove boundary markers\n *\n * @param xml - Raw XML string containing revision markup\n * @returns Cleaned XML with revisions accepted\n */\nexport function stripRevisionsFromXml(xml: string): string {\n let result = xml;\n\n // Step 1: Remove range markers (must be done first)\n const rangePatterns = [\n /<w:moveFromRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeStart>)/gs,\n /<w:moveFromRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeEnd>)/gs,\n /<w:moveToRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveToRangeStart>)/gs,\n /<w:moveToRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveToRangeEnd>)/gs,\n /<w:customXmlInsRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeStart>)/gs,\n /<w:customXmlInsRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeEnd>)/gs,\n /<w:customXmlDelRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeStart>)/gs,\n /<w:customXmlDelRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeEnd>)/gs,\n ];\n for (const pattern of rangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 2: Remove property change elements\n const propChangePatterns = [\n /<w:rPrChange[^>]*>[\\s\\S]*?<\\/w:rPrChange>/g,\n /<w:pPrChange[^>]*>[\\s\\S]*?<\\/w:pPrChange>/g,\n /<w:tblPrChange[^>]*>[\\s\\S]*?<\\/w:tblPrChange>/g,\n /<w:tblPrExChange[^>]*>[\\s\\S]*?<\\/w:tblPrExChange>/g,\n /<w:tcPrChange[^>]*>[\\s\\S]*?<\\/w:tcPrChange>/g,\n /<w:trPrChange[^>]*>[\\s\\S]*?<\\/w:trPrChange>/g,\n /<w:sectPrChange[^>]*>[\\s\\S]*?<\\/w:sectPrChange>/g,\n /<w:tblGridChange[^>]*>[\\s\\S]*?<\\/w:tblGridChange>/g,\n /<w:numberingChange[^>]*>[\\s\\S]*?<\\/w:numberingChange>/g,\n ];\n for (const pattern of propChangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 3: Remove deletions entirely (including content)\n // Iterate until no more deletions (handles nested cases)\n let prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:del\\b[^>]*>[\\s\\S]*?<\\/w:del>/g, '');\n }\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n\n // Step 4: Remove moveFrom entirely (source of moved content)\n prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:moveFrom\\b[^>]*>[\\s\\S]*?<\\/w:moveFrom>/g, '');\n }\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n\n // Step 5: Unwrap moveTo (keep content, remove wrapper)\n result = result.replace(/<\\/w:moveTo>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*>/g, '');\n\n // Step 6: Unwrap insertions (keep content, remove wrapper)\n result = result.replace(/<\\/w:ins>/g, '');\n result = result.replace(/<w:ins\\b[^>]*>/g, '');\n\n // Step 7: Clean up orphaned tags\n result = result.replace(/<w:ins\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*\\/>/g, '');\n\n return result;\n}\n\n/**\n * Accept all revisions in the document by transforming the in-memory model.\n *\n * This is the industry-standard approach used by OpenXML PowerTools, Aspose.Words,\n * and other production DOCX libraries. It allows subsequent modifications to the\n * document to work correctly.\n *\n * @param doc - Document to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nexport function acceptRevisionsInMemory(\n doc: Document,\n options: AcceptRevisionsOptions = {}\n): AcceptRevisionsResult {\n const logger = getLogger();\n const opts: Required<AcceptRevisionsOptions> = {\n acceptInsertions: options.acceptInsertions ?? true,\n acceptDeletions: options.acceptDeletions ?? true,\n acceptMoves: options.acceptMoves ?? true,\n acceptPropertyChanges: options.acceptPropertyChanges ?? true,\n cleanupEmptyTables: options.cleanupEmptyTables ?? true,\n };\n\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n logger.info('Accepting revisions in-memory', { options: opts });\n\n // Validate move pairs before accepting if moves are being accepted\n // Orphaned moves could result in content loss (moveFrom without moveTo = content deleted)\n if (opts.acceptMoves) {\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const movePairValidation = revisionManager.validateMovePairs();\n if (!movePairValidation.valid) {\n if (movePairValidation.orphanedMoveFrom.length > 0) {\n logger.warn(\n 'Orphaned moveFrom revisions detected - accepting these will DELETE content permanently ' +\n '(content was moved from here but no moveTo destination exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveFrom }\n );\n }\n if (movePairValidation.orphanedMoveTo.length > 0) {\n logger.warn(\n 'Orphaned moveTo revisions detected - content may be duplicated ' +\n '(content moved to here but no moveFrom source exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveTo }\n );\n }\n }\n }\n }\n\n // Process all paragraphs in the document body\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process paragraphs in tables and clear table/row/cell property changes\n const tables = doc.getTables();\n for (const table of tables) {\n // Clear tblPrChange on table\n if (opts.acceptPropertyChanges && table.getTblPrChange()) {\n table.clearTblPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const row of table.getRows()) {\n // Clear trPrChange on row\n if (opts.acceptPropertyChanges && row.getTrPrChange()) {\n row.clearTrPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const cell of row.getCells()) {\n // Clear tcPrChange on cell\n if (opts.acceptPropertyChanges && cell.getTcPrChange()) {\n cell.clearTcPrChange();\n result.propertyChangesAccepted++;\n }\n\n // Clear cell structural revision markers (cellIns/cellDel/cellMerge)\n if (opts.acceptPropertyChanges && cell.getCellRevision()) {\n cell.clearCellRevision();\n result.propertyChangesAccepted++;\n }\n\n // Process paragraphs in the cell\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process raw nested content (nested tables stored as XML)\n // These cannot be processed via the in-memory model, so we use XML-based stripping\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n // Count revisions stripped from nested content\n // We can't distinguish types in raw XML, so count as property changes\n result.propertyChangesAccepted++;\n logger.debug('Stripped revisions from nested content', {\n type: item.type,\n position: item.position,\n originalLength: item.xml.length,\n cleanedLength: cleanedXml.length,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in headers\n const headerFooterManager = doc.getHeaderFooterManager();\n if (headerFooterManager) {\n const headers = headerFooterManager.getAllHeaders();\n for (const headerEntry of headers) {\n const elements = headerEntry.header.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in header tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in footers\n const footers = headerFooterManager.getAllFooters();\n for (const footerEntry of footers) {\n const elements = footerEntry.footer.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in footer tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Clear sectPrChange on document section\n if (opts.acceptPropertyChanges) {\n const section = doc.getSection();\n if (section?.getSectPrChange()) {\n section.clearSectPrChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear revision manager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n revisionManager.clear();\n }\n\n // Disable track changes setting\n doc.disableTrackChanges();\n\n // Cleanup empty tables if enabled\n // This removes tables that have no visible content after revision acceptance\n // (e.g., tables where all content was deleted via tracked changes)\n if (opts.cleanupEmptyTables) {\n result.emptyTablesRemoved = cleanupEmptyTables(doc, logger);\n }\n\n result.totalAccepted =\n result.insertionsAccepted +\n result.deletionsAccepted +\n result.movesAccepted +\n result.propertyChangesAccepted;\n\n logger.info('Revisions accepted in-memory', {\n insertions: result.insertionsAccepted,\n deletions: result.deletionsAccepted,\n moves: result.movesAccepted,\n propertyChanges: result.propertyChangesAccepted,\n total: result.totalAccepted,\n emptyTablesRemoved: result.emptyTablesRemoved,\n });\n\n return result;\n}\n\n/**\n * Accept revisions in a single paragraph by transforming its content array.\n *\n * The transformation follows these rules:\n * - Insertions (w:ins): Unwrap - extract child content into parent position\n * - Deletions (w:del): Remove - delete revision and its content\n * - MoveFrom (w:moveFrom): Remove - content exists at moveTo destination\n * - MoveTo (w:moveTo): Unwrap - keep content, remove wrapper\n * - Property changes: Remove from model (current formatting is kept)\n *\n * @param paragraph - Paragraph to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nfunction acceptRevisionsInParagraph(\n paragraph: Paragraph,\n options: Required<AcceptRevisionsOptions>\n): AcceptRevisionsResult {\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionType = item.getType();\n\n // Handle insertion revisions (w:ins)\n if (revisionType === 'insert' && options.acceptInsertions) {\n // Unwrap: Extract child content into parent position\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.insertionsAccepted++;\n continue;\n }\n\n // Handle deletion revisions (w:del)\n if (revisionType === 'delete' && options.acceptDeletions) {\n // Remove: Don't add to newContent - content is deleted\n result.deletionsAccepted++;\n continue;\n }\n\n // Handle moveFrom revisions (source of moved content)\n if (revisionType === 'moveFrom' && options.acceptMoves) {\n // Remove: Content exists at moveTo destination\n result.movesAccepted++;\n continue;\n }\n\n // Handle moveTo revisions (destination of moved content)\n if (revisionType === 'moveTo' && options.acceptMoves) {\n // Unwrap: Keep content, remove wrapper\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.movesAccepted++;\n continue;\n }\n\n // Handle property change revisions\n if (PROPERTY_REVISION_TYPES.includes(revisionType) && options.acceptPropertyChanges) {\n // For property changes, the revision is metadata attached to runs\n // The current formatting (newProperties) is already applied to the run\n // We just need to remove the change tracking metadata\n // The content inside should be preserved\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.propertyChangesAccepted++;\n continue;\n }\n\n // If we reach here, this revision type is not being accepted\n // Keep it in the content\n newContent.push(item);\n } else if (item instanceof ComplexField && item.hasResultRevisions()) {\n // Accept revisions nested inside ComplexField result sections\n // Merge insertion/moveTo text into the result before clearing\n const fieldRevisions = item.getResultRevisions();\n let mergedResult = item.getResult() || '';\n const revisionsToKeep: Revision[] = [];\n\n for (const rev of fieldRevisions) {\n const revType = rev.getType();\n if (revType === 'insert' && options.acceptInsertions) {\n // Merge insertion text into result\n for (const child of rev.getRuns()) {\n mergedResult += child.getText() || '';\n }\n result.insertionsAccepted++;\n } else if (revType === 'delete' && options.acceptDeletions) {\n // Deleted text was never in result — just count it\n result.deletionsAccepted++;\n } else if (revType === 'moveTo' && options.acceptMoves) {\n // Merge moveTo text into result\n for (const child of rev.getRuns()) {\n mergedResult += child.getText() || '';\n }\n result.movesAccepted++;\n } else if (revType === 'moveFrom' && options.acceptMoves) {\n result.movesAccepted++;\n } else {\n // Revision type not being accepted — keep it\n revisionsToKeep.push(rev);\n }\n }\n\n // setResult() clears both resultRevisions and resultContent\n item.setResult(mergedResult);\n // Restore any unaccepted revisions\n if (revisionsToKeep.length > 0) {\n item.setResultRevisions(revisionsToKeep);\n }\n newContent.push(item);\n } else {\n // Non-revision content - keep as-is\n newContent.push(item);\n }\n }\n\n // Replace paragraph content with the transformed content\n paragraph.setContent(newContent);\n\n // Clear paragraph property change tracking (pPrChange) if accepting property changes\n // This removes the w:pPrChange element from the paragraph's formatting\n if (options.acceptPropertyChanges) {\n const formatting = paragraph.getFormatting();\n if (formatting.pPrChange) {\n paragraph.clearParagraphPropertiesChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear paragraph mark deletion tracking if accepting deletions\n // This removes the w:del element from w:pPr/w:rPr\n if (options.acceptDeletions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n paragraph.clearParagraphMarkDeletion();\n result.deletionsAccepted++;\n }\n }\n\n // Clear paragraph mark insertion tracking if accepting insertions\n // This removes the w:ins element from w:pPr/w:rPr\n if (options.acceptInsertions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkInsertion) {\n paragraph.clearParagraphMarkInsertion();\n result.insertionsAccepted++;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a paragraph has any revisions\n */\nexport function paragraphHasRevisions(paragraph: Paragraph): boolean {\n const content = paragraph.getContent();\n if (content.some((item) => item instanceof Revision)) {\n return true;\n }\n // Also check paragraph mark revision markers in w:pPr/w:rPr\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion || formatting.paragraphMarkInsertion) {\n return true;\n }\n return false;\n}\n\n/**\n * Get all revisions from a paragraph\n */\nexport function getRevisionsFromParagraph(paragraph: Paragraph): Revision[] {\n const content = paragraph.getContent();\n return content.filter((item): item is Revision => item instanceof Revision);\n}\n\n/**\n * Count revisions by type in a document\n */\nexport function countRevisionsByType(doc: Document): Map<RevisionType, number> {\n const counts = new Map<RevisionType, number>();\n\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const revisions = getRevisionsFromParagraph(paragraph);\n for (const revision of revisions) {\n const type = revision.getType();\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n }\n\n return counts;\n}\n\n/**\n * Remove tables that have no visible content after revision acceptance.\n *\n * A table is considered empty if ALL cells in ALL rows have no text content.\n * This handles cases where all table content was deleted via tracked changes -\n * the deletion markers are stripped but the empty table structure remains.\n *\n * @param doc - Document to clean up\n * @param logger - Logger instance for debug output\n * @returns Number of empty tables removed\n */\nfunction cleanupEmptyTables(doc: Document, logger: ILogger): number {\n const tables = doc.getTables();\n let removedCount = 0;\n const tablesToRemove: number[] = [];\n\n for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {\n const table = tables[tableIndex];\n if (!table) continue;\n\n let hasContent = false;\n const rows = table.getRows();\n\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const paragraphs = cell.getParagraphs();\n for (const para of paragraphs) {\n const text = para.getText().trim();\n if (text.length > 0) {\n hasContent = true;\n break;\n }\n }\n if (hasContent) break;\n }\n if (hasContent) break;\n }\n\n if (!hasContent) {\n // Mark this table for removal (store index)\n tablesToRemove.push(tableIndex);\n logger.debug('Found empty table for removal', { tableIndex });\n }\n }\n\n // Remove tables in reverse order to preserve indices\n for (let i = tablesToRemove.length - 1; i >= 0; i--) {\n const tableIndex = tablesToRemove[i];\n if (tableIndex !== undefined && doc.removeTable(tableIndex)) {\n removedCount++;\n logger.debug('Removed empty table', { tableIndex });\n }\n }\n\n if (removedCount > 0) {\n logger.info('Empty table cleanup complete', { tablesRemoved: removedCount });\n }\n\n return removedCount;\n}\n"]}
|