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
|
@@ -14,14 +14,18 @@
|
|
|
14
14
|
* @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import type { Document } from '../core/Document';
|
|
18
|
-
import { Paragraph } from '../elements/Paragraph';
|
|
19
|
-
import type { ParagraphContent } from '../elements/Paragraph';
|
|
20
|
-
import { Revision, RevisionType } from '../elements/Revision';
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
import type { Document } from '../core/Document.js';
|
|
18
|
+
import { Paragraph } from '../elements/Paragraph.js';
|
|
19
|
+
import type { ParagraphContent } from '../elements/Paragraph.js';
|
|
20
|
+
import { Revision, RevisionType } from '../elements/Revision.js';
|
|
21
|
+
import {
|
|
22
|
+
isRunContent,
|
|
23
|
+
isHyperlinkContent,
|
|
24
|
+
isImageRunContent,
|
|
25
|
+
} from '../elements/RevisionContent.js';
|
|
26
|
+
import { ComplexField } from '../elements/Field.js';
|
|
27
|
+
import { Table } from '../elements/Table.js';
|
|
28
|
+
import { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger.js';
|
|
25
29
|
|
|
26
30
|
/**
|
|
27
31
|
* Get scoped logger for this module
|
|
@@ -240,6 +244,31 @@ export function acceptRevisionsInMemory(
|
|
|
240
244
|
result.propertyChangesAccepted++;
|
|
241
245
|
}
|
|
242
246
|
|
|
247
|
+
// Row-level tracked ins / del (CT_TrPr: w:ins / w:del per ECMA-376
|
|
248
|
+
// §17.13.5.19 / §17.13.5.14) — these mark the ENTIRE row as a tracked
|
|
249
|
+
// insertion or deletion. Previously the acceptor only cleared the
|
|
250
|
+
// tcPrChange / trPrChange / cellRevision metadata and silently ignored
|
|
251
|
+
// row-level markers, so deleted rows persisted and inserted rows kept
|
|
252
|
+
// their pending state. Collect deletion indices up front so we can
|
|
253
|
+
// splice them out after iteration (reverse order to keep indices stable).
|
|
254
|
+
const rowsToRemove: number[] = [];
|
|
255
|
+
const allRows = table.getRows();
|
|
256
|
+
for (let rowIdx = 0; rowIdx < allRows.length; rowIdx++) {
|
|
257
|
+
const row = allRows[rowIdx]!;
|
|
258
|
+
const fmt = row.getFormatting();
|
|
259
|
+
if (fmt.rowInsertion && opts.acceptInsertions) {
|
|
260
|
+
row.setRowInsertion(undefined);
|
|
261
|
+
result.insertionsAccepted++;
|
|
262
|
+
}
|
|
263
|
+
if (fmt.rowDeletion && opts.acceptDeletions) {
|
|
264
|
+
rowsToRemove.push(rowIdx);
|
|
265
|
+
result.deletionsAccepted++;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
for (let i = rowsToRemove.length - 1; i >= 0; i--) {
|
|
269
|
+
table._removeRowAtIndex(rowsToRemove[i]!);
|
|
270
|
+
}
|
|
271
|
+
|
|
243
272
|
for (const row of table.getRows()) {
|
|
244
273
|
// Clear trPrChange on row
|
|
245
274
|
if (opts.acceptPropertyChanges && row.getTrPrChange()) {
|
|
@@ -254,10 +283,28 @@ export function acceptRevisionsInMemory(
|
|
|
254
283
|
result.propertyChangesAccepted++;
|
|
255
284
|
}
|
|
256
285
|
|
|
257
|
-
//
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
286
|
+
// Route cellIns / cellDel / cellMerge by their semantic revision type
|
|
287
|
+
// (per ECMA-376 §17.13.5.4-6). Previously all three were lumped under
|
|
288
|
+
// `acceptPropertyChanges`, which meant `{ acceptInsertions: true }`
|
|
289
|
+
// alone never cleared a cellIns marker, and `{ acceptPropertyChanges:
|
|
290
|
+
// true }` alone cleared everything including insertions. Correct
|
|
291
|
+
// mapping:
|
|
292
|
+
// - tableCellInsert (w:cellIns) → acceptInsertions
|
|
293
|
+
// - tableCellDelete (w:cellDel) → acceptDeletions
|
|
294
|
+
// - tableCellMerge (w:cellMerge) → acceptPropertyChanges
|
|
295
|
+
const cellRev = cell.getCellRevision();
|
|
296
|
+
if (cellRev) {
|
|
297
|
+
const revType = cellRev.getType();
|
|
298
|
+
if (revType === 'tableCellInsert' && opts.acceptInsertions) {
|
|
299
|
+
cell.clearCellRevision();
|
|
300
|
+
result.insertionsAccepted++;
|
|
301
|
+
} else if (revType === 'tableCellDelete' && opts.acceptDeletions) {
|
|
302
|
+
cell.clearCellRevision();
|
|
303
|
+
result.deletionsAccepted++;
|
|
304
|
+
} else if (revType === 'tableCellMerge' && opts.acceptPropertyChanges) {
|
|
305
|
+
cell.clearCellRevision();
|
|
306
|
+
result.propertyChangesAccepted++;
|
|
307
|
+
}
|
|
261
308
|
}
|
|
262
309
|
|
|
263
310
|
// Process paragraphs in the cell
|
|
@@ -385,6 +432,40 @@ export function acceptRevisionsInMemory(
|
|
|
385
432
|
}
|
|
386
433
|
}
|
|
387
434
|
|
|
435
|
+
// Walk footnote and endnote paragraphs. Per ECMA-376 §17.11.4 /
|
|
436
|
+
// §17.11.15, notes can hold any block-level content including
|
|
437
|
+
// tracked changes; programmatically-added Revision objects on note
|
|
438
|
+
// paragraphs (e.g.
|
|
439
|
+
// `footnote.getParagraphs()[0].addContent(new Revision(...))`)
|
|
440
|
+
// were never visited by the in-memory acceptor and stayed in the
|
|
441
|
+
// model after `acceptAllRevisions()`. The raw-XML acceptor
|
|
442
|
+
// (iter 135) already handles existing-document note revisions on
|
|
443
|
+
// load, so this loop's job is the programmatic-API path.
|
|
444
|
+
const footnoteManager = doc.getFootnoteManager?.();
|
|
445
|
+
if (footnoteManager) {
|
|
446
|
+
for (const fn of footnoteManager.getAllFootnotes()) {
|
|
447
|
+
for (const paragraph of fn.getParagraphs()) {
|
|
448
|
+
const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
|
|
449
|
+
result.insertionsAccepted += paragraphResult.insertionsAccepted;
|
|
450
|
+
result.deletionsAccepted += paragraphResult.deletionsAccepted;
|
|
451
|
+
result.movesAccepted += paragraphResult.movesAccepted;
|
|
452
|
+
result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
const endnoteManager = doc.getEndnoteManager?.();
|
|
457
|
+
if (endnoteManager) {
|
|
458
|
+
for (const en of endnoteManager.getAllEndnotes()) {
|
|
459
|
+
for (const paragraph of en.getParagraphs()) {
|
|
460
|
+
const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
|
|
461
|
+
result.insertionsAccepted += paragraphResult.insertionsAccepted;
|
|
462
|
+
result.deletionsAccepted += paragraphResult.deletionsAccepted;
|
|
463
|
+
result.movesAccepted += paragraphResult.movesAccepted;
|
|
464
|
+
result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
388
469
|
// Clear sectPrChange on document section
|
|
389
470
|
if (opts.acceptPropertyChanges) {
|
|
390
471
|
const section = doc.getSection();
|
|
@@ -581,6 +662,13 @@ function acceptRevisionsInParagraph(
|
|
|
581
662
|
paragraph.clearParagraphPropertiesChange();
|
|
582
663
|
result.propertyChangesAccepted++;
|
|
583
664
|
}
|
|
665
|
+
// Paragraph-mark rPrChange (CT_ParaRPrChange, §17.3.1.30) — same
|
|
666
|
+
// rationale as pPrChange: acceptance clears the "previous" snapshot,
|
|
667
|
+
// current formatting (paragraphMarkRunProperties) stays intact.
|
|
668
|
+
if (formatting.paragraphMarkRunPropertiesChange) {
|
|
669
|
+
paragraph.formatting.paragraphMarkRunPropertiesChange = undefined;
|
|
670
|
+
result.propertyChangesAccepted++;
|
|
671
|
+
}
|
|
584
672
|
}
|
|
585
673
|
|
|
586
674
|
// Clear paragraph mark deletion tracking if accepting deletions
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
35
|
|
|
36
|
-
import { Revision } from '../elements/Revision';
|
|
37
|
-
import { RangeMarker } from '../elements/RangeMarker';
|
|
38
|
-
import { Run } from '../elements/Run';
|
|
36
|
+
import { Revision } from '../elements/Revision.js';
|
|
37
|
+
import { RangeMarker } from '../elements/RangeMarker.js';
|
|
38
|
+
import { Run } from '../elements/Run.js';
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Options for creating a move operation
|
|
@@ -203,8 +203,8 @@ export class MoveOperationHelper {
|
|
|
203
203
|
* ```
|
|
204
204
|
*/
|
|
205
205
|
static addMoveOperation(
|
|
206
|
-
sourceParagraph: import('../elements/Paragraph').Paragraph,
|
|
207
|
-
destParagraph: import('../elements/Paragraph').Paragraph,
|
|
206
|
+
sourceParagraph: import('../elements/Paragraph.js').Paragraph,
|
|
207
|
+
destParagraph: import('../elements/Paragraph.js').Paragraph,
|
|
208
208
|
options: MoveOperationOptions
|
|
209
209
|
): MoveOperationResult {
|
|
210
210
|
const moveOp = this.createMoveOperation(options);
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
* @module RevisionAwareProcessor
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import type { Document } from '../core/Document';
|
|
15
|
-
import { Revision, RevisionType } from '../elements/Revision';
|
|
16
|
-
import { ChangeCategory, ChangeLocation } from './ChangelogGenerator';
|
|
14
|
+
import type { Document } from '../core/Document.js';
|
|
15
|
+
import { Revision, RevisionType } from '../elements/Revision.js';
|
|
16
|
+
import { ChangeCategory, ChangeLocation } from './ChangelogGenerator.js';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Revision handling modes for document processing.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @module RevisionWalker
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { ParsedXMLObject } from '../xml/XMLParser';
|
|
11
|
+
import { ParsedXMLObject } from '../xml/XMLParser.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Options for controlling which revision types to accept
|
|
@@ -143,6 +143,16 @@ export class RevisionWalker {
|
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
// Pre-recursion: row-level tracked deletions (CT_TrPr > w:del per
|
|
147
|
+
// §17.13.5.14). Must run BEFORE the depth-first recursion — otherwise
|
|
148
|
+
// processRevisions in trPr would strip the w:del marker before we can
|
|
149
|
+
// detect it at the table level. The default `w:del` removal in
|
|
150
|
+
// processRevisions only strips the marker itself, leaving a zombie
|
|
151
|
+
// empty row; per spec, accepting the deletion removes the entire row.
|
|
152
|
+
if (options.acceptDeletions && obj['w:tr']) {
|
|
153
|
+
RevisionWalker.filterDeletedRows(obj);
|
|
154
|
+
}
|
|
155
|
+
|
|
146
156
|
// Get keys to process (excluding metadata keys)
|
|
147
157
|
const keys = Object.keys(obj).filter(
|
|
148
158
|
(k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'
|
|
@@ -165,6 +175,37 @@ export class RevisionWalker {
|
|
|
165
175
|
RevisionWalker.processRevisions(obj, options);
|
|
166
176
|
}
|
|
167
177
|
|
|
178
|
+
/**
|
|
179
|
+
* Remove `<w:tr>` entries whose `<w:trPr>` contains a self-closing
|
|
180
|
+
* `<w:del/>` row-level deletion marker. Operates on the parsed-object
|
|
181
|
+
* representation (arrays when multiple, single object otherwise).
|
|
182
|
+
*/
|
|
183
|
+
private static filterDeletedRows(tbl: any): void {
|
|
184
|
+
const rows = tbl['w:tr'];
|
|
185
|
+
const isRowDeleted = (row: any): boolean => {
|
|
186
|
+
if (!row || typeof row !== 'object') return false;
|
|
187
|
+
const trPr = row['w:trPr'];
|
|
188
|
+
if (!trPr || typeof trPr !== 'object') return false;
|
|
189
|
+
// w:del at row level is a CT_TrackChange (no children). When absent
|
|
190
|
+
// the parser leaves no key; when present it's a self-closing tag
|
|
191
|
+
// parsed as an object with only @_w:id/@_w:author/@_w:date keys.
|
|
192
|
+
return !!trPr['w:del'];
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
if (Array.isArray(rows)) {
|
|
196
|
+
const kept = rows.filter((r) => !isRowDeleted(r));
|
|
197
|
+
if (kept.length !== rows.length) {
|
|
198
|
+
if (kept.length === 0) {
|
|
199
|
+
delete tbl['w:tr'];
|
|
200
|
+
} else {
|
|
201
|
+
tbl['w:tr'] = kept;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
} else if (isRowDeleted(rows)) {
|
|
205
|
+
delete tbl['w:tr'];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
168
209
|
/**
|
|
169
210
|
* Process revision elements at the current level
|
|
170
211
|
*/
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
* @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import type { Document } from '../core/Document';
|
|
16
|
-
import type { Paragraph, ParagraphContent } from '../elements/Paragraph';
|
|
17
|
-
import { Revision, RevisionType } from '../elements/Revision';
|
|
18
|
-
import type { Run } from '../elements/Run';
|
|
19
|
-
import { isRunContent, isHyperlinkContent } from '../elements/RevisionContent';
|
|
20
|
-
import { ChangeCategory } from './ChangelogGenerator';
|
|
21
|
-
import { SelectionCriteria } from './RevisionAwareProcessor';
|
|
15
|
+
import type { Document } from '../core/Document.js';
|
|
16
|
+
import type { Paragraph, ParagraphContent } from '../elements/Paragraph.js';
|
|
17
|
+
import { Revision, RevisionType } from '../elements/Revision.js';
|
|
18
|
+
import type { Run } from '../elements/Run.js';
|
|
19
|
+
import { isRunContent, isHyperlinkContent } from '../elements/RevisionContent.js';
|
|
20
|
+
import { ChangeCategory } from './ChangelogGenerator.js';
|
|
21
|
+
import { SelectionCriteria } from './RevisionAwareProcessor.js';
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Result of selective revision acceptance.
|
|
@@ -62,23 +62,9 @@ export class SelectiveRevisionAcceptor {
|
|
|
62
62
|
const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
|
|
63
63
|
|
|
64
64
|
if (hasFullApi) {
|
|
65
|
-
|
|
66
|
-
const paragraphs = (doc as any).getAllParagraphs();
|
|
67
|
-
for (const paragraph of paragraphs) {
|
|
65
|
+
this.walkAllParagraphs(doc, (paragraph) => {
|
|
68
66
|
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Process paragraphs in tables
|
|
72
|
-
const tables = (doc as any).getTables();
|
|
73
|
-
for (const table of tables) {
|
|
74
|
-
for (const row of table.getRows()) {
|
|
75
|
-
for (const cell of row.getCells()) {
|
|
76
|
-
for (const paragraph of cell.getParagraphs()) {
|
|
77
|
-
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
67
|
+
});
|
|
82
68
|
} else {
|
|
83
69
|
// Fallback: Filter revisions from RevisionManager only (for backward compatibility)
|
|
84
70
|
const revisionManager = doc.getRevisionManager();
|
|
@@ -136,23 +122,9 @@ export class SelectiveRevisionAcceptor {
|
|
|
136
122
|
const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
|
|
137
123
|
|
|
138
124
|
if (hasFullApi) {
|
|
139
|
-
|
|
140
|
-
const paragraphs = (doc as any).getAllParagraphs();
|
|
141
|
-
for (const paragraph of paragraphs) {
|
|
125
|
+
this.walkAllParagraphs(doc, (paragraph) => {
|
|
142
126
|
this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Process paragraphs in tables
|
|
146
|
-
const tables = (doc as any).getTables();
|
|
147
|
-
for (const table of tables) {
|
|
148
|
-
for (const row of table.getRows()) {
|
|
149
|
-
for (const cell of row.getCells()) {
|
|
150
|
-
for (const paragraph of cell.getParagraphs()) {
|
|
151
|
-
this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
127
|
+
});
|
|
156
128
|
} else {
|
|
157
129
|
// Fallback: Filter revisions from RevisionManager only (for backward compatibility)
|
|
158
130
|
const revisionManager = doc.getRevisionManager();
|
|
@@ -189,6 +161,93 @@ export class SelectiveRevisionAcceptor {
|
|
|
189
161
|
};
|
|
190
162
|
}
|
|
191
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Walk every paragraph that can carry tracked-change content per
|
|
166
|
+
* ECMA-376: body, tables (recursively), headers, footers, footnotes,
|
|
167
|
+
* and endnotes. Mirrors the in-memory acceptor traversal so
|
|
168
|
+
* selective accept / reject covers the same surface as
|
|
169
|
+
* `acceptRevisionsInMemory`. Comments are deliberately excluded —
|
|
170
|
+
* `Comment` stores `Run[]` rather than `Paragraph[]`, so revisions
|
|
171
|
+
* are never represented in the in-memory model and must be cleaned
|
|
172
|
+
* via the raw-XML path on load.
|
|
173
|
+
*/
|
|
174
|
+
private static walkAllParagraphs(
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
176
|
+
doc: any,
|
|
177
|
+
visit: (paragraph: Paragraph) => void
|
|
178
|
+
): void {
|
|
179
|
+
// Body paragraphs
|
|
180
|
+
for (const paragraph of doc.getAllParagraphs()) {
|
|
181
|
+
visit(paragraph);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Tables (body-level)
|
|
185
|
+
for (const table of doc.getTables()) {
|
|
186
|
+
for (const row of table.getRows()) {
|
|
187
|
+
for (const cell of row.getCells()) {
|
|
188
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
189
|
+
visit(paragraph);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Headers and footers
|
|
196
|
+
const hfManager = doc.getHeaderFooterManager?.();
|
|
197
|
+
if (hfManager) {
|
|
198
|
+
for (const headerEntry of hfManager.getAllHeaders()) {
|
|
199
|
+
for (const element of headerEntry.header.getElements()) {
|
|
200
|
+
if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {
|
|
201
|
+
// Paragraph
|
|
202
|
+
visit(element);
|
|
203
|
+
} else if (typeof element.getRows === 'function') {
|
|
204
|
+
// Table
|
|
205
|
+
for (const row of element.getRows()) {
|
|
206
|
+
for (const cell of row.getCells()) {
|
|
207
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
208
|
+
visit(paragraph);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
for (const footerEntry of hfManager.getAllFooters()) {
|
|
216
|
+
for (const element of footerEntry.footer.getElements()) {
|
|
217
|
+
if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {
|
|
218
|
+
visit(element);
|
|
219
|
+
} else if (typeof element.getRows === 'function') {
|
|
220
|
+
for (const row of element.getRows()) {
|
|
221
|
+
for (const cell of row.getCells()) {
|
|
222
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
223
|
+
visit(paragraph);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Footnotes and endnotes
|
|
233
|
+
const footnoteManager = doc.getFootnoteManager?.();
|
|
234
|
+
if (footnoteManager) {
|
|
235
|
+
for (const fn of footnoteManager.getAllFootnotes()) {
|
|
236
|
+
for (const paragraph of fn.getParagraphs()) {
|
|
237
|
+
visit(paragraph);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const endnoteManager = doc.getEndnoteManager?.();
|
|
242
|
+
if (endnoteManager) {
|
|
243
|
+
for (const en of endnoteManager.getAllEndnotes()) {
|
|
244
|
+
for (const paragraph of en.getParagraphs()) {
|
|
245
|
+
visit(paragraph);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
192
251
|
/**
|
|
193
252
|
* Process a paragraph for selective revision acceptance/rejection.
|
|
194
253
|
* Transforms matching revisions in-place using DOM transformation.
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* - fill: "auto" = inherit (continue resolution)
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import type { ShadingConfig } from '../elements/CommonTypes';
|
|
17
|
-
import type { Table } from '../elements/Table';
|
|
18
|
-
import type { TableCell } from '../elements/TableCell';
|
|
19
|
-
import type { StylesManager } from '../formatting/StylesManager';
|
|
20
|
-
import { getActiveConditionalsInPriorityOrder } from './cnfStyleDecoder';
|
|
16
|
+
import type { ShadingConfig } from '../elements/CommonTypes.js';
|
|
17
|
+
import type { Table } from '../elements/Table.js';
|
|
18
|
+
import type { TableCell } from '../elements/TableCell.js';
|
|
19
|
+
import type { StylesManager } from '../formatting/StylesManager.js';
|
|
20
|
+
import { getActiveConditionalsInPriorityOrder } from './cnfStyleDecoder.js';
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Resolves the effective shading for a table cell through the style hierarchy.
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import { ZipHandler } from '../zip/ZipHandler';
|
|
2
|
-
import { XMLParser } from '../xml/XMLParser';
|
|
3
|
-
import { RevisionWalker } from './RevisionWalker';
|
|
1
|
+
import { ZipHandler } from '../zip/ZipHandler.js';
|
|
2
|
+
import { XMLParser } from '../xml/XMLParser.js';
|
|
3
|
+
import { RevisionWalker } from './RevisionWalker.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Markers covered: w:ins, w:del, w:moveFrom, w:moveTo,
|
|
7
|
+
* w:rPrChange, w:pPrChange, w:tblPrChange, w:tblPrExChange,
|
|
8
|
+
* w:trPrChange, w:tcPrChange, w:sectPrChange, w:numberingChange,
|
|
9
|
+
* w:cellIns, w:cellDel, w:cellMerge, and any *RangeStart/End markers.
|
|
10
|
+
*/
|
|
11
|
+
const REVISION_MARKER_PATTERN =
|
|
12
|
+
/<w:(?:ins|del|moveFrom|moveTo|rPrChange|pPrChange|tblPrChange|tblPrExChange|trPrChange|tcPrChange|sectPrChange|numberingChange|cellIns|cellDel|cellMerge|moveFromRangeStart|moveFromRangeEnd|moveToRangeStart|moveToRangeEnd|customXmlInsRangeStart|customXmlInsRangeEnd|customXmlDelRangeStart|customXmlDelRangeEnd|customXmlMoveFromRangeStart|customXmlMoveFromRangeEnd|customXmlMoveToRangeStart|customXmlMoveToRangeEnd)\b/;
|
|
4
13
|
|
|
5
14
|
/**
|
|
6
15
|
* Accepts all tracked changes in a Word document per Microsoft's OpenXML SDK pattern
|
|
@@ -40,7 +49,14 @@ class RevisionAcceptor {
|
|
|
40
49
|
// Process document.xml
|
|
41
50
|
await this.processDocumentPart('word/document.xml');
|
|
42
51
|
|
|
43
|
-
// Process headers
|
|
52
|
+
// Process headers / footers / footnotes / endnotes / comments.
|
|
53
|
+
// Footnotes (§17.11.15), endnotes (§17.11.4), and comments (§17.13.4)
|
|
54
|
+
// can all carry block-level content including tracked changes
|
|
55
|
+
// (w:ins / w:del / pPrChange / rPrChange / moveFrom / moveTo).
|
|
56
|
+
// Previously only document.xml + headers + footers were walked,
|
|
57
|
+
// leaving footnote / endnote / comment revisions unaccepted so
|
|
58
|
+
// Word still showed the document as having pending tracked
|
|
59
|
+
// changes after `acceptAllRevisions()` returned.
|
|
44
60
|
const files = this.zipHandler.getFilePaths();
|
|
45
61
|
for (const file of files) {
|
|
46
62
|
if (/^word\/header\d+\.xml$/.exec(file)) {
|
|
@@ -50,6 +66,14 @@ class RevisionAcceptor {
|
|
|
50
66
|
await this.processDocumentPart(file);
|
|
51
67
|
}
|
|
52
68
|
}
|
|
69
|
+
// Singleton notes / comments parts. Check presence explicitly
|
|
70
|
+
// (not all documents have them) — processDocumentPart is a no-op
|
|
71
|
+
// on missing files.
|
|
72
|
+
for (const notesPath of ['word/footnotes.xml', 'word/endnotes.xml', 'word/comments.xml']) {
|
|
73
|
+
if (this.zipHandler.getFileAsString(notesPath)) {
|
|
74
|
+
await this.processDocumentPart(notesPath);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
53
77
|
|
|
54
78
|
// Clean up metadata files
|
|
55
79
|
this.cleanupPeopleXml();
|
|
@@ -61,12 +85,31 @@ class RevisionAcceptor {
|
|
|
61
85
|
* Process a document part (document.xml, header, footer) to accept revisions
|
|
62
86
|
*/
|
|
63
87
|
private async processDocumentPart(partPath: string): Promise<void> {
|
|
88
|
+
// Fast path: parts with no revision markup do not need to be re-serialised.
|
|
89
|
+
// Re-serialising a part destroys the original whitespace / formatting
|
|
90
|
+
// (XMLBuilder emits a different layout than the source), which can break
|
|
91
|
+
// byte-for-byte passthrough preservation in downstream consumers
|
|
92
|
+
// (e.g., comments.xml round-trip with no tracked changes inside).
|
|
93
|
+
const xml = this.zipHandler.getFileAsString(partPath);
|
|
94
|
+
if (!xml || !RevisionAcceptor.containsRevisionMarkup(xml)) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
64
98
|
if (this.useDomBasedProcessing) {
|
|
65
99
|
return this.processDocumentPartDOM(partPath);
|
|
66
100
|
}
|
|
67
101
|
return this.processDocumentPartRegex(partPath);
|
|
68
102
|
}
|
|
69
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Quick scan for any tracked-change marker. Returns false when the part
|
|
106
|
+
* carries none, allowing the acceptor to skip an unnecessary parse +
|
|
107
|
+
* re-serialise round-trip.
|
|
108
|
+
*/
|
|
109
|
+
private static containsRevisionMarkup(xml: string): boolean {
|
|
110
|
+
return REVISION_MARKER_PATTERN.test(xml);
|
|
111
|
+
}
|
|
112
|
+
|
|
70
113
|
/**
|
|
71
114
|
* DOM-based implementation of revision acceptance
|
|
72
115
|
* Uses XMLParser and RevisionWalker for reliable processing
|
|
@@ -200,23 +243,48 @@ class RevisionAcceptor {
|
|
|
200
243
|
}
|
|
201
244
|
|
|
202
245
|
/**
|
|
203
|
-
* Accept deletions - remove the entire <w:del> element including its content
|
|
246
|
+
* Accept deletions - remove the entire <w:del> element including its content.
|
|
204
247
|
*
|
|
205
|
-
* Per Microsoft SDK: "DeletedRun elements should be removed along with
|
|
248
|
+
* Per Microsoft SDK: "DeletedRun elements should be removed along with
|
|
249
|
+
* their content". Additionally, per ECMA-376 Part 1 §17.13.5.14, a
|
|
250
|
+
* self-closing `<w:del/>` inside `<w:trPr>` marks the entire row as a
|
|
251
|
+
* tracked deletion — accepting it must remove the entire `<w:tr>` block,
|
|
252
|
+
* not just the marker. Without that, zombie rows (the row wrapper with
|
|
253
|
+
* empty cells) persist in the document after revision acceptance.
|
|
206
254
|
*/
|
|
207
255
|
private acceptDeletions(xml: string): string {
|
|
208
256
|
let result = xml;
|
|
209
257
|
let previousLength = 0;
|
|
210
258
|
|
|
211
|
-
//
|
|
259
|
+
// Pass A — row-level deletion: remove entire <w:tr> whose <w:trPr>
|
|
260
|
+
// contains a self-closing row-deletion marker. Constraints:
|
|
261
|
+
// - `<w:trPr\b(?:\s[^>]*)?>` only matches the OPEN form of trPr (i.e.
|
|
262
|
+
// rejects self-closing `<w:trPr/>`, which by definition contains
|
|
263
|
+
// no del markers), so the match anchors on the correct row.
|
|
264
|
+
// - negative lookahead `(?!<w:tc\b|<w:tr\b|<\/w:tr>)` between the
|
|
265
|
+
// `<w:tr>` opening and the `<w:trPr>` prevents the match from
|
|
266
|
+
// slipping past a cell boundary or nested-table row and latching
|
|
267
|
+
// onto a later row's trPr-with-del.
|
|
268
|
+
const rowDelPattern =
|
|
269
|
+
/<w:tr\b[^>]*>(?:(?!<w:tc\b|<w:tr\b|<\/w:tr>)[\s\S])*?<w:trPr\b(?:\s[^>]*)?>(?:(?!<\/w:trPr>)[\s\S])*?<w:del\b[^>]*\/>(?:(?!<\/w:trPr>)[\s\S])*?<\/w:trPr>(?:(?!<w:tr\b|<\/w:tr>)[\s\S])*?<\/w:tr>/g;
|
|
270
|
+
previousLength = 0;
|
|
212
271
|
while (result.length !== previousLength) {
|
|
213
272
|
previousLength = result.length;
|
|
273
|
+
result = result.replace(rowDelPattern, '');
|
|
274
|
+
}
|
|
214
275
|
|
|
215
|
-
|
|
276
|
+
// Pass B — wrapper deletions: iterate until no more <w:del>..</w:del>
|
|
277
|
+
// elements (handles nested cases).
|
|
278
|
+
previousLength = 0;
|
|
279
|
+
while (result.length !== previousLength) {
|
|
280
|
+
previousLength = result.length;
|
|
216
281
|
result = result.replace(/<w:del\b[^>]*>[\s\S]*?<\/w:del>/g, '');
|
|
217
282
|
}
|
|
218
283
|
|
|
219
|
-
//
|
|
284
|
+
// Pass C — remove any remaining self-closing deletion markers (paragraph
|
|
285
|
+
// mark deletions inside pPr/rPr, orphans, etc.). By this point, any
|
|
286
|
+
// row-level markers have already triggered full-row removal in Pass A,
|
|
287
|
+
// so this pass only cleans up non-structural markers.
|
|
220
288
|
result = result.replace(/<w:del\b[^>]*\/>/g, '');
|
|
221
289
|
|
|
222
290
|
return result;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ZipHandler } from '../zip/ZipHandler';
|
|
1
|
+
import { ZipHandler } from '../zip/ZipHandler.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Strips all tracked changes markup from a Word document
|
|
@@ -13,11 +13,33 @@ class TrackedChangesStripper {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Main method to strip all tracked changes from the document
|
|
16
|
+
* Main method to strip all tracked changes from the document.
|
|
17
|
+
*
|
|
18
|
+
* Per ECMA-376 Part 1, tracked-change markup can appear in any
|
|
19
|
+
* part that carries block-level content: the body (§17.2 w:body),
|
|
20
|
+
* headers / footers (§17.10.3-4 CT_HdrFtr), footnotes (§17.11.15),
|
|
21
|
+
* endnotes (§17.11.4), and comments (§17.13.4). All of these
|
|
22
|
+
* must be walked — stripping document.xml alone would leave
|
|
23
|
+
* tracked changes visible in Word for every header / footer /
|
|
24
|
+
* note / comment revision.
|
|
17
25
|
*/
|
|
18
26
|
public async stripTrackedChanges(): Promise<void> {
|
|
19
|
-
//
|
|
20
|
-
await this.
|
|
27
|
+
// Always process the body.
|
|
28
|
+
await this.stripPartRevisions('word/document.xml');
|
|
29
|
+
|
|
30
|
+
// Process every header and footer part present in the ZIP.
|
|
31
|
+
for (const file of this.zipHandler.getFilePaths()) {
|
|
32
|
+
if (/^word\/header\d+\.xml$/.exec(file) || /^word\/footer\d+\.xml$/.exec(file)) {
|
|
33
|
+
await this.stripPartRevisions(file);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Process singleton notes / comments parts when present.
|
|
38
|
+
for (const path of ['word/footnotes.xml', 'word/endnotes.xml', 'word/comments.xml']) {
|
|
39
|
+
if (this.zipHandler.getFileAsString(path)) {
|
|
40
|
+
await this.stripPartRevisions(path);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
21
43
|
|
|
22
44
|
// Clean up metadata files
|
|
23
45
|
await this.cleanupPeopleXml();
|
|
@@ -26,15 +48,18 @@ class TrackedChangesStripper {
|
|
|
26
48
|
}
|
|
27
49
|
|
|
28
50
|
/**
|
|
29
|
-
* Strip ALL revision elements from
|
|
51
|
+
* Strip ALL revision elements from a single document part.
|
|
52
|
+
* The per-step pipeline is identical to the historical
|
|
53
|
+
* document.xml implementation; the only difference is the
|
|
54
|
+
* configurable source path.
|
|
30
55
|
*/
|
|
31
|
-
private async
|
|
32
|
-
const
|
|
33
|
-
if (!
|
|
56
|
+
private async stripPartRevisions(partPath: string): Promise<void> {
|
|
57
|
+
const xml = this.zipHandler.getFileAsString(partPath);
|
|
58
|
+
if (!xml) {
|
|
34
59
|
return;
|
|
35
60
|
}
|
|
36
61
|
|
|
37
|
-
let content =
|
|
62
|
+
let content = xml;
|
|
38
63
|
|
|
39
64
|
// STEP 1: Remove all range markers (boundary markers for tracked changes)
|
|
40
65
|
content = this.removeRangeMarkers(content);
|
|
@@ -56,7 +81,7 @@ class TrackedChangesStripper {
|
|
|
56
81
|
content = this.removeSelfClosingRevisionTags(content);
|
|
57
82
|
|
|
58
83
|
// Update the file in the zip
|
|
59
|
-
this.zipHandler.updateFile(
|
|
84
|
+
this.zipHandler.updateFile(partPath, content);
|
|
60
85
|
}
|
|
61
86
|
|
|
62
87
|
/**
|