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 @@
|
|
|
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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ParsedXMLObject } from '../xml/XMLParser';
|
|
1
|
+
import { ParsedXMLObject } from '../xml/XMLParser.js';
|
|
2
2
|
export interface RevisionWalkerOptions {
|
|
3
3
|
acceptInsertions?: boolean;
|
|
4
4
|
acceptDeletions?: boolean;
|
|
@@ -15,6 +15,7 @@ export declare class RevisionWalker {
|
|
|
15
15
|
static processTree(obj: ParsedXMLObject, options?: RevisionWalkerOptions): ParsedXMLObject;
|
|
16
16
|
private static deepClone;
|
|
17
17
|
private static walkAndTransform;
|
|
18
|
+
private static filterDeletedRows;
|
|
18
19
|
private static processRevisions;
|
|
19
20
|
private static shouldUnwrap;
|
|
20
21
|
private static shouldRemove;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionWalker.d.ts","sourceRoot":"","sources":["../../src/processors/RevisionWalker.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD,MAAM,WAAW,qBAAqB;IAEpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAaD,QAAA,MAAM,iBAAiB;;;;;CAmCtB,CAAC;AAcF,qBAAa,cAAc;IAczB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,eAAe;IAoB1F,OAAO,CAAC,MAAM,CAAC,SAAS;IAoBxB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IA0C/B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA6BhC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsB/B,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B,OAAO,CAAC,MAAM,CAAC,YAAY;IA4B3B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA+HhC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmBhC,OAAO,CAAC,MAAM,CAAC,eAAe;IAoB9B,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAarC,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAY9C,MAAM,CAAC,4BAA4B,IAAI,OAAO,iBAAiB;CAGhE"}
|
|
@@ -59,6 +59,9 @@ class RevisionWalker {
|
|
|
59
59
|
if (obj === null || typeof obj !== 'object') {
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
+
if (options.acceptDeletions && obj['w:tr']) {
|
|
63
|
+
RevisionWalker.filterDeletedRows(obj);
|
|
64
|
+
}
|
|
62
65
|
const keys = Object.keys(obj).filter((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
63
66
|
for (const key of keys) {
|
|
64
67
|
const value = obj[key];
|
|
@@ -73,6 +76,31 @@ class RevisionWalker {
|
|
|
73
76
|
}
|
|
74
77
|
RevisionWalker.processRevisions(obj, options);
|
|
75
78
|
}
|
|
79
|
+
static filterDeletedRows(tbl) {
|
|
80
|
+
const rows = tbl['w:tr'];
|
|
81
|
+
const isRowDeleted = (row) => {
|
|
82
|
+
if (!row || typeof row !== 'object')
|
|
83
|
+
return false;
|
|
84
|
+
const trPr = row['w:trPr'];
|
|
85
|
+
if (!trPr || typeof trPr !== 'object')
|
|
86
|
+
return false;
|
|
87
|
+
return !!trPr['w:del'];
|
|
88
|
+
};
|
|
89
|
+
if (Array.isArray(rows)) {
|
|
90
|
+
const kept = rows.filter((r) => !isRowDeleted(r));
|
|
91
|
+
if (kept.length !== rows.length) {
|
|
92
|
+
if (kept.length === 0) {
|
|
93
|
+
delete tbl['w:tr'];
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
tbl['w:tr'] = kept;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (isRowDeleted(rows)) {
|
|
101
|
+
delete tbl['w:tr'];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
76
104
|
static processRevisions(parent, options) {
|
|
77
105
|
if (!parent || typeof parent !== 'object') {
|
|
78
106
|
return;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionWalker.js","sourceRoot":"","sources":["../../src/processors/RevisionWalker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionWalker - DOM-based tree walker for accepting tracked changes\n *\n * Replaces the fragile RegEx-based revision acceptance with a robust\n * DOM-based approach that properly handles nested elements and preserves\n * element ordering.\n *\n * @module RevisionWalker\n */\n\nimport { ParsedXMLObject } from '../xml/XMLParser.js';\n\n/**\n * Options for controlling which revision types to accept\n */\nexport interface RevisionWalkerOptions {\n /** Keep content, remove w:ins wrapper (default: true) */\n acceptInsertions?: boolean;\n /** Remove w:del and content entirely (default: true) */\n acceptDeletions?: boolean;\n /** Handle w:moveFrom/w:moveTo (default: true) */\n acceptMoves?: boolean;\n /** Remove *Change elements (default: true) */\n acceptPropertyChanges?: boolean;\n}\n\n/**\n * Structure for tracking element order\n */\ninterface OrderedChildInfo {\n type: string;\n index: number;\n}\n\n/**\n * Revision element categories\n */\nconst REVISION_ELEMENTS = {\n /** Elements to unwrap (keep content, remove wrapper) */\n UNWRAP: ['w:ins', 'w:moveTo'],\n\n /** Elements to remove entirely (with content) */\n REMOVE: ['w:del', 'w:moveFrom'],\n\n /** Property change tracking elements */\n PROPERTY_CHANGES: [\n 'w:rPrChange',\n 'w:pPrChange',\n 'w:tblPrChange',\n 'w:tcPrChange',\n 'w:trPrChange',\n 'w:sectPrChange',\n 'w:tblGridChange',\n 'w:numberingChange',\n 'w:tblPrExChange',\n ],\n\n /** Range marker elements */\n RANGE_MARKERS: [\n 'w:moveFromRangeStart',\n 'w:moveFromRangeEnd',\n 'w:moveToRangeStart',\n 'w:moveToRangeEnd',\n 'w:customXmlInsRangeStart',\n 'w:customXmlInsRangeEnd',\n 'w:customXmlDelRangeStart',\n 'w:customXmlDelRangeEnd',\n 'w:customXmlMoveFromRangeStart',\n 'w:customXmlMoveFromRangeEnd',\n 'w:customXmlMoveToRangeStart',\n 'w:customXmlMoveToRangeEnd',\n ],\n};\n\n/**\n * DOM-based tree walker for accepting Word document revisions\n *\n * This class processes a parsed XML object tree (from XMLParser.parseToObject())\n * and accepts all tracked changes by:\n * - Unwrapping insertions (w:ins, w:moveTo) - keeping content\n * - Removing deletions (w:del, w:moveFrom) - discarding content\n * - Removing property changes (*Change elements)\n * - Removing range markers\n *\n * Element order is preserved using the _orderedChildren metadata.\n */\nexport class RevisionWalker {\n /**\n * Process a parsed XML object tree and accept all revisions\n *\n * @param obj - Parsed XML object from XMLParser.parseToObject()\n * @param options - Options controlling which revisions to accept\n * @returns New object tree with revisions accepted\n *\n * @example\n * ```typescript\n * const parsed = XMLParser.parseToObject(documentXml);\n * const clean = RevisionWalker.processTree(parsed);\n * ```\n */\n static processTree(obj: ParsedXMLObject, options?: RevisionWalkerOptions): ParsedXMLObject {\n const opts: Required<RevisionWalkerOptions> = {\n acceptInsertions: options?.acceptInsertions ?? true,\n acceptDeletions: options?.acceptDeletions ?? true,\n acceptMoves: options?.acceptMoves ?? true,\n acceptPropertyChanges: options?.acceptPropertyChanges ?? true,\n };\n\n // Deep clone the object to avoid mutating the original\n const clone = RevisionWalker.deepClone(obj);\n\n // Walk and transform the tree\n RevisionWalker.walkAndTransform(clone, opts);\n\n return clone;\n }\n\n /**\n * Deep clone an object\n */\n private static deepClone(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => RevisionWalker.deepClone(item));\n }\n\n const clone: any = {};\n for (const key of Object.keys(obj)) {\n clone[key] = RevisionWalker.deepClone(obj[key]);\n }\n return clone;\n }\n\n /**\n * Recursively walk and transform the object tree\n * Processes children first (depth-first) to handle nested revisions\n */\n private static walkAndTransform(obj: any, options: Required<RevisionWalkerOptions>): void {\n if (obj === null || typeof obj !== 'object') {\n return;\n }\n\n // Pre-recursion: row-level tracked deletions (CT_TrPr > w:del per\n // §17.13.5.14). Must run BEFORE the depth-first recursion — otherwise\n // processRevisions in trPr would strip the w:del marker before we can\n // detect it at the table level. The default `w:del` removal in\n // processRevisions only strips the marker itself, leaving a zombie\n // empty row; per spec, accepting the deletion removes the entire row.\n if (options.acceptDeletions && obj['w:tr']) {\n RevisionWalker.filterDeletedRows(obj);\n }\n\n // Get keys to process (excluding metadata keys)\n const keys = Object.keys(obj).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n // First pass: recurse into children (depth-first)\n for (const key of keys) {\n const value = obj[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n RevisionWalker.walkAndTransform(item, options);\n }\n } else if (typeof value === 'object' && value !== null) {\n RevisionWalker.walkAndTransform(value, options);\n }\n }\n\n // Second pass: process revision elements at this level\n // We need to iterate carefully because we're modifying the object\n RevisionWalker.processRevisions(obj, options);\n }\n\n /**\n * Remove `<w:tr>` entries whose `<w:trPr>` contains a self-closing\n * `<w:del/>` row-level deletion marker. Operates on the parsed-object\n * representation (arrays when multiple, single object otherwise).\n */\n private static filterDeletedRows(tbl: any): void {\n const rows = tbl['w:tr'];\n const isRowDeleted = (row: any): boolean => {\n if (!row || typeof row !== 'object') return false;\n const trPr = row['w:trPr'];\n if (!trPr || typeof trPr !== 'object') return false;\n // w:del at row level is a CT_TrackChange (no children). When absent\n // the parser leaves no key; when present it's a self-closing tag\n // parsed as an object with only @_w:id/@_w:author/@_w:date keys.\n return !!trPr['w:del'];\n };\n\n if (Array.isArray(rows)) {\n const kept = rows.filter((r) => !isRowDeleted(r));\n if (kept.length !== rows.length) {\n if (kept.length === 0) {\n delete tbl['w:tr'];\n } else {\n tbl['w:tr'] = kept;\n }\n }\n } else if (isRowDeleted(rows)) {\n delete tbl['w:tr'];\n }\n }\n\n /**\n * Process revision elements at the current level\n */\n private static processRevisions(parent: any, options: Required<RevisionWalkerOptions>): void {\n if (!parent || typeof parent !== 'object') {\n return;\n }\n\n const keysToProcess = Object.keys(parent).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n for (const key of keysToProcess) {\n // Check if this is a revision element\n if (RevisionWalker.shouldUnwrap(key, options)) {\n RevisionWalker.unwrapAllElements(parent, key);\n } else if (RevisionWalker.shouldRemove(key, options)) {\n RevisionWalker.removeAllElements(parent, key);\n }\n }\n }\n\n /**\n * Check if an element should be unwrapped (content kept)\n */\n private static shouldUnwrap(key: string, options: Required<RevisionWalkerOptions>): boolean {\n if (REVISION_ELEMENTS.UNWRAP.includes(key)) {\n if (key === 'w:ins' && !options.acceptInsertions) return false;\n if (key === 'w:moveTo' && !options.acceptMoves) return false;\n return true;\n }\n return false;\n }\n\n /**\n * Check if an element should be removed (content discarded)\n */\n private static shouldRemove(key: string, options: Required<RevisionWalkerOptions>): boolean {\n if (REVISION_ELEMENTS.REMOVE.includes(key)) {\n if (key === 'w:del' && !options.acceptDeletions) return false;\n if (key === 'w:moveFrom' && !options.acceptMoves) return false;\n return true;\n }\n if (REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key)) {\n return options.acceptPropertyChanges;\n }\n if (REVISION_ELEMENTS.RANGE_MARKERS.includes(key)) {\n return true; // Always remove range markers\n }\n return false;\n }\n\n /**\n * Unwrap all elements of a given type, promoting their children to parent\n *\n * This is the most complex operation in RevisionWalker. When we unwrap a\n * revision element like w:ins, we need to:\n * 1. Extract the children from inside w:ins\n * 2. Insert them at the correct position in the parent's element arrays\n * 3. Update _orderedChildren to reflect the new structure\n *\n * The key challenge is maintaining correct element order. For example:\n * Before: <w:tbl><w:tr>Row1</w:tr><w:ins><w:tr>Row2</w:tr></w:ins><w:tr>Row3</w:tr></w:tbl>\n * After: <w:tbl><w:tr>Row1</w:tr><w:tr>Row2</w:tr><w:tr>Row3</w:tr></w:tbl>\n */\n private static unwrapAllElements(parent: any, key: string): void {\n const elements = parent[key];\n if (!elements) return;\n\n const elementArray = Array.isArray(elements) ? elements : [elements];\n\n // Build a complete ordered list of child elements by walking _orderedChildren\n // This captures the intended order before we modify anything\n const orderedElements: { type: string; element: any }[] = [];\n\n if (parent._orderedChildren) {\n // Track how many of each type we've seen to get correct array index\n const typeCounters = new Map<string, number>();\n let unwrappedIndex = 0;\n\n for (const entry of parent._orderedChildren) {\n const { type } = entry;\n\n if (type === key) {\n // This is a revision element - extract its children in order\n const revElement = elementArray[unwrappedIndex];\n unwrappedIndex++;\n\n if (revElement && typeof revElement === 'object') {\n if (revElement._orderedChildren) {\n // Use the revision element's _orderedChildren for correct order\n const childCounters = new Map<string, number>();\n for (const childEntry of revElement._orderedChildren) {\n const childType = childEntry.type;\n const childIdx = childCounters.get(childType) || 0;\n childCounters.set(childType, childIdx + 1);\n\n const childElements = revElement[childType];\n if (childElements) {\n const childArray = Array.isArray(childElements) ? childElements : [childElements];\n if (childIdx < childArray.length) {\n orderedElements.push({\n type: childType,\n element: childArray[childIdx],\n });\n }\n }\n }\n } else {\n // No _orderedChildren, extract children in object key order\n const childKeys = Object.keys(revElement).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n for (const childKey of childKeys) {\n const childValue = revElement[childKey];\n const childArray = Array.isArray(childValue) ? childValue : [childValue];\n for (const child of childArray) {\n orderedElements.push({ type: childKey, element: child });\n }\n }\n }\n }\n } else {\n // Regular element - get it from the parent\n const idx = typeCounters.get(type) || 0;\n typeCounters.set(type, idx + 1);\n\n const parentElements = parent[type];\n if (parentElements) {\n const parentArray = Array.isArray(parentElements) ? parentElements : [parentElements];\n if (idx < parentArray.length) {\n orderedElements.push({ type, element: parentArray[idx] });\n }\n }\n }\n }\n }\n\n // Remove the revision wrapper\n delete parent[key];\n\n // If we have ordered elements, rebuild the arrays in correct order\n if (orderedElements.length > 0) {\n // Group elements by type\n const rebuiltArrays = new Map<string, any[]>();\n\n for (const { type, element } of orderedElements) {\n if (!rebuiltArrays.has(type)) {\n rebuiltArrays.set(type, []);\n }\n rebuiltArrays.get(type)!.push(element);\n }\n\n // Update parent with rebuilt arrays\n for (const [type, elements] of rebuiltArrays) {\n if (elements.length === 1) {\n parent[type] = elements[0];\n } else {\n parent[type] = elements;\n }\n }\n\n // Rebuild _orderedChildren\n const newOrderedChildren: OrderedChildInfo[] = [];\n const typeCounters = new Map<string, number>();\n\n for (const { type } of orderedElements) {\n const idx = typeCounters.get(type) || 0;\n typeCounters.set(type, idx + 1);\n newOrderedChildren.push({ type, index: idx });\n }\n\n parent._orderedChildren = newOrderedChildren;\n } else {\n // Fallback for when there's no _orderedChildren - just merge\n for (const element of elementArray) {\n if (!element || typeof element !== 'object') continue;\n\n const elementKeys = Object.keys(element).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n for (const childKey of elementKeys) {\n RevisionWalker.mergeIntoParent(parent, childKey, element[childKey]);\n }\n }\n }\n }\n\n /**\n * Remove all elements of a given type (including their content)\n */\n private static removeAllElements(parent: any, key: string): void {\n if (!parent[key]) return;\n\n // Update _orderedChildren before removing\n if (parent._orderedChildren) {\n parent._orderedChildren = parent._orderedChildren.filter(\n (c: OrderedChildInfo) => c.type !== key\n );\n // Re-index remaining elements of same types\n RevisionWalker.reindexOrderedChildren(parent._orderedChildren);\n }\n\n // Remove the element\n delete parent[key];\n }\n\n /**\n * Merge a child value into the parent, handling arrays properly\n */\n private static mergeIntoParent(parent: any, childKey: string, childValue: any): void {\n if (parent[childKey] === undefined) {\n // No existing value, just assign\n parent[childKey] = childValue;\n } else {\n // Existing value, need to merge\n const existing = parent[childKey];\n const incoming = Array.isArray(childValue) ? childValue : [childValue];\n\n if (Array.isArray(existing)) {\n parent[childKey] = [...existing, ...incoming];\n } else {\n parent[childKey] = [existing, ...incoming];\n }\n }\n }\n\n /**\n * Re-index _orderedChildren to ensure indices are sequential per type\n */\n private static reindexOrderedChildren(orderedChildren: OrderedChildInfo[]): void {\n const typeCounters = new Map<string, number>();\n\n for (const entry of orderedChildren) {\n const currentIndex = typeCounters.get(entry.type) || 0;\n entry.index = currentIndex;\n typeCounters.set(entry.type, currentIndex + 1);\n }\n }\n\n /**\n * Check if an element is a revision-related element (any type)\n */\n static isRevisionElement(key: string): boolean {\n return (\n REVISION_ELEMENTS.UNWRAP.includes(key) ||\n REVISION_ELEMENTS.REMOVE.includes(key) ||\n REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key) ||\n REVISION_ELEMENTS.RANGE_MARKERS.includes(key)\n );\n }\n\n /**\n * Get revision element categories (for external use/testing)\n */\n static getRevisionElementCategories(): typeof REVISION_ELEMENTS {\n return { ...REVISION_ELEMENTS };\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Document } from '../core/Document';
|
|
2
|
-
import { RevisionType } from '../elements/Revision';
|
|
3
|
-
import { SelectionCriteria } from './RevisionAwareProcessor';
|
|
1
|
+
import type { Document } from '../core/Document.js';
|
|
2
|
+
import { RevisionType } from '../elements/Revision.js';
|
|
3
|
+
import { SelectionCriteria } from './RevisionAwareProcessor.js';
|
|
4
4
|
export interface SelectiveAcceptResult {
|
|
5
5
|
accepted: string[];
|
|
6
6
|
rejected: string[];
|
|
@@ -15,6 +15,7 @@ export interface SelectiveAcceptResult {
|
|
|
15
15
|
export declare class SelectiveRevisionAcceptor {
|
|
16
16
|
static accept(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult;
|
|
17
17
|
static reject(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult;
|
|
18
|
+
private static walkAllParagraphs;
|
|
18
19
|
private static processSelectiveParagraph;
|
|
19
20
|
private static matchesMarkerCriteria;
|
|
20
21
|
private static acceptRevisionItem;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectiveRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/processors/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAY,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAKhE,MAAM,WAAW,qBAAqB;IAEpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD,qBAAa,yBAAyB;IAUpC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,qBAAqB;IA4DhF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,qBAAqB;IA0DhF,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAiFhC,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAmExC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA8CpC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAmDjC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAwDjC,MAAM,CAAC,OAAO,CACZ,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAC1B,qBAAqB;IAYxB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAW3E,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAW3E,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,qBAAqB;IAWhF,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,qBAAqB;IAWhF,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,qBAAqB;IAazE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,qBAAqB;IAYxE,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAUjE,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAUhE,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAUpE,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAOrE,OAAO,CAAC,MAAM,CAAC,eAAe;IAuD9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;CA8BnC"}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectiveRevisionAcceptor = void 0;
|
|
4
|
+
const Revision_js_1 = require("../elements/Revision.js");
|
|
5
|
+
const RevisionContent_js_1 = require("../elements/RevisionContent.js");
|
|
6
|
+
class SelectiveRevisionAcceptor {
|
|
7
|
+
static accept(doc, criteria) {
|
|
8
|
+
const accepted = [];
|
|
9
|
+
const remaining = [];
|
|
10
|
+
const hasFullApi = typeof doc.getAllParagraphs === 'function';
|
|
11
|
+
if (hasFullApi) {
|
|
12
|
+
this.walkAllParagraphs(doc, (paragraph) => {
|
|
13
|
+
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
const revisionManager = doc.getRevisionManager();
|
|
18
|
+
if (revisionManager) {
|
|
19
|
+
const allRevisions = revisionManager.getAllRevisions();
|
|
20
|
+
for (const rev of allRevisions) {
|
|
21
|
+
if (this.matchesCriteria(rev, criteria)) {
|
|
22
|
+
accepted.push(rev.getId().toString());
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
remaining.push(rev.getId().toString());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const revisionManager = doc.getRevisionManager();
|
|
31
|
+
if (revisionManager) {
|
|
32
|
+
for (const id of accepted) {
|
|
33
|
+
revisionManager.removeById(parseInt(id, 10));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
accepted,
|
|
38
|
+
rejected: [],
|
|
39
|
+
remaining,
|
|
40
|
+
summary: {
|
|
41
|
+
totalProcessed: accepted.length + remaining.length,
|
|
42
|
+
acceptedCount: accepted.length,
|
|
43
|
+
rejectedCount: 0,
|
|
44
|
+
remainingCount: remaining.length,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
static reject(doc, criteria) {
|
|
49
|
+
const rejected = [];
|
|
50
|
+
const remaining = [];
|
|
51
|
+
const hasFullApi = typeof doc.getAllParagraphs === 'function';
|
|
52
|
+
if (hasFullApi) {
|
|
53
|
+
this.walkAllParagraphs(doc, (paragraph) => {
|
|
54
|
+
this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const revisionManager = doc.getRevisionManager();
|
|
59
|
+
if (revisionManager) {
|
|
60
|
+
const allRevisions = revisionManager.getAllRevisions();
|
|
61
|
+
for (const rev of allRevisions) {
|
|
62
|
+
if (this.matchesCriteria(rev, criteria)) {
|
|
63
|
+
rejected.push(rev.getId().toString());
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
remaining.push(rev.getId().toString());
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const revisionManager = doc.getRevisionManager();
|
|
72
|
+
if (revisionManager) {
|
|
73
|
+
for (const id of rejected) {
|
|
74
|
+
revisionManager.removeById(parseInt(id, 10));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
accepted: [],
|
|
79
|
+
rejected,
|
|
80
|
+
remaining,
|
|
81
|
+
summary: {
|
|
82
|
+
totalProcessed: rejected.length + remaining.length,
|
|
83
|
+
acceptedCount: 0,
|
|
84
|
+
rejectedCount: rejected.length,
|
|
85
|
+
remainingCount: remaining.length,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
static walkAllParagraphs(doc, visit) {
|
|
90
|
+
for (const paragraph of doc.getAllParagraphs()) {
|
|
91
|
+
visit(paragraph);
|
|
92
|
+
}
|
|
93
|
+
for (const table of doc.getTables()) {
|
|
94
|
+
for (const row of table.getRows()) {
|
|
95
|
+
for (const cell of row.getCells()) {
|
|
96
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
97
|
+
visit(paragraph);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const hfManager = doc.getHeaderFooterManager?.();
|
|
103
|
+
if (hfManager) {
|
|
104
|
+
for (const headerEntry of hfManager.getAllHeaders()) {
|
|
105
|
+
for (const element of headerEntry.header.getElements()) {
|
|
106
|
+
if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {
|
|
107
|
+
visit(element);
|
|
108
|
+
}
|
|
109
|
+
else if (typeof element.getRows === 'function') {
|
|
110
|
+
for (const row of element.getRows()) {
|
|
111
|
+
for (const cell of row.getCells()) {
|
|
112
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
113
|
+
visit(paragraph);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (const footerEntry of hfManager.getAllFooters()) {
|
|
121
|
+
for (const element of footerEntry.footer.getElements()) {
|
|
122
|
+
if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {
|
|
123
|
+
visit(element);
|
|
124
|
+
}
|
|
125
|
+
else if (typeof element.getRows === 'function') {
|
|
126
|
+
for (const row of element.getRows()) {
|
|
127
|
+
for (const cell of row.getCells()) {
|
|
128
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
129
|
+
visit(paragraph);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const footnoteManager = doc.getFootnoteManager?.();
|
|
138
|
+
if (footnoteManager) {
|
|
139
|
+
for (const fn of footnoteManager.getAllFootnotes()) {
|
|
140
|
+
for (const paragraph of fn.getParagraphs()) {
|
|
141
|
+
visit(paragraph);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const endnoteManager = doc.getEndnoteManager?.();
|
|
146
|
+
if (endnoteManager) {
|
|
147
|
+
for (const en of endnoteManager.getAllEndnotes()) {
|
|
148
|
+
for (const paragraph of en.getParagraphs()) {
|
|
149
|
+
visit(paragraph);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
static processSelectiveParagraph(paragraph, criteria, action, processedIds, remainingIds) {
|
|
155
|
+
const content = paragraph.getContent();
|
|
156
|
+
const newContent = [];
|
|
157
|
+
for (const item of content) {
|
|
158
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
159
|
+
const revisionId = item.getId().toString();
|
|
160
|
+
if (this.matchesCriteria(item, criteria)) {
|
|
161
|
+
processedIds.push(revisionId);
|
|
162
|
+
if (action === 'accept') {
|
|
163
|
+
this.acceptRevisionItem(item, newContent);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.rejectRevisionItem(item, newContent);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
remainingIds.push(revisionId);
|
|
171
|
+
newContent.push(item);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
newContent.push(item);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
paragraph.setContent(newContent);
|
|
179
|
+
const formatting = paragraph.getFormatting();
|
|
180
|
+
if (formatting.paragraphMarkDeletion) {
|
|
181
|
+
const del = formatting.paragraphMarkDeletion;
|
|
182
|
+
if (this.matchesMarkerCriteria(del, criteria)) {
|
|
183
|
+
paragraph.clearParagraphMarkDeletion();
|
|
184
|
+
processedIds.push(del.id.toString());
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
remainingIds.push(del.id.toString());
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (formatting.paragraphMarkInsertion) {
|
|
191
|
+
const ins = formatting.paragraphMarkInsertion;
|
|
192
|
+
if (this.matchesMarkerCriteria(ins, criteria)) {
|
|
193
|
+
paragraph.clearParagraphMarkInsertion();
|
|
194
|
+
processedIds.push(ins.id.toString());
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
remainingIds.push(ins.id.toString());
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
static matchesMarkerCriteria(marker, criteria) {
|
|
202
|
+
if (!criteria.ids &&
|
|
203
|
+
!criteria.types &&
|
|
204
|
+
!criteria.authors &&
|
|
205
|
+
!criteria.dateRange &&
|
|
206
|
+
!criteria.categories &&
|
|
207
|
+
!criteria.custom) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
if (criteria.ids && !criteria.ids.includes(marker.id)) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
if (criteria.authors && !criteria.authors.includes(marker.author)) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
if (criteria.dateRange) {
|
|
217
|
+
if (marker.date < criteria.dateRange.start || marker.date > criteria.dateRange.end) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (criteria.types || criteria.categories || criteria.custom) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
static acceptRevisionItem(revision, newContent) {
|
|
227
|
+
const revisionType = revision.getType();
|
|
228
|
+
const childContent = revision.getContent();
|
|
229
|
+
switch (revisionType) {
|
|
230
|
+
case 'insert':
|
|
231
|
+
case 'moveTo':
|
|
232
|
+
for (const child of childContent) {
|
|
233
|
+
if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
234
|
+
newContent.push(child);
|
|
235
|
+
}
|
|
236
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
237
|
+
newContent.push(child);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
break;
|
|
241
|
+
case 'delete':
|
|
242
|
+
case 'moveFrom':
|
|
243
|
+
break;
|
|
244
|
+
case 'runPropertiesChange':
|
|
245
|
+
case 'paragraphPropertiesChange':
|
|
246
|
+
case 'tablePropertiesChange':
|
|
247
|
+
case 'tableExceptionPropertiesChange':
|
|
248
|
+
case 'tableRowPropertiesChange':
|
|
249
|
+
case 'tableCellPropertiesChange':
|
|
250
|
+
case 'sectionPropertiesChange':
|
|
251
|
+
case 'numberingChange':
|
|
252
|
+
for (const child of childContent) {
|
|
253
|
+
if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
254
|
+
newContent.push(child);
|
|
255
|
+
}
|
|
256
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
257
|
+
newContent.push(child);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
newContent.push(revision);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
static rejectRevisionItem(revision, newContent) {
|
|
266
|
+
const revisionType = revision.getType();
|
|
267
|
+
const childContent = revision.getContent();
|
|
268
|
+
switch (revisionType) {
|
|
269
|
+
case 'insert':
|
|
270
|
+
case 'moveTo':
|
|
271
|
+
break;
|
|
272
|
+
case 'delete':
|
|
273
|
+
case 'moveFrom':
|
|
274
|
+
for (const child of childContent) {
|
|
275
|
+
if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
276
|
+
newContent.push(child);
|
|
277
|
+
}
|
|
278
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
279
|
+
newContent.push(child);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
case 'runPropertiesChange':
|
|
284
|
+
case 'paragraphPropertiesChange':
|
|
285
|
+
case 'tablePropertiesChange':
|
|
286
|
+
case 'tableExceptionPropertiesChange':
|
|
287
|
+
case 'tableRowPropertiesChange':
|
|
288
|
+
case 'tableCellPropertiesChange':
|
|
289
|
+
case 'sectionPropertiesChange':
|
|
290
|
+
case 'numberingChange':
|
|
291
|
+
for (const child of childContent) {
|
|
292
|
+
if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
293
|
+
newContent.push(child);
|
|
294
|
+
}
|
|
295
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
296
|
+
newContent.push(child);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
break;
|
|
300
|
+
default:
|
|
301
|
+
newContent.push(revision);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
static preview(doc, criteria, action) {
|
|
305
|
+
return action === 'accept' ? this.accept(doc, criteria) : this.reject(doc, criteria);
|
|
306
|
+
}
|
|
307
|
+
static acceptByAuthor(doc, author) {
|
|
308
|
+
return this.accept(doc, { authors: [author] });
|
|
309
|
+
}
|
|
310
|
+
static rejectByAuthor(doc, author) {
|
|
311
|
+
return this.reject(doc, { authors: [author] });
|
|
312
|
+
}
|
|
313
|
+
static acceptByType(doc, types) {
|
|
314
|
+
return this.accept(doc, { types });
|
|
315
|
+
}
|
|
316
|
+
static rejectByType(doc, types) {
|
|
317
|
+
return this.reject(doc, { types });
|
|
318
|
+
}
|
|
319
|
+
static acceptBeforeDate(doc, date) {
|
|
320
|
+
return this.accept(doc, {
|
|
321
|
+
dateRange: { start: new Date(0), end: date },
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
static acceptAfterDate(doc, date) {
|
|
325
|
+
return this.accept(doc, {
|
|
326
|
+
dateRange: { start: date, end: new Date() },
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
static acceptInsertionsOnly(doc) {
|
|
330
|
+
return this.accept(doc, { types: ['insert'] });
|
|
331
|
+
}
|
|
332
|
+
static acceptDeletionsOnly(doc) {
|
|
333
|
+
return this.accept(doc, { types: ['delete'] });
|
|
334
|
+
}
|
|
335
|
+
static rejectFormattingChanges(doc) {
|
|
336
|
+
return this.reject(doc, { categories: ['formatting'] });
|
|
337
|
+
}
|
|
338
|
+
static acceptContentChangesOnly(doc) {
|
|
339
|
+
return this.accept(doc, { categories: ['content'] });
|
|
340
|
+
}
|
|
341
|
+
static matchesCriteria(revision, criteria) {
|
|
342
|
+
if (!criteria.ids &&
|
|
343
|
+
!criteria.types &&
|
|
344
|
+
!criteria.authors &&
|
|
345
|
+
!criteria.dateRange &&
|
|
346
|
+
!criteria.categories &&
|
|
347
|
+
!criteria.custom) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
if (criteria.ids && !criteria.ids.includes(revision.getId())) {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
if (criteria.types && !criteria.types.includes(revision.getType())) {
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
if (criteria.dateRange) {
|
|
360
|
+
const date = revision.getDate();
|
|
361
|
+
if (date < criteria.dateRange.start || date > criteria.dateRange.end) {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (criteria.categories) {
|
|
366
|
+
const category = this.getRevisionCategory(revision);
|
|
367
|
+
if (!criteria.categories.includes(category)) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (criteria.custom && !criteria.custom(revision)) {
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
static getRevisionCategory(revision) {
|
|
377
|
+
const type = revision.getType();
|
|
378
|
+
if (type === 'insert' || type === 'delete') {
|
|
379
|
+
return 'content';
|
|
380
|
+
}
|
|
381
|
+
if (type === 'runPropertiesChange' ||
|
|
382
|
+
type === 'paragraphPropertiesChange' ||
|
|
383
|
+
type === 'numberingChange') {
|
|
384
|
+
return 'formatting';
|
|
385
|
+
}
|
|
386
|
+
if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {
|
|
387
|
+
return 'structural';
|
|
388
|
+
}
|
|
389
|
+
if (type === 'tablePropertiesChange' ||
|
|
390
|
+
type === 'tableExceptionPropertiesChange' ||
|
|
391
|
+
type === 'tableRowPropertiesChange' ||
|
|
392
|
+
type === 'tableCellPropertiesChange' ||
|
|
393
|
+
type === 'tableCellInsert' ||
|
|
394
|
+
type === 'tableCellDelete' ||
|
|
395
|
+
type === 'tableCellMerge') {
|
|
396
|
+
return 'table';
|
|
397
|
+
}
|
|
398
|
+
return 'content';
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
exports.SelectiveRevisionAcceptor = SelectiveRevisionAcceptor;
|
|
402
|
+
//# sourceMappingURL=SelectiveRevisionAcceptor.js.map
|