docxmlater 10.0.2 → 10.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 -2
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.d.ts +0 -27
- package/dist/constants/limits.d.ts.map +1 -1
- package/dist/constants/limits.js +13 -13
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +23 -19
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +197 -63
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +59 -24
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.d.ts.map +1 -1
- package/dist/core/DocumentIdManager.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +6 -6
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +86 -55
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.d.ts.map +1 -1
- package/dist/core/Relationship.js +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.js +3 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.js +1 -1
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +8 -2
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -2
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +31 -28
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +6 -6
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +5 -5
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +2 -2
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +21 -5
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +2 -2
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +8 -0
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +153 -118
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts +1 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +44 -5
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +1 -3
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +127 -118
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +21 -0
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +20 -8
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -2
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +29 -35
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +2 -2
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +63 -67
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +6 -6
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +65 -47
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +1 -1
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +11 -11
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +4 -4
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +26 -26
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +87 -95
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +3 -3
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/compatibility-types.js.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/list-types.d.ts +4 -4
- package/dist/types/list-types.d.ts.map +1 -1
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +7 -7
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +23 -2
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts +1 -0
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +46 -0
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts +0 -28
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +5 -7
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +1 -1
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.d.ts +0 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +0 -7
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +2 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.js.map +1 -1
- 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 +3 -3
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -4
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -19
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +0 -2
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.js.map +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +10 -0
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +4 -5
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +34 -4
- package/src/__tests__/helper-methods.test.ts +512 -0
- package/src/constants/legacyCompatFlags.ts +138 -0
- package/src/constants/limits.ts +50 -0
- package/src/core/CLAUDE.md +109 -0
- package/src/core/Document.ts +15569 -0
- package/src/core/DocumentContent.ts +467 -0
- package/src/core/DocumentGenerator.ts +1104 -0
- package/src/core/DocumentIdManager.ts +158 -0
- package/src/core/DocumentParser.ts +10140 -0
- package/src/core/DocumentValidator.ts +372 -0
- package/src/core/Relationship.ts +367 -0
- package/src/core/RelationshipManager.ts +428 -0
- package/src/elements/AlternateContent.ts +42 -0
- package/src/elements/Bookmark.ts +210 -0
- package/src/elements/BookmarkManager.ts +250 -0
- package/src/elements/CLAUDE.md +126 -0
- package/src/elements/Comment.ts +359 -0
- package/src/elements/CommentManager.ts +502 -0
- package/src/elements/CommonTypes.ts +549 -0
- package/src/elements/CustomXml.ts +36 -0
- package/src/elements/Endnote.ts +217 -0
- package/src/elements/EndnoteManager.ts +249 -0
- package/src/elements/Field.ts +1233 -0
- package/src/elements/FieldHelpers.ts +333 -0
- package/src/elements/FontManager.ts +339 -0
- package/src/elements/Footer.ts +269 -0
- package/src/elements/Footnote.ts +217 -0
- package/src/elements/FootnoteManager.ts +249 -0
- package/src/elements/Header.ts +269 -0
- package/src/elements/HeaderFooterManager.ts +219 -0
- package/src/elements/Hyperlink.ts +1146 -0
- package/src/elements/Image.ts +1756 -0
- package/src/elements/ImageManager.ts +432 -0
- package/src/elements/ImageRun.ts +59 -0
- package/src/elements/MathElement.ts +65 -0
- package/src/elements/Paragraph.ts +4287 -0
- package/src/elements/PreservedElement.ts +53 -0
- package/src/elements/PropertyChangeTypes.ts +442 -0
- package/src/elements/RangeMarker.ts +400 -0
- package/src/elements/Revision.ts +1217 -0
- package/src/elements/RevisionContent.ts +73 -0
- package/src/elements/RevisionManager.ts +1070 -0
- package/src/elements/Run.ts +3068 -0
- package/src/elements/Section.ts +1421 -0
- package/src/elements/Shape.ts +873 -0
- package/src/elements/StructuredDocumentTag.ts +978 -0
- package/src/elements/Table.ts +2524 -0
- package/src/elements/TableCell.ts +1586 -0
- package/src/elements/TableGridChange.ts +151 -0
- package/src/elements/TableOfContents.ts +691 -0
- package/src/elements/TableOfContentsElement.ts +89 -0
- package/src/elements/TableRow.ts +906 -0
- package/src/elements/TextBox.ts +768 -0
- package/src/formatting/AbstractNumbering.ts +548 -0
- package/src/formatting/CLAUDE.md +74 -0
- package/src/formatting/NumberingInstance.ts +212 -0
- package/src/formatting/NumberingLevel.ts +1006 -0
- package/src/formatting/NumberingManager.ts +827 -0
- package/src/formatting/Style.ts +1833 -0
- package/src/formatting/StylesManager.ts +1005 -0
- package/src/helpers/CleanupHelper.ts +524 -0
- package/src/images/ImageOptimizer.ts +274 -0
- package/src/index.ts +554 -0
- package/src/managers/CLAUDE.md +47 -0
- package/src/managers/DrawingManager.ts +319 -0
- package/src/tracking/DocumentTrackingContext.ts +643 -0
- package/src/tracking/TrackingContext.ts +173 -0
- package/src/types/compatibility-types.ts +49 -0
- package/src/types/formatting.ts +210 -0
- package/src/types/list-types.ts +152 -0
- package/src/types/settings-types.ts +59 -0
- package/src/types/styleConfig.ts +189 -0
- package/src/utils/CLAUDE.md +153 -0
- package/src/utils/ChangelogGenerator.ts +1581 -0
- package/src/utils/CompatibilityUpgrader.ts +237 -0
- package/src/utils/InMemoryRevisionAcceptor.ts +696 -0
- package/src/utils/MoveOperationHelper.ts +238 -0
- package/src/utils/RevisionAwareProcessor.ts +526 -0
- package/src/utils/RevisionWalker.ts +457 -0
- package/src/utils/SelectiveRevisionAcceptor.ts +683 -0
- package/src/utils/ShadingResolver.ts +107 -0
- package/src/utils/acceptRevisions.ts +714 -0
- package/src/utils/cnfStyleDecoder.ts +217 -0
- package/src/utils/corruptionDetection.ts +345 -0
- package/src/utils/dateFormatting.ts +20 -0
- package/src/utils/deepClone.ts +78 -0
- package/src/utils/diagnostics.ts +129 -0
- package/src/utils/errorHandling.ts +80 -0
- package/src/utils/formatting.ts +213 -0
- package/src/utils/list-detection.ts +274 -0
- package/src/utils/logger.ts +404 -0
- package/src/utils/parsingHelpers.ts +190 -0
- package/src/utils/stripTrackedChanges.ts +353 -0
- package/src/utils/textDiff.ts +100 -0
- package/src/utils/units.ts +421 -0
- package/src/utils/validation.ts +542 -0
- package/src/utils/xmlSanitization.ts +182 -0
- package/src/validation/RevisionAutoFixer.ts +542 -0
- package/src/validation/RevisionValidator.ts +460 -0
- package/src/validation/ValidationRules.ts +338 -0
- package/src/validation/index.ts +30 -0
- package/src/xml/CLAUDE.md +65 -0
- package/src/xml/XMLBuilder.ts +871 -0
- package/src/xml/XMLParser.ts +919 -0
- package/src/zip/CLAUDE.md +55 -0
- package/src/zip/ZipHandler.ts +637 -0
- package/src/zip/ZipReader.ts +299 -0
- package/src/zip/ZipWriter.ts +390 -0
- package/src/zip/errors.ts +69 -0
- package/src/zip/types.ts +116 -0
- package/dist/core/ListNormalizer.d.ts +0 -23
- package/dist/core/ListNormalizer.d.ts.map +0 -1
- package/dist/core/ListNormalizer.js +0 -624
- package/dist/core/ListNormalizer.js.map +0 -1
- package/dist/images/index.d.ts +0 -2
- package/dist/images/index.d.ts.map +0 -1
- package/dist/images/index.js +0 -8
- package/dist/images/index.js.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
- package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.js +0 -360
- package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
- package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
- package/dist/ms-doc/fib/FIB.d.ts +0 -18
- package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
- package/dist/ms-doc/fib/FIB.js +0 -342
- package/dist/ms-doc/fib/FIB.js.map +0 -1
- package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
- package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
- package/dist/ms-doc/fields/FieldParser.js +0 -266
- package/dist/ms-doc/fields/FieldParser.js.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
- package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.js +0 -233
- package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
- package/dist/ms-doc/index.d.ts +0 -20
- package/dist/ms-doc/index.d.ts.map +0 -1
- package/dist/ms-doc/index.js +0 -59
- package/dist/ms-doc/index.js.map +0 -1
- package/dist/ms-doc/properties/SPRM.d.ts +0 -210
- package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
- package/dist/ms-doc/properties/SPRM.js +0 -633
- package/dist/ms-doc/properties/SPRM.js.map +0 -1
- package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
- package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
- package/dist/ms-doc/sections/SectionParser.js +0 -214
- package/dist/ms-doc/sections/SectionParser.js.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
- package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.js +0 -268
- package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
- package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
- package/dist/ms-doc/tables/TableParser.d.ts +0 -29
- package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
- package/dist/ms-doc/tables/TableParser.js +0 -176
- package/dist/ms-doc/tables/TableParser.js.map +0 -1
- package/dist/ms-doc/text/PieceTable.d.ts +0 -21
- package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
- package/dist/ms-doc/text/PieceTable.js +0 -171
- package/dist/ms-doc/text/PieceTable.js.map +0 -1
- package/dist/ms-doc/types/Constants.d.ts +0 -99
- package/dist/ms-doc/types/Constants.d.ts.map +0 -1
- package/dist/ms-doc/types/Constants.js +0 -102
- package/dist/ms-doc/types/Constants.js.map +0 -1
- package/dist/ms-doc/types/DocTypes.d.ts +0 -368
- package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
- package/dist/ms-doc/types/DocTypes.js +0 -3
- package/dist/ms-doc/types/DocTypes.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -3
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -6
- package/dist/tracking/index.js.map +0 -1
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RevisionAwareProcessor - Handles document revisions before and during processing
|
|
3
|
+
*
|
|
4
|
+
* Provides three modes for handling existing Word tracked changes:
|
|
5
|
+
* - accept_all: Accept all revisions before processing (default)
|
|
6
|
+
* - preserve: Preserve revisions, skip conflicting operations
|
|
7
|
+
* - preserve_and_wrap: Preserve revisions, wrap conflicts in new revisions
|
|
8
|
+
*
|
|
9
|
+
* Implements ECMA-376 compliant revision handling.
|
|
10
|
+
*
|
|
11
|
+
* @module RevisionAwareProcessor
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Document } from '../core/Document';
|
|
15
|
+
import { Revision, RevisionType } from '../elements/Revision';
|
|
16
|
+
import { RevisionManager } from '../elements/RevisionManager';
|
|
17
|
+
import { ChangeCategory, ChangeLocation } from './ChangelogGenerator';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Revision handling modes for document processing.
|
|
21
|
+
*/
|
|
22
|
+
export type RevisionHandlingMode =
|
|
23
|
+
| 'accept_all' // Accept all revisions before processing
|
|
24
|
+
| 'preserve' // Preserve revisions, skip conflicting operations
|
|
25
|
+
| 'preserve_and_wrap'; // Preserve revisions, wrap conflicts in new revisions
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Options for revision-aware processing.
|
|
29
|
+
*/
|
|
30
|
+
export interface RevisionProcessingOptions {
|
|
31
|
+
/** How to handle existing revisions */
|
|
32
|
+
mode: RevisionHandlingMode;
|
|
33
|
+
/** Author name for new revisions (required for 'preserve_and_wrap' mode) */
|
|
34
|
+
author?: string;
|
|
35
|
+
/** Selective acceptance criteria (optional, for partial acceptance) */
|
|
36
|
+
acceptCriteria?: SelectionCriteria;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Criteria for selecting specific revisions.
|
|
41
|
+
*/
|
|
42
|
+
export interface SelectionCriteria {
|
|
43
|
+
/** Specific revision IDs */
|
|
44
|
+
ids?: number[];
|
|
45
|
+
/** Filter by revision types */
|
|
46
|
+
types?: RevisionType[];
|
|
47
|
+
/** Filter by authors */
|
|
48
|
+
authors?: string[];
|
|
49
|
+
/** Filter by date range */
|
|
50
|
+
dateRange?: { start: Date; end: Date };
|
|
51
|
+
/** Filter by category */
|
|
52
|
+
categories?: ChangeCategory[];
|
|
53
|
+
/** Custom filter function */
|
|
54
|
+
custom?: (revision: Revision) => boolean;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Result of revision-aware processing.
|
|
59
|
+
*/
|
|
60
|
+
export interface RevisionProcessingResult {
|
|
61
|
+
/** Whether processing completed successfully */
|
|
62
|
+
success: boolean;
|
|
63
|
+
/** IDs of revisions that were accepted */
|
|
64
|
+
acceptedRevisions: string[];
|
|
65
|
+
/** IDs of revisions that were preserved */
|
|
66
|
+
preservedRevisions: string[];
|
|
67
|
+
/** IDs of new revisions created (preserve_and_wrap mode) */
|
|
68
|
+
newRevisions: string[];
|
|
69
|
+
/** Conflicts encountered during processing */
|
|
70
|
+
conflicts: ConflictInfo[];
|
|
71
|
+
/** Processing log entries */
|
|
72
|
+
log: ProcessingLogEntry[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Information about a conflict between an operation and a revision.
|
|
77
|
+
*/
|
|
78
|
+
export interface ConflictInfo {
|
|
79
|
+
/** Description of the operation that conflicted */
|
|
80
|
+
operation: string;
|
|
81
|
+
/** ID of the conflicting revision */
|
|
82
|
+
revisionId: string;
|
|
83
|
+
/** How the conflict was resolved */
|
|
84
|
+
resolution: 'accepted' | 'skipped' | 'wrapped';
|
|
85
|
+
/** Location of the conflict */
|
|
86
|
+
location: ChangeLocation;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Log entry for processing actions.
|
|
91
|
+
*/
|
|
92
|
+
export interface ProcessingLogEntry {
|
|
93
|
+
timestamp: Date;
|
|
94
|
+
action: string;
|
|
95
|
+
details: string;
|
|
96
|
+
revisionId?: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Handles document revisions before and during processing.
|
|
101
|
+
* Implements ECMA-376 compliant revision handling.
|
|
102
|
+
*/
|
|
103
|
+
export class RevisionAwareProcessor {
|
|
104
|
+
/**
|
|
105
|
+
* Prepare document for processing by handling revisions.
|
|
106
|
+
* Call this before applying any document modifications.
|
|
107
|
+
*
|
|
108
|
+
* @param doc - Document to prepare
|
|
109
|
+
* @param options - Processing options
|
|
110
|
+
* @returns Processing result with details of actions taken
|
|
111
|
+
*/
|
|
112
|
+
static async prepare(
|
|
113
|
+
doc: Document,
|
|
114
|
+
options: RevisionProcessingOptions
|
|
115
|
+
): Promise<RevisionProcessingResult> {
|
|
116
|
+
const log: ProcessingLogEntry[] = [];
|
|
117
|
+
const acceptedRevisions: string[] = [];
|
|
118
|
+
const preservedRevisions: string[] = [];
|
|
119
|
+
const newRevisions: string[] = [];
|
|
120
|
+
const conflicts: ConflictInfo[] = [];
|
|
121
|
+
|
|
122
|
+
const addLog = (action: string, details: string, revisionId?: string) => {
|
|
123
|
+
log.push({
|
|
124
|
+
timestamp: new Date(),
|
|
125
|
+
action,
|
|
126
|
+
details,
|
|
127
|
+
revisionId,
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
addLog('start', `Starting revision processing with mode: ${options.mode}`);
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const revisionManager = doc.getRevisionManager();
|
|
135
|
+
const hasInMemoryRevisions = revisionManager?.hasRevisions() ?? false;
|
|
136
|
+
const hasRawXmlRevisions = doc.hasRawXmlRevisions();
|
|
137
|
+
|
|
138
|
+
// Check both in-memory model AND raw XML for revisions
|
|
139
|
+
// Raw XML may contain revisions that weren't fully parsed into memory
|
|
140
|
+
if (!hasInMemoryRevisions && !hasRawXmlRevisions) {
|
|
141
|
+
addLog('complete', 'No revisions found in document');
|
|
142
|
+
return {
|
|
143
|
+
success: true,
|
|
144
|
+
acceptedRevisions,
|
|
145
|
+
preservedRevisions,
|
|
146
|
+
newRevisions,
|
|
147
|
+
conflicts,
|
|
148
|
+
log,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const allRevisions = revisionManager?.getAllRevisions() ?? [];
|
|
153
|
+
const inMemoryCount = allRevisions.length;
|
|
154
|
+
const rawXmlNote = hasRawXmlRevisions ? ' (raw XML contains revision markup)' : '';
|
|
155
|
+
addLog('info', `Found ${inMemoryCount} parsed revisions in document${rawXmlNote}`);
|
|
156
|
+
|
|
157
|
+
switch (options.mode) {
|
|
158
|
+
case 'accept_all':
|
|
159
|
+
// Accept all revisions
|
|
160
|
+
await this.acceptAllRevisions(doc, allRevisions, acceptedRevisions, addLog);
|
|
161
|
+
break;
|
|
162
|
+
|
|
163
|
+
case 'preserve':
|
|
164
|
+
// Preserve all revisions by preventing document.xml regeneration
|
|
165
|
+
// This keeps the original XML with w:ins/w:del elements intact
|
|
166
|
+
for (const rev of allRevisions) {
|
|
167
|
+
preservedRevisions.push(rev.getId().toString());
|
|
168
|
+
}
|
|
169
|
+
doc.preserveRawXml();
|
|
170
|
+
addLog('complete', `Preserved ${preservedRevisions.length} revisions (raw XML preservation enabled)`);
|
|
171
|
+
break;
|
|
172
|
+
|
|
173
|
+
case 'preserve_and_wrap':
|
|
174
|
+
// Preserve all revisions, track for later wrapping
|
|
175
|
+
// Also enable raw XML preservation to keep existing revisions
|
|
176
|
+
for (const rev of allRevisions) {
|
|
177
|
+
preservedRevisions.push(rev.getId().toString());
|
|
178
|
+
}
|
|
179
|
+
doc.preserveRawXml();
|
|
180
|
+
addLog('info', `Will preserve and wrap conflicts for ${preservedRevisions.length} revisions`);
|
|
181
|
+
addLog('info', `New revisions will be authored by: ${options.author || 'Unknown'}`);
|
|
182
|
+
break;
|
|
183
|
+
|
|
184
|
+
default:
|
|
185
|
+
addLog('error', `Unknown processing mode: ${options.mode}`);
|
|
186
|
+
return {
|
|
187
|
+
success: false,
|
|
188
|
+
acceptedRevisions,
|
|
189
|
+
preservedRevisions,
|
|
190
|
+
newRevisions,
|
|
191
|
+
conflicts,
|
|
192
|
+
log,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
addLog('complete', 'Revision processing completed successfully');
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
success: true,
|
|
200
|
+
acceptedRevisions,
|
|
201
|
+
preservedRevisions,
|
|
202
|
+
newRevisions,
|
|
203
|
+
conflicts,
|
|
204
|
+
log,
|
|
205
|
+
};
|
|
206
|
+
} catch (error: unknown) {
|
|
207
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
208
|
+
addLog('error', `Processing failed: ${errorMessage}`);
|
|
209
|
+
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
acceptedRevisions,
|
|
213
|
+
preservedRevisions,
|
|
214
|
+
newRevisions,
|
|
215
|
+
conflicts,
|
|
216
|
+
log,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Accept all revisions in the document using Document.acceptAllRevisions().
|
|
223
|
+
*
|
|
224
|
+
* This delegates to Document.acceptAllRevisions() which uses in-memory DOM transformation
|
|
225
|
+
* (the industry-standard approach used by OpenXML PowerTools, Aspose.Words, etc.):
|
|
226
|
+
*
|
|
227
|
+
* 1. Transforms Revision objects in paragraph.content arrays
|
|
228
|
+
* 2. Insertions (w:ins): Unwraps content - keeps Runs/Hyperlinks, removes Revision wrapper
|
|
229
|
+
* 3. Deletions (w:del): Removes content entirely from the model
|
|
230
|
+
* 4. Move operations: moveFrom removed, moveTo unwrapped
|
|
231
|
+
* 5. Property changes: Removes change metadata, keeps current formatting
|
|
232
|
+
*
|
|
233
|
+
* This approach allows subsequent modifications to be saved correctly because the
|
|
234
|
+
* in-memory model is transformed (not raw XML), so save() regenerates document.xml
|
|
235
|
+
* with both the accepted changes AND any subsequent modifications.
|
|
236
|
+
*
|
|
237
|
+
* @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs
|
|
238
|
+
* @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138
|
|
239
|
+
*/
|
|
240
|
+
private static async acceptAllRevisions(
|
|
241
|
+
doc: Document,
|
|
242
|
+
revisions: Revision[],
|
|
243
|
+
acceptedIds: string[],
|
|
244
|
+
addLog: (action: string, details: string, revisionId?: string) => void
|
|
245
|
+
): Promise<void> {
|
|
246
|
+
addLog('info', 'Accepting all revisions using in-memory DOM transformation');
|
|
247
|
+
|
|
248
|
+
// Track accepted revision IDs before acceptance (for logging)
|
|
249
|
+
for (const rev of revisions) {
|
|
250
|
+
acceptedIds.push(rev.getId().toString());
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Use Document.acceptAllRevisions() which uses in-memory transformation
|
|
254
|
+
// This allows subsequent modifications to be saved correctly
|
|
255
|
+
await doc.acceptAllRevisions();
|
|
256
|
+
|
|
257
|
+
// Log each accepted revision
|
|
258
|
+
for (const id of acceptedIds) {
|
|
259
|
+
addLog('accept', `Accepted revision ${id}`, id);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
addLog('complete', `Accepted ${acceptedIds.length} revisions (in-memory transformation)`);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Accept revisions matching the given criteria.
|
|
267
|
+
* Uses existing RevisionAcceptor under the hood.
|
|
268
|
+
*
|
|
269
|
+
* @param doc - Document to process
|
|
270
|
+
* @param criteria - Selection criteria
|
|
271
|
+
* @returns Array of accepted revision IDs
|
|
272
|
+
*/
|
|
273
|
+
static acceptSelective(
|
|
274
|
+
doc: Document,
|
|
275
|
+
criteria: SelectionCriteria
|
|
276
|
+
): string[] {
|
|
277
|
+
const revisionManager = doc.getRevisionManager();
|
|
278
|
+
if (!revisionManager) {
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const allRevisions = revisionManager.getAllRevisions();
|
|
283
|
+
const matchingRevisions = this.filterRevisions(allRevisions, criteria);
|
|
284
|
+
|
|
285
|
+
const acceptedIds: string[] = [];
|
|
286
|
+
for (const rev of matchingRevisions) {
|
|
287
|
+
acceptedIds.push(rev.getId().toString());
|
|
288
|
+
// Note: Actual acceptance would require XML manipulation
|
|
289
|
+
// For now, this returns which revisions WOULD be accepted
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return acceptedIds;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Filter revisions based on criteria.
|
|
297
|
+
*/
|
|
298
|
+
private static filterRevisions(
|
|
299
|
+
revisions: Revision[],
|
|
300
|
+
criteria: SelectionCriteria
|
|
301
|
+
): Revision[] {
|
|
302
|
+
return revisions.filter(rev => {
|
|
303
|
+
// Filter by IDs
|
|
304
|
+
if (criteria.ids && !criteria.ids.includes(rev.getId())) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Filter by types
|
|
309
|
+
if (criteria.types && !criteria.types.includes(rev.getType())) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Filter by authors
|
|
314
|
+
if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Filter by date range
|
|
319
|
+
if (criteria.dateRange) {
|
|
320
|
+
const date = rev.getDate();
|
|
321
|
+
if (date < criteria.dateRange.start || date > criteria.dateRange.end) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Filter by categories
|
|
327
|
+
if (criteria.categories) {
|
|
328
|
+
const category = this.getRevisionCategory(rev);
|
|
329
|
+
if (!criteria.categories.includes(category)) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Custom filter
|
|
335
|
+
if (criteria.custom && !criteria.custom(rev)) {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return true;
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Get the semantic category of a revision.
|
|
345
|
+
*/
|
|
346
|
+
private static getRevisionCategory(revision: Revision): ChangeCategory {
|
|
347
|
+
const type = revision.getType();
|
|
348
|
+
|
|
349
|
+
if (type === 'insert' || type === 'delete') {
|
|
350
|
+
return 'content';
|
|
351
|
+
}
|
|
352
|
+
if (
|
|
353
|
+
type === 'runPropertiesChange' ||
|
|
354
|
+
type === 'paragraphPropertiesChange' ||
|
|
355
|
+
type === 'numberingChange'
|
|
356
|
+
) {
|
|
357
|
+
return 'formatting';
|
|
358
|
+
}
|
|
359
|
+
if (
|
|
360
|
+
type === 'moveFrom' ||
|
|
361
|
+
type === 'moveTo' ||
|
|
362
|
+
type === 'sectionPropertiesChange'
|
|
363
|
+
) {
|
|
364
|
+
return 'structural';
|
|
365
|
+
}
|
|
366
|
+
if (
|
|
367
|
+
type === 'tablePropertiesChange' ||
|
|
368
|
+
type === 'tableExceptionPropertiesChange' ||
|
|
369
|
+
type === 'tableRowPropertiesChange' ||
|
|
370
|
+
type === 'tableCellPropertiesChange' ||
|
|
371
|
+
type === 'tableCellInsert' ||
|
|
372
|
+
type === 'tableCellDelete' ||
|
|
373
|
+
type === 'tableCellMerge'
|
|
374
|
+
) {
|
|
375
|
+
return 'table';
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return 'content';
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Check if an operation at the given location would conflict with any revision.
|
|
383
|
+
*
|
|
384
|
+
* @param doc - Document to check
|
|
385
|
+
* @param paragraphIndex - Paragraph index
|
|
386
|
+
* @param runIndex - Optional run index
|
|
387
|
+
* @returns Conflicting revision or null
|
|
388
|
+
*/
|
|
389
|
+
static checkConflict(
|
|
390
|
+
doc: Document,
|
|
391
|
+
paragraphIndex: number,
|
|
392
|
+
runIndex?: number
|
|
393
|
+
): Revision | null {
|
|
394
|
+
const revisionManager = doc.getRevisionManager();
|
|
395
|
+
if (!revisionManager) {
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Get revisions that might affect this paragraph
|
|
400
|
+
const revisions = revisionManager.getRevisionsForParagraph(paragraphIndex);
|
|
401
|
+
|
|
402
|
+
// For now, return the first revision at this location
|
|
403
|
+
// In a more complete implementation, we would check run-level conflicts
|
|
404
|
+
return revisions.length > 0 ? revisions[0]! : null;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Get all revisions that would be affected by an operation.
|
|
409
|
+
*
|
|
410
|
+
* @param doc - Document to check
|
|
411
|
+
* @param paragraphIndex - Paragraph index
|
|
412
|
+
* @param runIndex - Optional run index
|
|
413
|
+
* @returns Array of affected revisions
|
|
414
|
+
*/
|
|
415
|
+
static getAffectedRevisions(
|
|
416
|
+
doc: Document,
|
|
417
|
+
paragraphIndex: number,
|
|
418
|
+
runIndex?: number
|
|
419
|
+
): Revision[] {
|
|
420
|
+
const revisionManager = doc.getRevisionManager();
|
|
421
|
+
if (!revisionManager) {
|
|
422
|
+
return [];
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return revisionManager.getRevisionsForParagraph(paragraphIndex);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Wrap content in a new revision (for preserve_and_wrap mode).
|
|
430
|
+
* Creates a new revision tracking the change.
|
|
431
|
+
*
|
|
432
|
+
* @param doc - Document to modify
|
|
433
|
+
* @param paragraphIndex - Paragraph index
|
|
434
|
+
* @param runIndex - Run index
|
|
435
|
+
* @param author - Author for the new revision
|
|
436
|
+
* @param type - Type of revision to create
|
|
437
|
+
* @returns ID of the new revision
|
|
438
|
+
*/
|
|
439
|
+
static wrapInRevision(
|
|
440
|
+
doc: Document,
|
|
441
|
+
paragraphIndex: number,
|
|
442
|
+
runIndex: number,
|
|
443
|
+
author: string,
|
|
444
|
+
type: 'insert' | 'delete'
|
|
445
|
+
): string {
|
|
446
|
+
const revisionManager = doc.getRevisionManager();
|
|
447
|
+
if (!revisionManager) {
|
|
448
|
+
throw new Error('Document does not have a revision manager');
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Get the paragraphs from the document
|
|
452
|
+
const paragraphs = doc.getParagraphs();
|
|
453
|
+
if (paragraphIndex < 0 || paragraphIndex >= paragraphs.length) {
|
|
454
|
+
throw new Error(`Invalid paragraph index: ${paragraphIndex}`);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const paragraph = paragraphs[paragraphIndex];
|
|
458
|
+
if (!paragraph) {
|
|
459
|
+
throw new Error(`Paragraph at index ${paragraphIndex} not found`);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const runs = paragraph.getRuns();
|
|
463
|
+
if (runIndex < 0 || runIndex >= runs.length) {
|
|
464
|
+
throw new Error(`Invalid run index: ${runIndex}`);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
const run = runs[runIndex];
|
|
468
|
+
if (!run) {
|
|
469
|
+
throw new Error(`Run at index ${runIndex} not found`);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Create new revision
|
|
473
|
+
const revision = new Revision({
|
|
474
|
+
author,
|
|
475
|
+
type,
|
|
476
|
+
content: run,
|
|
477
|
+
date: new Date(),
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
// Register with manager
|
|
481
|
+
revisionManager.register(revision);
|
|
482
|
+
|
|
483
|
+
return revision.getId().toString();
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Check if document has any tracked changes.
|
|
488
|
+
*
|
|
489
|
+
* @param doc - Document to check
|
|
490
|
+
* @returns True if document has tracked changes
|
|
491
|
+
*/
|
|
492
|
+
static hasTrackedChanges(doc: Document): boolean {
|
|
493
|
+
const revisionManager = doc.getRevisionManager();
|
|
494
|
+
return revisionManager ? revisionManager.hasRevisions() : false;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Get summary of tracked changes in document.
|
|
499
|
+
*
|
|
500
|
+
* @param doc - Document to summarize
|
|
501
|
+
* @returns Summary object or null if no revision manager
|
|
502
|
+
*/
|
|
503
|
+
static getTrackedChangesSummary(doc: Document): {
|
|
504
|
+
total: number;
|
|
505
|
+
insertions: number;
|
|
506
|
+
deletions: number;
|
|
507
|
+
formatting: number;
|
|
508
|
+
moves: number;
|
|
509
|
+
authors: string[];
|
|
510
|
+
} | null {
|
|
511
|
+
const revisionManager = doc.getRevisionManager();
|
|
512
|
+
if (!revisionManager) {
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const summary = revisionManager.getSummary();
|
|
517
|
+
return {
|
|
518
|
+
total: summary.total,
|
|
519
|
+
insertions: summary.byType.insertions,
|
|
520
|
+
deletions: summary.byType.deletions,
|
|
521
|
+
formatting: summary.byType.propertyChanges,
|
|
522
|
+
moves: summary.byType.moves,
|
|
523
|
+
authors: summary.authors,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
}
|