docxmlater 11.0.10 → 12.1.0
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/README.md +53 -13
- package/dist/core/Document.d.ts +29 -3
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +733 -170
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +1 -0
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +77 -25
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +7 -3
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +427 -81
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +2 -2
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/Comment.d.ts +15 -1
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +67 -12
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts +4 -0
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +74 -16
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts +10 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +76 -34
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts +1 -0
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +8 -4
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/Footer.d.ts +3 -1
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +39 -53
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.d.ts +3 -1
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +39 -53
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.d.ts +4 -2
- package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
- package/dist/elements/HeaderFooterManager.js +36 -6
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +6 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +69 -44
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +33 -6
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts +1 -0
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +11 -0
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +3 -0
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +91 -26
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/Revision.d.ts +4 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +369 -29
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/Run.d.ts +1 -0
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +24 -4
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +17 -7
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +50 -42
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +9 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +46 -6
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -0
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +90 -42
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +1 -0
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +32 -13
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +5 -7
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableRow.d.ts +1 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +16 -1
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +55 -42
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/esm/core/Document.js +735 -172
- package/dist/esm/core/Document.js.map +1 -1
- package/dist/esm/core/DocumentGenerator.js +77 -25
- package/dist/esm/core/DocumentGenerator.js.map +1 -1
- package/dist/esm/core/DocumentParser.js +427 -81
- package/dist/esm/core/DocumentParser.js.map +1 -1
- package/dist/esm/core/RelationshipManager.js +2 -2
- package/dist/esm/core/RelationshipManager.js.map +1 -1
- package/dist/esm/elements/Comment.js +67 -12
- package/dist/esm/elements/Comment.js.map +1 -1
- package/dist/esm/elements/CommentManager.js +74 -16
- package/dist/esm/elements/CommentManager.js.map +1 -1
- package/dist/esm/elements/EndnoteManager.js.map +1 -1
- package/dist/esm/elements/Field.js +77 -35
- package/dist/esm/elements/Field.js.map +1 -1
- package/dist/esm/elements/FieldHelpers.js +7 -4
- package/dist/esm/elements/FieldHelpers.js.map +1 -1
- package/dist/esm/elements/Footer.js +39 -53
- package/dist/esm/elements/Footer.js.map +1 -1
- package/dist/esm/elements/FootnoteManager.js.map +1 -1
- package/dist/esm/elements/Header.js +39 -53
- package/dist/esm/elements/Header.js.map +1 -1
- package/dist/esm/elements/HeaderFooterManager.js +36 -6
- package/dist/esm/elements/HeaderFooterManager.js.map +1 -1
- package/dist/esm/elements/Hyperlink.js +69 -44
- package/dist/esm/elements/Hyperlink.js.map +1 -1
- package/dist/esm/elements/Image.js +33 -6
- package/dist/esm/elements/Image.js.map +1 -1
- package/dist/esm/elements/ImageManager.js +11 -0
- package/dist/esm/elements/ImageManager.js.map +1 -1
- package/dist/esm/elements/Paragraph.js +91 -26
- package/dist/esm/elements/Paragraph.js.map +1 -1
- package/dist/esm/elements/Revision.js +369 -29
- package/dist/esm/elements/Revision.js.map +1 -1
- package/dist/esm/elements/Run.js +24 -4
- package/dist/esm/elements/Run.js.map +1 -1
- package/dist/esm/elements/Section.js +17 -7
- package/dist/esm/elements/Section.js.map +1 -1
- package/dist/esm/elements/Shape.js +50 -42
- package/dist/esm/elements/Shape.js.map +1 -1
- package/dist/esm/elements/StructuredDocumentTag.js +46 -6
- package/dist/esm/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/esm/elements/Table.js +90 -42
- package/dist/esm/elements/Table.js.map +1 -1
- package/dist/esm/elements/TableCell.js +32 -13
- package/dist/esm/elements/TableCell.js.map +1 -1
- package/dist/esm/elements/TableOfContents.js +5 -7
- package/dist/esm/elements/TableOfContents.js.map +1 -1
- package/dist/esm/elements/TableRow.js +16 -1
- package/dist/esm/elements/TableRow.js.map +1 -1
- package/dist/esm/elements/TextBox.js +55 -42
- package/dist/esm/elements/TextBox.js.map +1 -1
- package/dist/esm/formatting/AbstractNumbering.js +1 -1
- package/dist/esm/formatting/AbstractNumbering.js.map +1 -1
- package/dist/esm/formatting/NumberingLevel.js +8 -6
- package/dist/esm/formatting/NumberingLevel.js.map +1 -1
- package/dist/esm/formatting/NumberingManager.js +16 -1
- package/dist/esm/formatting/NumberingManager.js.map +1 -1
- package/dist/esm/formatting/Style.js +14 -0
- package/dist/esm/formatting/Style.js.map +1 -1
- package/dist/esm/formatting/StylesManager.js +14 -2
- package/dist/esm/formatting/StylesManager.js.map +1 -1
- package/dist/esm/helpers/CleanupHelper.js +103 -26
- package/dist/esm/helpers/CleanupHelper.js.map +1 -1
- package/dist/esm/images/ImageOptimizer.js +52 -4
- package/dist/esm/images/ImageOptimizer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal.js +1 -1
- package/dist/esm/internal.js.map +1 -1
- package/dist/esm/processors/CompatibilityUpgrader.js +7 -1
- package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -1
- package/dist/esm/processors/InMemoryRevisionAcceptor.js +134 -13
- package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/esm/processors/RevisionWalker.js +223 -39
- package/dist/esm/processors/RevisionWalker.js.map +1 -1
- package/dist/esm/processors/SelectiveRevisionAcceptor.js +116 -17
- package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/esm/processors/acceptRevisions.js +20 -11
- package/dist/esm/processors/acceptRevisions.js.map +1 -1
- package/dist/esm/processors/cnfStyleDecoder.js +7 -7
- package/dist/esm/processors/cnfStyleDecoder.js.map +1 -1
- package/dist/esm/processors/stripTrackedChanges.js +16 -5
- package/dist/esm/processors/stripTrackedChanges.js.map +1 -1
- package/dist/esm/utils/deepClone.js +24 -11
- package/dist/esm/utils/deepClone.js.map +1 -1
- package/dist/esm/utils/units.js +1 -1
- package/dist/esm/utils/units.js.map +1 -1
- package/dist/esm/utils/validation.js +11 -23
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/esm/utils/xmlSanitization.js +131 -7
- package/dist/esm/utils/xmlSanitization.js.map +1 -1
- package/dist/esm/validation/RevisionAutoFixer.js +69 -55
- package/dist/esm/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/esm/validation/RevisionValidator.js +24 -20
- package/dist/esm/validation/RevisionValidator.js.map +1 -1
- package/dist/esm/xml/XMLBuilder.js +52 -20
- package/dist/esm/xml/XMLBuilder.js.map +1 -1
- package/dist/esm/xml/XMLParser.js +55 -13
- package/dist/esm/xml/XMLParser.js.map +1 -1
- package/dist/esm/zip/ZipHandler.js +37 -13
- package/dist/esm/zip/ZipHandler.js.map +1 -1
- package/dist/esm/zip/ZipReader.js +53 -6
- package/dist/esm/zip/ZipReader.js.map +1 -1
- package/dist/esm/zip/errors.js +7 -0
- package/dist/esm/zip/errors.js.map +1 -1
- package/dist/esm/zip/types.js +4 -0
- package/dist/esm/zip/types.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +1 -1
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +8 -6
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +16 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +14 -0
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +14 -2
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +103 -26
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.d.ts.map +1 -1
- package/dist/images/ImageOptimizer.js +52 -4
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -1
- package/dist/internal.js.map +1 -1
- package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/processors/CompatibilityUpgrader.js +7 -1
- package/dist/processors/CompatibilityUpgrader.js.map +1 -1
- package/dist/processors/InMemoryRevisionAcceptor.d.ts +1 -0
- package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/processors/InMemoryRevisionAcceptor.js +135 -13
- package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/processors/RevisionWalker.d.ts +9 -3
- package/dist/processors/RevisionWalker.d.ts.map +1 -1
- package/dist/processors/RevisionWalker.js +223 -39
- package/dist/processors/RevisionWalker.js.map +1 -1
- package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/processors/SelectiveRevisionAcceptor.js +116 -17
- package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/processors/acceptRevisions.d.ts +1 -0
- package/dist/processors/acceptRevisions.d.ts.map +1 -1
- package/dist/processors/acceptRevisions.js +21 -11
- package/dist/processors/acceptRevisions.js.map +1 -1
- package/dist/processors/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/processors/cnfStyleDecoder.js +7 -7
- package/dist/processors/cnfStyleDecoder.js.map +1 -1
- package/dist/processors/stripTrackedChanges.d.ts.map +1 -1
- package/dist/processors/stripTrackedChanges.js +16 -5
- package/dist/processors/stripTrackedChanges.js.map +1 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +24 -11
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/units.d.ts.map +1 -1
- package/dist/utils/units.js +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +11 -23
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts +2 -0
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +133 -7
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +6 -2
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +68 -54
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts +2 -0
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +26 -21
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -0
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +52 -20
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts +1 -0
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +55 -13
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js +37 -13
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +52 -5
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/errors.d.ts +3 -0
- package/dist/zip/errors.d.ts.map +1 -1
- package/dist/zip/errors.js +9 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.d.ts +4 -0
- package/dist/zip/types.d.ts.map +1 -1
- package/dist/zip/types.js +4 -0
- package/dist/zip/types.js.map +1 -1
- package/package.json +2 -2
- package/src/core/Document.ts +1184 -242
- package/src/core/DocumentGenerator.ts +106 -26
- package/src/core/DocumentParser.ts +681 -114
- package/src/core/RelationshipManager.ts +446 -442
- package/src/elements/Comment.ts +123 -18
- package/src/elements/CommentManager.ts +121 -22
- package/src/elements/EndnoteManager.ts +4 -1
- package/src/elements/Field.ts +134 -43
- package/src/elements/FieldHelpers.ts +20 -4
- package/src/elements/Footer.ts +62 -67
- package/src/elements/FootnoteManager.ts +4 -1
- package/src/elements/Header.ts +62 -67
- package/src/elements/HeaderFooterManager.ts +56 -8
- package/src/elements/Hyperlink.ts +150 -55
- package/src/elements/Image.ts +51 -7
- package/src/elements/ImageManager.ts +24 -0
- package/src/elements/Paragraph.ts +161 -40
- package/src/elements/Revision.ts +446 -47
- package/src/elements/Run.ts +44 -6
- package/src/elements/Section.ts +25 -9
- package/src/elements/Shape.ts +52 -44
- package/src/elements/StructuredDocumentTag.ts +83 -8
- package/src/elements/Table.ts +151 -50
- package/src/elements/TableCell.ts +57 -17
- package/src/elements/TableOfContents.ts +10 -9
- package/src/elements/TableRow.ts +35 -3
- package/src/elements/TextBox.ts +58 -43
- package/src/formatting/AbstractNumbering.ts +4 -2
- package/src/formatting/NumberingLevel.ts +50 -12
- package/src/formatting/NumberingManager.ts +32 -3
- package/src/formatting/Style.ts +14 -0
- package/src/formatting/StylesManager.ts +29 -2
- package/src/helpers/CleanupHelper.ts +122 -30
- package/src/images/ImageOptimizer.ts +64 -5
- package/src/index.ts +7 -0
- package/src/internal.ts +1 -0
- package/src/processors/CompatibilityUpgrader.ts +15 -2
- package/src/processors/InMemoryRevisionAcceptor.ts +276 -17
- package/src/processors/RevisionWalker.ts +390 -46
- package/src/processors/SelectiveRevisionAcceptor.ts +164 -28
- package/src/processors/acceptRevisions.ts +67 -17
- package/src/processors/cnfStyleDecoder.ts +18 -12
- package/src/processors/stripTrackedChanges.ts +47 -10
- package/src/utils/deepClone.ts +48 -14
- package/src/utils/units.ts +3 -1
- package/src/utils/validation.ts +30 -32
- package/src/utils/xmlSanitization.ts +218 -22
- package/src/validation/RevisionAutoFixer.ts +109 -65
- package/src/validation/RevisionValidator.ts +48 -23
- package/src/xml/XMLBuilder.ts +82 -22
- package/src/xml/XMLParser.ts +87 -20
- package/src/zip/ZipHandler.ts +61 -21
- package/src/zip/ZipReader.ts +135 -13
- package/src/zip/errors.ts +15 -0
- package/src/zip/types.ts +44 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Revision.js","sourceRoot":"","sources":["../../../src/elements/Revision.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Revision - Represents tracked changes in a Word document\n *\n * Track changes allow tracking of insertions, deletions, and modifications\n * to document content, showing who made changes and when.\n */\n\nimport { Run } from './Run.js';\nimport type { RunFormatting } from './Run.js';\nimport { XMLElement } from '../xml/XMLBuilder.js';\nimport type { RevisionLocation } from './PropertyChangeTypes.js';\nimport type { RevisionContent } from './RevisionContent.js';\nimport { isRunContent, isHyperlinkContent } from './RevisionContent.js';\nimport { formatDateForXml } from '../utils/dateFormatting.js';\n\n/**\n * Revision type - All OpenXML WordprocessingML revision types\n */\nexport type RevisionType =\n // Content changes\n | 'insert' // w:ins - Inserted content\n | 'delete' // w:del - Deleted content\n // Property changes\n | 'runPropertiesChange' // w:rPrChange - Run formatting change (bold, italic, font, etc.)\n | 'paragraphPropertiesChange' // w:pPrChange - Paragraph formatting change\n | 'tablePropertiesChange' // w:tblPrChange - Table formatting change\n | 'tableExceptionPropertiesChange' // w:tblPrExChange - Table exception properties change\n | 'tableRowPropertiesChange' // w:trPrChange - Table row properties change\n | 'tableCellPropertiesChange' // w:tcPrChange - Table cell properties change\n | 'sectionPropertiesChange' // w:sectPrChange - Section properties change\n // Move operations\n | 'moveFrom' // w:moveFrom - Content moved from this location\n | 'moveTo' // w:moveTo - Content moved to this location\n // Table operations\n | 'tableCellInsert' // w:cellIns - Table cell inserted\n | 'tableCellDelete' // w:cellDel - Table cell deleted\n | 'tableCellMerge' // w:cellMerge - Table cells merged\n // Numbering\n | 'numberingChange' // w:numberingChange - List numbering changed\n // Hyperlink changes\n | 'hyperlinkChange' // Hyperlink URL, text, or formatting change\n // Rich content changes (new tracking types)\n | 'imageChange' // Image insertion, deletion, or property change\n | 'fieldChange' // Field insertion, deletion, or value change\n | 'commentChange' // Comment insertion, deletion, or content change\n | 'bookmarkChange' // Bookmark creation, deletion, or range change\n | 'contentControlChange'; // Content control insertion, deletion, or property change\n\n/**\n * Field context for revisions inside complex fields\n * Provides information about the parent field when a revision appears in a field result\n */\nexport interface FieldContext {\n /** Reference to the parent ComplexField (if revision is in field result) */\n field?: import('./Field.js').ComplexField;\n /** Field instruction (e.g., \"HYPERLINK\", \"TOC\", \"MERGEFIELD\") */\n instruction?: string;\n /** Position within field: 'instruction' or 'result' */\n position: 'instruction' | 'result';\n}\n\n/**\n * Revision properties\n */\nexport interface RevisionProperties {\n /** Unique revision ID (assigned by RevisionManager) */\n id?: number;\n /** Author who made the change */\n author: string;\n /** Date when the change was made */\n date?: Date;\n /** Type of revision */\n type: RevisionType;\n /** Content affected by the revision (Run, Hyperlink, or arrays thereof) */\n content: RevisionContent | RevisionContent[];\n /** Previous properties (for property change revisions) */\n previousProperties?: Record<string, any>;\n /** New properties (for property change revisions) */\n newProperties?: Record<string, any>;\n /** Move ID (for moveFrom/moveTo operations) */\n moveId?: string;\n /** Destination location (for moveFrom) or source location (for moveTo) */\n moveLocation?: string;\n /** Location of this revision within the document structure */\n location?: RevisionLocation;\n /** Field context if revision is inside a complex field */\n fieldContext?: FieldContext;\n}\n\n/**\n * Represents a tracked change (revision) in a document\n */\nexport class Revision {\n private id: number;\n private author: string;\n private date: Date;\n private type: RevisionType;\n private content: RevisionContent[];\n private previousProperties?: Record<string, any>;\n private newProperties?: Record<string, any>;\n private moveId?: string;\n private moveLocation?: string;\n private isFieldInstruction = false;\n private location?: RevisionLocation;\n private fieldContext?: FieldContext;\n\n /**\n * Creates a new Revision\n * @param properties - Revision properties\n */\n constructor(properties: RevisionProperties) {\n this.id = properties.id ?? 0; // Will be assigned by RevisionManager\n this.author = properties.author;\n this.date = properties.date || new Date();\n this.type = properties.type;\n this.content = Array.isArray(properties.content) ? properties.content : [properties.content];\n this.previousProperties = properties.previousProperties;\n this.newProperties = properties.newProperties;\n this.moveId = properties.moveId;\n this.moveLocation = properties.moveLocation;\n this.location = properties.location;\n this.fieldContext = properties.fieldContext;\n }\n\n /**\n * Gets the revision ID\n */\n getId(): number {\n return this.id;\n }\n\n /**\n * Sets the revision ID (used by RevisionManager)\n * @internal\n */\n setId(id: number): void {\n this.id = id;\n }\n\n /**\n * Gets the author\n */\n getAuthor(): string {\n return this.author;\n }\n\n /**\n * Sets the author\n */\n setAuthor(author: string): this {\n this.author = author;\n return this;\n }\n\n /**\n * Gets the revision date\n */\n getDate(): Date {\n return this.date;\n }\n\n /**\n * Sets the revision date\n */\n setDate(date: Date): this {\n this.date = date;\n return this;\n }\n\n /**\n * Gets the revision type\n */\n getType(): RevisionType {\n return this.type;\n }\n\n /**\n * Gets all content items in this revision\n * @returns Array of RevisionContent (Run or Hyperlink objects)\n */\n getContent(): RevisionContent[] {\n return [...this.content];\n }\n\n /**\n * Gets only the Run objects from this revision (backward compatible)\n * @returns Array of Run objects\n */\n getRuns(): Run[] {\n return this.content.filter((item): item is Run => isRunContent(item));\n }\n\n /**\n * Gets only the Hyperlink objects from this revision\n * @returns Array of Hyperlink objects\n */\n getHyperlinks(): import('./Hyperlink.js').Hyperlink[] {\n return this.content.filter((item): item is import('./Hyperlink.js').Hyperlink =>\n isHyperlinkContent(item)\n );\n }\n\n /**\n * Adds a run to this revision\n */\n addRun(run: Run): this {\n this.content.push(run);\n return this;\n }\n\n /**\n * Adds a hyperlink to this revision\n */\n addHyperlink(hyperlink: import('./Hyperlink.js').Hyperlink): this {\n this.content.push(hyperlink);\n return this;\n }\n\n /**\n * Adds content (Run or Hyperlink) to this revision\n */\n addContent(item: RevisionContent): this {\n this.content.push(item);\n return this;\n }\n\n /**\n * Gets the combined text content from all Runs and Hyperlinks in this revision.\n * This is used by isParagraphBlank() to detect text inside revision elements.\n * @returns Combined text string from all content items\n */\n getText(): string {\n return this.content\n .filter(\n (item): item is Run | import('./Hyperlink.js').Hyperlink =>\n isRunContent(item) || isHyperlinkContent(item)\n )\n .map((item) => item.getText())\n .join('');\n }\n\n /**\n * Gets the previous properties (for property change revisions)\n */\n getPreviousProperties(): Record<string, any> | undefined {\n return this.previousProperties;\n }\n\n /**\n * Gets the new properties (for property change revisions)\n */\n getNewProperties(): Record<string, any> | undefined {\n return this.newProperties;\n }\n\n /**\n * Gets the move ID (for moveFrom/moveTo operations)\n */\n getMoveId(): string | undefined {\n return this.moveId;\n }\n\n /**\n * Gets the move location\n */\n getMoveLocation(): string | undefined {\n return this.moveLocation;\n }\n\n /**\n * Gets the location of this revision within the document\n * @returns Location information or undefined if not set\n */\n getLocation(): RevisionLocation | undefined {\n return this.location;\n }\n\n /**\n * Sets the location of this revision within the document\n * @param location - Location information\n * @returns This revision for chaining\n */\n setLocation(location: RevisionLocation): this {\n this.location = location;\n return this;\n }\n\n /**\n * Gets the field context if this revision is inside a complex field\n * @returns Field context information or undefined if not inside a field\n */\n getFieldContext(): FieldContext | undefined {\n return this.fieldContext;\n }\n\n /**\n * Sets the field context for this revision\n * @param context - Field context information\n * @returns This revision for chaining\n */\n setFieldContext(context: FieldContext): this {\n this.fieldContext = context;\n return this;\n }\n\n /**\n * Checks if this revision is inside a complex field\n * @returns True if the revision is inside a field result or instruction section\n */\n isInsideField(): boolean {\n return this.fieldContext !== undefined;\n }\n\n /**\n * Checks if this revision is inside a field result section\n * @returns True if the revision is in the result section of a complex field\n */\n isInsideFieldResult(): boolean {\n return this.fieldContext?.position === 'result';\n }\n\n /**\n * Checks if this revision is inside a field instruction section\n * @returns True if the revision is in the instruction section of a complex field\n */\n isInsideFieldInstruction(): boolean {\n return this.fieldContext?.position === 'instruction';\n }\n\n /**\n * Gets the parent field if this revision is inside a complex field\n * @returns The parent ComplexField or undefined\n */\n getParentField(): import('./Field.js').ComplexField | undefined {\n return this.fieldContext?.field;\n }\n\n /**\n * Marks this revision as a field instruction deletion\n * When true, uses w:delInstrText instead of w:delText\n */\n setAsFieldInstruction(): this {\n this.isFieldInstruction = true;\n return this;\n }\n\n /**\n * Checks if this is a field instruction deletion\n */\n isFieldInstructionDeletion(): boolean {\n return this.isFieldInstruction;\n }\n\n /**\n * Formats a date to ISO 8601 format for XML\n * Per ECMA-376, revision dates must be in ISO 8601 format (e.g., \"2024-01-01T12:00:00Z\")\n * Uses formatDateForXml() to strip milliseconds which Word does not accept.\n * @param date - Date to format\n * @returns ISO 8601 formatted date string without milliseconds\n */\n private formatDate(date: Date): string {\n return formatDateForXml(date);\n }\n\n /**\n * Gets the XML element name for this revision type\n * Maps internal revision types to OOXML WordprocessingML element names per ECMA-376\n *\n * Mappings:\n * - insert → w:ins (inserted content)\n * - delete → w:del (deleted content)\n * - runPropertiesChange → w:rPrChange (run formatting change)\n * - paragraphPropertiesChange → w:pPrChange (paragraph formatting change)\n * - tablePropertiesChange → w:tblPrChange (table formatting change)\n * - tableRowPropertiesChange → w:trPrChange (table row properties change)\n * - tableCellPropertiesChange → w:tcPrChange (table cell properties change)\n * - sectionPropertiesChange → w:sectPrChange (section properties change)\n * - moveFrom → w:moveFrom (source location of moved content)\n * - moveTo → w:moveTo (destination location of moved content)\n * - tableCellInsert → w:cellIns (inserted table cell)\n * - tableCellDelete → w:cellDel (deleted table cell)\n * - tableCellMerge → w:cellMerge (merged table cells)\n * - numberingChange → w:numberingChange (list numbering changed)\n *\n * @returns OOXML element name (e.g., \"w:ins\", \"w:del\")\n */\n private getElementName(): string {\n switch (this.type) {\n case 'insert':\n return 'w:ins';\n case 'delete':\n return 'w:del';\n case 'runPropertiesChange':\n return 'w:rPrChange';\n case 'paragraphPropertiesChange':\n return 'w:pPrChange';\n case 'tablePropertiesChange':\n return 'w:tblPrChange';\n case 'tableExceptionPropertiesChange':\n return 'w:tblPrExChange';\n case 'tableRowPropertiesChange':\n return 'w:trPrChange';\n case 'tableCellPropertiesChange':\n return 'w:tcPrChange';\n case 'sectionPropertiesChange':\n return 'w:sectPrChange';\n case 'moveFrom':\n return 'w:moveFrom';\n case 'moveTo':\n return 'w:moveTo';\n case 'tableCellInsert':\n return 'w:cellIns';\n case 'tableCellDelete':\n return 'w:cellDel';\n case 'tableCellMerge':\n return 'w:cellMerge';\n case 'numberingChange':\n return 'w:numberingChange';\n // Internal tracking types - no OOXML element equivalent\n // These are used for changelog generation and internal tracking,\n // not for XML serialization. OOXML tracks these as insert/delete pairs.\n case 'hyperlinkChange':\n case 'imageChange':\n case 'fieldChange':\n case 'commentChange':\n case 'bookmarkChange':\n case 'contentControlChange':\n throw new Error(\n `Revision type '${this.type}' is an internal tracking type and cannot be serialized to OOXML XML. ` +\n `OOXML does not have a native element for this type. ` +\n `Use insert/delete revision pairs for tracking changes to ${this.type.replace('Change', '')}s.`\n );\n default:\n // TypeScript exhaustiveness check - this should never be reached\n // if all RevisionType values are handled above\n const _exhaustiveCheck: never = this.type;\n throw new Error(`Unknown revision type: ${_exhaustiveCheck}`);\n }\n }\n\n /**\n * Generates XML for this revision per OOXML WordprocessingML specification (ECMA-376)\n *\n * **XML Structure:**\n *\n * Content revisions (w:ins, w:del, w:moveFrom, w:moveTo):\n * ```xml\n * <w:ins w:id=\"0\" w:author=\"Author Name\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:r>\n * <w:t>Inserted text</w:t>\n * </w:r>\n * </w:ins>\n * ```\n *\n * Deletion revisions use w:delText instead of w:t:\n * ```xml\n * <w:del w:id=\"1\" w:author=\"Author Name\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:r>\n * <w:delText>Deleted text</w:delText>\n * </w:r>\n * </w:del>\n * ```\n *\n * Property change revisions (w:rPrChange, w:pPrChange, etc.):\n * ```xml\n * <w:rPrChange w:id=\"2\" w:author=\"Author Name\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:rPr>\n * <w:b/> <!-- Previous bold setting -->\n * <w:sz w:val=\"24\"/> <!-- Previous font size -->\n * </w:rPr>\n * </w:rPrChange>\n * ```\n *\n * **Required Attributes (per ECMA-376):**\n * - w:id: Unique revision identifier (ST_DecimalNumber) - REQUIRED\n * - w:author: Author who made the change (ST_String) - REQUIRED\n * - w:date: When the change was made (ST_DateTime, ISO 8601) - OPTIONAL\n *\n * **Move Operations:**\n * For moveFrom/moveTo, an additional w:moveId attribute links the source and destination:\n * ```xml\n * <w:moveFrom w:id=\"3\" w:author=\"Author\" w:date=\"...\" w:moveId=\"move-1\">...</w:moveFrom>\n * <w:moveTo w:id=\"4\" w:author=\"Author\" w:date=\"...\" w:moveId=\"move-1\">...</w:moveTo>\n * ```\n *\n * **Content vs Property Changes:**\n * - Content revisions (insert/delete/move): Contain w:r elements with text runs\n * - Property revisions (rPrChange/pPrChange): Contain previous property elements (w:rPr, w:pPr)\n *\n * @returns XMLElement representing the revision in OOXML format, or null for internal-only types\n * @see ECMA-376 Part 1 §17.13.5 (Revision Identifiers for Paragraph Content)\n * @see ECMA-376 Part 1 §17.13.5.15 (Inserted Paragraph)\n * @see ECMA-376 Part 1 §17.13.5.14 (Deleted Paragraph)\n */\n toXML(): XMLElement | null {\n // Internal tracking types have no OOXML equivalent and cannot be serialized\n // They are used for changelog generation and internal tracking only\n const INTERNAL_TRACKING_TYPES: RevisionType[] = [\n 'hyperlinkChange',\n 'imageChange',\n 'fieldChange',\n 'commentChange',\n 'bookmarkChange',\n 'contentControlChange',\n ];\n\n if (INTERNAL_TRACKING_TYPES.includes(this.type)) {\n // Return null for internal types - callers should skip these\n return null;\n }\n\n const attributes: Record<string, string> = {\n 'w:id': this.id.toString(),\n 'w:author': this.author,\n 'w:date': this.formatDate(this.date),\n };\n\n // Add move-specific attributes\n if ((this.type === 'moveFrom' || this.type === 'moveTo') && this.moveId) {\n attributes['w:moveId'] = this.moveId;\n }\n\n const elementName = this.getElementName();\n const children: XMLElement[] = [];\n\n // Handle different revision types\n if (this.isPropertyChangeType()) {\n // Property change revisions contain the previous properties\n if (this.previousProperties) {\n children.push(this.createPropertiesElement());\n }\n }\n\n // Check if content contains only a single hyperlink (needs nesting inversion per ECMA-376)\n // w:hyperlink is NOT a valid child of w:ins/w:del; instead w:ins/w:del must be inside w:hyperlink\n const firstItem = this.content[0];\n const singleHyperlink =\n this.content.length === 1 && firstItem && isHyperlinkContent(firstItem) ? firstItem : null;\n\n if (singleHyperlink && !this.isPropertyChangeType()) {\n return this.createHyperlinkWrappedRevisionXml(singleHyperlink, elementName, attributes);\n }\n\n // Add content to the revision (handles both Run and Hyperlink)\n for (const item of this.content) {\n if (isHyperlinkContent(item)) {\n // For multiple-item revisions containing hyperlinks, extract the runs\n // and add them directly (hyperlink wrapper omitted to maintain validity)\n const hyperlinkXml = item.toXML();\n if (hyperlinkXml.children) {\n for (const child of hyperlinkXml.children) {\n if (typeof child === 'object' && child.name === 'w:r') {\n if (this.type === 'delete' || this.type === 'moveFrom') {\n children.push(this.convertRunXmlToDeleted(child));\n } else {\n children.push(child);\n }\n }\n }\n }\n } else if (isRunContent(item)) {\n // Handle Run content (existing behavior)\n if (this.type === 'delete' || this.type === 'moveFrom') {\n // For deletions and moveFrom, we need to modify the run XML to use w:delText instead of w:t\n const runXml = this.createDeletedRunXml(item);\n children.push(runXml);\n } else {\n // For other types, use normal run XML\n children.push(item.toXML());\n }\n }\n }\n\n return {\n name: elementName,\n attributes,\n children,\n };\n }\n\n /**\n * Checks if this is a property change revision type\n *\n * Property change revisions track formatting changes, not content changes.\n * They contain previous property elements (w:rPr, w:pPr, etc.) instead of text runs.\n *\n * **Property Change Types:**\n * - runPropertiesChange: Run formatting (bold, italic, font, color, etc.)\n * - paragraphPropertiesChange: Paragraph formatting (alignment, spacing, indentation, etc.)\n * - tablePropertiesChange: Table formatting\n * - tableRowPropertiesChange: Table row properties\n * - tableCellPropertiesChange: Table cell properties\n * - sectionPropertiesChange: Section properties (page size, margins, etc.)\n * - numberingChange: List numbering properties\n *\n * **Content Change Types (NOT property changes):**\n * - insert: Added text\n * - delete: Removed text\n * - moveFrom: Moved text source\n * - moveTo: Moved text destination\n * - tableCellInsert: Added table cell\n * - tableCellDelete: Removed table cell\n * - tableCellMerge: Merged table cells\n *\n * @returns true if this revision tracks a property/formatting change, false otherwise\n */\n private isPropertyChangeType(): boolean {\n return [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n ].includes(this.type);\n }\n\n /**\n * Creates XML element for previous properties in property change revisions\n *\n * **Purpose:**\n * Property change revisions (w:rPrChange, w:pPrChange, etc.) must contain a child element\n * with the PREVIOUS state of the properties before the change. This allows Word to show\n * what changed and enables accepting/rejecting the change.\n *\n * **Structure:**\n * ```xml\n * <w:rPrChange w:id=\"0\" w:author=\"Author\" w:date=\"...\">\n * <w:rPr>\n * <!-- Previous run properties -->\n * <w:b/> <!-- Was bold -->\n * <w:sz w:val=\"24\"/> <!-- Was 12pt (24 half-points) -->\n * </w:rPr>\n * </w:rPrChange>\n * ```\n *\n * **Property Element Mapping:**\n * - runPropertiesChange → w:rPr (run properties)\n * - paragraphPropertiesChange → w:pPr (paragraph properties)\n * - tablePropertiesChange → w:tblPr (table properties)\n * - tableRowPropertiesChange → w:trPr (table row properties)\n * - tableCellPropertiesChange → w:tcPr (table cell properties)\n * - sectionPropertiesChange → w:sectPr (section properties)\n * - numberingChange → w:numPr (numbering properties)\n *\n * **Implementation:**\n * This method converts the previousProperties object into OOXML elements.\n * - Boolean properties (e.g., bold) → <w:b/>\n * - Value properties (e.g., font size) → <w:sz w:val=\"24\"/>\n *\n * @returns XMLElement containing previous properties (w:rPr, w:pPr, etc.)\n * @see ECMA-376 Part 1 §17.13.5.31 (Run Properties Change)\n * @see ECMA-376 Part 1 §17.13.5.29 (Paragraph Properties Change)\n */\n private createPropertiesElement(): XMLElement {\n // For runPropertiesChange, delegate to Run.generateRunPropertiesXML for correct\n // ECMA-376 element names and ordering (e.g., bold→w:b, font→w:rFonts, size→w:sz)\n if (this.type === 'runPropertiesChange' && this.previousProperties) {\n const rPr = Run.generateRunPropertiesXML(this.previousProperties as RunFormatting);\n return rPr || { name: 'w:rPr', attributes: {}, children: [] };\n }\n\n // The property element name depends on the revision type\n let propElementName = 'w:rPr';\n\n switch (this.type) {\n case 'runPropertiesChange':\n propElementName = 'w:rPr';\n break;\n case 'paragraphPropertiesChange':\n propElementName = 'w:pPr';\n break;\n case 'tablePropertiesChange':\n propElementName = 'w:tblPr';\n break;\n case 'tableExceptionPropertiesChange':\n propElementName = 'w:tblPrEx';\n break;\n case 'tableRowPropertiesChange':\n propElementName = 'w:trPr';\n break;\n case 'tableCellPropertiesChange':\n propElementName = 'w:tcPr';\n break;\n case 'sectionPropertiesChange':\n propElementName = 'w:sectPr';\n break;\n case 'numberingChange':\n propElementName = 'w:numPr';\n break;\n }\n\n // Build property children from previousProperties\n const propChildren: XMLElement[] = [];\n if (this.previousProperties) {\n for (const [key, value] of Object.entries(this.previousProperties)) {\n if (typeof value === 'boolean' && value) {\n // Boolean properties (e.g., bold, italic)\n propChildren.push({ name: `w:${key}`, attributes: {}, children: [] });\n } else if (typeof value === 'string' || typeof value === 'number') {\n // Value properties (e.g., font size, color)\n propChildren.push({\n name: `w:${key}`,\n attributes: { 'w:val': value.toString() },\n children: [],\n });\n }\n }\n }\n\n return {\n name: propElementName,\n attributes: {},\n children: propChildren,\n };\n }\n\n /**\n * Creates XML for a deleted run (uses w:delText or w:delInstrText instead of w:t)\n *\n * **OOXML Requirement:**\n * Per ECMA-376, deleted text must use w:delText element instead of w:t element.\n * For deleted field instructions, w:delInstrText must be used instead.\n * This is required for proper rendering in Microsoft Word's Track Changes mode.\n *\n * **Transformation:**\n * ```xml\n * <!-- Normal run (NOT in deletion) -->\n * <w:r>\n * <w:rPr><w:b/></w:rPr>\n * <w:t>Text</w:t>\n * </w:r>\n *\n * <!-- Deleted run (inside w:del) -->\n * <w:r>\n * <w:rPr><w:b/></w:rPr>\n * <w:delText>Text</w:delText>\n * </w:r>\n *\n * <!-- Deleted field instruction (inside w:del) -->\n * <w:r>\n * <w:delInstrText>MERGEFIELD Name</w:delInstrText>\n * </w:r>\n * ```\n *\n * **Why This Matters:**\n * - w:delText tells Word to render with strikethrough in Track Changes mode\n * - w:delInstrText is specifically for deleted field codes\n * - w:t would render as normal text even inside w:del element\n * - Word will reject documents with w:t inside deletions as malformed\n *\n * **Implementation:**\n * This method gets the run's normal XML and replaces all w:t elements with w:delText\n * or w:delInstrText (for field instructions) while preserving all other properties\n * (formatting, spacing attributes, etc.)\n *\n * @param run - Run containing deleted text\n * @returns XMLElement with w:delText or w:delInstrText instead of w:t\n * @see ECMA-376 Part 1 §17.13.5.14 (Deleted Run Content)\n * @see ECMA-376 Part 1 §22.1.2.27 (w:delText element)\n * @see ECMA-376 Part 1 §22.1.2.26 (w:delInstrText element)\n */\n private createDeletedRunXml(run: Run): XMLElement {\n // Get the regular run XML\n const runXml = run.toXML();\n\n // Determine which element to use for deleted text\n // w:delInstrText for field instructions, w:delText for regular text\n const deletedTextElement = this.isFieldInstruction ? 'w:delInstrText' : 'w:delText';\n\n // We need to replace text elements with their deleted counterparts:\n // - w:t -> w:delText (or w:delInstrText if isFieldInstruction)\n // - w:instrText -> w:delInstrText (always, regardless of isFieldInstruction flag)\n if (runXml.children) {\n const modifiedChildren = runXml.children.map((child) => {\n if (typeof child === 'object') {\n if (child.name === 'w:t') {\n // Replace w:t with appropriate deleted text element\n return {\n ...child,\n name: deletedTextElement,\n };\n } else if (child.name === 'w:instrText') {\n // Replace w:instrText with w:delInstrText\n // Per ECMA-376 §22.1.2.26, deleted field instructions must use w:delInstrText\n return {\n ...child,\n name: 'w:delInstrText',\n };\n }\n }\n return child;\n });\n\n return {\n ...runXml,\n children: modifiedChildren,\n };\n }\n\n return runXml;\n }\n\n /**\n * Creates XML for a deleted hyperlink (transforms nested runs to use w:delText)\n *\n * **OOXML Requirement:**\n * Per ECMA-376, when a hyperlink is inside a w:del element, its nested runs must\n * use w:delText instead of w:t. This transforms the hyperlink's internal run\n * content to comply with Word's Track Changes requirements.\n *\n * **XML Structure:**\n * ```xml\n * <w:del w:id=\"1\" w:author=\"Author\" w:date=\"...\">\n * <w:hyperlink r:id=\"rId1\">\n * <w:r>\n * <w:delText>Link text</w:delText> <!-- Transformed from w:t -->\n * </w:r>\n * </w:hyperlink>\n * </w:del>\n * ```\n *\n * @param hyperlink - Hyperlink containing deleted content\n * @returns XMLElement with nested runs transformed to use w:delText\n */\n /**\n * Creates a hyperlink-wrapped revision XML element.\n * Per ECMA-376, w:hyperlink is NOT a valid child of w:ins/w:del.\n * Instead, w:ins/w:del must be inside w:hyperlink:\n * <w:hyperlink r:id=\"rId1\"><w:ins ...><w:r>...</w:r></w:ins></w:hyperlink>\n */\n private createHyperlinkWrappedRevisionXml(\n hyperlink: import('./Hyperlink.js').Hyperlink,\n revisionElementName: string,\n revisionAttributes: Record<string, string>\n ): XMLElement {\n const hyperlinkXml = hyperlink.toXML();\n\n // Extract runs from the hyperlink\n const runs: XMLElement[] = [];\n if (hyperlinkXml.children) {\n for (const child of hyperlinkXml.children) {\n if (typeof child === 'object' && child.name === 'w:r') {\n if (this.type === 'delete' || this.type === 'moveFrom') {\n runs.push(this.convertRunXmlToDeleted(child));\n } else {\n runs.push(child);\n }\n }\n }\n }\n\n // Build: <w:hyperlink ...><w:ins/w:del ...><w:r>...</w:r></w:ins/w:del></w:hyperlink>\n const revisionElement: XMLElement = {\n name: revisionElementName,\n attributes: revisionAttributes,\n children: runs,\n };\n\n return {\n name: hyperlinkXml.name,\n attributes: hyperlinkXml.attributes,\n children: [revisionElement],\n };\n }\n\n /**\n * Converts a run XMLElement to use deleted text elements\n */\n private convertRunXmlToDeleted(runXml: XMLElement): XMLElement {\n const deletedTextElement = this.isFieldInstruction ? 'w:delInstrText' : 'w:delText';\n\n if (!runXml.children) return runXml;\n\n const modifiedChildren = runXml.children.map((child) => {\n if (typeof child === 'object' && child.name === 'w:t') {\n return {\n ...child,\n name: deletedTextElement,\n };\n }\n return child;\n });\n\n return {\n ...runXml,\n children: modifiedChildren,\n };\n }\n\n /**\n * Creates an insertion revision\n * @param author - Author who made the insertion\n * @param content - Inserted content (Run, Hyperlink, or arrays thereof)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createInsertion(\n author: string,\n content: RevisionContent | RevisionContent[],\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'insert',\n content,\n date,\n });\n }\n\n /**\n * Creates a deletion revision\n * @param author - Author who made the deletion\n * @param content - Deleted content (Run, Hyperlink, or arrays thereof)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createDeletion(\n author: string,\n content: RevisionContent | RevisionContent[],\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'delete',\n content,\n date,\n });\n }\n\n /**\n * Creates a field instruction deletion revision\n * Uses w:delInstrText instead of w:delText for field codes\n * @param author - Author who made the deletion\n * @param content - Deleted field instruction content (Run or array of Runs)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createFieldInstructionDeletion(\n author: string,\n content: Run | Run[],\n date?: Date\n ): Revision {\n const revision = new Revision({\n author,\n type: 'delete',\n content,\n date,\n });\n revision.setAsFieldInstruction();\n return revision;\n }\n\n /**\n * Creates a revision from text\n * Convenience method that creates a Run from the text\n * @param type - Revision type\n * @param author - Author who made the change\n * @param text - Text content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static fromText(type: RevisionType, author: string, text: string, date?: Date): Revision {\n const run = new Run(text);\n return new Revision({\n author,\n type,\n content: run,\n date,\n });\n }\n\n /**\n * Creates a run properties change revision\n * @param author - Author who made the change\n * @param content - Content with changed formatting\n * @param previousProperties - Previous run properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createRunPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'runPropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a paragraph properties change revision\n * @param author - Author who made the change\n * @param content - Paragraph content\n * @param previousProperties - Previous paragraph properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createParagraphPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'paragraphPropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a table properties change revision\n * @param author - Author who made the change\n * @param content - Table content\n * @param previousProperties - Previous table properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTablePropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'tablePropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a table exception properties change revision\n * Tracks changes to table properties that override style defaults\n * @param author - Author who made the change\n * @param content - Table content\n * @param previousProperties - Previous table exception properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableExceptionPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'tableExceptionPropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a moveFrom revision (source of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createMoveFrom(\n author: string,\n content: Run | Run[],\n moveId: string,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'moveFrom',\n content,\n moveId,\n date,\n });\n }\n\n /**\n * Creates a moveTo revision (destination of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createMoveTo(author: string, content: Run | Run[], moveId: string, date?: Date): Revision {\n return new Revision({\n author,\n type: 'moveTo',\n content,\n moveId,\n date,\n });\n }\n\n /**\n * Creates a table cell insertion revision\n * @param author - Author who inserted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableCellInsert(author: string, content: Run | Run[], date?: Date): Revision {\n return new Revision({\n author,\n type: 'tableCellInsert',\n content,\n date,\n });\n }\n\n /**\n * Creates a table cell deletion revision\n * @param author - Author who deleted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableCellDelete(author: string, content: Run | Run[], date?: Date): Revision {\n return new Revision({\n author,\n type: 'tableCellDelete',\n content,\n date,\n });\n }\n\n /**\n * Creates a table cell merge revision\n * @param author - Author who merged cells\n * @param content - Merged cell content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableCellMerge(author: string, content: Run | Run[], date?: Date): Revision {\n return new Revision({\n author,\n type: 'tableCellMerge',\n content,\n date,\n });\n }\n\n /**\n * Creates a numbering change revision\n * @param author - Author who changed the numbering\n * @param content - Content with changed numbering\n * @param previousProperties - Previous numbering properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createNumberingChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'numberingChange',\n content,\n previousProperties,\n date,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Revision.js","sourceRoot":"","sources":["../../../src/elements/Revision.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Revision - Represents tracked changes in a Word document\n *\n * Track changes allow tracking of insertions, deletions, and modifications\n * to document content, showing who made changes and when.\n */\n\nimport { Run } from './Run.js';\nimport type { RunFormatting } from './Run.js';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder.js';\nimport type { RevisionLocation } from './PropertyChangeTypes.js';\nimport type { RevisionContent } from './RevisionContent.js';\nimport { isRunContent, isHyperlinkContent } from './RevisionContent.js';\nimport { formatDateForXml } from '../utils/dateFormatting.js';\n\n/**\n * Revision type - All OpenXML WordprocessingML revision types\n */\nexport type RevisionType =\n // Content changes\n | 'insert' // w:ins - Inserted content\n | 'delete' // w:del - Deleted content\n // Property changes\n | 'runPropertiesChange' // w:rPrChange - Run formatting change (bold, italic, font, etc.)\n | 'paragraphPropertiesChange' // w:pPrChange - Paragraph formatting change\n | 'tablePropertiesChange' // w:tblPrChange - Table formatting change\n | 'tableExceptionPropertiesChange' // w:tblPrExChange - Table exception properties change\n | 'tableRowPropertiesChange' // w:trPrChange - Table row properties change\n | 'tableCellPropertiesChange' // w:tcPrChange - Table cell properties change\n | 'sectionPropertiesChange' // w:sectPrChange - Section properties change\n // Move operations\n | 'moveFrom' // w:moveFrom - Content moved from this location\n | 'moveTo' // w:moveTo - Content moved to this location\n // Table operations\n | 'tableCellInsert' // w:cellIns - Table cell inserted\n | 'tableCellDelete' // w:cellDel - Table cell deleted\n | 'tableCellMerge' // w:cellMerge - Table cells merged\n // Numbering\n | 'numberingChange' // w:numberingChange - List numbering changed\n // Hyperlink changes\n | 'hyperlinkChange' // Hyperlink URL, text, or formatting change\n // Rich content changes (new tracking types)\n | 'imageChange' // Image insertion, deletion, or property change\n | 'fieldChange' // Field insertion, deletion, or value change\n | 'commentChange' // Comment insertion, deletion, or content change\n | 'bookmarkChange' // Bookmark creation, deletion, or range change\n | 'contentControlChange'; // Content control insertion, deletion, or property change\n\n/**\n * Field context for revisions inside complex fields\n * Provides information about the parent field when a revision appears in a field result\n */\nexport interface FieldContext {\n /** Reference to the parent ComplexField (if revision is in field result) */\n field?: import('./Field.js').ComplexField;\n /** Field instruction (e.g., \"HYPERLINK\", \"TOC\", \"MERGEFIELD\") */\n instruction?: string;\n /** Position within field: 'instruction' or 'result' */\n position: 'instruction' | 'result';\n}\n\n/**\n * Revision properties\n */\nexport interface RevisionProperties {\n /** Unique revision ID (assigned by RevisionManager) */\n id?: number;\n /** Author who made the change */\n author: string;\n /** Date when the change was made */\n date?: Date;\n /** Type of revision */\n type: RevisionType;\n /** Content affected by the revision (Run, Hyperlink, or arrays thereof) */\n content: RevisionContent | RevisionContent[];\n /** Previous properties (for property change revisions) */\n previousProperties?: Record<string, any>;\n /** New properties (for property change revisions) */\n newProperties?: Record<string, any>;\n /** Move ID (for moveFrom/moveTo operations) */\n moveId?: string;\n /** Destination location (for moveFrom) or source location (for moveTo) */\n moveLocation?: string;\n /** Location of this revision within the document structure */\n location?: RevisionLocation;\n /** Field context if revision is inside a complex field */\n fieldContext?: FieldContext;\n}\n\n/**\n * Represents a tracked change (revision) in a document\n */\nexport class Revision {\n private id: number;\n private author: string;\n private date: Date;\n private type: RevisionType;\n private content: RevisionContent[];\n private previousProperties?: Record<string, any>;\n private newProperties?: Record<string, any>;\n private moveId?: string;\n private moveLocation?: string;\n private isFieldInstruction = false;\n private location?: RevisionLocation;\n private fieldContext?: FieldContext;\n\n /**\n * Creates a new Revision\n * @param properties - Revision properties\n */\n constructor(properties: RevisionProperties) {\n this.id = properties.id ?? 0; // Will be assigned by RevisionManager\n this.author = properties.author;\n this.date = properties.date || new Date();\n this.type = properties.type;\n this.content = Array.isArray(properties.content) ? properties.content : [properties.content];\n this.previousProperties = properties.previousProperties;\n this.newProperties = properties.newProperties;\n this.moveId = properties.moveId;\n this.moveLocation = properties.moveLocation;\n this.location = properties.location;\n this.fieldContext = properties.fieldContext;\n }\n\n /**\n * Gets the revision ID\n */\n getId(): number {\n return this.id;\n }\n\n /**\n * Sets the revision ID (used by RevisionManager)\n * @internal\n */\n setId(id: number): void {\n this.id = id;\n }\n\n /**\n * Gets the author\n */\n getAuthor(): string {\n return this.author;\n }\n\n /**\n * Sets the author\n */\n setAuthor(author: string): this {\n this.author = author;\n return this;\n }\n\n /**\n * Gets the revision date\n */\n getDate(): Date {\n return this.date;\n }\n\n /**\n * Sets the revision date\n */\n setDate(date: Date): this {\n this.date = date;\n return this;\n }\n\n /**\n * Gets the revision type\n */\n getType(): RevisionType {\n return this.type;\n }\n\n /**\n * Gets all content items in this revision\n * @returns Array of RevisionContent (Run or Hyperlink objects)\n */\n getContent(): RevisionContent[] {\n return [...this.content];\n }\n\n /**\n * Gets only the Run objects from this revision (backward compatible)\n * @returns Array of Run objects\n */\n getRuns(): Run[] {\n return this.content.filter((item): item is Run => isRunContent(item));\n }\n\n /**\n * Gets only the Hyperlink objects from this revision\n * @returns Array of Hyperlink objects\n */\n getHyperlinks(): import('./Hyperlink.js').Hyperlink[] {\n return this.content.filter((item): item is import('./Hyperlink.js').Hyperlink =>\n isHyperlinkContent(item)\n );\n }\n\n /**\n * Adds a run to this revision\n */\n addRun(run: Run): this {\n this.content.push(run);\n return this;\n }\n\n /**\n * Adds a hyperlink to this revision\n */\n addHyperlink(hyperlink: import('./Hyperlink.js').Hyperlink): this {\n this.content.push(hyperlink);\n return this;\n }\n\n /**\n * Adds content (Run or Hyperlink) to this revision\n */\n addContent(item: RevisionContent): this {\n this.content.push(item);\n return this;\n }\n\n /**\n * Gets the combined text content from all Runs and Hyperlinks in this revision.\n * This is used by isParagraphBlank() to detect text inside revision elements.\n * @returns Combined text string from all content items\n */\n getText(): string {\n return this.content\n .filter(\n (item): item is Run | import('./Hyperlink.js').Hyperlink =>\n isRunContent(item) || isHyperlinkContent(item)\n )\n .map((item) => item.getText())\n .join('');\n }\n\n /**\n * Gets the previous properties (for property change revisions)\n */\n getPreviousProperties(): Record<string, any> | undefined {\n return this.previousProperties;\n }\n\n /**\n * Gets the new properties (for property change revisions)\n */\n getNewProperties(): Record<string, any> | undefined {\n return this.newProperties;\n }\n\n /**\n * Gets the move ID (for moveFrom/moveTo operations)\n */\n getMoveId(): string | undefined {\n return this.moveId;\n }\n\n /**\n * Gets the move location\n */\n getMoveLocation(): string | undefined {\n return this.moveLocation;\n }\n\n /**\n * Gets the location of this revision within the document\n * @returns Location information or undefined if not set\n */\n getLocation(): RevisionLocation | undefined {\n return this.location;\n }\n\n /**\n * Sets the location of this revision within the document\n * @param location - Location information\n * @returns This revision for chaining\n */\n setLocation(location: RevisionLocation): this {\n this.location = location;\n return this;\n }\n\n /**\n * Gets the field context if this revision is inside a complex field\n * @returns Field context information or undefined if not inside a field\n */\n getFieldContext(): FieldContext | undefined {\n return this.fieldContext;\n }\n\n /**\n * Sets the field context for this revision\n * @param context - Field context information\n * @returns This revision for chaining\n */\n setFieldContext(context: FieldContext): this {\n this.fieldContext = context;\n return this;\n }\n\n /**\n * Checks if this revision is inside a complex field\n * @returns True if the revision is inside a field result or instruction section\n */\n isInsideField(): boolean {\n return this.fieldContext !== undefined;\n }\n\n /**\n * Checks if this revision is inside a field result section\n * @returns True if the revision is in the result section of a complex field\n */\n isInsideFieldResult(): boolean {\n return this.fieldContext?.position === 'result';\n }\n\n /**\n * Checks if this revision is inside a field instruction section\n * @returns True if the revision is in the instruction section of a complex field\n */\n isInsideFieldInstruction(): boolean {\n return this.fieldContext?.position === 'instruction';\n }\n\n /**\n * Gets the parent field if this revision is inside a complex field\n * @returns The parent ComplexField or undefined\n */\n getParentField(): import('./Field.js').ComplexField | undefined {\n return this.fieldContext?.field;\n }\n\n /**\n * Marks this revision as a field instruction deletion\n * When true, uses w:delInstrText instead of w:delText\n */\n setAsFieldInstruction(): this {\n this.isFieldInstruction = true;\n return this;\n }\n\n /**\n * Checks if this is a field instruction deletion\n */\n isFieldInstructionDeletion(): boolean {\n return this.isFieldInstruction;\n }\n\n /**\n * Formats a date to ISO 8601 format for XML\n * Per ECMA-376, revision dates must be in ISO 8601 format (e.g., \"2024-01-01T12:00:00Z\")\n * Uses formatDateForXml() to strip milliseconds which Word does not accept.\n * @param date - Date to format\n * @returns ISO 8601 formatted date string without milliseconds\n */\n private formatDate(date: Date): string {\n return formatDateForXml(date);\n }\n\n /**\n * Gets the XML element name for this revision type\n * Maps internal revision types to OOXML WordprocessingML element names per ECMA-376\n *\n * Mappings:\n * - insert → w:ins (inserted content)\n * - delete → w:del (deleted content)\n * - runPropertiesChange → w:rPrChange (run formatting change)\n * - paragraphPropertiesChange → w:pPrChange (paragraph formatting change)\n * - tablePropertiesChange → w:tblPrChange (table formatting change)\n * - tableRowPropertiesChange → w:trPrChange (table row properties change)\n * - tableCellPropertiesChange → w:tcPrChange (table cell properties change)\n * - sectionPropertiesChange → w:sectPrChange (section properties change)\n * - moveFrom → w:moveFrom (source location of moved content)\n * - moveTo → w:moveTo (destination location of moved content)\n * - tableCellInsert → w:cellIns (inserted table cell)\n * - tableCellDelete → w:cellDel (deleted table cell)\n * - tableCellMerge → w:cellMerge (merged table cells)\n * - numberingChange → w:numberingChange (list numbering changed)\n *\n * @returns OOXML element name (e.g., \"w:ins\", \"w:del\")\n */\n private getElementName(): string {\n switch (this.type) {\n case 'insert':\n return 'w:ins';\n case 'delete':\n return 'w:del';\n case 'runPropertiesChange':\n return 'w:rPrChange';\n case 'paragraphPropertiesChange':\n return 'w:pPrChange';\n case 'tablePropertiesChange':\n return 'w:tblPrChange';\n case 'tableExceptionPropertiesChange':\n return 'w:tblPrExChange';\n case 'tableRowPropertiesChange':\n return 'w:trPrChange';\n case 'tableCellPropertiesChange':\n return 'w:tcPrChange';\n case 'sectionPropertiesChange':\n return 'w:sectPrChange';\n case 'moveFrom':\n return 'w:moveFrom';\n case 'moveTo':\n return 'w:moveTo';\n case 'tableCellInsert':\n return 'w:cellIns';\n case 'tableCellDelete':\n return 'w:cellDel';\n case 'tableCellMerge':\n return 'w:cellMerge';\n case 'numberingChange':\n return 'w:numberingChange';\n // Internal tracking types - no OOXML element equivalent\n // These are used for changelog generation and internal tracking,\n // not for XML serialization. OOXML tracks these as insert/delete pairs.\n case 'hyperlinkChange':\n case 'imageChange':\n case 'fieldChange':\n case 'commentChange':\n case 'bookmarkChange':\n case 'contentControlChange':\n throw new Error(\n `Revision type '${this.type}' is an internal tracking type and cannot be serialized to OOXML XML. ` +\n `OOXML does not have a native element for this type. ` +\n `Use insert/delete revision pairs for tracking changes to ${this.type.replace('Change', '')}s.`\n );\n default:\n // TypeScript exhaustiveness check - this should never be reached\n // if all RevisionType values are handled above\n const _exhaustiveCheck: never = this.type;\n throw new Error(`Unknown revision type: ${_exhaustiveCheck}`);\n }\n }\n\n /**\n * Generates XML for this revision per OOXML WordprocessingML specification (ECMA-376)\n *\n * **XML Structure:**\n *\n * Content revisions (w:ins, w:del, w:moveFrom, w:moveTo):\n * ```xml\n * <w:ins w:id=\"0\" w:author=\"Author Name\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:r>\n * <w:t>Inserted text</w:t>\n * </w:r>\n * </w:ins>\n * ```\n *\n * Deletion revisions use w:delText instead of w:t:\n * ```xml\n * <w:del w:id=\"1\" w:author=\"Author Name\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:r>\n * <w:delText>Deleted text</w:delText>\n * </w:r>\n * </w:del>\n * ```\n *\n * Property change revisions (w:rPrChange, w:pPrChange, etc.):\n * ```xml\n * <w:rPrChange w:id=\"2\" w:author=\"Author Name\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:rPr>\n * <w:b/> <!-- Previous bold setting -->\n * <w:sz w:val=\"24\"/> <!-- Previous font size -->\n * </w:rPr>\n * </w:rPrChange>\n * ```\n *\n * **Required Attributes (per ECMA-376):**\n * - w:id: Unique revision identifier (ST_DecimalNumber) - REQUIRED\n * - w:author: Author who made the change (ST_String) - REQUIRED\n * - w:date: When the change was made (ST_DateTime, ISO 8601) - OPTIONAL\n *\n * **Move Operations:**\n * w:moveFrom/w:moveTo are CT_RunTrackChange and carry only w:id/w:author/w:date.\n * The moveId field stays in-memory pairing metadata (getMovePair/validateMovePairs);\n * on disk, source/destination linkage is expressed solely via the w:name attribute\n * on w:moveFromRangeStart/w:moveToRangeStart (see RangeMarker.toXML()).\n *\n * **Content vs Property Changes:**\n * - Content revisions (insert/delete/move): Contain w:r elements with text runs\n * - Property revisions (rPrChange/pPrChange): Contain previous property elements (w:rPr, w:pPr)\n *\n * **Hyperlink Content:**\n * w:hyperlink is not a valid child of CT_RunTrackChange, so hyperlink content is\n * serialized with inverted nesting (<w:hyperlink><w:ins>...</w:ins></w:hyperlink>).\n * Mixed Run + Hyperlink content produces sibling elements (one revision element per\n * run group, one hyperlink-wrapped revision element per link), returned as a single\n * raw-XML fragment element that XMLBuilder emits verbatim.\n *\n * @returns XMLElement representing the revision in OOXML format, or null for internal-only types\n * @see ECMA-376 Part 1 §17.13.5 (Revision Identifiers for Paragraph Content)\n * @see ECMA-376 Part 1 §17.13.5.15 (Inserted Paragraph)\n * @see ECMA-376 Part 1 §17.13.5.14 (Deleted Paragraph)\n */\n toXML(): XMLElement | null {\n // Internal tracking types have no OOXML equivalent and cannot be serialized\n // They are used for changelog generation and internal tracking only\n const INTERNAL_TRACKING_TYPES: RevisionType[] = [\n 'hyperlinkChange',\n 'imageChange',\n 'fieldChange',\n 'commentChange',\n 'bookmarkChange',\n 'contentControlChange',\n ];\n\n if (INTERNAL_TRACKING_TYPES.includes(this.type)) {\n // Return null for internal types - callers should skip these\n return null;\n }\n\n const attributes: Record<string, string> = {\n 'w:id': this.id.toString(),\n 'w:author': this.author,\n 'w:date': this.formatDate(this.date),\n };\n\n // moveId is intentionally NOT serialized: ECMA-376 CT_RunTrackChange declares no\n // such attribute, and an undeclared w: attribute fails Open XML schema validation.\n // On-disk move pairing is carried by w:name on the move range start markers.\n\n const elementName = this.getElementName();\n const children: XMLElement[] = [];\n\n // Handle different revision types\n if (this.isPropertyChangeType()) {\n // Property change revisions contain the previous properties\n if (this.previousProperties) {\n children.push(this.createPropertiesElement());\n }\n }\n\n // Per ECMA-376, w:hyperlink is NOT a valid child of w:ins/w:del (CT_RunTrackChange);\n // the nesting must be inverted so w:ins/w:del sits inside w:hyperlink. Content is\n // therefore split into sibling segments: each consecutive run group gets its own\n // revision element and each hyperlink wraps its own revision element, preserving\n // the link target (r:id/w:anchor) instead of downgrading it to plain runs.\n if (!this.isPropertyChangeType()) {\n const segments: XMLElement[] = [];\n // CT_TrackChange requires a document-unique w:id, so sibling segments\n // cannot share the revision's id. Extra segments derive ids from a high\n // base (deterministic, stable across saves) that cannot collide with the\n // small sequential ids RevisionManager issues.\n const segmentAttributes = (segmentIndex: number): Record<string, string> =>\n segmentIndex === 0\n ? attributes\n : {\n ...attributes,\n 'w:id': String(500000000 + (this.id % 1000000) * 1000 + segmentIndex),\n };\n let pendingRuns: XMLElement[] = [];\n const flushRuns = (): void => {\n if (pendingRuns.length > 0) {\n segments.push({\n name: elementName,\n attributes: segmentAttributes(segments.length),\n children: pendingRuns,\n });\n pendingRuns = [];\n }\n };\n\n for (const item of this.content) {\n if (isHyperlinkContent(item)) {\n flushRuns();\n segments.push(\n this.createHyperlinkWrappedRevisionXml(\n item,\n elementName,\n segmentAttributes(segments.length)\n )\n );\n } else if (isRunContent(item)) {\n if (this.type === 'delete' || this.type === 'moveFrom') {\n pendingRuns.push(this.createDeletedRunXml(item));\n } else {\n pendingRuns.push(item.toXML());\n }\n }\n }\n flushRuns();\n\n if (segments.length === 0) {\n return { name: elementName, attributes, children: [] };\n }\n if (segments.length === 1) {\n return segments[0]!;\n }\n // Multiple sibling elements cannot share one XML root; emit them as a\n // pre-serialized fragment that XMLBuilder passes through verbatim.\n return {\n name: '__rawXml',\n rawXml: segments.map((segment) => XMLBuilder.elementToString(segment)).join(''),\n };\n }\n\n // Property change revisions keep their content runs alongside the\n // previous-properties element\n for (const item of this.content) {\n if (isHyperlinkContent(item)) {\n const hyperlinkXml = item.toXML();\n if (hyperlinkXml.children) {\n for (const child of hyperlinkXml.children) {\n if (typeof child === 'object' && child.name === 'w:r') {\n children.push(child);\n }\n }\n }\n } else if (isRunContent(item)) {\n children.push(item.toXML());\n }\n }\n\n return {\n name: elementName,\n attributes,\n children,\n };\n }\n\n /**\n * Checks if this is a property change revision type\n *\n * Property change revisions track formatting changes, not content changes.\n * They contain previous property elements (w:rPr, w:pPr, etc.) instead of text runs.\n *\n * **Property Change Types:**\n * - runPropertiesChange: Run formatting (bold, italic, font, color, etc.)\n * - paragraphPropertiesChange: Paragraph formatting (alignment, spacing, indentation, etc.)\n * - tablePropertiesChange: Table formatting\n * - tableRowPropertiesChange: Table row properties\n * - tableCellPropertiesChange: Table cell properties\n * - sectionPropertiesChange: Section properties (page size, margins, etc.)\n * - numberingChange: List numbering properties\n *\n * **Content Change Types (NOT property changes):**\n * - insert: Added text\n * - delete: Removed text\n * - moveFrom: Moved text source\n * - moveTo: Moved text destination\n * - tableCellInsert: Added table cell\n * - tableCellDelete: Removed table cell\n * - tableCellMerge: Merged table cells\n *\n * @returns true if this revision tracks a property/formatting change, false otherwise\n */\n private isPropertyChangeType(): boolean {\n return [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n ].includes(this.type);\n }\n\n /**\n * Creates XML element for previous properties in property change revisions\n *\n * **Purpose:**\n * Property change revisions (w:rPrChange, w:pPrChange, etc.) must contain a child element\n * with the PREVIOUS state of the properties before the change. This allows Word to show\n * what changed and enables accepting/rejecting the change.\n *\n * **Structure:**\n * ```xml\n * <w:rPrChange w:id=\"0\" w:author=\"Author\" w:date=\"...\">\n * <w:rPr>\n * <!-- Previous run properties -->\n * <w:b/> <!-- Was bold -->\n * <w:sz w:val=\"24\"/> <!-- Was 12pt (24 half-points) -->\n * </w:rPr>\n * </w:rPrChange>\n * ```\n *\n * **Property Element Mapping:**\n * - runPropertiesChange → w:rPr (run properties)\n * - paragraphPropertiesChange → w:pPr (paragraph properties)\n * - tablePropertiesChange → w:tblPr (table properties)\n * - tableRowPropertiesChange → w:trPr (table row properties)\n * - tableCellPropertiesChange → w:tcPr (table cell properties)\n * - sectionPropertiesChange → w:sectPr (section properties)\n * - numberingChange → w:numPr (numbering properties)\n *\n * **Implementation:**\n * This method converts the previousProperties object into OOXML elements.\n * - runPropertiesChange delegates to Run.generateRunPropertiesXML\n * - Other types translate API-style keys to their schema local names\n * (e.g., alignment → w:jc), serialize known object values (spacing,\n * indentation, borders, shading, table widths), and order children\n * per the schema sequence of the containing property element\n *\n * @returns XMLElement containing previous properties (w:rPr, w:pPr, etc.)\n * @see ECMA-376 Part 1 §17.13.5.31 (Run Properties Change)\n * @see ECMA-376 Part 1 §17.13.5.29 (Paragraph Properties Change)\n */\n private createPropertiesElement(): XMLElement {\n // For runPropertiesChange, delegate to Run.generateRunPropertiesXML for correct\n // ECMA-376 element names and ordering (e.g., bold→w:b, font→w:rFonts, size→w:sz)\n if (this.type === 'runPropertiesChange' && this.previousProperties) {\n const rPr = Run.generateRunPropertiesXML(this.previousProperties as RunFormatting);\n return rPr || { name: 'w:rPr', attributes: {}, children: [] };\n }\n\n // The property element name depends on the revision type\n let propElementName = 'w:rPr';\n\n switch (this.type) {\n case 'runPropertiesChange':\n propElementName = 'w:rPr';\n break;\n case 'paragraphPropertiesChange':\n propElementName = 'w:pPr';\n break;\n case 'tablePropertiesChange':\n propElementName = 'w:tblPr';\n break;\n case 'tableExceptionPropertiesChange':\n propElementName = 'w:tblPrEx';\n break;\n case 'tableRowPropertiesChange':\n propElementName = 'w:trPr';\n break;\n case 'tableCellPropertiesChange':\n propElementName = 'w:tcPr';\n break;\n case 'sectionPropertiesChange':\n propElementName = 'w:sectPr';\n break;\n case 'numberingChange':\n propElementName = 'w:numPr';\n break;\n }\n\n // Build property children from previousProperties, translating API-style\n // keys to their OOXML local names (keys already given as local names pass\n // through unchanged)\n const keyMap = Revision.PROPERTY_KEY_TO_ELEMENT[this.type] ?? {};\n const propChildren: XMLElement[] = [];\n if (this.previousProperties) {\n for (const [key, value] of Object.entries(this.previousProperties)) {\n const child = this.createPreviousPropertyXml(`w:${keyMap[key] ?? key}`, value);\n if (child) {\n propChildren.push(child);\n }\n }\n }\n\n // CT_PPrBase, CT_TblPrBase, CT_TrPr, CT_TcPr and CT_SectPr are xsd:sequence\n // types, so children must follow the declared order to stay schema-valid\n const order = Revision.PROPERTY_CHILD_ORDER[propElementName];\n if (order) {\n const rank = (name: string): number => {\n const index = order.indexOf(name);\n return index === -1 ? order.length : index;\n };\n propChildren.sort((a, b) => rank(a.name) - rank(b.name));\n }\n\n return {\n name: propElementName,\n attributes: {},\n children: propChildren,\n };\n }\n\n /**\n * API-key → OOXML local-name translations for property-change snapshots.\n * previousProperties accepts the same key names as the element formatting\n * APIs (e.g. ParagraphFormatting.alignment); the schema requires the local\n * element names (w:jc), so keys are translated before serialization.\n */\n private static readonly PROPERTY_KEY_TO_ELEMENT: Partial<\n Record<RevisionType, Record<string, string>>\n > = {\n paragraphPropertiesChange: {\n alignment: 'jc',\n style: 'pStyle',\n styleId: 'pStyle',\n indentation: 'ind',\n numbering: 'numPr',\n outlineLevel: 'outlineLvl',\n shading: 'shd',\n borders: 'pBdr',\n },\n tablePropertiesChange: {\n alignment: 'jc',\n style: 'tblStyle',\n styleId: 'tblStyle',\n width: 'tblW',\n indent: 'tblInd',\n borders: 'tblBorders',\n shading: 'shd',\n layout: 'tblLayout',\n cellMargins: 'tblCellMar',\n cellSpacing: 'tblCellSpacing',\n },\n tableExceptionPropertiesChange: {\n alignment: 'jc',\n width: 'tblW',\n indent: 'tblInd',\n borders: 'tblBorders',\n shading: 'shd',\n layout: 'tblLayout',\n cellMargins: 'tblCellMar',\n cellSpacing: 'tblCellSpacing',\n },\n tableRowPropertiesChange: {\n alignment: 'jc',\n height: 'trHeight',\n isHeader: 'tblHeader',\n cellSpacing: 'tblCellSpacing',\n },\n tableCellPropertiesChange: {\n width: 'tcW',\n borders: 'tcBorders',\n shading: 'shd',\n verticalAlignment: 'vAlign',\n margins: 'tcMar',\n },\n sectionPropertiesChange: {\n pageSize: 'pgSz',\n margins: 'pgMar',\n columns: 'cols',\n pageNumbering: 'pgNumType',\n },\n };\n\n /**\n * Schema child order for property snapshot containers (xsd:sequence order\n * from the corresponding CT_* types). Unknown children sort after known ones.\n */\n private static readonly PROPERTY_CHILD_ORDER: Record<string, readonly string[]> = {\n 'w:pPr': [\n 'w:pStyle',\n 'w:keepNext',\n 'w:keepLines',\n 'w:pageBreakBefore',\n 'w:framePr',\n 'w:widowControl',\n 'w:numPr',\n 'w:suppressLineNumbers',\n 'w:pBdr',\n 'w:shd',\n 'w:tabs',\n 'w:suppressAutoHyphens',\n 'w:kinsoku',\n 'w:wordWrap',\n 'w:overflowPunct',\n 'w:topLinePunct',\n 'w:autoSpaceDE',\n 'w:autoSpaceDN',\n 'w:bidi',\n 'w:adjustRightInd',\n 'w:snapToGrid',\n 'w:spacing',\n 'w:ind',\n 'w:contextualSpacing',\n 'w:mirrorIndents',\n 'w:suppressOverlap',\n 'w:jc',\n 'w:textDirection',\n 'w:textAlignment',\n 'w:textboxTightWrap',\n 'w:outlineLvl',\n ],\n 'w:tblPr': [\n 'w:tblStyle',\n 'w:tblpPr',\n 'w:tblOverlap',\n 'w:bidiVisual',\n 'w:tblStyleRowBandSize',\n 'w:tblStyleColBandSize',\n 'w:tblW',\n 'w:jc',\n 'w:tblCellSpacing',\n 'w:tblInd',\n 'w:tblBorders',\n 'w:shd',\n 'w:tblLayout',\n 'w:tblCellMar',\n 'w:tblLook',\n 'w:tblCaption',\n 'w:tblDescription',\n ],\n 'w:tblPrEx': [\n 'w:tblW',\n 'w:jc',\n 'w:tblCellSpacing',\n 'w:tblInd',\n 'w:tblBorders',\n 'w:shd',\n 'w:tblLayout',\n 'w:tblCellMar',\n 'w:tblLook',\n ],\n 'w:trPr': [\n 'w:cnfStyle',\n 'w:divId',\n 'w:gridBefore',\n 'w:gridAfter',\n 'w:wBefore',\n 'w:wAfter',\n 'w:cantSplit',\n 'w:trHeight',\n 'w:tblHeader',\n 'w:tblCellSpacing',\n 'w:jc',\n 'w:hidden',\n ],\n 'w:tcPr': [\n 'w:cnfStyle',\n 'w:tcW',\n 'w:gridSpan',\n 'w:hMerge',\n 'w:vMerge',\n 'w:tcBorders',\n 'w:shd',\n 'w:noWrap',\n 'w:tcMar',\n 'w:textDirection',\n 'w:tcFitText',\n 'w:vAlign',\n 'w:hideMark',\n ],\n 'w:sectPr': [\n 'w:headerReference',\n 'w:footerReference',\n 'w:footnotePr',\n 'w:endnotePr',\n 'w:type',\n 'w:pgSz',\n 'w:pgMar',\n 'w:paperSrc',\n 'w:pgBorders',\n 'w:lnNumType',\n 'w:pgNumType',\n 'w:cols',\n 'w:formProt',\n 'w:vAlign',\n 'w:noEndnote',\n 'w:titlePg',\n 'w:textDirection',\n 'w:bidi',\n 'w:rtlGutter',\n 'w:docGrid',\n ],\n 'w:numPr': ['w:ilvl', 'w:numId', 'w:numberingChange', 'w:ins'],\n };\n\n /**\n * Serializes one previous-property entry to its OOXML element.\n * Booleans follow the CT_OnOff convention (true = on, false = explicit off\n * via w:val=\"0\") so the snapshot keeps the same tri-state information the\n * main property serializers emit.\n */\n private createPreviousPropertyXml(name: string, value: unknown): XMLElement | null {\n if (typeof value === 'boolean') {\n return { name, attributes: value ? {} : { 'w:val': '0' }, children: [] };\n }\n if (typeof value === 'string' || typeof value === 'number') {\n return { name, attributes: { 'w:val': value.toString() }, children: [] };\n }\n if (value && typeof value === 'object') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- previousProperties is Record<string, any>\n return this.createObjectPropertyXml(name, value as Record<string, any>);\n }\n return null;\n }\n\n /**\n * Serializes object-valued previous properties (complex OOXML structures).\n * Only shapes with a known schema mapping are emitted; unknown objects are\n * skipped because their attribute layout cannot be inferred safely.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- previousProperties is Record<string, any>\n private createObjectPropertyXml(name: string, value: Record<string, any>): XMLElement | null {\n switch (name) {\n case 'w:spacing':\n return {\n name,\n attributes: XMLBuilder.buildAttributes({\n 'w:before': value.before,\n 'w:beforeLines': value.beforeLines,\n 'w:beforeAutospacing':\n value.beforeAutospacing === undefined\n ? undefined\n : value.beforeAutospacing\n ? '1'\n : '0',\n 'w:after': value.after,\n 'w:afterLines': value.afterLines,\n 'w:afterAutospacing':\n value.afterAutospacing === undefined ? undefined : value.afterAutospacing ? '1' : '0',\n 'w:line': value.line,\n 'w:lineRule': value.lineRule,\n }),\n children: [],\n };\n case 'w:ind':\n return {\n name,\n attributes: XMLBuilder.buildAttributes({\n 'w:start': value.start,\n 'w:end': value.end,\n 'w:left': value.left,\n 'w:leftChars': value.leftChars,\n 'w:right': value.right,\n 'w:rightChars': value.rightChars,\n 'w:firstLine': value.firstLine,\n 'w:firstLineChars': value.firstLineChars,\n 'w:hanging': value.hanging,\n 'w:hangingChars': value.hangingChars,\n }),\n children: [],\n };\n case 'w:numPr': {\n const numPrChildren: XMLElement[] = [];\n const level = value.level ?? value.ilvl;\n const numId = value.numId ?? value.id;\n if (level !== undefined) {\n numPrChildren.push({\n name: 'w:ilvl',\n attributes: { 'w:val': String(level) },\n children: [],\n });\n }\n if (numId !== undefined) {\n numPrChildren.push({\n name: 'w:numId',\n attributes: { 'w:val': String(numId) },\n children: [],\n });\n }\n return numPrChildren.length > 0 ? { name, attributes: {}, children: numPrChildren } : null;\n }\n case 'w:shd':\n return XMLBuilder.createShading(value);\n case 'w:pBdr':\n case 'w:tblBorders':\n case 'w:tcBorders': {\n const sides =\n name === 'w:pBdr'\n ? ['top', 'left', 'bottom', 'right', 'between', 'bar']\n : ['top', 'left', 'bottom', 'right', 'insideH', 'insideV'];\n const borderChildren: XMLElement[] = [];\n for (const side of sides) {\n if (value[side]) {\n borderChildren.push(XMLBuilder.createBorder(side, value[side]));\n }\n }\n return borderChildren.length > 0\n ? { name, attributes: {}, children: borderChildren }\n : null;\n }\n case 'w:tblW':\n case 'w:tcW':\n case 'w:tblInd':\n case 'w:tblCellSpacing':\n return {\n name,\n attributes: XMLBuilder.buildAttributes({\n 'w:w': value.w ?? value.width ?? value.value,\n 'w:type': value.type ?? 'dxa',\n }),\n children: [],\n };\n case 'w:trHeight':\n return {\n name,\n attributes: XMLBuilder.buildAttributes({\n 'w:val': value.value ?? value.val ?? value.height,\n 'w:hRule': value.rule ?? value.hRule,\n }),\n children: [],\n };\n case 'w:tcMar':\n case 'w:tblCellMar':\n return XMLBuilder.createMargins(name.slice(2), value);\n case 'w:pgSz':\n return {\n name,\n attributes: XMLBuilder.buildAttributes({\n 'w:w': value.width ?? value.w,\n 'w:h': value.height ?? value.h,\n 'w:orient': value.orientation ?? value.orient,\n }),\n children: [],\n };\n case 'w:pgMar':\n return {\n name,\n attributes: XMLBuilder.buildAttributes({\n 'w:top': value.top,\n 'w:right': value.right,\n 'w:bottom': value.bottom,\n 'w:left': value.left,\n 'w:header': value.header,\n 'w:footer': value.footer,\n 'w:gutter': value.gutter,\n }),\n children: [],\n };\n default:\n // Unknown object shape — no schema mapping to apply\n return null;\n }\n }\n\n /**\n * Creates XML for a deleted run (uses w:delText or w:delInstrText instead of w:t)\n *\n * **OOXML Requirement:**\n * Per ECMA-376, deleted text must use w:delText element instead of w:t element.\n * For deleted field instructions, w:delInstrText must be used instead.\n * This is required for proper rendering in Microsoft Word's Track Changes mode.\n *\n * **Transformation:**\n * ```xml\n * <!-- Normal run (NOT in deletion) -->\n * <w:r>\n * <w:rPr><w:b/></w:rPr>\n * <w:t>Text</w:t>\n * </w:r>\n *\n * <!-- Deleted run (inside w:del) -->\n * <w:r>\n * <w:rPr><w:b/></w:rPr>\n * <w:delText>Text</w:delText>\n * </w:r>\n *\n * <!-- Deleted field instruction (inside w:del) -->\n * <w:r>\n * <w:delInstrText>MERGEFIELD Name</w:delInstrText>\n * </w:r>\n * ```\n *\n * **Why This Matters:**\n * - w:delText tells Word to render with strikethrough in Track Changes mode\n * - w:delInstrText is specifically for deleted field codes\n * - w:t would render as normal text even inside w:del element\n * - Word will reject documents with w:t inside deletions as malformed\n *\n * **Implementation:**\n * This method gets the run's normal XML and replaces all w:t elements with w:delText\n * or w:delInstrText (for field instructions) while preserving all other properties\n * (formatting, spacing attributes, etc.)\n *\n * @param run - Run containing deleted text\n * @returns XMLElement with w:delText or w:delInstrText instead of w:t\n * @see ECMA-376 Part 1 §17.13.5.14 (Deleted Run Content)\n * @see ECMA-376 Part 1 §22.1.2.27 (w:delText element)\n * @see ECMA-376 Part 1 §22.1.2.26 (w:delInstrText element)\n */\n private createDeletedRunXml(run: Run): XMLElement {\n // Get the regular run XML\n const runXml = run.toXML();\n\n // Determine which element to use for deleted text\n // w:delInstrText for field instructions, w:delText for regular text\n const deletedTextElement = this.isFieldInstruction ? 'w:delInstrText' : 'w:delText';\n\n // We need to replace text elements with their deleted counterparts:\n // - w:t -> w:delText (or w:delInstrText if isFieldInstruction)\n // - w:instrText -> w:delInstrText (always, regardless of isFieldInstruction flag)\n if (runXml.children) {\n const modifiedChildren = runXml.children.map((child) => {\n if (typeof child === 'object') {\n if (child.name === 'w:t') {\n // Replace w:t with appropriate deleted text element\n return {\n ...child,\n name: deletedTextElement,\n };\n } else if (child.name === 'w:instrText') {\n // Replace w:instrText with w:delInstrText\n // Per ECMA-376 §22.1.2.26, deleted field instructions must use w:delInstrText\n return {\n ...child,\n name: 'w:delInstrText',\n };\n }\n }\n return child;\n });\n\n return {\n ...runXml,\n children: modifiedChildren,\n };\n }\n\n return runXml;\n }\n\n /**\n * Creates XML for a deleted hyperlink (transforms nested runs to use w:delText)\n *\n * **OOXML Requirement:**\n * Per ECMA-376, when a hyperlink is inside a w:del element, its nested runs must\n * use w:delText instead of w:t. This transforms the hyperlink's internal run\n * content to comply with Word's Track Changes requirements.\n *\n * **XML Structure:**\n * ```xml\n * <w:del w:id=\"1\" w:author=\"Author\" w:date=\"...\">\n * <w:hyperlink r:id=\"rId1\">\n * <w:r>\n * <w:delText>Link text</w:delText> <!-- Transformed from w:t -->\n * </w:r>\n * </w:hyperlink>\n * </w:del>\n * ```\n *\n * @param hyperlink - Hyperlink containing deleted content\n * @returns XMLElement with nested runs transformed to use w:delText\n */\n /**\n * Creates a hyperlink-wrapped revision XML element.\n * Per ECMA-376, w:hyperlink is NOT a valid child of w:ins/w:del.\n * Instead, w:ins/w:del must be inside w:hyperlink:\n * <w:hyperlink r:id=\"rId1\"><w:ins ...><w:r>...</w:r></w:ins></w:hyperlink>\n */\n private createHyperlinkWrappedRevisionXml(\n hyperlink: import('./Hyperlink.js').Hyperlink,\n revisionElementName: string,\n revisionAttributes: Record<string, string>\n ): XMLElement {\n const hyperlinkXml = hyperlink.toXML();\n\n // Extract runs from the hyperlink\n const runs: XMLElement[] = [];\n if (hyperlinkXml.children) {\n for (const child of hyperlinkXml.children) {\n if (typeof child === 'object' && child.name === 'w:r') {\n if (this.type === 'delete' || this.type === 'moveFrom') {\n runs.push(this.convertRunXmlToDeleted(child));\n } else {\n runs.push(child);\n }\n }\n }\n }\n\n // Build: <w:hyperlink ...><w:ins/w:del ...><w:r>...</w:r></w:ins/w:del></w:hyperlink>\n const revisionElement: XMLElement = {\n name: revisionElementName,\n attributes: revisionAttributes,\n children: runs,\n };\n\n return {\n name: hyperlinkXml.name,\n attributes: hyperlinkXml.attributes,\n children: [revisionElement],\n };\n }\n\n /**\n * Converts a run XMLElement to use deleted text elements\n */\n private convertRunXmlToDeleted(runXml: XMLElement): XMLElement {\n const deletedTextElement = this.isFieldInstruction ? 'w:delInstrText' : 'w:delText';\n\n if (!runXml.children) return runXml;\n\n const modifiedChildren = runXml.children.map((child) => {\n if (typeof child === 'object' && child.name === 'w:t') {\n return {\n ...child,\n name: deletedTextElement,\n };\n }\n return child;\n });\n\n return {\n ...runXml,\n children: modifiedChildren,\n };\n }\n\n /**\n * Creates an insertion revision\n * @param author - Author who made the insertion\n * @param content - Inserted content (Run, Hyperlink, or arrays thereof)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createInsertion(\n author: string,\n content: RevisionContent | RevisionContent[],\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'insert',\n content,\n date,\n });\n }\n\n /**\n * Creates a deletion revision\n * @param author - Author who made the deletion\n * @param content - Deleted content (Run, Hyperlink, or arrays thereof)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createDeletion(\n author: string,\n content: RevisionContent | RevisionContent[],\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'delete',\n content,\n date,\n });\n }\n\n /**\n * Creates a field instruction deletion revision\n * Uses w:delInstrText instead of w:delText for field codes\n * @param author - Author who made the deletion\n * @param content - Deleted field instruction content (Run or array of Runs)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createFieldInstructionDeletion(\n author: string,\n content: Run | Run[],\n date?: Date\n ): Revision {\n const revision = new Revision({\n author,\n type: 'delete',\n content,\n date,\n });\n revision.setAsFieldInstruction();\n return revision;\n }\n\n /**\n * Creates a revision from text\n * Convenience method that creates a Run from the text\n * @param type - Revision type\n * @param author - Author who made the change\n * @param text - Text content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static fromText(type: RevisionType, author: string, text: string, date?: Date): Revision {\n const run = new Run(text);\n return new Revision({\n author,\n type,\n content: run,\n date,\n });\n }\n\n /**\n * Creates a run properties change revision\n * @param author - Author who made the change\n * @param content - Content with changed formatting\n * @param previousProperties - Previous run properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createRunPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'runPropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a paragraph properties change revision\n * @param author - Author who made the change\n * @param content - Paragraph content\n * @param previousProperties - Previous paragraph properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createParagraphPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'paragraphPropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a table properties change revision\n * @param author - Author who made the change\n * @param content - Table content\n * @param previousProperties - Previous table properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTablePropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'tablePropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a table exception properties change revision\n * Tracks changes to table properties that override style defaults\n * @param author - Author who made the change\n * @param content - Table content\n * @param previousProperties - Previous table exception properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableExceptionPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'tableExceptionPropertiesChange',\n content,\n previousProperties,\n date,\n });\n }\n\n /**\n * Creates a moveFrom revision (source of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createMoveFrom(\n author: string,\n content: Run | Run[],\n moveId: string,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'moveFrom',\n content,\n moveId,\n date,\n });\n }\n\n /**\n * Creates a moveTo revision (destination of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createMoveTo(author: string, content: Run | Run[], moveId: string, date?: Date): Revision {\n return new Revision({\n author,\n type: 'moveTo',\n content,\n moveId,\n date,\n });\n }\n\n /**\n * Creates a table cell insertion revision\n * @param author - Author who inserted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableCellInsert(author: string, content: Run | Run[], date?: Date): Revision {\n return new Revision({\n author,\n type: 'tableCellInsert',\n content,\n date,\n });\n }\n\n /**\n * Creates a table cell deletion revision\n * @param author - Author who deleted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableCellDelete(author: string, content: Run | Run[], date?: Date): Revision {\n return new Revision({\n author,\n type: 'tableCellDelete',\n content,\n date,\n });\n }\n\n /**\n * Creates a table cell merge revision\n * @param author - Author who merged cells\n * @param content - Merged cell content\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createTableCellMerge(author: string, content: Run | Run[], date?: Date): Revision {\n return new Revision({\n author,\n type: 'tableCellMerge',\n content,\n date,\n });\n }\n\n /**\n * Creates a numbering change revision\n * @param author - Author who changed the numbering\n * @param content - Content with changed numbering\n * @param previousProperties - Previous numbering properties\n * @param date - Optional date (defaults to now)\n * @returns New Revision instance\n */\n static createNumberingChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n return new Revision({\n author,\n type: 'numberingChange',\n content,\n previousProperties,\n date,\n });\n }\n}\n"]}
|
package/dist/esm/elements/Run.js
CHANGED
|
@@ -27,7 +27,7 @@ export class Run {
|
|
|
27
27
|
autoClean: shouldClean,
|
|
28
28
|
warnToConsole: true,
|
|
29
29
|
});
|
|
30
|
-
const cleanedText = validation.cleanedText
|
|
30
|
+
const cleanedText = validation.cleanedText ?? text;
|
|
31
31
|
const normalizedText = cleanedText ?? '';
|
|
32
32
|
this.content = this.parseTextWithSpecialCharacters(normalizedText);
|
|
33
33
|
const { cleanXmlFromText, ...displayFormatting } = formatting;
|
|
@@ -144,7 +144,7 @@ export class Run {
|
|
|
144
144
|
autoClean: shouldClean,
|
|
145
145
|
warnToConsole: true,
|
|
146
146
|
});
|
|
147
|
-
const cleanedText = validation.cleanedText
|
|
147
|
+
const cleanedText = validation.cleanedText ?? text;
|
|
148
148
|
const normalizedText = cleanedText ?? '';
|
|
149
149
|
const isAllInstructionText = this.content.length > 0 && this.content.every((c) => c.type === 'instructionText');
|
|
150
150
|
if (isAllInstructionText) {
|
|
@@ -508,8 +508,12 @@ export class Run {
|
|
|
508
508
|
}
|
|
509
509
|
setFont(font, size) {
|
|
510
510
|
const previousFont = this.formatting.font;
|
|
511
|
+
const previousHAnsi = this.formatting.fontHAnsi;
|
|
512
|
+
const previousCs = this.formatting.fontCs;
|
|
511
513
|
const previousSize = this.formatting.size;
|
|
512
514
|
this.formatting.font = font;
|
|
515
|
+
this.formatting.fontHAnsi = font;
|
|
516
|
+
this.formatting.fontCs = font;
|
|
513
517
|
if (size !== undefined) {
|
|
514
518
|
this.formatting.size = size;
|
|
515
519
|
}
|
|
@@ -517,6 +521,12 @@ export class Run {
|
|
|
517
521
|
if (previousFont !== font) {
|
|
518
522
|
this.trackingContext.trackRunPropertyChange(this, 'font', previousFont, font);
|
|
519
523
|
}
|
|
524
|
+
if (previousHAnsi !== font) {
|
|
525
|
+
this.trackingContext.trackRunPropertyChange(this, 'fontHAnsi', previousHAnsi, font);
|
|
526
|
+
}
|
|
527
|
+
if (previousCs !== font) {
|
|
528
|
+
this.trackingContext.trackRunPropertyChange(this, 'fontCs', previousCs, font);
|
|
529
|
+
}
|
|
520
530
|
if (size !== undefined && previousSize !== size) {
|
|
521
531
|
this.trackingContext.trackRunPropertyChange(this, 'size', previousSize, size);
|
|
522
532
|
}
|
|
@@ -684,6 +694,14 @@ export class Run {
|
|
|
684
694
|
}
|
|
685
695
|
return this;
|
|
686
696
|
}
|
|
697
|
+
setFontAscii(font) {
|
|
698
|
+
const previousValue = this.formatting.font;
|
|
699
|
+
this.formatting.font = font;
|
|
700
|
+
if (this.trackingContext?.isEnabled() && previousValue !== font) {
|
|
701
|
+
this.trackingContext.trackRunPropertyChange(this, 'font', previousValue, font);
|
|
702
|
+
}
|
|
703
|
+
return this;
|
|
704
|
+
}
|
|
687
705
|
setFontHAnsi(font) {
|
|
688
706
|
const previousValue = this.formatting.fontHAnsi;
|
|
689
707
|
this.formatting.fontHAnsi = font;
|
|
@@ -1101,10 +1119,12 @@ export class Run {
|
|
|
1101
1119
|
const rFontsAttrs = {};
|
|
1102
1120
|
if (formatting.font)
|
|
1103
1121
|
rFontsAttrs['w:ascii'] = formatting.font;
|
|
1104
|
-
|
|
1122
|
+
if (formatting.fontHAnsi !== undefined)
|
|
1123
|
+
rFontsAttrs['w:hAnsi'] = formatting.fontHAnsi;
|
|
1105
1124
|
if (formatting.fontEastAsia)
|
|
1106
1125
|
rFontsAttrs['w:eastAsia'] = formatting.fontEastAsia;
|
|
1107
|
-
|
|
1126
|
+
if (formatting.fontCs !== undefined)
|
|
1127
|
+
rFontsAttrs['w:cs'] = formatting.fontCs;
|
|
1108
1128
|
if (formatting.fontHint)
|
|
1109
1129
|
rFontsAttrs['w:hint'] = formatting.fontHint;
|
|
1110
1130
|
if (formatting.fontAsciiTheme)
|