docxmlater 10.0.2 → 10.0.3
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 +2 -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 +60 -54
- 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.map +1 -1
- package/dist/elements/Paragraph.js +128 -117
- 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.js +1 -1
- 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.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 +10107 -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 +4227 -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 +668 -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 +613 -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,613 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectiveRevisionAcceptor - Accept or reject specific revisions based on criteria
|
|
3
|
+
*
|
|
4
|
+
* Provides granular control over revision acceptance using in-memory DOM transformation.
|
|
5
|
+
* Extends the all-or-nothing approach with selective acceptance by author, type, date,
|
|
6
|
+
* and custom criteria.
|
|
7
|
+
*
|
|
8
|
+
* Uses the industry-standard in-memory transformation approach (like OpenXML PowerTools),
|
|
9
|
+
* allowing subsequent modifications to be saved correctly.
|
|
10
|
+
*
|
|
11
|
+
* @module SelectiveRevisionAcceptor
|
|
12
|
+
* @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs
|
|
13
|
+
*/
|
|
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 type { Hyperlink } from '../elements/Hyperlink';
|
|
20
|
+
import { isRunContent, isHyperlinkContent } from '../elements/RevisionContent';
|
|
21
|
+
import { ChangeCategory } from './ChangelogGenerator';
|
|
22
|
+
import { SelectionCriteria } from './RevisionAwareProcessor';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Result of selective revision acceptance.
|
|
26
|
+
*/
|
|
27
|
+
export interface SelectiveAcceptResult {
|
|
28
|
+
/** IDs of accepted revisions */
|
|
29
|
+
accepted: string[];
|
|
30
|
+
/** IDs of rejected/removed revisions */
|
|
31
|
+
rejected: string[];
|
|
32
|
+
/** IDs of revisions that remain */
|
|
33
|
+
remaining: string[];
|
|
34
|
+
/** Summary of actions taken */
|
|
35
|
+
summary: {
|
|
36
|
+
totalProcessed: number;
|
|
37
|
+
acceptedCount: number;
|
|
38
|
+
rejectedCount: number;
|
|
39
|
+
remainingCount: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Provides granular control over revision acceptance using in-memory DOM transformation.
|
|
45
|
+
* Allows subsequent modifications to be saved correctly.
|
|
46
|
+
*/
|
|
47
|
+
export class SelectiveRevisionAcceptor {
|
|
48
|
+
/**
|
|
49
|
+
* Accept revisions matching criteria using in-memory DOM transformation.
|
|
50
|
+
* Matching revisions: content kept, revision wrapper removed.
|
|
51
|
+
* Non-matching revisions: preserved in the document.
|
|
52
|
+
*
|
|
53
|
+
* @param doc - Document to process
|
|
54
|
+
* @param criteria - Selection criteria
|
|
55
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
56
|
+
*/
|
|
57
|
+
static accept(
|
|
58
|
+
doc: Document,
|
|
59
|
+
criteria: SelectionCriteria
|
|
60
|
+
): SelectiveAcceptResult {
|
|
61
|
+
const accepted: string[] = [];
|
|
62
|
+
const remaining: string[] = [];
|
|
63
|
+
|
|
64
|
+
// Check if doc has full Document API (getAllParagraphs, getTables)
|
|
65
|
+
// or if it's a minimal mock (only getRevisionManager)
|
|
66
|
+
const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
|
|
67
|
+
|
|
68
|
+
if (hasFullApi) {
|
|
69
|
+
// Full in-memory DOM transformation
|
|
70
|
+
const paragraphs = (doc as any).getAllParagraphs();
|
|
71
|
+
for (const paragraph of paragraphs) {
|
|
72
|
+
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Process paragraphs in tables
|
|
76
|
+
const tables = (doc as any).getTables();
|
|
77
|
+
for (const table of tables) {
|
|
78
|
+
for (const row of table.getRows()) {
|
|
79
|
+
for (const cell of row.getCells()) {
|
|
80
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
81
|
+
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
// Fallback: Filter revisions from RevisionManager only (for backward compatibility)
|
|
88
|
+
const revisionManager = doc.getRevisionManager();
|
|
89
|
+
if (revisionManager) {
|
|
90
|
+
const allRevisions = revisionManager.getAllRevisions();
|
|
91
|
+
for (const rev of allRevisions) {
|
|
92
|
+
if (this.matchesCriteria(rev, criteria)) {
|
|
93
|
+
accepted.push(rev.getId().toString());
|
|
94
|
+
} else {
|
|
95
|
+
remaining.push(rev.getId().toString());
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Clear accepted revisions from RevisionManager
|
|
102
|
+
const revisionManager = doc.getRevisionManager();
|
|
103
|
+
if (revisionManager) {
|
|
104
|
+
for (const id of accepted) {
|
|
105
|
+
revisionManager.removeById(parseInt(id, 10));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
accepted,
|
|
111
|
+
rejected: [],
|
|
112
|
+
remaining,
|
|
113
|
+
summary: {
|
|
114
|
+
totalProcessed: accepted.length + remaining.length,
|
|
115
|
+
acceptedCount: accepted.length,
|
|
116
|
+
rejectedCount: 0,
|
|
117
|
+
remainingCount: remaining.length,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Reject revisions matching criteria using in-memory DOM transformation.
|
|
124
|
+
* Matching revisions: content AND wrapper removed (opposite of accept).
|
|
125
|
+
* Non-matching revisions: preserved in the document.
|
|
126
|
+
*
|
|
127
|
+
* For insertions: Rejecting removes the inserted content entirely.
|
|
128
|
+
* For deletions: Rejecting keeps the deleted content (opposite of accepting).
|
|
129
|
+
*
|
|
130
|
+
* @param doc - Document to process
|
|
131
|
+
* @param criteria - Selection criteria
|
|
132
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
133
|
+
*/
|
|
134
|
+
static reject(
|
|
135
|
+
doc: Document,
|
|
136
|
+
criteria: SelectionCriteria
|
|
137
|
+
): SelectiveAcceptResult {
|
|
138
|
+
const rejected: string[] = [];
|
|
139
|
+
const remaining: string[] = [];
|
|
140
|
+
|
|
141
|
+
// Check if doc has full Document API (getAllParagraphs, getTables)
|
|
142
|
+
// or if it's a minimal mock (only getRevisionManager)
|
|
143
|
+
const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
|
|
144
|
+
|
|
145
|
+
if (hasFullApi) {
|
|
146
|
+
// Full in-memory DOM transformation
|
|
147
|
+
const paragraphs = (doc as any).getAllParagraphs();
|
|
148
|
+
for (const paragraph of paragraphs) {
|
|
149
|
+
this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Process paragraphs in tables
|
|
153
|
+
const tables = (doc as any).getTables();
|
|
154
|
+
for (const table of tables) {
|
|
155
|
+
for (const row of table.getRows()) {
|
|
156
|
+
for (const cell of row.getCells()) {
|
|
157
|
+
for (const paragraph of cell.getParagraphs()) {
|
|
158
|
+
this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
} else {
|
|
164
|
+
// Fallback: Filter revisions from RevisionManager only (for backward compatibility)
|
|
165
|
+
const revisionManager = doc.getRevisionManager();
|
|
166
|
+
if (revisionManager) {
|
|
167
|
+
const allRevisions = revisionManager.getAllRevisions();
|
|
168
|
+
for (const rev of allRevisions) {
|
|
169
|
+
if (this.matchesCriteria(rev, criteria)) {
|
|
170
|
+
rejected.push(rev.getId().toString());
|
|
171
|
+
} else {
|
|
172
|
+
remaining.push(rev.getId().toString());
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Clear rejected revisions from RevisionManager
|
|
179
|
+
const revisionManager = doc.getRevisionManager();
|
|
180
|
+
if (revisionManager) {
|
|
181
|
+
for (const id of rejected) {
|
|
182
|
+
revisionManager.removeById(parseInt(id, 10));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
accepted: [],
|
|
188
|
+
rejected,
|
|
189
|
+
remaining,
|
|
190
|
+
summary: {
|
|
191
|
+
totalProcessed: rejected.length + remaining.length,
|
|
192
|
+
acceptedCount: 0,
|
|
193
|
+
rejectedCount: rejected.length,
|
|
194
|
+
remainingCount: remaining.length,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Process a paragraph for selective revision acceptance/rejection.
|
|
201
|
+
* Transforms matching revisions in-place using DOM transformation.
|
|
202
|
+
*/
|
|
203
|
+
private static processSelectiveParagraph(
|
|
204
|
+
paragraph: Paragraph,
|
|
205
|
+
criteria: SelectionCriteria,
|
|
206
|
+
action: 'accept' | 'reject',
|
|
207
|
+
processedIds: string[],
|
|
208
|
+
remainingIds: string[]
|
|
209
|
+
): void {
|
|
210
|
+
const content = paragraph.getContent();
|
|
211
|
+
const newContent: ParagraphContent[] = [];
|
|
212
|
+
|
|
213
|
+
for (const item of content) {
|
|
214
|
+
if (item instanceof Revision) {
|
|
215
|
+
const revisionId = item.getId().toString();
|
|
216
|
+
|
|
217
|
+
if (this.matchesCriteria(item, criteria)) {
|
|
218
|
+
// This revision matches the criteria - process it
|
|
219
|
+
processedIds.push(revisionId);
|
|
220
|
+
|
|
221
|
+
if (action === 'accept') {
|
|
222
|
+
// Accept: Transform based on revision type
|
|
223
|
+
this.acceptRevisionItem(item, newContent);
|
|
224
|
+
} else {
|
|
225
|
+
// Reject: Transform opposite of accept
|
|
226
|
+
this.rejectRevisionItem(item, newContent);
|
|
227
|
+
}
|
|
228
|
+
} else {
|
|
229
|
+
// This revision doesn't match - keep it
|
|
230
|
+
remainingIds.push(revisionId);
|
|
231
|
+
newContent.push(item);
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
// Non-revision content - keep as-is
|
|
235
|
+
newContent.push(item);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Replace paragraph content with the transformed content
|
|
240
|
+
paragraph.setContent(newContent);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Accept a single revision item (unwrap insertions, remove deletions).
|
|
245
|
+
*/
|
|
246
|
+
private static acceptRevisionItem(
|
|
247
|
+
revision: Revision,
|
|
248
|
+
newContent: ParagraphContent[]
|
|
249
|
+
): void {
|
|
250
|
+
const revisionType = revision.getType();
|
|
251
|
+
const childContent = revision.getContent();
|
|
252
|
+
|
|
253
|
+
switch (revisionType) {
|
|
254
|
+
case 'insert':
|
|
255
|
+
case 'moveTo':
|
|
256
|
+
// Unwrap: Extract child content into parent position
|
|
257
|
+
for (const child of childContent) {
|
|
258
|
+
if (isRunContent(child)) {
|
|
259
|
+
newContent.push(child as Run);
|
|
260
|
+
} else if (isHyperlinkContent(child)) {
|
|
261
|
+
newContent.push(child);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
break;
|
|
265
|
+
|
|
266
|
+
case 'delete':
|
|
267
|
+
case 'moveFrom':
|
|
268
|
+
// Remove: Don't add to newContent - content is deleted
|
|
269
|
+
break;
|
|
270
|
+
|
|
271
|
+
case 'runPropertiesChange':
|
|
272
|
+
case 'paragraphPropertiesChange':
|
|
273
|
+
case 'tablePropertiesChange':
|
|
274
|
+
case 'tableExceptionPropertiesChange':
|
|
275
|
+
case 'tableRowPropertiesChange':
|
|
276
|
+
case 'tableCellPropertiesChange':
|
|
277
|
+
case 'sectionPropertiesChange':
|
|
278
|
+
case 'numberingChange':
|
|
279
|
+
// Property changes: Keep content, remove change metadata
|
|
280
|
+
for (const child of childContent) {
|
|
281
|
+
if (isRunContent(child)) {
|
|
282
|
+
newContent.push(child as Run);
|
|
283
|
+
} else if (isHyperlinkContent(child)) {
|
|
284
|
+
newContent.push(child);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
|
|
289
|
+
default:
|
|
290
|
+
// Unknown type - keep the revision as-is for safety
|
|
291
|
+
newContent.push(revision);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Reject a single revision item (opposite of accept).
|
|
297
|
+
* - Rejecting an insertion removes the content
|
|
298
|
+
* - Rejecting a deletion keeps the content (unwraps it)
|
|
299
|
+
*/
|
|
300
|
+
private static rejectRevisionItem(
|
|
301
|
+
revision: Revision,
|
|
302
|
+
newContent: ParagraphContent[]
|
|
303
|
+
): void {
|
|
304
|
+
const revisionType = revision.getType();
|
|
305
|
+
const childContent = revision.getContent();
|
|
306
|
+
|
|
307
|
+
switch (revisionType) {
|
|
308
|
+
case 'insert':
|
|
309
|
+
case 'moveTo':
|
|
310
|
+
// Reject insertion: Remove the inserted content entirely
|
|
311
|
+
break;
|
|
312
|
+
|
|
313
|
+
case 'delete':
|
|
314
|
+
case 'moveFrom':
|
|
315
|
+
// Reject deletion: Keep the deleted content (unwrap)
|
|
316
|
+
for (const child of childContent) {
|
|
317
|
+
if (isRunContent(child)) {
|
|
318
|
+
newContent.push(child as Run);
|
|
319
|
+
} else if (isHyperlinkContent(child)) {
|
|
320
|
+
newContent.push(child);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
break;
|
|
324
|
+
|
|
325
|
+
case 'runPropertiesChange':
|
|
326
|
+
case 'paragraphPropertiesChange':
|
|
327
|
+
case 'tablePropertiesChange':
|
|
328
|
+
case 'tableExceptionPropertiesChange':
|
|
329
|
+
case 'tableRowPropertiesChange':
|
|
330
|
+
case 'tableCellPropertiesChange':
|
|
331
|
+
case 'sectionPropertiesChange':
|
|
332
|
+
case 'numberingChange':
|
|
333
|
+
// Rejecting property changes: Would need to restore old properties
|
|
334
|
+
// For now, just keep content without the change metadata
|
|
335
|
+
// (Full implementation would restore previousProperties)
|
|
336
|
+
for (const child of childContent) {
|
|
337
|
+
if (isRunContent(child)) {
|
|
338
|
+
newContent.push(child as Run);
|
|
339
|
+
} else if (isHyperlinkContent(child)) {
|
|
340
|
+
newContent.push(child);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
break;
|
|
344
|
+
|
|
345
|
+
default:
|
|
346
|
+
// Unknown type - keep the revision as-is for safety
|
|
347
|
+
newContent.push(revision);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Preview what would happen without making changes.
|
|
353
|
+
*
|
|
354
|
+
* @param doc - Document to analyze
|
|
355
|
+
* @param criteria - Selection criteria
|
|
356
|
+
* @param action - Action to preview
|
|
357
|
+
* @returns Preview of what would happen
|
|
358
|
+
*/
|
|
359
|
+
static preview(
|
|
360
|
+
doc: Document,
|
|
361
|
+
criteria: SelectionCriteria,
|
|
362
|
+
action: 'accept' | 'reject'
|
|
363
|
+
): SelectiveAcceptResult {
|
|
364
|
+
// Preview is the same as the actual operation but without side effects
|
|
365
|
+
return action === 'accept'
|
|
366
|
+
? this.accept(doc, criteria)
|
|
367
|
+
: this.reject(doc, criteria);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Accept all revisions by a specific author.
|
|
372
|
+
*
|
|
373
|
+
* @param doc - Document to process
|
|
374
|
+
* @param author - Author name to accept
|
|
375
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
376
|
+
*/
|
|
377
|
+
static acceptByAuthor(doc: Document, author: string): SelectiveAcceptResult {
|
|
378
|
+
return this.accept(doc, { authors: [author] });
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Reject all revisions by a specific author.
|
|
383
|
+
*
|
|
384
|
+
* @param doc - Document to process
|
|
385
|
+
* @param author - Author name to reject
|
|
386
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
387
|
+
*/
|
|
388
|
+
static rejectByAuthor(doc: Document, author: string): SelectiveAcceptResult {
|
|
389
|
+
return this.reject(doc, { authors: [author] });
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Accept all revisions of specific types.
|
|
394
|
+
*
|
|
395
|
+
* @param doc - Document to process
|
|
396
|
+
* @param types - Revision types to accept
|
|
397
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
398
|
+
*/
|
|
399
|
+
static acceptByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {
|
|
400
|
+
return this.accept(doc, { types });
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Reject all revisions of specific types.
|
|
405
|
+
*
|
|
406
|
+
* @param doc - Document to process
|
|
407
|
+
* @param types - Revision types to reject
|
|
408
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
409
|
+
*/
|
|
410
|
+
static rejectByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {
|
|
411
|
+
return this.reject(doc, { types });
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Accept all revisions before a specific date.
|
|
416
|
+
*
|
|
417
|
+
* @param doc - Document to process
|
|
418
|
+
* @param date - Cutoff date (exclusive)
|
|
419
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
420
|
+
*/
|
|
421
|
+
static acceptBeforeDate(doc: Document, date: Date): SelectiveAcceptResult {
|
|
422
|
+
return this.accept(doc, {
|
|
423
|
+
dateRange: { start: new Date(0), end: date },
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Accept all revisions after a specific date.
|
|
429
|
+
*
|
|
430
|
+
* @param doc - Document to process
|
|
431
|
+
* @param date - Start date (exclusive)
|
|
432
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
433
|
+
*/
|
|
434
|
+
static acceptAfterDate(doc: Document, date: Date): SelectiveAcceptResult {
|
|
435
|
+
return this.accept(doc, {
|
|
436
|
+
dateRange: { start: date, end: new Date() },
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Accept all insertions only.
|
|
442
|
+
*
|
|
443
|
+
* @param doc - Document to process
|
|
444
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
445
|
+
*/
|
|
446
|
+
static acceptInsertionsOnly(doc: Document): SelectiveAcceptResult {
|
|
447
|
+
return this.accept(doc, { types: ['insert'] });
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Accept all deletions only.
|
|
452
|
+
*
|
|
453
|
+
* @param doc - Document to process
|
|
454
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
455
|
+
*/
|
|
456
|
+
static acceptDeletionsOnly(doc: Document): SelectiveAcceptResult {
|
|
457
|
+
return this.accept(doc, { types: ['delete'] });
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Reject all formatting changes (keep content changes).
|
|
462
|
+
*
|
|
463
|
+
* @param doc - Document to process
|
|
464
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
465
|
+
*/
|
|
466
|
+
static rejectFormattingChanges(doc: Document): SelectiveAcceptResult {
|
|
467
|
+
return this.reject(doc, { categories: ['formatting'] });
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Accept content changes only (reject formatting).
|
|
472
|
+
*
|
|
473
|
+
* @param doc - Document to process
|
|
474
|
+
* @returns Result with accepted, rejected, and remaining revision IDs
|
|
475
|
+
*/
|
|
476
|
+
static acceptContentChangesOnly(doc: Document): SelectiveAcceptResult {
|
|
477
|
+
return this.accept(doc, { categories: ['content'] });
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Partition revisions into matching and non-matching based on criteria.
|
|
482
|
+
*/
|
|
483
|
+
private static partitionRevisions(
|
|
484
|
+
revisions: Revision[],
|
|
485
|
+
criteria: SelectionCriteria
|
|
486
|
+
): { matching: Revision[]; nonMatching: Revision[] } {
|
|
487
|
+
const matching: Revision[] = [];
|
|
488
|
+
const nonMatching: Revision[] = [];
|
|
489
|
+
|
|
490
|
+
for (const rev of revisions) {
|
|
491
|
+
if (this.matchesCriteria(rev, criteria)) {
|
|
492
|
+
matching.push(rev);
|
|
493
|
+
} else {
|
|
494
|
+
nonMatching.push(rev);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
return { matching, nonMatching };
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Check if a revision matches the given criteria.
|
|
503
|
+
*/
|
|
504
|
+
private static matchesCriteria(
|
|
505
|
+
revision: Revision,
|
|
506
|
+
criteria: SelectionCriteria
|
|
507
|
+
): boolean {
|
|
508
|
+
// If no criteria specified, match nothing
|
|
509
|
+
if (
|
|
510
|
+
!criteria.ids &&
|
|
511
|
+
!criteria.types &&
|
|
512
|
+
!criteria.authors &&
|
|
513
|
+
!criteria.dateRange &&
|
|
514
|
+
!criteria.categories &&
|
|
515
|
+
!criteria.custom
|
|
516
|
+
) {
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Filter by IDs
|
|
521
|
+
if (criteria.ids && !criteria.ids.includes(revision.getId())) {
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// Filter by types
|
|
526
|
+
if (criteria.types && !criteria.types.includes(revision.getType())) {
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Filter by authors
|
|
531
|
+
if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// Filter by date range
|
|
536
|
+
if (criteria.dateRange) {
|
|
537
|
+
const date = revision.getDate();
|
|
538
|
+
if (date < criteria.dateRange.start || date > criteria.dateRange.end) {
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Filter by categories
|
|
544
|
+
if (criteria.categories) {
|
|
545
|
+
const category = this.getRevisionCategory(revision);
|
|
546
|
+
if (!criteria.categories.includes(category)) {
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// Custom filter
|
|
552
|
+
if (criteria.custom && !criteria.custom(revision)) {
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
return true;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Get the semantic category of a revision.
|
|
561
|
+
*/
|
|
562
|
+
private static getRevisionCategory(revision: Revision): ChangeCategory {
|
|
563
|
+
const type = revision.getType();
|
|
564
|
+
|
|
565
|
+
if (type === 'insert' || type === 'delete') {
|
|
566
|
+
return 'content';
|
|
567
|
+
}
|
|
568
|
+
if (
|
|
569
|
+
type === 'runPropertiesChange' ||
|
|
570
|
+
type === 'paragraphPropertiesChange' ||
|
|
571
|
+
type === 'numberingChange'
|
|
572
|
+
) {
|
|
573
|
+
return 'formatting';
|
|
574
|
+
}
|
|
575
|
+
if (
|
|
576
|
+
type === 'moveFrom' ||
|
|
577
|
+
type === 'moveTo' ||
|
|
578
|
+
type === 'sectionPropertiesChange'
|
|
579
|
+
) {
|
|
580
|
+
return 'structural';
|
|
581
|
+
}
|
|
582
|
+
if (
|
|
583
|
+
type === 'tablePropertiesChange' ||
|
|
584
|
+
type === 'tableExceptionPropertiesChange' ||
|
|
585
|
+
type === 'tableRowPropertiesChange' ||
|
|
586
|
+
type === 'tableCellPropertiesChange' ||
|
|
587
|
+
type === 'tableCellInsert' ||
|
|
588
|
+
type === 'tableCellDelete' ||
|
|
589
|
+
type === 'tableCellMerge'
|
|
590
|
+
) {
|
|
591
|
+
return 'table';
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return 'content';
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Create an empty result.
|
|
599
|
+
*/
|
|
600
|
+
private static emptyResult(): SelectiveAcceptResult {
|
|
601
|
+
return {
|
|
602
|
+
accepted: [],
|
|
603
|
+
rejected: [],
|
|
604
|
+
remaining: [],
|
|
605
|
+
summary: {
|
|
606
|
+
totalProcessed: 0,
|
|
607
|
+
acceptedCount: 0,
|
|
608
|
+
rejectedCount: 0,
|
|
609
|
+
remainingCount: 0,
|
|
610
|
+
},
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShadingResolver - Resolves effective cell shading through the ECMA-376 style hierarchy
|
|
3
|
+
*
|
|
4
|
+
* Per ECMA-376 §17.7.6, cell shading is resolved in priority order:
|
|
5
|
+
* 1. Direct cell shading
|
|
6
|
+
* 2. Row table property exceptions (tblPrEx)
|
|
7
|
+
* 3. Conditional table style (tblStylePr) based on cnfStyle bitmask
|
|
8
|
+
* 4. Table style default cell shading
|
|
9
|
+
* 5. Direct table shading
|
|
10
|
+
*
|
|
11
|
+
* Special values:
|
|
12
|
+
* - pattern: "nil" = explicitly clear (stop resolution)
|
|
13
|
+
* - fill: "auto" = inherit (continue resolution)
|
|
14
|
+
*/
|
|
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';
|
|
21
|
+
import type { ConditionalFormattingType } from '../formatting/Style';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Resolves the effective shading for a table cell through the style hierarchy.
|
|
25
|
+
*
|
|
26
|
+
* @param cell - The table cell to resolve shading for
|
|
27
|
+
* @param table - The parent table
|
|
28
|
+
* @param stylesManager - The document's styles manager for style lookup
|
|
29
|
+
* @returns The resolved ShadingConfig, or undefined if no shading applies
|
|
30
|
+
*/
|
|
31
|
+
export function resolveCellShading(
|
|
32
|
+
cell: TableCell,
|
|
33
|
+
table: Table,
|
|
34
|
+
stylesManager: StylesManager
|
|
35
|
+
): ShadingConfig | undefined {
|
|
36
|
+
// 1. Direct cell shading
|
|
37
|
+
const directShading = cell.getShading();
|
|
38
|
+
if (directShading) {
|
|
39
|
+
if (directShading.pattern === 'nil') return undefined;
|
|
40
|
+
if (directShading.fill && directShading.fill !== 'auto') return directShading;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 2. Row table property exceptions
|
|
44
|
+
const row = findRowForCell(cell, table);
|
|
45
|
+
if (row) {
|
|
46
|
+
const exceptions = row.getTablePropertyExceptions();
|
|
47
|
+
if (exceptions?.shading) {
|
|
48
|
+
if (exceptions.shading.pattern === 'nil') return undefined;
|
|
49
|
+
if (exceptions.shading.fill && exceptions.shading.fill !== 'auto') return exceptions.shading;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 3. Conditional table style shading
|
|
54
|
+
const tableStyleId = table.getStyle();
|
|
55
|
+
if (tableStyleId) {
|
|
56
|
+
const style = stylesManager.getStyle(tableStyleId);
|
|
57
|
+
if (style) {
|
|
58
|
+
const styleProps = style.getProperties();
|
|
59
|
+
const conditionals = styleProps.tableStyle?.conditionalFormatting;
|
|
60
|
+
if (conditionals) {
|
|
61
|
+
const cnfStyle = cell.getCnfStyle();
|
|
62
|
+
if (cnfStyle) {
|
|
63
|
+
const activeConditionals = getActiveConditionalsInPriorityOrder(cnfStyle);
|
|
64
|
+
for (const condType of activeConditionals) {
|
|
65
|
+
const match = conditionals.find(
|
|
66
|
+
(c) => c.type === (condType)
|
|
67
|
+
);
|
|
68
|
+
if (match?.cellFormatting?.shading) {
|
|
69
|
+
const condShading = match.cellFormatting.shading;
|
|
70
|
+
if (condShading.pattern === 'nil') return undefined;
|
|
71
|
+
return condShading;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 4. Table style default cell shading
|
|
78
|
+
if (styleProps.tableStyle?.cell?.shading) {
|
|
79
|
+
const defaultCellShading = styleProps.tableStyle.cell.shading;
|
|
80
|
+
if (defaultCellShading.pattern === 'nil') return undefined;
|
|
81
|
+
return defaultCellShading;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 5. Direct table shading
|
|
87
|
+
const tableShading = table.getShading();
|
|
88
|
+
if (tableShading) {
|
|
89
|
+
if (tableShading.pattern === 'nil') return undefined;
|
|
90
|
+
return tableShading;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Finds the row that contains a given cell.
|
|
98
|
+
*/
|
|
99
|
+
function findRowForCell(cell: TableCell, table: Table) {
|
|
100
|
+
for (const row of table.getRows()) {
|
|
101
|
+
const cells = row.getCells();
|
|
102
|
+
if (cells.includes(cell)) {
|
|
103
|
+
return row;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|