docxmlater 10.4.1 → 11.0.4
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 +3 -3
- package/dist/constants/legacyCompatFlags.d.ts +1 -1
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/core/Document.d.ts +74 -67
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +605 -414
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +11 -10
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +19 -19
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentEvents.d.ts +39 -0
- package/dist/core/DocumentEvents.d.ts.map +1 -0
- package/dist/core/DocumentEvents.js +51 -0
- package/dist/core/DocumentEvents.js.map +1 -0
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +72 -52
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +15 -15
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +2056 -1073
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts +3 -3
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +31 -31
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/ElementRegistry.d.ts +22 -0
- package/dist/core/ElementRegistry.d.ts.map +1 -0
- package/dist/core/ElementRegistry.js +27 -0
- package/dist/core/ElementRegistry.js.map +1 -0
- package/dist/core/Relationship.js +4 -4
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +32 -32
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.d.ts +1 -1
- package/dist/elements/AlternateContent.d.ts.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts +6 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +19 -3
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js +7 -7
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.d.ts +2 -2
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +4 -4
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts +2 -2
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +9 -9
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +9 -4
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -0
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.d.ts +1 -1
- package/dist/elements/CustomXml.d.ts.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts +2 -2
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js +9 -9
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +11 -11
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts +9 -5
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +21 -9
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +10 -10
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/Footer.d.ts +3 -3
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +5 -5
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts +2 -2
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +9 -9
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +11 -11
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.d.ts +3 -3
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +5 -5
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.d.ts +2 -2
- package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -5
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +29 -29
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +67 -67
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +4 -4
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.d.ts +3 -3
- package/dist/elements/ImageRun.d.ts.map +1 -1
- package/dist/elements/ImageRun.js +2 -2
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.d.ts +1 -1
- package/dist/elements/MathElement.d.ts.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +34 -19
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +286 -231
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.d.ts +1 -1
- package/dist/elements/PreservedElement.d.ts.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts +2 -2
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts +14 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js +46 -8
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/RegisteredBodyElement.d.ts +15 -0
- package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
- package/dist/elements/RegisteredBodyElement.js +44 -0
- package/dist/elements/RegisteredBodyElement.js.map +1 -0
- package/dist/elements/Revision.d.ts +8 -8
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +12 -12
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.d.ts +3 -3
- package/dist/elements/RevisionContent.d.ts.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts +2 -2
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +2 -2
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -10
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +199 -173
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts +4 -2
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +152 -145
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts +3 -3
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +12 -12
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +3 -3
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +39 -39
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +16 -10
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +118 -89
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +11 -11
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +108 -78
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js +3 -3
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +2 -2
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.d.ts +2 -2
- package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
- package/dist/elements/TableOfContentsElement.js +5 -5
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts +18 -7
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +127 -74
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts +4 -4
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +6 -6
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/esm/constants/legacyCompatFlags.js +97 -0
- package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
- package/dist/esm/constants/limits.js +36 -0
- package/dist/esm/constants/limits.js.map +1 -0
- package/dist/esm/core/Document.js +8498 -0
- package/dist/esm/core/Document.js.map +1 -0
- package/dist/esm/core/DocumentContent.js +190 -0
- package/dist/esm/core/DocumentContent.js.map +1 -0
- package/dist/esm/core/DocumentEvents.js +47 -0
- package/dist/esm/core/DocumentEvents.js.map +1 -0
- package/dist/esm/core/DocumentGenerator.js +764 -0
- package/dist/esm/core/DocumentGenerator.js.map +1 -0
- package/dist/esm/core/DocumentIdManager.js +67 -0
- package/dist/esm/core/DocumentIdManager.js.map +1 -0
- package/dist/esm/core/DocumentParser.js +8760 -0
- package/dist/esm/core/DocumentParser.js.map +1 -0
- package/dist/esm/core/DocumentValidator.js +222 -0
- package/dist/esm/core/DocumentValidator.js.map +1 -0
- package/dist/esm/core/ElementRegistry.js +24 -0
- package/dist/esm/core/ElementRegistry.js.map +1 -0
- package/dist/esm/core/Relationship.js +177 -0
- package/dist/esm/core/Relationship.js.map +1 -0
- package/dist/esm/core/RelationshipManager.js +202 -0
- package/dist/esm/core/RelationshipManager.js.map +1 -0
- package/dist/esm/elements/AlternateContent.js +19 -0
- package/dist/esm/elements/AlternateContent.js.map +1 -0
- package/dist/esm/elements/Bookmark.js +115 -0
- package/dist/esm/elements/Bookmark.js.map +1 -0
- package/dist/esm/elements/BookmarkManager.js +99 -0
- package/dist/esm/elements/BookmarkManager.js.map +1 -0
- package/dist/esm/elements/Comment.js +181 -0
- package/dist/esm/elements/Comment.js.map +1 -0
- package/dist/esm/elements/CommentManager.js +233 -0
- package/dist/esm/elements/CommentManager.js.map +1 -0
- package/dist/esm/elements/CommonTypes.js +106 -0
- package/dist/esm/elements/CommonTypes.js.map +1 -0
- package/dist/esm/elements/CustomXml.js +19 -0
- package/dist/esm/elements/CustomXml.js.map +1 -0
- package/dist/esm/elements/Endnote.js +107 -0
- package/dist/esm/elements/Endnote.js.map +1 -0
- package/dist/esm/elements/EndnoteManager.js +119 -0
- package/dist/esm/elements/EndnoteManager.js.map +1 -0
- package/dist/esm/elements/Field.js +856 -0
- package/dist/esm/elements/Field.js.map +1 -0
- package/dist/esm/elements/FieldHelpers.js +134 -0
- package/dist/esm/elements/FieldHelpers.js.map +1 -0
- package/dist/esm/elements/FontManager.js +158 -0
- package/dist/esm/elements/FontManager.js.map +1 -0
- package/dist/esm/elements/Footer.js +141 -0
- package/dist/esm/elements/Footer.js.map +1 -0
- package/dist/esm/elements/Footnote.js +107 -0
- package/dist/esm/elements/Footnote.js.map +1 -0
- package/dist/esm/elements/FootnoteManager.js +119 -0
- package/dist/esm/elements/FootnoteManager.js.map +1 -0
- package/dist/esm/elements/Header.js +141 -0
- package/dist/esm/elements/Header.js.map +1 -0
- package/dist/esm/elements/HeaderFooterManager.js +87 -0
- package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
- package/dist/esm/elements/Hyperlink.js +586 -0
- package/dist/esm/elements/Hyperlink.js.map +1 -0
- package/dist/esm/elements/Image.js +1288 -0
- package/dist/esm/elements/Image.js.map +1 -0
- package/dist/esm/elements/ImageManager.js +223 -0
- package/dist/esm/elements/ImageManager.js.map +1 -0
- package/dist/esm/elements/ImageRun.js +29 -0
- package/dist/esm/elements/ImageRun.js.map +1 -0
- package/dist/esm/elements/MathElement.js +37 -0
- package/dist/esm/elements/MathElement.js.map +1 -0
- package/dist/esm/elements/Paragraph.js +2308 -0
- package/dist/esm/elements/Paragraph.js.map +1 -0
- package/dist/esm/elements/PreservedElement.js +29 -0
- package/dist/esm/elements/PreservedElement.js.map +1 -0
- package/dist/esm/elements/PropertyChangeTypes.js +53 -0
- package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
- package/dist/esm/elements/RangeMarker.js +219 -0
- package/dist/esm/elements/RangeMarker.js.map +1 -0
- package/dist/esm/elements/RegisteredBodyElement.js +40 -0
- package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
- package/dist/esm/elements/Revision.js +498 -0
- package/dist/esm/elements/Revision.js.map +1 -0
- package/dist/esm/elements/RevisionContent.js +18 -0
- package/dist/esm/elements/RevisionContent.js.map +1 -0
- package/dist/esm/elements/RevisionManager.js +486 -0
- package/dist/esm/elements/RevisionManager.js.map +1 -0
- package/dist/esm/elements/Run.js +1465 -0
- package/dist/esm/elements/Run.js.map +1 -0
- package/dist/esm/elements/Section.js +978 -0
- package/dist/esm/elements/Section.js.map +1 -0
- package/dist/esm/elements/Shape.js +493 -0
- package/dist/esm/elements/Shape.js.map +1 -0
- package/dist/esm/elements/StructuredDocumentTag.js +471 -0
- package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
- package/dist/esm/elements/Table.js +1456 -0
- package/dist/esm/elements/Table.js.map +1 -0
- package/dist/esm/elements/TableCell.js +835 -0
- package/dist/esm/elements/TableCell.js.map +1 -0
- package/dist/esm/elements/TableGridChange.js +52 -0
- package/dist/esm/elements/TableGridChange.js.map +1 -0
- package/dist/esm/elements/TableOfContents.js +389 -0
- package/dist/esm/elements/TableOfContents.js.map +1 -0
- package/dist/esm/elements/TableOfContentsElement.js +29 -0
- package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
- package/dist/esm/elements/TableRow.js +555 -0
- package/dist/esm/elements/TableRow.js.map +1 -0
- package/dist/esm/elements/TextBox.js +459 -0
- package/dist/esm/elements/TextBox.js.map +1 -0
- package/dist/esm/formatting/AbstractNumbering.js +325 -0
- package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
- package/dist/esm/formatting/NumberingInstance.js +150 -0
- package/dist/esm/formatting/NumberingInstance.js.map +1 -0
- package/dist/esm/formatting/NumberingLevel.js +608 -0
- package/dist/esm/formatting/NumberingLevel.js.map +1 -0
- package/dist/esm/formatting/NumberingManager.js +423 -0
- package/dist/esm/formatting/NumberingManager.js.map +1 -0
- package/dist/esm/formatting/Style.js +1151 -0
- package/dist/esm/formatting/Style.js.map +1 -0
- package/dist/esm/formatting/StylesManager.js +557 -0
- package/dist/esm/formatting/StylesManager.js.map +1 -0
- package/dist/esm/helpers/CleanupHelper.js +350 -0
- package/dist/esm/helpers/CleanupHelper.js.map +1 -0
- package/dist/esm/images/ImageOptimizer.js +161 -0
- package/dist/esm/images/ImageOptimizer.js.map +1 -0
- package/dist/esm/index.js +75 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal.js +16 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/managers/DrawingManager.js +163 -0
- package/dist/esm/managers/DrawingManager.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/processors/ChangelogGenerator.js +970 -0
- package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
- package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
- package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
- package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
- package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
- package/dist/esm/processors/MoveOperationHelper.js +57 -0
- package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
- package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
- package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
- package/dist/esm/processors/RevisionWalker.js +278 -0
- package/dist/esm/processors/RevisionWalker.js.map +1 -0
- package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
- package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
- package/dist/esm/processors/ShadingResolver.js +66 -0
- package/dist/esm/processors/ShadingResolver.js.map +1 -0
- package/dist/esm/processors/acceptRevisions.js +416 -0
- package/dist/esm/processors/acceptRevisions.js.map +1 -0
- package/dist/esm/processors/cnfStyleDecoder.js +89 -0
- package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
- package/dist/esm/processors/stripTrackedChanges.js +201 -0
- package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
- package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
- package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
- package/dist/esm/tracking/TrackingContext.js +2 -0
- package/dist/esm/tracking/TrackingContext.js.map +1 -0
- package/dist/esm/types/compatibility-types.js +8 -0
- package/dist/esm/types/compatibility-types.js.map +1 -0
- package/dist/esm/types/document-types.js +2 -0
- package/dist/esm/types/document-types.js.map +1 -0
- package/dist/esm/types/formatting.js +2 -0
- package/dist/esm/types/formatting.js.map +1 -0
- package/dist/esm/types/list-types.js +2 -0
- package/dist/esm/types/list-types.js.map +1 -0
- package/dist/esm/types/settings-types.js +2 -0
- package/dist/esm/types/settings-types.js.map +1 -0
- package/dist/esm/types/styleConfig.js +2 -0
- package/dist/esm/types/styleConfig.js.map +1 -0
- package/dist/esm/utils/KeyedRegistry.js +32 -0
- package/dist/esm/utils/KeyedRegistry.js.map +1 -0
- package/dist/esm/utils/corruptionDetection.js +155 -0
- package/dist/esm/utils/corruptionDetection.js.map +1 -0
- package/dist/esm/utils/dateFormatting.js +4 -0
- package/dist/esm/utils/dateFormatting.js.map +1 -0
- package/dist/esm/utils/deepClone.js +40 -0
- package/dist/esm/utils/deepClone.js.map +1 -0
- package/dist/esm/utils/deepEqual.js +47 -0
- package/dist/esm/utils/deepEqual.js.map +1 -0
- package/dist/esm/utils/diagnostics.js +69 -0
- package/dist/esm/utils/diagnostics.js.map +1 -0
- package/dist/esm/utils/errorHandling.js +36 -0
- package/dist/esm/utils/errorHandling.js.map +1 -0
- package/dist/esm/utils/formatting.js +93 -0
- package/dist/esm/utils/formatting.js.map +1 -0
- package/dist/esm/utils/list-detection.js +148 -0
- package/dist/esm/utils/list-detection.js.map +1 -0
- package/dist/esm/utils/logger.js +205 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/parsingHelpers.js +56 -0
- package/dist/esm/utils/parsingHelpers.js.map +1 -0
- package/dist/esm/utils/textDiff.js +42 -0
- package/dist/esm/utils/textDiff.js.map +1 -0
- package/dist/esm/utils/units.js +152 -0
- package/dist/esm/utils/units.js.map +1 -0
- package/dist/esm/utils/validation.js +285 -0
- package/dist/esm/utils/validation.js.map +1 -0
- package/dist/esm/utils/xmlSanitization.js +54 -0
- package/dist/esm/utils/xmlSanitization.js.map +1 -0
- package/dist/esm/validation/RevisionAutoFixer.js +340 -0
- package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
- package/dist/esm/validation/RevisionValidator.js +240 -0
- package/dist/esm/validation/RevisionValidator.js.map +1 -0
- package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
- package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
- package/dist/esm/validation/ValidationRules.js +92 -0
- package/dist/esm/validation/ValidationRules.js.map +1 -0
- package/dist/esm/validation/index.js +4 -0
- package/dist/esm/validation/index.js.map +1 -0
- package/dist/esm/xml/XMLBuilder.js +434 -0
- package/dist/esm/xml/XMLBuilder.js.map +1 -0
- package/dist/esm/xml/XMLParser.js +486 -0
- package/dist/esm/xml/XMLParser.js.map +1 -0
- package/dist/esm/zip/ZipHandler.js +298 -0
- package/dist/esm/zip/ZipHandler.js.map +1 -0
- package/dist/esm/zip/ZipReader.js +147 -0
- package/dist/esm/zip/ZipReader.js.map +1 -0
- package/dist/esm/zip/ZipWriter.js +199 -0
- package/dist/esm/zip/ZipWriter.js.map +1 -0
- package/dist/esm/zip/errors.js +43 -0
- package/dist/esm/zip/errors.js.map +1 -0
- package/dist/esm/zip/types.js +31 -0
- package/dist/esm/zip/types.js.map +1 -0
- package/dist/formatting/AbstractNumbering.d.ts +2 -2
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +33 -33
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts +2 -2
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +7 -7
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +11 -2
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +111 -25
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +4 -4
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +28 -28
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +14 -7
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +309 -112
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -2
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +52 -52
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +15 -15
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/index.d.ts +81 -90
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +286 -317
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +16 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +42 -0
- package/dist/internal.js.map +1 -0
- package/dist/managers/DrawingManager.d.ts +3 -3
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js +12 -12
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
- package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
- package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
- package/dist/processors/ChangelogGenerator.js.map +1 -0
- package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
- package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
- package/dist/processors/CompatibilityUpgrader.js.map +1 -0
- package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
- package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
- package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
- package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
- package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
- package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
- package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
- package/dist/processors/MoveOperationHelper.js.map +1 -0
- package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
- package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
- package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
- package/dist/processors/RevisionAwareProcessor.js.map +1 -0
- package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
- package/dist/processors/RevisionWalker.d.ts.map +1 -0
- package/dist/{utils → processors}/RevisionWalker.js +28 -0
- package/dist/processors/RevisionWalker.js.map +1 -0
- package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
- package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
- package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
- package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
- package/dist/processors/ShadingResolver.d.ts +6 -0
- package/dist/processors/ShadingResolver.d.ts.map +1 -0
- package/dist/{utils → processors}/ShadingResolver.js +2 -2
- package/dist/processors/ShadingResolver.js.map +1 -0
- package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
- package/dist/processors/acceptRevisions.d.ts.map +1 -0
- package/dist/{utils → processors}/acceptRevisions.js +24 -4
- package/dist/processors/acceptRevisions.js.map +1 -0
- package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
- package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
- package/dist/processors/cnfStyleDecoder.js.map +1 -0
- package/dist/processors/stripTrackedChanges.d.ts +3 -0
- package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
- package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
- package/dist/processors/stripTrackedChanges.js.map +1 -0
- package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +38 -43
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts +8 -8
- package/dist/tracking/TrackingContext.d.ts.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/document-types.d.ts +28 -0
- package/dist/types/document-types.d.ts.map +1 -0
- package/dist/types/document-types.js +3 -0
- package/dist/types/document-types.js.map +1 -0
- package/dist/types/formatting.d.ts +4 -4
- package/dist/types/formatting.d.ts.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/settings-types.d.ts +6 -0
- package/dist/types/settings-types.d.ts.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/utils/KeyedRegistry.d.ts +13 -0
- package/dist/utils/KeyedRegistry.d.ts.map +1 -0
- package/dist/utils/KeyedRegistry.js +36 -0
- package/dist/utils/KeyedRegistry.js.map +1 -0
- package/dist/utils/corruptionDetection.d.ts +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js +4 -4
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/deepEqual.d.ts +2 -0
- package/dist/utils/deepEqual.d.ts.map +1 -0
- package/dist/utils/deepEqual.js +50 -0
- package/dist/utils/deepEqual.js.map +1 -0
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/parsingHelpers.d.ts +1 -1
- package/dist/utils/parsingHelpers.d.ts.map +1 -1
- package/dist/utils/parsingHelpers.js +2 -2
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/validation.js +7 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.js +2 -2
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +4 -4
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +11 -11
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts +5 -4
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +29 -30
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
- package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
- package/dist/validation/ValidationRuleRegistry.js +43 -0
- package/dist/validation/ValidationRuleRegistry.js.map +1 -0
- package/dist/validation/index.d.ts +3 -3
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +10 -10
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +6 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +11 -6
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.js +6 -6
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js +8 -8
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +14 -14
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.d.ts +1 -1
- package/dist/zip/ZipWriter.d.ts.map +1 -1
- package/dist/zip/ZipWriter.js +10 -10
- package/dist/zip/ZipWriter.js.map +1 -1
- package/package.json +20 -4
- package/src/constants/legacyCompatFlags.ts +1 -1
- package/src/core/Document.ts +461 -167
- package/src/core/DocumentContent.ts +14 -11
- package/src/core/DocumentEvents.ts +90 -0
- package/src/core/DocumentGenerator.ts +49 -22
- package/src/core/DocumentParser.ts +2180 -617
- package/src/core/DocumentValidator.ts +7 -7
- package/src/core/ElementRegistry.ts +69 -0
- package/src/core/Relationship.ts +1 -1
- package/src/core/RelationshipManager.ts +4 -4
- package/src/elements/AlternateContent.ts +1 -1
- package/src/elements/Bookmark.ts +52 -4
- package/src/elements/BookmarkManager.ts +2 -2
- package/src/elements/Comment.ts +3 -3
- package/src/elements/CommentManager.ts +4 -4
- package/src/elements/CommonTypes.ts +45 -7
- package/src/elements/CustomXml.ts +1 -1
- package/src/elements/Endnote.ts +2 -2
- package/src/elements/EndnoteManager.ts +3 -3
- package/src/elements/Field.ts +44 -10
- package/src/elements/FieldHelpers.ts +2 -2
- package/src/elements/Footer.ts +4 -4
- package/src/elements/Footnote.ts +2 -2
- package/src/elements/FootnoteManager.ts +3 -3
- package/src/elements/Header.ts +4 -4
- package/src/elements/HeaderFooterManager.ts +2 -2
- package/src/elements/Hyperlink.ts +16 -12
- package/src/elements/Image.ts +3 -3
- package/src/elements/ImageManager.ts +2 -2
- package/src/elements/ImageRun.ts +3 -3
- package/src/elements/MathElement.ts +1 -1
- package/src/elements/Paragraph.ts +221 -88
- package/src/elements/PreservedElement.ts +1 -1
- package/src/elements/PropertyChangeTypes.ts +2 -2
- package/src/elements/RangeMarker.ts +153 -12
- package/src/elements/RegisteredBodyElement.ts +52 -0
- package/src/elements/Revision.ts +14 -14
- package/src/elements/RevisionContent.ts +3 -3
- package/src/elements/RevisionManager.ts +3 -3
- package/src/elements/Run.ts +221 -94
- package/src/elements/Section.ts +136 -69
- package/src/elements/Shape.ts +4 -4
- package/src/elements/StructuredDocumentTag.ts +3 -3
- package/src/elements/Table.ts +91 -27
- package/src/elements/TableCell.ts +62 -34
- package/src/elements/TableGridChange.ts +1 -1
- package/src/elements/TableOfContents.ts +1 -1
- package/src/elements/TableOfContentsElement.ts +2 -2
- package/src/elements/TableRow.ts +192 -48
- package/src/elements/TextBox.ts +5 -5
- package/src/formatting/AbstractNumbering.ts +3 -3
- package/src/formatting/NumberingInstance.ts +2 -2
- package/src/formatting/NumberingLevel.ts +201 -10
- package/src/formatting/NumberingManager.ts +5 -5
- package/src/formatting/Style.ts +382 -86
- package/src/formatting/StylesManager.ts +4 -4
- package/src/helpers/CleanupHelper.ts +6 -6
- package/src/index.ts +118 -127
- package/src/internal.ts +79 -0
- package/src/managers/DrawingManager.ts +3 -3
- package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
- package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
- package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
- package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
- package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
- package/src/{utils → processors}/RevisionWalker.ts +42 -1
- package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
- package/src/{utils → processors}/ShadingResolver.ts +5 -5
- package/src/{utils → processors}/acceptRevisions.ts +77 -9
- package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
- package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
- package/src/tracking/DocumentTrackingContext.ts +12 -14
- package/src/tracking/TrackingContext.ts +8 -8
- package/src/types/document-types.ts +53 -0
- package/src/types/formatting.ts +4 -4
- package/src/types/settings-types.ts +32 -0
- package/src/utils/KeyedRegistry.ts +41 -0
- package/src/utils/corruptionDetection.ts +2 -2
- package/src/utils/deepEqual.ts +58 -0
- package/src/utils/list-detection.ts +2 -2
- package/src/utils/parsingHelpers.ts +11 -3
- package/src/utils/validation.ts +3 -3
- package/src/utils/xmlSanitization.ts +1 -1
- package/src/validation/RevisionAutoFixer.ts +5 -5
- package/src/validation/RevisionValidator.ts +39 -28
- package/src/validation/ValidationRuleRegistry.ts +86 -0
- package/src/validation/index.ts +3 -3
- package/src/xml/XMLBuilder.ts +13 -3
- package/src/xml/XMLParser.ts +2 -2
- package/src/zip/ZipHandler.ts +4 -4
- package/src/zip/ZipReader.ts +3 -3
- package/src/zip/ZipWriter.ts +3 -3
- package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
- package/dist/utils/ChangelogGenerator.js.map +0 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
- package/dist/utils/CompatibilityUpgrader.js.map +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
- package/dist/utils/MoveOperationHelper.js.map +0 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
- package/dist/utils/RevisionAwareProcessor.js.map +0 -1
- package/dist/utils/RevisionWalker.d.ts.map +0 -1
- package/dist/utils/RevisionWalker.js.map +0 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
- package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
- package/dist/utils/ShadingResolver.d.ts +0 -6
- package/dist/utils/ShadingResolver.d.ts.map +0 -1
- package/dist/utils/ShadingResolver.js.map +0 -1
- package/dist/utils/acceptRevisions.d.ts.map +0 -1
- package/dist/utils/acceptRevisions.js.map +0 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
- package/dist/utils/cnfStyleDecoder.js.map +0 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -3
- package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
- package/dist/utils/stripTrackedChanges.js.map +0 -1
- package/src/__tests__/helper-methods.test.ts +0 -512
- package/src/constants/CLAUDE.md +0 -28
- package/src/core/CLAUDE.md +0 -113
- package/src/elements/CLAUDE.md +0 -142
- package/src/formatting/CLAUDE.md +0 -78
- package/src/managers/CLAUDE.md +0 -47
- package/src/tracking/CLAUDE.md +0 -30
- package/src/types/CLAUDE.md +0 -39
- package/src/utils/CLAUDE.md +0 -168
- package/src/validation/CLAUDE.md +0 -40
- package/src/xml/CLAUDE.md +0 -65
- package/src/zip/CLAUDE.md +0 -55
- /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
- /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Revision } from '../elements/Revision.js';
|
|
2
|
+
import { RangeMarker } from '../elements/RangeMarker.js';
|
|
3
|
+
import { Run } from '../elements/Run.js';
|
|
4
|
+
let globalMoveIdCounter = 0;
|
|
5
|
+
let globalAnnotationIdCounter = 1000;
|
|
6
|
+
export class MoveOperationHelper {
|
|
7
|
+
static createMoveOperation(options) {
|
|
8
|
+
const { author, content, date = new Date() } = options;
|
|
9
|
+
const moveId = options.moveId || `move-${++globalMoveIdCounter}`;
|
|
10
|
+
const getNextId = options.idProvider || (() => ++globalAnnotationIdCounter);
|
|
11
|
+
const moveFromRangeId = getNextId();
|
|
12
|
+
const moveFromId = getNextId();
|
|
13
|
+
const moveToRangeId = getNextId();
|
|
14
|
+
const moveToId = getNextId();
|
|
15
|
+
const moveFromRangeStart = RangeMarker.createMoveFromStart(moveFromRangeId, moveId, author, date);
|
|
16
|
+
const moveFrom = Revision.createMoveFrom(author, content, moveId, date);
|
|
17
|
+
moveFrom.setId(moveFromId);
|
|
18
|
+
const moveFromRangeEnd = RangeMarker.createMoveFromEnd(moveFromRangeId);
|
|
19
|
+
const contentArray = Array.isArray(content) ? content : [content];
|
|
20
|
+
const clonedContent = contentArray.map((run) => {
|
|
21
|
+
const cloned = new Run(run.getText(), { ...run.getFormatting() });
|
|
22
|
+
return cloned;
|
|
23
|
+
});
|
|
24
|
+
const moveToRangeStart = RangeMarker.createMoveToStart(moveToRangeId, moveId, author, date);
|
|
25
|
+
const moveTo = Revision.createMoveTo(author, clonedContent, moveId, date);
|
|
26
|
+
moveTo.setId(moveToId);
|
|
27
|
+
const moveToRangeEnd = RangeMarker.createMoveToEnd(moveToRangeId);
|
|
28
|
+
return {
|
|
29
|
+
source: {
|
|
30
|
+
rangeStart: moveFromRangeStart,
|
|
31
|
+
moveFrom,
|
|
32
|
+
rangeEnd: moveFromRangeEnd,
|
|
33
|
+
},
|
|
34
|
+
destination: {
|
|
35
|
+
rangeStart: moveToRangeStart,
|
|
36
|
+
moveTo,
|
|
37
|
+
rangeEnd: moveToRangeEnd,
|
|
38
|
+
},
|
|
39
|
+
moveId,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
static addMoveOperation(sourceParagraph, destParagraph, options) {
|
|
43
|
+
const moveOp = this.createMoveOperation(options);
|
|
44
|
+
sourceParagraph.addRangeMarker(moveOp.source.rangeStart);
|
|
45
|
+
sourceParagraph.addRevision(moveOp.source.moveFrom);
|
|
46
|
+
sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);
|
|
47
|
+
destParagraph.addRangeMarker(moveOp.destination.rangeStart);
|
|
48
|
+
destParagraph.addRevision(moveOp.destination.moveTo);
|
|
49
|
+
destParagraph.addRangeMarker(moveOp.destination.rangeEnd);
|
|
50
|
+
return moveOp;
|
|
51
|
+
}
|
|
52
|
+
static resetIdCounters() {
|
|
53
|
+
globalMoveIdCounter = 0;
|
|
54
|
+
globalAnnotationIdCounter = 1000;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=MoveOperationHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoveOperationHelper.js","sourceRoot":"","sources":["../../../src/processors/MoveOperationHelper.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MoveOperationHelper - Creates complete move operations with range markers\n *\n * Per ECMA-376, move operations in tracked changes require:\n * 1. w:moveFromRangeStart (marks start of source region)\n * 2. w:moveFrom (contains the moved content)\n * 3. w:moveFromRangeEnd (marks end of source region)\n * 4. w:moveToRangeStart (marks start of destination region)\n * 5. w:moveTo (contains the moved content copy)\n * 6. w:moveToRangeEnd (marks end of destination region)\n *\n * The range markers and move elements share a common 'name' (for range markers)\n * and 'moveId' (for move elements) that links them together.\n *\n * @example\n * ```typescript\n * // Create a complete move operation\n * const moveOp = MoveOperationHelper.createMoveOperation({\n * author: 'John Doe',\n * content: [new Run('moved text')],\n * idProvider: () => document.getIdManager().getNextId(),\n * });\n *\n * // Add to source paragraph\n * sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\n * sourceParagraph.addRevision(moveOp.source.moveFrom);\n * sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\n *\n * // Add to destination paragraph\n * destParagraph.addRangeMarker(moveOp.destination.rangeStart);\n * destParagraph.addRevision(moveOp.destination.moveTo);\n * destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\n * ```\n */\n\nimport { Revision } from '../elements/Revision.js';\nimport { RangeMarker } from '../elements/RangeMarker.js';\nimport { Run } from '../elements/Run.js';\n\n/**\n * Options for creating a move operation\n */\nexport interface MoveOperationOptions {\n /** Author who made the move */\n author: string;\n /** Content being moved (Run or array of Runs) */\n content: Run | Run[];\n /** Date of the move (defaults to now) */\n date?: Date;\n /** ID provider function - returns the next available annotation ID */\n idProvider?: () => number;\n /** Optional move ID (auto-generated if not provided) */\n moveId?: string;\n}\n\n/**\n * Result of creating a move operation\n */\nexport interface MoveOperationResult {\n /** Elements to add to the source paragraph (where content was moved FROM) */\n source: {\n /** Range start marker (w:moveFromRangeStart) */\n rangeStart: RangeMarker;\n /** Move revision (w:moveFrom) */\n moveFrom: Revision;\n /** Range end marker (w:moveFromRangeEnd) */\n rangeEnd: RangeMarker;\n };\n /** Elements to add to the destination paragraph (where content was moved TO) */\n destination: {\n /** Range start marker (w:moveToRangeStart) */\n rangeStart: RangeMarker;\n /** Move revision (w:moveTo) */\n moveTo: Revision;\n /** Range end marker (w:moveToRangeEnd) */\n rangeEnd: RangeMarker;\n };\n /** The move ID linking all elements together */\n moveId: string;\n}\n\n/**\n * Simple ID counter for when no provider is specified\n */\nlet globalMoveIdCounter = 0;\nlet globalAnnotationIdCounter = 1000; // Start high to avoid conflicts\n\n/**\n * Helper class for creating complete move operations\n */\nexport class MoveOperationHelper {\n /**\n * Creates a complete move operation with all required elements.\n *\n * This generates:\n * - Source: w:moveFromRangeStart, w:moveFrom, w:moveFromRangeEnd\n * - Destination: w:moveToRangeStart, w:moveTo, w:moveToRangeEnd\n *\n * All elements are linked by the moveId (for revisions) and name (for range markers).\n *\n * @param options - Move operation options\n * @returns Complete move operation with all elements\n *\n * @example\n * ```typescript\n * const moveOp = MoveOperationHelper.createMoveOperation({\n * author: 'John Doe',\n * content: new Run('text to move'),\n * });\n *\n * // Add to source paragraph (where text was)\n * sourcePara.addRangeMarker(moveOp.source.rangeStart);\n * sourcePara.addRevision(moveOp.source.moveFrom);\n * sourcePara.addRangeMarker(moveOp.source.rangeEnd);\n *\n * // Add to destination paragraph (where text moved to)\n * destPara.addRangeMarker(moveOp.destination.rangeStart);\n * destPara.addRevision(moveOp.destination.moveTo);\n * destPara.addRangeMarker(moveOp.destination.rangeEnd);\n * ```\n */\n static createMoveOperation(options: MoveOperationOptions): MoveOperationResult {\n const { author, content, date = new Date() } = options;\n\n // Generate move ID if not provided\n const moveId = options.moveId || `move-${++globalMoveIdCounter}`;\n\n // Get IDs from provider or use simple counter\n const getNextId = options.idProvider || (() => ++globalAnnotationIdCounter);\n\n // Allocate IDs for all elements\n // Range markers use same ID for start/end pairs\n const moveFromRangeId = getNextId();\n const moveFromId = getNextId();\n const moveToRangeId = getNextId();\n const moveToId = getNextId();\n\n // Create source elements\n const moveFromRangeStart = RangeMarker.createMoveFromStart(\n moveFromRangeId,\n moveId,\n author,\n date\n );\n\n const moveFrom = Revision.createMoveFrom(author, content, moveId, date);\n moveFrom.setId(moveFromId);\n\n const moveFromRangeEnd = RangeMarker.createMoveFromEnd(moveFromRangeId);\n\n // Create destination elements (clone content for moveTo)\n const contentArray = Array.isArray(content) ? content : [content];\n const clonedContent = contentArray.map((run) => {\n // Clone the run to have independent content at destination\n const cloned = new Run(run.getText(), { ...run.getFormatting() });\n return cloned;\n });\n\n const moveToRangeStart = RangeMarker.createMoveToStart(moveToRangeId, moveId, author, date);\n\n const moveTo = Revision.createMoveTo(author, clonedContent, moveId, date);\n moveTo.setId(moveToId);\n\n const moveToRangeEnd = RangeMarker.createMoveToEnd(moveToRangeId);\n\n return {\n source: {\n rangeStart: moveFromRangeStart,\n moveFrom,\n rangeEnd: moveFromRangeEnd,\n },\n destination: {\n rangeStart: moveToRangeStart,\n moveTo,\n rangeEnd: moveToRangeEnd,\n },\n moveId,\n };\n }\n\n /**\n * Adds a complete move operation to source and destination paragraphs.\n *\n * This is a convenience method that creates the move operation and adds\n * all elements to the appropriate paragraphs in the correct order.\n *\n * @param sourceParagraph - Paragraph where content was moved FROM\n * @param destParagraph - Paragraph where content was moved TO\n * @param options - Move operation options\n * @returns The move operation result for reference\n *\n * @example\n * ```typescript\n * import { Paragraph } from 'docxmlater';\n *\n * const sourcePara = document.getParagraphs()[0];\n * const destPara = document.getParagraphs()[5];\n *\n * MoveOperationHelper.addMoveOperation(sourcePara, destPara, {\n * author: 'John Doe',\n * content: new Run('moved text'),\n * });\n * ```\n */\n static addMoveOperation(\n sourceParagraph: import('../elements/Paragraph.js').Paragraph,\n destParagraph: import('../elements/Paragraph.js').Paragraph,\n options: MoveOperationOptions\n ): MoveOperationResult {\n const moveOp = this.createMoveOperation(options);\n\n // Add to source paragraph in order\n sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\n sourceParagraph.addRevision(moveOp.source.moveFrom);\n sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\n\n // Add to destination paragraph in order\n destParagraph.addRangeMarker(moveOp.destination.rangeStart);\n destParagraph.addRevision(moveOp.destination.moveTo);\n destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\n\n return moveOp;\n }\n\n /**\n * Resets the global ID counters (for testing purposes).\n * @internal\n */\n static resetIdCounters(): void {\n globalMoveIdCounter = 0;\n globalAnnotationIdCounter = 1000;\n }\n}\n"]}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { Revision } from '../elements/Revision.js';
|
|
2
|
+
export class RevisionAwareProcessor {
|
|
3
|
+
static async prepare(doc, options) {
|
|
4
|
+
const log = [];
|
|
5
|
+
const acceptedRevisions = [];
|
|
6
|
+
const preservedRevisions = [];
|
|
7
|
+
const newRevisions = [];
|
|
8
|
+
const conflicts = [];
|
|
9
|
+
const addLog = (action, details, revisionId) => {
|
|
10
|
+
log.push({
|
|
11
|
+
timestamp: new Date(),
|
|
12
|
+
action,
|
|
13
|
+
details,
|
|
14
|
+
revisionId,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
addLog('start', `Starting revision processing with mode: ${options.mode}`);
|
|
18
|
+
try {
|
|
19
|
+
const revisionManager = doc.getRevisionManager();
|
|
20
|
+
const hasInMemoryRevisions = revisionManager?.hasRevisions() ?? false;
|
|
21
|
+
const hasRawXmlRevisions = doc.hasRawXmlRevisions();
|
|
22
|
+
if (!hasInMemoryRevisions && !hasRawXmlRevisions) {
|
|
23
|
+
addLog('complete', 'No revisions found in document');
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
acceptedRevisions,
|
|
27
|
+
preservedRevisions,
|
|
28
|
+
newRevisions,
|
|
29
|
+
conflicts,
|
|
30
|
+
log,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const allRevisions = revisionManager?.getAllRevisions() ?? [];
|
|
34
|
+
const inMemoryCount = allRevisions.length;
|
|
35
|
+
const rawXmlNote = hasRawXmlRevisions ? ' (raw XML contains revision markup)' : '';
|
|
36
|
+
addLog('info', `Found ${inMemoryCount} parsed revisions in document${rawXmlNote}`);
|
|
37
|
+
switch (options.mode) {
|
|
38
|
+
case 'accept_all':
|
|
39
|
+
await this.acceptAllRevisions(doc, allRevisions, acceptedRevisions, addLog);
|
|
40
|
+
break;
|
|
41
|
+
case 'preserve':
|
|
42
|
+
for (const rev of allRevisions) {
|
|
43
|
+
preservedRevisions.push(rev.getId().toString());
|
|
44
|
+
}
|
|
45
|
+
doc.preserveRawXml();
|
|
46
|
+
addLog('complete', `Preserved ${preservedRevisions.length} revisions (raw XML preservation enabled)`);
|
|
47
|
+
break;
|
|
48
|
+
case 'preserve_and_wrap':
|
|
49
|
+
for (const rev of allRevisions) {
|
|
50
|
+
preservedRevisions.push(rev.getId().toString());
|
|
51
|
+
}
|
|
52
|
+
doc.preserveRawXml();
|
|
53
|
+
addLog('info', `Will preserve and wrap conflicts for ${preservedRevisions.length} revisions`);
|
|
54
|
+
addLog('info', `New revisions will be authored by: ${options.author || 'Unknown'}`);
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
addLog('error', `Unknown processing mode: ${options.mode}`);
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
acceptedRevisions,
|
|
61
|
+
preservedRevisions,
|
|
62
|
+
newRevisions,
|
|
63
|
+
conflicts,
|
|
64
|
+
log,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
addLog('complete', 'Revision processing completed successfully');
|
|
68
|
+
return {
|
|
69
|
+
success: true,
|
|
70
|
+
acceptedRevisions,
|
|
71
|
+
preservedRevisions,
|
|
72
|
+
newRevisions,
|
|
73
|
+
conflicts,
|
|
74
|
+
log,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
79
|
+
addLog('error', `Processing failed: ${errorMessage}`);
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
acceptedRevisions,
|
|
83
|
+
preservedRevisions,
|
|
84
|
+
newRevisions,
|
|
85
|
+
conflicts,
|
|
86
|
+
log,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
static async acceptAllRevisions(doc, revisions, acceptedIds, addLog) {
|
|
91
|
+
addLog('info', 'Accepting all revisions using in-memory DOM transformation');
|
|
92
|
+
for (const rev of revisions) {
|
|
93
|
+
acceptedIds.push(rev.getId().toString());
|
|
94
|
+
}
|
|
95
|
+
await doc.acceptAllRevisions();
|
|
96
|
+
for (const id of acceptedIds) {
|
|
97
|
+
addLog('accept', `Accepted revision ${id}`, id);
|
|
98
|
+
}
|
|
99
|
+
addLog('complete', `Accepted ${acceptedIds.length} revisions (in-memory transformation)`);
|
|
100
|
+
}
|
|
101
|
+
static acceptSelective(doc, criteria) {
|
|
102
|
+
const revisionManager = doc.getRevisionManager();
|
|
103
|
+
if (!revisionManager) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const allRevisions = revisionManager.getAllRevisions();
|
|
107
|
+
const matchingRevisions = this.filterRevisions(allRevisions, criteria);
|
|
108
|
+
const acceptedIds = [];
|
|
109
|
+
for (const rev of matchingRevisions) {
|
|
110
|
+
acceptedIds.push(rev.getId().toString());
|
|
111
|
+
}
|
|
112
|
+
return acceptedIds;
|
|
113
|
+
}
|
|
114
|
+
static filterRevisions(revisions, criteria) {
|
|
115
|
+
return revisions.filter((rev) => {
|
|
116
|
+
if (criteria.ids && !criteria.ids.includes(rev.getId())) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (criteria.types && !criteria.types.includes(rev.getType())) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
if (criteria.dateRange) {
|
|
126
|
+
const date = rev.getDate();
|
|
127
|
+
if (date < criteria.dateRange.start || date > criteria.dateRange.end) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (criteria.categories) {
|
|
132
|
+
const category = this.getRevisionCategory(rev);
|
|
133
|
+
if (!criteria.categories.includes(category)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (criteria.custom && !criteria.custom(rev)) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
static getRevisionCategory(revision) {
|
|
144
|
+
const type = revision.getType();
|
|
145
|
+
if (type === 'insert' || type === 'delete') {
|
|
146
|
+
return 'content';
|
|
147
|
+
}
|
|
148
|
+
if (type === 'runPropertiesChange' ||
|
|
149
|
+
type === 'paragraphPropertiesChange' ||
|
|
150
|
+
type === 'numberingChange') {
|
|
151
|
+
return 'formatting';
|
|
152
|
+
}
|
|
153
|
+
if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {
|
|
154
|
+
return 'structural';
|
|
155
|
+
}
|
|
156
|
+
if (type === 'tablePropertiesChange' ||
|
|
157
|
+
type === 'tableExceptionPropertiesChange' ||
|
|
158
|
+
type === 'tableRowPropertiesChange' ||
|
|
159
|
+
type === 'tableCellPropertiesChange' ||
|
|
160
|
+
type === 'tableCellInsert' ||
|
|
161
|
+
type === 'tableCellDelete' ||
|
|
162
|
+
type === 'tableCellMerge') {
|
|
163
|
+
return 'table';
|
|
164
|
+
}
|
|
165
|
+
return 'content';
|
|
166
|
+
}
|
|
167
|
+
static checkConflict(doc, paragraphIndex, _runIndex) {
|
|
168
|
+
const revisionManager = doc.getRevisionManager();
|
|
169
|
+
if (!revisionManager) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const revisions = revisionManager.getRevisionsForParagraph(paragraphIndex);
|
|
173
|
+
return revisions.length > 0 ? revisions[0] : null;
|
|
174
|
+
}
|
|
175
|
+
static getAffectedRevisions(doc, paragraphIndex, _runIndex) {
|
|
176
|
+
const revisionManager = doc.getRevisionManager();
|
|
177
|
+
if (!revisionManager) {
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
return revisionManager.getRevisionsForParagraph(paragraphIndex);
|
|
181
|
+
}
|
|
182
|
+
static wrapInRevision(doc, paragraphIndex, runIndex, author, type) {
|
|
183
|
+
const revisionManager = doc.getRevisionManager();
|
|
184
|
+
if (!revisionManager) {
|
|
185
|
+
throw new Error('Document does not have a revision manager');
|
|
186
|
+
}
|
|
187
|
+
const paragraphs = doc.getParagraphs();
|
|
188
|
+
if (paragraphIndex < 0 || paragraphIndex >= paragraphs.length) {
|
|
189
|
+
throw new Error(`Invalid paragraph index: ${paragraphIndex}`);
|
|
190
|
+
}
|
|
191
|
+
const paragraph = paragraphs[paragraphIndex];
|
|
192
|
+
if (!paragraph) {
|
|
193
|
+
throw new Error(`Paragraph at index ${paragraphIndex} not found`);
|
|
194
|
+
}
|
|
195
|
+
const runs = paragraph.getRuns();
|
|
196
|
+
if (runIndex < 0 || runIndex >= runs.length) {
|
|
197
|
+
throw new Error(`Invalid run index: ${runIndex}`);
|
|
198
|
+
}
|
|
199
|
+
const run = runs[runIndex];
|
|
200
|
+
if (!run) {
|
|
201
|
+
throw new Error(`Run at index ${runIndex} not found`);
|
|
202
|
+
}
|
|
203
|
+
const revision = new Revision({
|
|
204
|
+
author,
|
|
205
|
+
type,
|
|
206
|
+
content: run,
|
|
207
|
+
date: new Date(),
|
|
208
|
+
});
|
|
209
|
+
revisionManager.register(revision);
|
|
210
|
+
return revision.getId().toString();
|
|
211
|
+
}
|
|
212
|
+
static hasTrackedChanges(doc) {
|
|
213
|
+
const revisionManager = doc.getRevisionManager();
|
|
214
|
+
return revisionManager ? revisionManager.hasRevisions() : false;
|
|
215
|
+
}
|
|
216
|
+
static getTrackedChangesSummary(doc) {
|
|
217
|
+
const revisionManager = doc.getRevisionManager();
|
|
218
|
+
if (!revisionManager) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const summary = revisionManager.getSummary();
|
|
222
|
+
return {
|
|
223
|
+
total: summary.total,
|
|
224
|
+
insertions: summary.byType.insertions,
|
|
225
|
+
deletions: summary.byType.deletions,
|
|
226
|
+
formatting: summary.byType.propertyChanges,
|
|
227
|
+
moves: summary.byType.moves,
|
|
228
|
+
authors: summary.authors,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=RevisionAwareProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionAwareProcessor.js","sourceRoot":"","sources":["../../../src/processors/RevisionAwareProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionAwareProcessor - Handles document revisions before and during processing\n *\n * Provides three modes for handling existing Word tracked changes:\n * - accept_all: Accept all revisions before processing (default)\n * - preserve: Preserve revisions, skip conflicting operations\n * - preserve_and_wrap: Preserve revisions, wrap conflicts in new revisions\n *\n * Implements ECMA-376 compliant revision handling.\n *\n * @module RevisionAwareProcessor\n */\n\nimport type { Document } from '../core/Document.js';\nimport { Revision, RevisionType } from '../elements/Revision.js';\nimport { ChangeCategory, ChangeLocation } from './ChangelogGenerator.js';\n\n/**\n * Revision handling modes for document processing.\n */\nexport type RevisionHandlingMode =\n | 'accept_all' // Accept all revisions before processing\n | 'preserve' // Preserve revisions, skip conflicting operations\n | 'preserve_and_wrap'; // Preserve revisions, wrap conflicts in new revisions\n\n/**\n * Options for revision-aware processing.\n */\nexport interface RevisionProcessingOptions {\n /** How to handle existing revisions */\n mode: RevisionHandlingMode;\n /** Author name for new revisions (required for 'preserve_and_wrap' mode) */\n author?: string;\n /** Selective acceptance criteria (optional, for partial acceptance) */\n acceptCriteria?: SelectionCriteria;\n}\n\n/**\n * Criteria for selecting specific revisions.\n */\nexport interface SelectionCriteria {\n /** Specific revision IDs */\n ids?: number[];\n /** Filter by revision types */\n types?: RevisionType[];\n /** Filter by authors */\n authors?: string[];\n /** Filter by date range */\n dateRange?: { start: Date; end: Date };\n /** Filter by category */\n categories?: ChangeCategory[];\n /** Custom filter function */\n custom?: (revision: Revision) => boolean;\n}\n\n/**\n * Result of revision-aware processing.\n */\nexport interface RevisionProcessingResult {\n /** Whether processing completed successfully */\n success: boolean;\n /** IDs of revisions that were accepted */\n acceptedRevisions: string[];\n /** IDs of revisions that were preserved */\n preservedRevisions: string[];\n /** IDs of new revisions created (preserve_and_wrap mode) */\n newRevisions: string[];\n /** Conflicts encountered during processing */\n conflicts: ConflictInfo[];\n /** Processing log entries */\n log: ProcessingLogEntry[];\n}\n\n/**\n * Information about a conflict between an operation and a revision.\n */\nexport interface ConflictInfo {\n /** Description of the operation that conflicted */\n operation: string;\n /** ID of the conflicting revision */\n revisionId: string;\n /** How the conflict was resolved */\n resolution: 'accepted' | 'skipped' | 'wrapped';\n /** Location of the conflict */\n location: ChangeLocation;\n}\n\n/**\n * Log entry for processing actions.\n */\nexport interface ProcessingLogEntry {\n timestamp: Date;\n action: string;\n details: string;\n revisionId?: string;\n}\n\n/**\n * Handles document revisions before and during processing.\n * Implements ECMA-376 compliant revision handling.\n */\nexport class RevisionAwareProcessor {\n /**\n * Prepare document for processing by handling revisions.\n * Call this before applying any document modifications.\n *\n * @param doc - Document to prepare\n * @param options - Processing options\n * @returns Processing result with details of actions taken\n */\n static async prepare(\n doc: Document,\n options: RevisionProcessingOptions\n ): Promise<RevisionProcessingResult> {\n const log: ProcessingLogEntry[] = [];\n const acceptedRevisions: string[] = [];\n const preservedRevisions: string[] = [];\n const newRevisions: string[] = [];\n const conflicts: ConflictInfo[] = [];\n\n const addLog = (action: string, details: string, revisionId?: string) => {\n log.push({\n timestamp: new Date(),\n action,\n details,\n revisionId,\n });\n };\n\n addLog('start', `Starting revision processing with mode: ${options.mode}`);\n\n try {\n const revisionManager = doc.getRevisionManager();\n const hasInMemoryRevisions = revisionManager?.hasRevisions() ?? false;\n const hasRawXmlRevisions = doc.hasRawXmlRevisions();\n\n // Check both in-memory model AND raw XML for revisions\n // Raw XML may contain revisions that weren't fully parsed into memory\n if (!hasInMemoryRevisions && !hasRawXmlRevisions) {\n addLog('complete', 'No revisions found in document');\n return {\n success: true,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n\n const allRevisions = revisionManager?.getAllRevisions() ?? [];\n const inMemoryCount = allRevisions.length;\n const rawXmlNote = hasRawXmlRevisions ? ' (raw XML contains revision markup)' : '';\n addLog('info', `Found ${inMemoryCount} parsed revisions in document${rawXmlNote}`);\n\n switch (options.mode) {\n case 'accept_all':\n // Accept all revisions\n await this.acceptAllRevisions(doc, allRevisions, acceptedRevisions, addLog);\n break;\n\n case 'preserve':\n // Preserve all revisions by preventing document.xml regeneration\n // This keeps the original XML with w:ins/w:del elements intact\n for (const rev of allRevisions) {\n preservedRevisions.push(rev.getId().toString());\n }\n doc.preserveRawXml();\n addLog(\n 'complete',\n `Preserved ${preservedRevisions.length} revisions (raw XML preservation enabled)`\n );\n break;\n\n case 'preserve_and_wrap':\n // Preserve all revisions, track for later wrapping\n // Also enable raw XML preservation to keep existing revisions\n for (const rev of allRevisions) {\n preservedRevisions.push(rev.getId().toString());\n }\n doc.preserveRawXml();\n addLog(\n 'info',\n `Will preserve and wrap conflicts for ${preservedRevisions.length} revisions`\n );\n addLog('info', `New revisions will be authored by: ${options.author || 'Unknown'}`);\n break;\n\n default:\n addLog('error', `Unknown processing mode: ${options.mode}`);\n return {\n success: false,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n\n addLog('complete', 'Revision processing completed successfully');\n\n return {\n success: true,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n addLog('error', `Processing failed: ${errorMessage}`);\n\n return {\n success: false,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n }\n\n /**\n * Accept all revisions in the document using Document.acceptAllRevisions().\n *\n * This delegates to Document.acceptAllRevisions() which uses in-memory DOM transformation\n * (the industry-standard approach used by OpenXML PowerTools, Aspose.Words, etc.):\n *\n * 1. Transforms Revision objects in paragraph.content arrays\n * 2. Insertions (w:ins): Unwraps content - keeps Runs/Hyperlinks, removes Revision wrapper\n * 3. Deletions (w:del): Removes content entirely from the model\n * 4. Move operations: moveFrom removed, moveTo unwrapped\n * 5. Property changes: Removes change metadata, keeps current formatting\n *\n * This approach allows subsequent modifications to be saved correctly because the\n * in-memory model is transformed (not raw XML), so save() regenerates document.xml\n * with both the accepted changes AND any subsequent modifications.\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138\n */\n private static async acceptAllRevisions(\n doc: Document,\n revisions: Revision[],\n acceptedIds: string[],\n addLog: (action: string, details: string, revisionId?: string) => void\n ): Promise<void> {\n addLog('info', 'Accepting all revisions using in-memory DOM transformation');\n\n // Track accepted revision IDs before acceptance (for logging)\n for (const rev of revisions) {\n acceptedIds.push(rev.getId().toString());\n }\n\n // Use Document.acceptAllRevisions() which uses in-memory transformation\n // This allows subsequent modifications to be saved correctly\n await doc.acceptAllRevisions();\n\n // Log each accepted revision\n for (const id of acceptedIds) {\n addLog('accept', `Accepted revision ${id}`, id);\n }\n\n addLog('complete', `Accepted ${acceptedIds.length} revisions (in-memory transformation)`);\n }\n\n /**\n * Accept revisions matching the given criteria.\n * Uses existing RevisionAcceptor under the hood.\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Array of accepted revision IDs\n */\n static acceptSelective(doc: Document, criteria: SelectionCriteria): string[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n const allRevisions = revisionManager.getAllRevisions();\n const matchingRevisions = this.filterRevisions(allRevisions, criteria);\n\n const acceptedIds: string[] = [];\n for (const rev of matchingRevisions) {\n acceptedIds.push(rev.getId().toString());\n // Note: Actual acceptance would require XML manipulation\n // For now, this returns which revisions WOULD be accepted\n }\n\n return acceptedIds;\n }\n\n /**\n * Filter revisions based on criteria.\n */\n private static filterRevisions(revisions: Revision[], criteria: SelectionCriteria): Revision[] {\n return revisions.filter((rev) => {\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(rev.getId())) {\n return false;\n }\n\n // Filter by types\n if (criteria.types && !criteria.types.includes(rev.getType())) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n const date = rev.getDate();\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // Filter by categories\n if (criteria.categories) {\n const category = this.getRevisionCategory(rev);\n if (!criteria.categories.includes(category)) {\n return false;\n }\n }\n\n // Custom filter\n if (criteria.custom && !criteria.custom(rev)) {\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Get the semantic category of a revision.\n */\n private static getRevisionCategory(revision: Revision): ChangeCategory {\n const type = revision.getType();\n\n if (type === 'insert' || type === 'delete') {\n return 'content';\n }\n if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n return 'formatting';\n }\n if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n return 'structural';\n }\n if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n return 'table';\n }\n\n return 'content';\n }\n\n /**\n * Check if an operation at the given location would conflict with any revision.\n *\n * @param doc - Document to check\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Optional run index\n * @returns Conflicting revision or null\n */\n static checkConflict(doc: Document, paragraphIndex: number, _runIndex?: number): Revision | null {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return null;\n }\n\n // Get revisions that might affect this paragraph\n const revisions = revisionManager.getRevisionsForParagraph(paragraphIndex);\n\n // For now, return the first revision at this location\n // In a more complete implementation, we would check run-level conflicts\n return revisions.length > 0 ? revisions[0]! : null;\n }\n\n /**\n * Get all revisions that would be affected by an operation.\n *\n * @param doc - Document to check\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Optional run index\n * @returns Array of affected revisions\n */\n static getAffectedRevisions(\n doc: Document,\n paragraphIndex: number,\n _runIndex?: number\n ): Revision[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n return revisionManager.getRevisionsForParagraph(paragraphIndex);\n }\n\n /**\n * Wrap content in a new revision (for preserve_and_wrap mode).\n * Creates a new revision tracking the change.\n *\n * @param doc - Document to modify\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Run index\n * @param author - Author for the new revision\n * @param type - Type of revision to create\n * @returns ID of the new revision\n */\n static wrapInRevision(\n doc: Document,\n paragraphIndex: number,\n runIndex: number,\n author: string,\n type: 'insert' | 'delete'\n ): string {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n throw new Error('Document does not have a revision manager');\n }\n\n // Get the paragraphs from the document\n const paragraphs = doc.getParagraphs();\n if (paragraphIndex < 0 || paragraphIndex >= paragraphs.length) {\n throw new Error(`Invalid paragraph index: ${paragraphIndex}`);\n }\n\n const paragraph = paragraphs[paragraphIndex];\n if (!paragraph) {\n throw new Error(`Paragraph at index ${paragraphIndex} not found`);\n }\n\n const runs = paragraph.getRuns();\n if (runIndex < 0 || runIndex >= runs.length) {\n throw new Error(`Invalid run index: ${runIndex}`);\n }\n\n const run = runs[runIndex];\n if (!run) {\n throw new Error(`Run at index ${runIndex} not found`);\n }\n\n // Create new revision\n const revision = new Revision({\n author,\n type,\n content: run,\n date: new Date(),\n });\n\n // Register with manager\n revisionManager.register(revision);\n\n return revision.getId().toString();\n }\n\n /**\n * Check if document has any tracked changes.\n *\n * @param doc - Document to check\n * @returns True if document has tracked changes\n */\n static hasTrackedChanges(doc: Document): boolean {\n const revisionManager = doc.getRevisionManager();\n return revisionManager ? revisionManager.hasRevisions() : false;\n }\n\n /**\n * Get summary of tracked changes in document.\n *\n * @param doc - Document to summarize\n * @returns Summary object or null if no revision manager\n */\n static getTrackedChangesSummary(doc: Document): {\n total: number;\n insertions: number;\n deletions: number;\n formatting: number;\n moves: number;\n authors: string[];\n } | null {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return null;\n }\n\n const summary = revisionManager.getSummary();\n return {\n total: summary.total,\n insertions: summary.byType.insertions,\n deletions: summary.byType.deletions,\n formatting: summary.byType.propertyChanges,\n moves: summary.byType.moves,\n authors: summary.authors,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
const REVISION_ELEMENTS = {
|
|
2
|
+
UNWRAP: ['w:ins', 'w:moveTo'],
|
|
3
|
+
REMOVE: ['w:del', 'w:moveFrom'],
|
|
4
|
+
PROPERTY_CHANGES: [
|
|
5
|
+
'w:rPrChange',
|
|
6
|
+
'w:pPrChange',
|
|
7
|
+
'w:tblPrChange',
|
|
8
|
+
'w:tcPrChange',
|
|
9
|
+
'w:trPrChange',
|
|
10
|
+
'w:sectPrChange',
|
|
11
|
+
'w:tblGridChange',
|
|
12
|
+
'w:numberingChange',
|
|
13
|
+
'w:tblPrExChange',
|
|
14
|
+
],
|
|
15
|
+
RANGE_MARKERS: [
|
|
16
|
+
'w:moveFromRangeStart',
|
|
17
|
+
'w:moveFromRangeEnd',
|
|
18
|
+
'w:moveToRangeStart',
|
|
19
|
+
'w:moveToRangeEnd',
|
|
20
|
+
'w:customXmlInsRangeStart',
|
|
21
|
+
'w:customXmlInsRangeEnd',
|
|
22
|
+
'w:customXmlDelRangeStart',
|
|
23
|
+
'w:customXmlDelRangeEnd',
|
|
24
|
+
'w:customXmlMoveFromRangeStart',
|
|
25
|
+
'w:customXmlMoveFromRangeEnd',
|
|
26
|
+
'w:customXmlMoveToRangeStart',
|
|
27
|
+
'w:customXmlMoveToRangeEnd',
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
export class RevisionWalker {
|
|
31
|
+
static processTree(obj, options) {
|
|
32
|
+
const opts = {
|
|
33
|
+
acceptInsertions: options?.acceptInsertions ?? true,
|
|
34
|
+
acceptDeletions: options?.acceptDeletions ?? true,
|
|
35
|
+
acceptMoves: options?.acceptMoves ?? true,
|
|
36
|
+
acceptPropertyChanges: options?.acceptPropertyChanges ?? true,
|
|
37
|
+
};
|
|
38
|
+
const clone = RevisionWalker.deepClone(obj);
|
|
39
|
+
RevisionWalker.walkAndTransform(clone, opts);
|
|
40
|
+
return clone;
|
|
41
|
+
}
|
|
42
|
+
static deepClone(obj) {
|
|
43
|
+
if (obj === null || typeof obj !== 'object') {
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(obj)) {
|
|
47
|
+
return obj.map((item) => RevisionWalker.deepClone(item));
|
|
48
|
+
}
|
|
49
|
+
const clone = {};
|
|
50
|
+
for (const key of Object.keys(obj)) {
|
|
51
|
+
clone[key] = RevisionWalker.deepClone(obj[key]);
|
|
52
|
+
}
|
|
53
|
+
return clone;
|
|
54
|
+
}
|
|
55
|
+
static walkAndTransform(obj, options) {
|
|
56
|
+
if (obj === null || typeof obj !== 'object') {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (options.acceptDeletions && obj['w:tr']) {
|
|
60
|
+
RevisionWalker.filterDeletedRows(obj);
|
|
61
|
+
}
|
|
62
|
+
const keys = Object.keys(obj).filter((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
63
|
+
for (const key of keys) {
|
|
64
|
+
const value = obj[key];
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
for (const item of value) {
|
|
67
|
+
RevisionWalker.walkAndTransform(item, options);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (typeof value === 'object' && value !== null) {
|
|
71
|
+
RevisionWalker.walkAndTransform(value, options);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
RevisionWalker.processRevisions(obj, options);
|
|
75
|
+
}
|
|
76
|
+
static filterDeletedRows(tbl) {
|
|
77
|
+
const rows = tbl['w:tr'];
|
|
78
|
+
const isRowDeleted = (row) => {
|
|
79
|
+
if (!row || typeof row !== 'object')
|
|
80
|
+
return false;
|
|
81
|
+
const trPr = row['w:trPr'];
|
|
82
|
+
if (!trPr || typeof trPr !== 'object')
|
|
83
|
+
return false;
|
|
84
|
+
return !!trPr['w:del'];
|
|
85
|
+
};
|
|
86
|
+
if (Array.isArray(rows)) {
|
|
87
|
+
const kept = rows.filter((r) => !isRowDeleted(r));
|
|
88
|
+
if (kept.length !== rows.length) {
|
|
89
|
+
if (kept.length === 0) {
|
|
90
|
+
delete tbl['w:tr'];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
tbl['w:tr'] = kept;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (isRowDeleted(rows)) {
|
|
98
|
+
delete tbl['w:tr'];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
static processRevisions(parent, options) {
|
|
102
|
+
if (!parent || typeof parent !== 'object') {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const keysToProcess = Object.keys(parent).filter((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
106
|
+
for (const key of keysToProcess) {
|
|
107
|
+
if (RevisionWalker.shouldUnwrap(key, options)) {
|
|
108
|
+
RevisionWalker.unwrapAllElements(parent, key);
|
|
109
|
+
}
|
|
110
|
+
else if (RevisionWalker.shouldRemove(key, options)) {
|
|
111
|
+
RevisionWalker.removeAllElements(parent, key);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
static shouldUnwrap(key, options) {
|
|
116
|
+
if (REVISION_ELEMENTS.UNWRAP.includes(key)) {
|
|
117
|
+
if (key === 'w:ins' && !options.acceptInsertions)
|
|
118
|
+
return false;
|
|
119
|
+
if (key === 'w:moveTo' && !options.acceptMoves)
|
|
120
|
+
return false;
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
static shouldRemove(key, options) {
|
|
126
|
+
if (REVISION_ELEMENTS.REMOVE.includes(key)) {
|
|
127
|
+
if (key === 'w:del' && !options.acceptDeletions)
|
|
128
|
+
return false;
|
|
129
|
+
if (key === 'w:moveFrom' && !options.acceptMoves)
|
|
130
|
+
return false;
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
if (REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key)) {
|
|
134
|
+
return options.acceptPropertyChanges;
|
|
135
|
+
}
|
|
136
|
+
if (REVISION_ELEMENTS.RANGE_MARKERS.includes(key)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
static unwrapAllElements(parent, key) {
|
|
142
|
+
const elements = parent[key];
|
|
143
|
+
if (!elements)
|
|
144
|
+
return;
|
|
145
|
+
const elementArray = Array.isArray(elements) ? elements : [elements];
|
|
146
|
+
const orderedElements = [];
|
|
147
|
+
if (parent._orderedChildren) {
|
|
148
|
+
const typeCounters = new Map();
|
|
149
|
+
let unwrappedIndex = 0;
|
|
150
|
+
for (const entry of parent._orderedChildren) {
|
|
151
|
+
const { type } = entry;
|
|
152
|
+
if (type === key) {
|
|
153
|
+
const revElement = elementArray[unwrappedIndex];
|
|
154
|
+
unwrappedIndex++;
|
|
155
|
+
if (revElement && typeof revElement === 'object') {
|
|
156
|
+
if (revElement._orderedChildren) {
|
|
157
|
+
const childCounters = new Map();
|
|
158
|
+
for (const childEntry of revElement._orderedChildren) {
|
|
159
|
+
const childType = childEntry.type;
|
|
160
|
+
const childIdx = childCounters.get(childType) || 0;
|
|
161
|
+
childCounters.set(childType, childIdx + 1);
|
|
162
|
+
const childElements = revElement[childType];
|
|
163
|
+
if (childElements) {
|
|
164
|
+
const childArray = Array.isArray(childElements) ? childElements : [childElements];
|
|
165
|
+
if (childIdx < childArray.length) {
|
|
166
|
+
orderedElements.push({
|
|
167
|
+
type: childType,
|
|
168
|
+
element: childArray[childIdx],
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
const childKeys = Object.keys(revElement).filter((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
176
|
+
for (const childKey of childKeys) {
|
|
177
|
+
const childValue = revElement[childKey];
|
|
178
|
+
const childArray = Array.isArray(childValue) ? childValue : [childValue];
|
|
179
|
+
for (const child of childArray) {
|
|
180
|
+
orderedElements.push({ type: childKey, element: child });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const idx = typeCounters.get(type) || 0;
|
|
188
|
+
typeCounters.set(type, idx + 1);
|
|
189
|
+
const parentElements = parent[type];
|
|
190
|
+
if (parentElements) {
|
|
191
|
+
const parentArray = Array.isArray(parentElements) ? parentElements : [parentElements];
|
|
192
|
+
if (idx < parentArray.length) {
|
|
193
|
+
orderedElements.push({ type, element: parentArray[idx] });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
delete parent[key];
|
|
200
|
+
if (orderedElements.length > 0) {
|
|
201
|
+
const rebuiltArrays = new Map();
|
|
202
|
+
for (const { type, element } of orderedElements) {
|
|
203
|
+
if (!rebuiltArrays.has(type)) {
|
|
204
|
+
rebuiltArrays.set(type, []);
|
|
205
|
+
}
|
|
206
|
+
rebuiltArrays.get(type).push(element);
|
|
207
|
+
}
|
|
208
|
+
for (const [type, elements] of rebuiltArrays) {
|
|
209
|
+
if (elements.length === 1) {
|
|
210
|
+
parent[type] = elements[0];
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
parent[type] = elements;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const newOrderedChildren = [];
|
|
217
|
+
const typeCounters = new Map();
|
|
218
|
+
for (const { type } of orderedElements) {
|
|
219
|
+
const idx = typeCounters.get(type) || 0;
|
|
220
|
+
typeCounters.set(type, idx + 1);
|
|
221
|
+
newOrderedChildren.push({ type, index: idx });
|
|
222
|
+
}
|
|
223
|
+
parent._orderedChildren = newOrderedChildren;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
for (const element of elementArray) {
|
|
227
|
+
if (!element || typeof element !== 'object')
|
|
228
|
+
continue;
|
|
229
|
+
const elementKeys = Object.keys(element).filter((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
230
|
+
for (const childKey of elementKeys) {
|
|
231
|
+
RevisionWalker.mergeIntoParent(parent, childKey, element[childKey]);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
static removeAllElements(parent, key) {
|
|
237
|
+
if (!parent[key])
|
|
238
|
+
return;
|
|
239
|
+
if (parent._orderedChildren) {
|
|
240
|
+
parent._orderedChildren = parent._orderedChildren.filter((c) => c.type !== key);
|
|
241
|
+
RevisionWalker.reindexOrderedChildren(parent._orderedChildren);
|
|
242
|
+
}
|
|
243
|
+
delete parent[key];
|
|
244
|
+
}
|
|
245
|
+
static mergeIntoParent(parent, childKey, childValue) {
|
|
246
|
+
if (parent[childKey] === undefined) {
|
|
247
|
+
parent[childKey] = childValue;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const existing = parent[childKey];
|
|
251
|
+
const incoming = Array.isArray(childValue) ? childValue : [childValue];
|
|
252
|
+
if (Array.isArray(existing)) {
|
|
253
|
+
parent[childKey] = [...existing, ...incoming];
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
parent[childKey] = [existing, ...incoming];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
static reindexOrderedChildren(orderedChildren) {
|
|
261
|
+
const typeCounters = new Map();
|
|
262
|
+
for (const entry of orderedChildren) {
|
|
263
|
+
const currentIndex = typeCounters.get(entry.type) || 0;
|
|
264
|
+
entry.index = currentIndex;
|
|
265
|
+
typeCounters.set(entry.type, currentIndex + 1);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
static isRevisionElement(key) {
|
|
269
|
+
return (REVISION_ELEMENTS.UNWRAP.includes(key) ||
|
|
270
|
+
REVISION_ELEMENTS.REMOVE.includes(key) ||
|
|
271
|
+
REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key) ||
|
|
272
|
+
REVISION_ELEMENTS.RANGE_MARKERS.includes(key));
|
|
273
|
+
}
|
|
274
|
+
static getRevisionElementCategories() {
|
|
275
|
+
return { ...REVISION_ELEMENTS };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=RevisionWalker.js.map
|