docxmlater 10.1.3 → 10.1.5
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 +759 -754
- package/dist/constants/legacyCompatFlags.js +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +50 -50
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +483 -471
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +9 -9
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +251 -251
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.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 +2123 -2155
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +2 -5
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.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 +3 -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.d.ts.map +1 -1
- package/dist/elements/Comment.js +9 -6
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +18 -17
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +21 -21
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +56 -56
- 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 +6 -6
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +6 -7
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +82 -25
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js +2 -2
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +6 -6
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +6 -7
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js +2 -2
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -3
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +134 -76
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +238 -106
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +1 -1
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +24 -24
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +181 -188
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js +6 -6
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +4 -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 +40 -48
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -16
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +256 -238
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +36 -11
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +6 -6
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +99 -104
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +11 -11
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +102 -107
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +10 -10
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +105 -106
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +4 -4
- 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 +13 -6
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +3 -5
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +4 -4
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +54 -49
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +1 -3
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +5 -5
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +119 -125
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +9 -9
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +11 -11
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +219 -247
- 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 +96 -102
- 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 +6 -6
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js +7 -7
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +23 -7
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts.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 +6 -6
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.d.ts +2 -2
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js +97 -101
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +1 -1
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
- package/dist/utils/MoveOperationHelper.js +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js +2 -4
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.d.ts.map +1 -1
- package/dist/utils/RevisionWalker.js +4 -12
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.d.ts.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +23 -12
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +40 -40
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.js +1 -1
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +10 -2
- 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 +21 -23
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +3 -3
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.d.ts +1 -1
- package/dist/utils/textDiff.js +8 -8
- 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 +24 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +3 -3
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +5 -5
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +7 -9
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js +3 -3
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +98 -100
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +61 -66
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +1 -3
- 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 +28 -36
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/types.js +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/helper-methods.test.ts +512 -512
- package/src/constants/legacyCompatFlags.ts +138 -138
- package/src/constants/limits.ts +50 -50
- package/src/core/Document.ts +985 -1145
- package/src/core/DocumentContent.ts +461 -467
- package/src/core/DocumentGenerator.ts +1133 -1104
- package/src/core/DocumentIdManager.ts +158 -158
- package/src/core/DocumentParser.ts +2347 -2716
- package/src/core/DocumentValidator.ts +363 -372
- package/src/core/Relationship.ts +367 -367
- package/src/core/RelationshipManager.ts +429 -428
- package/src/elements/AlternateContent.ts +42 -42
- package/src/elements/Bookmark.ts +212 -210
- package/src/elements/BookmarkManager.ts +247 -250
- package/src/elements/Comment.ts +356 -359
- package/src/elements/CommentManager.ts +499 -502
- package/src/elements/CommonTypes.ts +524 -549
- package/src/elements/CustomXml.ts +36 -36
- package/src/elements/Endnote.ts +221 -217
- package/src/elements/EndnoteManager.ts +246 -249
- package/src/elements/Field.ts +1292 -1233
- package/src/elements/FieldHelpers.ts +329 -333
- package/src/elements/FontManager.ts +336 -339
- package/src/elements/Footer.ts +269 -269
- package/src/elements/Footnote.ts +221 -217
- package/src/elements/FootnoteManager.ts +246 -249
- package/src/elements/Header.ts +269 -269
- package/src/elements/HeaderFooterManager.ts +219 -219
- package/src/elements/Hyperlink.ts +1288 -1193
- package/src/elements/Image.ts +1982 -1756
- package/src/elements/ImageManager.ts +437 -432
- package/src/elements/ImageRun.ts +59 -59
- package/src/elements/MathElement.ts +65 -65
- package/src/elements/Paragraph.ts +4347 -4287
- package/src/elements/PreservedElement.ts +53 -53
- package/src/elements/PropertyChangeTypes.ts +458 -442
- package/src/elements/RangeMarker.ts +382 -400
- package/src/elements/Revision.ts +1198 -1217
- package/src/elements/RevisionContent.ts +73 -73
- package/src/elements/RevisionManager.ts +1070 -1070
- package/src/elements/Run.ts +3103 -3073
- package/src/elements/Section.ts +1521 -1421
- package/src/elements/Shape.ts +884 -873
- package/src/elements/StructuredDocumentTag.ts +1176 -1207
- package/src/elements/Table.ts +2468 -2524
- package/src/elements/TableCell.ts +1617 -1621
- package/src/elements/TableGridChange.ts +149 -151
- package/src/elements/TableOfContents.ts +701 -691
- package/src/elements/TableOfContentsElement.ts +89 -89
- package/src/elements/TableRow.ts +960 -929
- package/src/elements/TextBox.ts +766 -768
- package/src/formatting/AbstractNumbering.ts +580 -579
- package/src/formatting/NumberingInstance.ts +295 -299
- package/src/formatting/NumberingLevel.ts +981 -1040
- package/src/formatting/NumberingManager.ts +833 -827
- package/src/formatting/Style.ts +1785 -1879
- package/src/formatting/StylesManager.ts +1090 -1130
- package/src/helpers/CleanupHelper.ts +524 -524
- package/src/images/ImageOptimizer.ts +274 -274
- package/src/index.ts +559 -554
- package/src/managers/DrawingManager.ts +319 -319
- package/src/tracking/DocumentTrackingContext.ts +687 -674
- package/src/tracking/TrackingContext.ts +175 -173
- package/src/types/compatibility-types.ts +49 -49
- package/src/types/formatting.ts +210 -210
- package/src/types/list-types.ts +14 -14
- package/src/types/settings-types.ts +59 -59
- package/src/types/styleConfig.ts +189 -189
- package/src/utils/ChangelogGenerator.ts +1583 -1581
- package/src/utils/CompatibilityUpgrader.ts +235 -237
- package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
- package/src/utils/MoveOperationHelper.ts +233 -238
- package/src/utils/RevisionAwareProcessor.ts +518 -526
- package/src/utils/RevisionWalker.ts +427 -457
- package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
- package/src/utils/ShadingResolver.ts +105 -107
- package/src/utils/acceptRevisions.ts +723 -714
- package/src/utils/cnfStyleDecoder.ts +212 -217
- package/src/utils/corruptionDetection.ts +346 -345
- package/src/utils/dateFormatting.ts +20 -20
- package/src/utils/deepClone.ts +77 -78
- package/src/utils/diagnostics.ts +125 -129
- package/src/utils/errorHandling.ts +80 -80
- package/src/utils/formatting.ts +220 -213
- package/src/utils/list-detection.ts +32 -42
- package/src/utils/logger.ts +412 -404
- package/src/utils/parsingHelpers.ts +190 -190
- package/src/utils/stripTrackedChanges.ts +356 -353
- package/src/utils/textDiff.ts +100 -100
- package/src/utils/units.ts +421 -421
- package/src/utils/validation.ts +553 -542
- package/src/utils/xmlSanitization.ts +179 -182
- package/src/validation/RevisionAutoFixer.ts +541 -542
- package/src/validation/RevisionValidator.ts +470 -460
- package/src/validation/ValidationRules.ts +338 -338
- package/src/validation/index.ts +30 -30
- package/src/xml/XMLBuilder.ts +857 -871
- package/src/xml/XMLParser.ts +877 -919
- package/src/zip/ZipHandler.ts +629 -637
- package/src/zip/ZipReader.ts +295 -299
- package/src/zip/ZipWriter.ts +374 -390
- package/src/zip/types.ts +116 -116
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevisionWalker.js","sourceRoot":"","sources":["../../src/utils/RevisionWalker.ts"],"names":[],"mappings":";;;AAqCA,MAAM,iBAAiB,GAAG;IAExB,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;IAG7B,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;IAG/B,gBAAgB,EAAE;QAChB,aAAa;QACb,aAAa;QACb,eAAe;QACf,cAAc;QACd,cAAc;QACd,gBAAgB;QAChB,iBAAiB;QACjB,mBAAmB;QACnB,iBAAiB;KAClB;IAGD,aAAa,EAAE;QACb,sBAAsB;QACtB,oBAAoB;QACpB,oBAAoB;QACpB,kBAAkB;QAClB,0BAA0B;QAC1B,wBAAwB;QACxB,0BAA0B;QAC1B,wBAAwB;QACxB,+BAA+B;QAC/B,6BAA6B;QAC7B,6BAA6B;QAC7B,2BAA2B;KAC5B;CACF,CAAC;AAcF,MAAa,cAAc;IAczB,MAAM,CAAC,WAAW,CAChB,GAAoB,EACpB,OAA+B;QAE/B,MAAM,IAAI,GAAoC;YAC5C,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,IAAI,IAAI;YACnD,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,IAAI;YACjD,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI;YACzC,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,IAAI,IAAI;SAC9D,CAAC;QAGF,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAG5C,cAAc,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE7C,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,MAAM,CAAC,SAAS,CAAC,GAAQ;QAC/B,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,GAAQ,EAAE,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAMO,MAAM,CAAC,gBAAgB,CAC7B,GAAQ,EACR,OAAwC;QAExC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAGD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,kBAAkB,CACxE,CAAC;QAGF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,cAAc,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACvD,cAAc,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAID,cAAc,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAKO,MAAM,CAAC,gBAAgB,CAC7B,MAAW,EACX,OAAwC;QAExC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,kBAAkB,CACxE,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAEhC,IAAI,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9C,cAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;gBACrD,cAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAKO,MAAM,CAAC,YAAY,CACzB,GAAW,EACX,OAAwC;QAExC,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB;gBAAE,OAAO,KAAK,CAAC;YAC/D,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,MAAM,CAAC,YAAY,CACzB,GAAW,EACX,OAAwC;QAExC,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;gBAAE,OAAO,KAAK,CAAC;YAC9D,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,iBAAiB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,OAAO,CAAC,qBAAqB,CAAC;QACvC,CAAC;QACD,IAAI,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAeO,MAAM,CAAC,iBAAiB,CAAC,MAAW,EAAE,GAAW;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAIrE,MAAM,eAAe,GAAqC,EAAE,CAAC;QAE7D,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAE5B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC/C,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;gBAEvB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBAEjB,MAAM,UAAU,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;oBAChD,cAAc,EAAE,CAAC;oBAEjB,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;wBACjD,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;4BAEhC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;4BAChD,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;gCACrD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC;gCAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gCACnD,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;gCAE3C,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;gCAC5C,IAAI,aAAa,EAAE,CAAC;oCAClB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;wCAC7C,CAAC,CAAC,aAAa;wCACf,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;oCACpB,IAAI,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;wCACjC,eAAe,CAAC,IAAI,CAAC;4CACnB,IAAI,EAAE,SAAS;4CACf,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;yCAC9B,CAAC,CAAC;oCACL,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BAEN,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;gCACnB,CAAC,KAAK,OAAO;gCACb,CAAC,KAAK,kBAAkB,CAC3B,CAAC;4BACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gCACjC,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;gCACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;oCAC1C,CAAC,CAAC,UAAU;oCACZ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gCACjB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;oCAC/B,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gCAC3D,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBAEN,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;oBAEhC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;4BAC/C,CAAC,CAAC,cAAc;4BAChB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;wBACrB,IAAI,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;4BAC7B,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC5D,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAGD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QAGnB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAE/B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAiB,CAAC;YAE/C,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,eAAe,EAAE,CAAC;gBAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7B,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC9B,CAAC;gBACD,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC;YAGD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC;gBAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;gBAC1B,CAAC;YACH,CAAC;YAGD,MAAM,kBAAkB,GAAuB,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAE/C,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;gBAChC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;QAC/C,CAAC;aAAM,CAAC;YAEN,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;oBAAE,SAAS;gBAEtD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,kBAAkB,CACxE,CAAC;gBAEF,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;oBACnC,cAAc,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAKO,MAAM,CAAC,iBAAiB,CAAC,MAAW,EAAE,GAAW;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO;QAGzB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CACtD,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CACxC,CAAC;YAEF,cAAc,CAAC,sBAAsB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,CAAC;QAGD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAKO,MAAM,CAAC,eAAe,CAC5B,MAAW,EACX,QAAgB,EAChB,UAAe;QAEf,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAEnC,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;QAChC,CAAC;aAAM,CAAC;YAEN,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAEvE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAKO,MAAM,CAAC,sBAAsB,CACnC,eAAmC;QAEnC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE/C,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAKD,MAAM,CAAC,iBAAiB,CAAC,GAAW;QAClC,OAAO,CACL,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtC,iBAAiB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAChD,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC9C,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,4BAA4B;QACjC,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAClC,CAAC;CACF;AAlXD,wCAkXC","sourcesContent":["/**\r\n * RevisionWalker - DOM-based tree walker for accepting tracked changes\r\n *\r\n * Replaces the fragile RegEx-based revision acceptance with a robust\r\n * DOM-based approach that properly handles nested elements and preserves\r\n * element ordering.\r\n *\r\n * @module RevisionWalker\r\n */\r\n\r\nimport { ParsedXMLObject } from '../xml/XMLParser';\r\n\r\n/**\r\n * Options for controlling which revision types to accept\r\n */\r\nexport interface RevisionWalkerOptions {\r\n /** Keep content, remove w:ins wrapper (default: true) */\r\n acceptInsertions?: boolean;\r\n /** Remove w:del and content entirely (default: true) */\r\n acceptDeletions?: boolean;\r\n /** Handle w:moveFrom/w:moveTo (default: true) */\r\n acceptMoves?: boolean;\r\n /** Remove *Change elements (default: true) */\r\n acceptPropertyChanges?: boolean;\r\n}\r\n\r\n/**\r\n * Structure for tracking element order\r\n */\r\ninterface OrderedChildInfo {\r\n type: string;\r\n index: number;\r\n}\r\n\r\n/**\r\n * Revision element categories\r\n */\r\nconst REVISION_ELEMENTS = {\r\n /** Elements to unwrap (keep content, remove wrapper) */\r\n UNWRAP: ['w:ins', 'w:moveTo'],\r\n\r\n /** Elements to remove entirely (with content) */\r\n REMOVE: ['w:del', 'w:moveFrom'],\r\n\r\n /** Property change tracking elements */\r\n PROPERTY_CHANGES: [\r\n 'w:rPrChange',\r\n 'w:pPrChange',\r\n 'w:tblPrChange',\r\n 'w:tcPrChange',\r\n 'w:trPrChange',\r\n 'w:sectPrChange',\r\n 'w:tblGridChange',\r\n 'w:numberingChange',\r\n 'w:tblPrExChange',\r\n ],\r\n\r\n /** Range marker elements */\r\n RANGE_MARKERS: [\r\n 'w:moveFromRangeStart',\r\n 'w:moveFromRangeEnd',\r\n 'w:moveToRangeStart',\r\n 'w:moveToRangeEnd',\r\n 'w:customXmlInsRangeStart',\r\n 'w:customXmlInsRangeEnd',\r\n 'w:customXmlDelRangeStart',\r\n 'w:customXmlDelRangeEnd',\r\n 'w:customXmlMoveFromRangeStart',\r\n 'w:customXmlMoveFromRangeEnd',\r\n 'w:customXmlMoveToRangeStart',\r\n 'w:customXmlMoveToRangeEnd',\r\n ],\r\n};\r\n\r\n/**\r\n * DOM-based tree walker for accepting Word document revisions\r\n *\r\n * This class processes a parsed XML object tree (from XMLParser.parseToObject())\r\n * and accepts all tracked changes by:\r\n * - Unwrapping insertions (w:ins, w:moveTo) - keeping content\r\n * - Removing deletions (w:del, w:moveFrom) - discarding content\r\n * - Removing property changes (*Change elements)\r\n * - Removing range markers\r\n *\r\n * Element order is preserved using the _orderedChildren metadata.\r\n */\r\nexport class RevisionWalker {\r\n /**\r\n * Process a parsed XML object tree and accept all revisions\r\n *\r\n * @param obj - Parsed XML object from XMLParser.parseToObject()\r\n * @param options - Options controlling which revisions to accept\r\n * @returns New object tree with revisions accepted\r\n *\r\n * @example\r\n * ```typescript\r\n * const parsed = XMLParser.parseToObject(documentXml);\r\n * const clean = RevisionWalker.processTree(parsed);\r\n * ```\r\n */\r\n static processTree(\r\n obj: ParsedXMLObject,\r\n options?: RevisionWalkerOptions\r\n ): ParsedXMLObject {\r\n const opts: Required<RevisionWalkerOptions> = {\r\n acceptInsertions: options?.acceptInsertions ?? true,\r\n acceptDeletions: options?.acceptDeletions ?? true,\r\n acceptMoves: options?.acceptMoves ?? true,\r\n acceptPropertyChanges: options?.acceptPropertyChanges ?? true,\r\n };\r\n\r\n // Deep clone the object to avoid mutating the original\r\n const clone = RevisionWalker.deepClone(obj);\r\n\r\n // Walk and transform the tree\r\n RevisionWalker.walkAndTransform(clone, opts);\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Deep clone an object\r\n */\r\n private static deepClone(obj: any): any {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => RevisionWalker.deepClone(item));\r\n }\r\n\r\n const clone: any = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = RevisionWalker.deepClone(obj[key]);\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Recursively walk and transform the object tree\r\n * Processes children first (depth-first) to handle nested revisions\r\n */\r\n private static walkAndTransform(\r\n obj: any,\r\n options: Required<RevisionWalkerOptions>\r\n ): void {\r\n if (obj === null || typeof obj !== 'object') {\r\n return;\r\n }\r\n\r\n // Get keys to process (excluding metadata keys)\r\n const keys = Object.keys(obj).filter(\r\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\r\n );\r\n\r\n // First pass: recurse into children (depth-first)\r\n for (const key of keys) {\r\n const value = obj[key];\r\n if (Array.isArray(value)) {\r\n for (const item of value) {\r\n RevisionWalker.walkAndTransform(item, options);\r\n }\r\n } else if (typeof value === 'object' && value !== null) {\r\n RevisionWalker.walkAndTransform(value, options);\r\n }\r\n }\r\n\r\n // Second pass: process revision elements at this level\r\n // We need to iterate carefully because we're modifying the object\r\n RevisionWalker.processRevisions(obj, options);\r\n }\r\n\r\n /**\r\n * Process revision elements at the current level\r\n */\r\n private static processRevisions(\r\n parent: any,\r\n options: Required<RevisionWalkerOptions>\r\n ): void {\r\n if (!parent || typeof parent !== 'object') {\r\n return;\r\n }\r\n\r\n const keysToProcess = Object.keys(parent).filter(\r\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\r\n );\r\n\r\n for (const key of keysToProcess) {\r\n // Check if this is a revision element\r\n if (RevisionWalker.shouldUnwrap(key, options)) {\r\n RevisionWalker.unwrapAllElements(parent, key);\r\n } else if (RevisionWalker.shouldRemove(key, options)) {\r\n RevisionWalker.removeAllElements(parent, key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if an element should be unwrapped (content kept)\r\n */\r\n private static shouldUnwrap(\r\n key: string,\r\n options: Required<RevisionWalkerOptions>\r\n ): boolean {\r\n if (REVISION_ELEMENTS.UNWRAP.includes(key)) {\r\n if (key === 'w:ins' && !options.acceptInsertions) return false;\r\n if (key === 'w:moveTo' && !options.acceptMoves) return false;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if an element should be removed (content discarded)\r\n */\r\n private static shouldRemove(\r\n key: string,\r\n options: Required<RevisionWalkerOptions>\r\n ): boolean {\r\n if (REVISION_ELEMENTS.REMOVE.includes(key)) {\r\n if (key === 'w:del' && !options.acceptDeletions) return false;\r\n if (key === 'w:moveFrom' && !options.acceptMoves) return false;\r\n return true;\r\n }\r\n if (REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key)) {\r\n return options.acceptPropertyChanges;\r\n }\r\n if (REVISION_ELEMENTS.RANGE_MARKERS.includes(key)) {\r\n return true; // Always remove range markers\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Unwrap all elements of a given type, promoting their children to parent\r\n *\r\n * This is the most complex operation in RevisionWalker. When we unwrap a\r\n * revision element like w:ins, we need to:\r\n * 1. Extract the children from inside w:ins\r\n * 2. Insert them at the correct position in the parent's element arrays\r\n * 3. Update _orderedChildren to reflect the new structure\r\n *\r\n * The key challenge is maintaining correct element order. For example:\r\n * Before: <w:tbl><w:tr>Row1</w:tr><w:ins><w:tr>Row2</w:tr></w:ins><w:tr>Row3</w:tr></w:tbl>\r\n * After: <w:tbl><w:tr>Row1</w:tr><w:tr>Row2</w:tr><w:tr>Row3</w:tr></w:tbl>\r\n */\r\n private static unwrapAllElements(parent: any, key: string): void {\r\n const elements = parent[key];\r\n if (!elements) return;\r\n\r\n const elementArray = Array.isArray(elements) ? elements : [elements];\r\n\r\n // Build a complete ordered list of child elements by walking _orderedChildren\r\n // This captures the intended order before we modify anything\r\n const orderedElements: { type: string; element: any }[] = [];\r\n\r\n if (parent._orderedChildren) {\r\n // Track how many of each type we've seen to get correct array index\r\n const typeCounters = new Map<string, number>();\r\n let unwrappedIndex = 0;\r\n\r\n for (const entry of parent._orderedChildren) {\r\n const { type } = entry;\r\n\r\n if (type === key) {\r\n // This is a revision element - extract its children in order\r\n const revElement = elementArray[unwrappedIndex];\r\n unwrappedIndex++;\r\n\r\n if (revElement && typeof revElement === 'object') {\r\n if (revElement._orderedChildren) {\r\n // Use the revision element's _orderedChildren for correct order\r\n const childCounters = new Map<string, number>();\r\n for (const childEntry of revElement._orderedChildren) {\r\n const childType = childEntry.type;\r\n const childIdx = childCounters.get(childType) || 0;\r\n childCounters.set(childType, childIdx + 1);\r\n\r\n const childElements = revElement[childType];\r\n if (childElements) {\r\n const childArray = Array.isArray(childElements)\r\n ? childElements\r\n : [childElements];\r\n if (childIdx < childArray.length) {\r\n orderedElements.push({\r\n type: childType,\r\n element: childArray[childIdx],\r\n });\r\n }\r\n }\r\n }\r\n } else {\r\n // No _orderedChildren, extract children in object key order\r\n const childKeys = Object.keys(revElement).filter(\r\n (k) =>\r\n !k.startsWith('@_') &&\r\n k !== '#text' &&\r\n k !== '_orderedChildren'\r\n );\r\n for (const childKey of childKeys) {\r\n const childValue = revElement[childKey];\r\n const childArray = Array.isArray(childValue)\r\n ? childValue\r\n : [childValue];\r\n for (const child of childArray) {\r\n orderedElements.push({ type: childKey, element: child });\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // Regular element - get it from the parent\r\n const idx = typeCounters.get(type) || 0;\r\n typeCounters.set(type, idx + 1);\r\n\r\n const parentElements = parent[type];\r\n if (parentElements) {\r\n const parentArray = Array.isArray(parentElements)\r\n ? parentElements\r\n : [parentElements];\r\n if (idx < parentArray.length) {\r\n orderedElements.push({ type, element: parentArray[idx] });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Remove the revision wrapper\r\n delete parent[key];\r\n\r\n // If we have ordered elements, rebuild the arrays in correct order\r\n if (orderedElements.length > 0) {\r\n // Group elements by type\r\n const rebuiltArrays = new Map<string, any[]>();\r\n\r\n for (const { type, element } of orderedElements) {\r\n if (!rebuiltArrays.has(type)) {\r\n rebuiltArrays.set(type, []);\r\n }\r\n rebuiltArrays.get(type)!.push(element);\r\n }\r\n\r\n // Update parent with rebuilt arrays\r\n for (const [type, elements] of rebuiltArrays) {\r\n if (elements.length === 1) {\r\n parent[type] = elements[0];\r\n } else {\r\n parent[type] = elements;\r\n }\r\n }\r\n\r\n // Rebuild _orderedChildren\r\n const newOrderedChildren: OrderedChildInfo[] = [];\r\n const typeCounters = new Map<string, number>();\r\n\r\n for (const { type } of orderedElements) {\r\n const idx = typeCounters.get(type) || 0;\r\n typeCounters.set(type, idx + 1);\r\n newOrderedChildren.push({ type, index: idx });\r\n }\r\n\r\n parent._orderedChildren = newOrderedChildren;\r\n } else {\r\n // Fallback for when there's no _orderedChildren - just merge\r\n for (const element of elementArray) {\r\n if (!element || typeof element !== 'object') continue;\r\n\r\n const elementKeys = Object.keys(element).filter(\r\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\r\n );\r\n\r\n for (const childKey of elementKeys) {\r\n RevisionWalker.mergeIntoParent(parent, childKey, element[childKey]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all elements of a given type (including their content)\r\n */\r\n private static removeAllElements(parent: any, key: string): void {\r\n if (!parent[key]) return;\r\n\r\n // Update _orderedChildren before removing\r\n if (parent._orderedChildren) {\r\n parent._orderedChildren = parent._orderedChildren.filter(\r\n (c: OrderedChildInfo) => c.type !== key\r\n );\r\n // Re-index remaining elements of same types\r\n RevisionWalker.reindexOrderedChildren(parent._orderedChildren);\r\n }\r\n\r\n // Remove the element\r\n delete parent[key];\r\n }\r\n\r\n /**\r\n * Merge a child value into the parent, handling arrays properly\r\n */\r\n private static mergeIntoParent(\r\n parent: any,\r\n childKey: string,\r\n childValue: any\r\n ): void {\r\n if (parent[childKey] === undefined) {\r\n // No existing value, just assign\r\n parent[childKey] = childValue;\r\n } else {\r\n // Existing value, need to merge\r\n const existing = parent[childKey];\r\n const incoming = Array.isArray(childValue) ? childValue : [childValue];\r\n\r\n if (Array.isArray(existing)) {\r\n parent[childKey] = [...existing, ...incoming];\r\n } else {\r\n parent[childKey] = [existing, ...incoming];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Re-index _orderedChildren to ensure indices are sequential per type\r\n */\r\n private static reindexOrderedChildren(\r\n orderedChildren: OrderedChildInfo[]\r\n ): void {\r\n const typeCounters = new Map<string, number>();\r\n\r\n for (const entry of orderedChildren) {\r\n const currentIndex = typeCounters.get(entry.type) || 0;\r\n entry.index = currentIndex;\r\n typeCounters.set(entry.type, currentIndex + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Check if an element is a revision-related element (any type)\r\n */\r\n static isRevisionElement(key: string): boolean {\r\n return (\r\n REVISION_ELEMENTS.UNWRAP.includes(key) ||\r\n REVISION_ELEMENTS.REMOVE.includes(key) ||\r\n REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key) ||\r\n REVISION_ELEMENTS.RANGE_MARKERS.includes(key)\r\n );\r\n }\r\n\r\n /**\r\n * Get revision element categories (for external use/testing)\r\n */\r\n static getRevisionElementCategories(): typeof REVISION_ELEMENTS {\r\n return { ...REVISION_ELEMENTS };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RevisionWalker.js","sourceRoot":"","sources":["../../src/utils/RevisionWalker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionWalker - DOM-based tree walker for accepting tracked changes\n *\n * Replaces the fragile RegEx-based revision acceptance with a robust\n * DOM-based approach that properly handles nested elements and preserves\n * element ordering.\n *\n * @module RevisionWalker\n */\n\nimport { ParsedXMLObject } from '../xml/XMLParser';\n\n/**\n * Options for controlling which revision types to accept\n */\nexport interface RevisionWalkerOptions {\n /** Keep content, remove w:ins wrapper (default: true) */\n acceptInsertions?: boolean;\n /** Remove w:del and content entirely (default: true) */\n acceptDeletions?: boolean;\n /** Handle w:moveFrom/w:moveTo (default: true) */\n acceptMoves?: boolean;\n /** Remove *Change elements (default: true) */\n acceptPropertyChanges?: boolean;\n}\n\n/**\n * Structure for tracking element order\n */\ninterface OrderedChildInfo {\n type: string;\n index: number;\n}\n\n/**\n * Revision element categories\n */\nconst REVISION_ELEMENTS = {\n /** Elements to unwrap (keep content, remove wrapper) */\n UNWRAP: ['w:ins', 'w:moveTo'],\n\n /** Elements to remove entirely (with content) */\n REMOVE: ['w:del', 'w:moveFrom'],\n\n /** Property change tracking elements */\n PROPERTY_CHANGES: [\n 'w:rPrChange',\n 'w:pPrChange',\n 'w:tblPrChange',\n 'w:tcPrChange',\n 'w:trPrChange',\n 'w:sectPrChange',\n 'w:tblGridChange',\n 'w:numberingChange',\n 'w:tblPrExChange',\n ],\n\n /** Range marker elements */\n RANGE_MARKERS: [\n 'w:moveFromRangeStart',\n 'w:moveFromRangeEnd',\n 'w:moveToRangeStart',\n 'w:moveToRangeEnd',\n 'w:customXmlInsRangeStart',\n 'w:customXmlInsRangeEnd',\n 'w:customXmlDelRangeStart',\n 'w:customXmlDelRangeEnd',\n 'w:customXmlMoveFromRangeStart',\n 'w:customXmlMoveFromRangeEnd',\n 'w:customXmlMoveToRangeStart',\n 'w:customXmlMoveToRangeEnd',\n ],\n};\n\n/**\n * DOM-based tree walker for accepting Word document revisions\n *\n * This class processes a parsed XML object tree (from XMLParser.parseToObject())\n * and accepts all tracked changes by:\n * - Unwrapping insertions (w:ins, w:moveTo) - keeping content\n * - Removing deletions (w:del, w:moveFrom) - discarding content\n * - Removing property changes (*Change elements)\n * - Removing range markers\n *\n * Element order is preserved using the _orderedChildren metadata.\n */\nexport class RevisionWalker {\n /**\n * Process a parsed XML object tree and accept all revisions\n *\n * @param obj - Parsed XML object from XMLParser.parseToObject()\n * @param options - Options controlling which revisions to accept\n * @returns New object tree with revisions accepted\n *\n * @example\n * ```typescript\n * const parsed = XMLParser.parseToObject(documentXml);\n * const clean = RevisionWalker.processTree(parsed);\n * ```\n */\n static processTree(obj: ParsedXMLObject, options?: RevisionWalkerOptions): ParsedXMLObject {\n const opts: Required<RevisionWalkerOptions> = {\n acceptInsertions: options?.acceptInsertions ?? true,\n acceptDeletions: options?.acceptDeletions ?? true,\n acceptMoves: options?.acceptMoves ?? true,\n acceptPropertyChanges: options?.acceptPropertyChanges ?? true,\n };\n\n // Deep clone the object to avoid mutating the original\n const clone = RevisionWalker.deepClone(obj);\n\n // Walk and transform the tree\n RevisionWalker.walkAndTransform(clone, opts);\n\n return clone;\n }\n\n /**\n * Deep clone an object\n */\n private static deepClone(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => RevisionWalker.deepClone(item));\n }\n\n const clone: any = {};\n for (const key of Object.keys(obj)) {\n clone[key] = RevisionWalker.deepClone(obj[key]);\n }\n return clone;\n }\n\n /**\n * Recursively walk and transform the object tree\n * Processes children first (depth-first) to handle nested revisions\n */\n private static walkAndTransform(obj: any, options: Required<RevisionWalkerOptions>): void {\n if (obj === null || typeof obj !== 'object') {\n return;\n }\n\n // Get keys to process (excluding metadata keys)\n const keys = Object.keys(obj).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n // First pass: recurse into children (depth-first)\n for (const key of keys) {\n const value = obj[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n RevisionWalker.walkAndTransform(item, options);\n }\n } else if (typeof value === 'object' && value !== null) {\n RevisionWalker.walkAndTransform(value, options);\n }\n }\n\n // Second pass: process revision elements at this level\n // We need to iterate carefully because we're modifying the object\n RevisionWalker.processRevisions(obj, options);\n }\n\n /**\n * Process revision elements at the current level\n */\n private static processRevisions(parent: any, options: Required<RevisionWalkerOptions>): void {\n if (!parent || typeof parent !== 'object') {\n return;\n }\n\n const keysToProcess = Object.keys(parent).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n for (const key of keysToProcess) {\n // Check if this is a revision element\n if (RevisionWalker.shouldUnwrap(key, options)) {\n RevisionWalker.unwrapAllElements(parent, key);\n } else if (RevisionWalker.shouldRemove(key, options)) {\n RevisionWalker.removeAllElements(parent, key);\n }\n }\n }\n\n /**\n * Check if an element should be unwrapped (content kept)\n */\n private static shouldUnwrap(key: string, options: Required<RevisionWalkerOptions>): boolean {\n if (REVISION_ELEMENTS.UNWRAP.includes(key)) {\n if (key === 'w:ins' && !options.acceptInsertions) return false;\n if (key === 'w:moveTo' && !options.acceptMoves) return false;\n return true;\n }\n return false;\n }\n\n /**\n * Check if an element should be removed (content discarded)\n */\n private static shouldRemove(key: string, options: Required<RevisionWalkerOptions>): boolean {\n if (REVISION_ELEMENTS.REMOVE.includes(key)) {\n if (key === 'w:del' && !options.acceptDeletions) return false;\n if (key === 'w:moveFrom' && !options.acceptMoves) return false;\n return true;\n }\n if (REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key)) {\n return options.acceptPropertyChanges;\n }\n if (REVISION_ELEMENTS.RANGE_MARKERS.includes(key)) {\n return true; // Always remove range markers\n }\n return false;\n }\n\n /**\n * Unwrap all elements of a given type, promoting their children to parent\n *\n * This is the most complex operation in RevisionWalker. When we unwrap a\n * revision element like w:ins, we need to:\n * 1. Extract the children from inside w:ins\n * 2. Insert them at the correct position in the parent's element arrays\n * 3. Update _orderedChildren to reflect the new structure\n *\n * The key challenge is maintaining correct element order. For example:\n * Before: <w:tbl><w:tr>Row1</w:tr><w:ins><w:tr>Row2</w:tr></w:ins><w:tr>Row3</w:tr></w:tbl>\n * After: <w:tbl><w:tr>Row1</w:tr><w:tr>Row2</w:tr><w:tr>Row3</w:tr></w:tbl>\n */\n private static unwrapAllElements(parent: any, key: string): void {\n const elements = parent[key];\n if (!elements) return;\n\n const elementArray = Array.isArray(elements) ? elements : [elements];\n\n // Build a complete ordered list of child elements by walking _orderedChildren\n // This captures the intended order before we modify anything\n const orderedElements: { type: string; element: any }[] = [];\n\n if (parent._orderedChildren) {\n // Track how many of each type we've seen to get correct array index\n const typeCounters = new Map<string, number>();\n let unwrappedIndex = 0;\n\n for (const entry of parent._orderedChildren) {\n const { type } = entry;\n\n if (type === key) {\n // This is a revision element - extract its children in order\n const revElement = elementArray[unwrappedIndex];\n unwrappedIndex++;\n\n if (revElement && typeof revElement === 'object') {\n if (revElement._orderedChildren) {\n // Use the revision element's _orderedChildren for correct order\n const childCounters = new Map<string, number>();\n for (const childEntry of revElement._orderedChildren) {\n const childType = childEntry.type;\n const childIdx = childCounters.get(childType) || 0;\n childCounters.set(childType, childIdx + 1);\n\n const childElements = revElement[childType];\n if (childElements) {\n const childArray = Array.isArray(childElements) ? childElements : [childElements];\n if (childIdx < childArray.length) {\n orderedElements.push({\n type: childType,\n element: childArray[childIdx],\n });\n }\n }\n }\n } else {\n // No _orderedChildren, extract children in object key order\n const childKeys = Object.keys(revElement).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n for (const childKey of childKeys) {\n const childValue = revElement[childKey];\n const childArray = Array.isArray(childValue) ? childValue : [childValue];\n for (const child of childArray) {\n orderedElements.push({ type: childKey, element: child });\n }\n }\n }\n }\n } else {\n // Regular element - get it from the parent\n const idx = typeCounters.get(type) || 0;\n typeCounters.set(type, idx + 1);\n\n const parentElements = parent[type];\n if (parentElements) {\n const parentArray = Array.isArray(parentElements) ? parentElements : [parentElements];\n if (idx < parentArray.length) {\n orderedElements.push({ type, element: parentArray[idx] });\n }\n }\n }\n }\n }\n\n // Remove the revision wrapper\n delete parent[key];\n\n // If we have ordered elements, rebuild the arrays in correct order\n if (orderedElements.length > 0) {\n // Group elements by type\n const rebuiltArrays = new Map<string, any[]>();\n\n for (const { type, element } of orderedElements) {\n if (!rebuiltArrays.has(type)) {\n rebuiltArrays.set(type, []);\n }\n rebuiltArrays.get(type)!.push(element);\n }\n\n // Update parent with rebuilt arrays\n for (const [type, elements] of rebuiltArrays) {\n if (elements.length === 1) {\n parent[type] = elements[0];\n } else {\n parent[type] = elements;\n }\n }\n\n // Rebuild _orderedChildren\n const newOrderedChildren: OrderedChildInfo[] = [];\n const typeCounters = new Map<string, number>();\n\n for (const { type } of orderedElements) {\n const idx = typeCounters.get(type) || 0;\n typeCounters.set(type, idx + 1);\n newOrderedChildren.push({ type, index: idx });\n }\n\n parent._orderedChildren = newOrderedChildren;\n } else {\n // Fallback for when there's no _orderedChildren - just merge\n for (const element of elementArray) {\n if (!element || typeof element !== 'object') continue;\n\n const elementKeys = Object.keys(element).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n for (const childKey of elementKeys) {\n RevisionWalker.mergeIntoParent(parent, childKey, element[childKey]);\n }\n }\n }\n }\n\n /**\n * Remove all elements of a given type (including their content)\n */\n private static removeAllElements(parent: any, key: string): void {\n if (!parent[key]) return;\n\n // Update _orderedChildren before removing\n if (parent._orderedChildren) {\n parent._orderedChildren = parent._orderedChildren.filter(\n (c: OrderedChildInfo) => c.type !== key\n );\n // Re-index remaining elements of same types\n RevisionWalker.reindexOrderedChildren(parent._orderedChildren);\n }\n\n // Remove the element\n delete parent[key];\n }\n\n /**\n * Merge a child value into the parent, handling arrays properly\n */\n private static mergeIntoParent(parent: any, childKey: string, childValue: any): void {\n if (parent[childKey] === undefined) {\n // No existing value, just assign\n parent[childKey] = childValue;\n } else {\n // Existing value, need to merge\n const existing = parent[childKey];\n const incoming = Array.isArray(childValue) ? childValue : [childValue];\n\n if (Array.isArray(existing)) {\n parent[childKey] = [...existing, ...incoming];\n } else {\n parent[childKey] = [existing, ...incoming];\n }\n }\n }\n\n /**\n * Re-index _orderedChildren to ensure indices are sequential per type\n */\n private static reindexOrderedChildren(orderedChildren: OrderedChildInfo[]): void {\n const typeCounters = new Map<string, number>();\n\n for (const entry of orderedChildren) {\n const currentIndex = typeCounters.get(entry.type) || 0;\n entry.index = currentIndex;\n typeCounters.set(entry.type, currentIndex + 1);\n }\n }\n\n /**\n * Check if an element is a revision-related element (any type)\n */\n static isRevisionElement(key: string): boolean {\n return (\n REVISION_ELEMENTS.UNWRAP.includes(key) ||\n REVISION_ELEMENTS.REMOVE.includes(key) ||\n REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key) ||\n REVISION_ELEMENTS.RANGE_MARKERS.includes(key)\n );\n }\n\n /**\n * Get revision element categories (for external use/testing)\n */\n static getRevisionElementCategories(): typeof REVISION_ELEMENTS {\n return { ...REVISION_ELEMENTS };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectiveRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/utils/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAK9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAK7D,MAAM,WAAW,qBAAqB;IAEpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD,qBAAa,yBAAyB;IAUpC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"SelectiveRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/utils/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAK9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAK7D,MAAM,WAAW,qBAAqB;IAEpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD,qBAAa,yBAAyB;IAUpC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,qBAAqB;IA0EhF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,qBAAqB;IAkEhF,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAmExC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA8CpC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAmDjC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAwDjC,MAAM,CAAC,OAAO,CACZ,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAC1B,qBAAqB;IAYxB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAW3E,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAW3E,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,qBAAqB;IAWhF,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,qBAAqB;IAWhF,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,qBAAqB;IAazE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,qBAAqB;IAYxE,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAUjE,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAUhE,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAUpE,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,QAAQ,GAAG,qBAAqB;IAOrE,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAqBjC,OAAO,CAAC,MAAM,CAAC,eAAe;IAuD9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAkClC,OAAO,CAAC,MAAM,CAAC,WAAW;CAa3B"}
|
|
@@ -259,9 +259,7 @@ class SelectiveRevisionAcceptor {
|
|
|
259
259
|
}
|
|
260
260
|
}
|
|
261
261
|
static preview(doc, criteria, action) {
|
|
262
|
-
return action === 'accept'
|
|
263
|
-
? this.accept(doc, criteria)
|
|
264
|
-
: this.reject(doc, criteria);
|
|
262
|
+
return action === 'accept' ? this.accept(doc, criteria) : this.reject(doc, criteria);
|
|
265
263
|
}
|
|
266
264
|
static acceptByAuthor(doc, author) {
|
|
267
265
|
return this.accept(doc, { authors: [author] });
|
|
@@ -355,9 +353,7 @@ class SelectiveRevisionAcceptor {
|
|
|
355
353
|
type === 'numberingChange') {
|
|
356
354
|
return 'formatting';
|
|
357
355
|
}
|
|
358
|
-
if (type === 'moveFrom' ||
|
|
359
|
-
type === 'moveTo' ||
|
|
360
|
-
type === 'sectionPropertiesChange') {
|
|
356
|
+
if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {
|
|
361
357
|
return 'structural';
|
|
362
358
|
}
|
|
363
359
|
if (type === 'tablePropertiesChange' ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectiveRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * SelectiveRevisionAcceptor - Accept or reject specific revisions based on criteria\r\n *\r\n * Provides granular control over revision acceptance using in-memory DOM transformation.\r\n * Extends the all-or-nothing approach with selective acceptance by author, type, date,\r\n * and custom criteria.\r\n *\r\n * Uses the industry-standard in-memory transformation approach (like OpenXML PowerTools),\r\n * allowing subsequent modifications to be saved correctly.\r\n *\r\n * @module SelectiveRevisionAcceptor\r\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\r\n */\r\n\r\nimport type { Document } from '../core/Document';\r\nimport type { Paragraph, ParagraphContent } from '../elements/Paragraph';\r\nimport { Revision, RevisionType } from '../elements/Revision';\r\nimport type { Run } from '../elements/Run';\r\nimport type { Hyperlink } from '../elements/Hyperlink';\r\nimport { isRunContent, isHyperlinkContent } from '../elements/RevisionContent';\r\nimport { ChangeCategory } from './ChangelogGenerator';\r\nimport { SelectionCriteria } from './RevisionAwareProcessor';\r\n\r\n/**\r\n * Result of selective revision acceptance.\r\n */\r\nexport interface SelectiveAcceptResult {\r\n /** IDs of accepted revisions */\r\n accepted: string[];\r\n /** IDs of rejected/removed revisions */\r\n rejected: string[];\r\n /** IDs of revisions that remain */\r\n remaining: string[];\r\n /** Summary of actions taken */\r\n summary: {\r\n totalProcessed: number;\r\n acceptedCount: number;\r\n rejectedCount: number;\r\n remainingCount: number;\r\n };\r\n}\r\n\r\n/**\r\n * Provides granular control over revision acceptance using in-memory DOM transformation.\r\n * Allows subsequent modifications to be saved correctly.\r\n */\r\nexport class SelectiveRevisionAcceptor {\r\n /**\r\n * Accept revisions matching criteria using in-memory DOM transformation.\r\n * Matching revisions: content kept, revision wrapper removed.\r\n * Non-matching revisions: preserved in the document.\r\n *\r\n * @param doc - Document to process\r\n * @param criteria - Selection criteria\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static accept(\r\n doc: Document,\r\n criteria: SelectionCriteria\r\n ): SelectiveAcceptResult {\r\n const accepted: string[] = [];\r\n const remaining: string[] = [];\r\n\r\n // Check if doc has full Document API (getAllParagraphs, getTables)\r\n // or if it's a minimal mock (only getRevisionManager)\r\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\r\n\r\n if (hasFullApi) {\r\n // Full in-memory DOM transformation\r\n const paragraphs = (doc as any).getAllParagraphs();\r\n for (const paragraph of paragraphs) {\r\n this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);\r\n }\r\n\r\n // Process paragraphs in tables\r\n const tables = (doc as any).getTables();\r\n for (const table of tables) {\r\n for (const row of table.getRows()) {\r\n for (const cell of row.getCells()) {\r\n for (const paragraph of cell.getParagraphs()) {\r\n this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\r\n const revisionManager = doc.getRevisionManager();\r\n if (revisionManager) {\r\n const allRevisions = revisionManager.getAllRevisions();\r\n for (const rev of allRevisions) {\r\n if (this.matchesCriteria(rev, criteria)) {\r\n accepted.push(rev.getId().toString());\r\n } else {\r\n remaining.push(rev.getId().toString());\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clear accepted revisions from RevisionManager\r\n const revisionManager = doc.getRevisionManager();\r\n if (revisionManager) {\r\n for (const id of accepted) {\r\n revisionManager.removeById(parseInt(id, 10));\r\n }\r\n }\r\n\r\n return {\r\n accepted,\r\n rejected: [],\r\n remaining,\r\n summary: {\r\n totalProcessed: accepted.length + remaining.length,\r\n acceptedCount: accepted.length,\r\n rejectedCount: 0,\r\n remainingCount: remaining.length,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Reject revisions matching criteria using in-memory DOM transformation.\r\n * Matching revisions: content AND wrapper removed (opposite of accept).\r\n * Non-matching revisions: preserved in the document.\r\n *\r\n * For insertions: Rejecting removes the inserted content entirely.\r\n * For deletions: Rejecting keeps the deleted content (opposite of accepting).\r\n *\r\n * @param doc - Document to process\r\n * @param criteria - Selection criteria\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static reject(\r\n doc: Document,\r\n criteria: SelectionCriteria\r\n ): SelectiveAcceptResult {\r\n const rejected: string[] = [];\r\n const remaining: string[] = [];\r\n\r\n // Check if doc has full Document API (getAllParagraphs, getTables)\r\n // or if it's a minimal mock (only getRevisionManager)\r\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\r\n\r\n if (hasFullApi) {\r\n // Full in-memory DOM transformation\r\n const paragraphs = (doc as any).getAllParagraphs();\r\n for (const paragraph of paragraphs) {\r\n this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);\r\n }\r\n\r\n // Process paragraphs in tables\r\n const tables = (doc as any).getTables();\r\n for (const table of tables) {\r\n for (const row of table.getRows()) {\r\n for (const cell of row.getCells()) {\r\n for (const paragraph of cell.getParagraphs()) {\r\n this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\r\n const revisionManager = doc.getRevisionManager();\r\n if (revisionManager) {\r\n const allRevisions = revisionManager.getAllRevisions();\r\n for (const rev of allRevisions) {\r\n if (this.matchesCriteria(rev, criteria)) {\r\n rejected.push(rev.getId().toString());\r\n } else {\r\n remaining.push(rev.getId().toString());\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clear rejected revisions from RevisionManager\r\n const revisionManager = doc.getRevisionManager();\r\n if (revisionManager) {\r\n for (const id of rejected) {\r\n revisionManager.removeById(parseInt(id, 10));\r\n }\r\n }\r\n\r\n return {\r\n accepted: [],\r\n rejected,\r\n remaining,\r\n summary: {\r\n totalProcessed: rejected.length + remaining.length,\r\n acceptedCount: 0,\r\n rejectedCount: rejected.length,\r\n remainingCount: remaining.length,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Process a paragraph for selective revision acceptance/rejection.\r\n * Transforms matching revisions in-place using DOM transformation.\r\n */\r\n private static processSelectiveParagraph(\r\n paragraph: Paragraph,\r\n criteria: SelectionCriteria,\r\n action: 'accept' | 'reject',\r\n processedIds: string[],\r\n remainingIds: string[]\r\n ): void {\r\n const content = paragraph.getContent();\r\n const newContent: ParagraphContent[] = [];\r\n\r\n for (const item of content) {\r\n if (item instanceof Revision) {\r\n const revisionId = item.getId().toString();\r\n\r\n if (this.matchesCriteria(item, criteria)) {\r\n // This revision matches the criteria - process it\r\n processedIds.push(revisionId);\r\n\r\n if (action === 'accept') {\r\n // Accept: Transform based on revision type\r\n this.acceptRevisionItem(item, newContent);\r\n } else {\r\n // Reject: Transform opposite of accept\r\n this.rejectRevisionItem(item, newContent);\r\n }\r\n } else {\r\n // This revision doesn't match - keep it\r\n remainingIds.push(revisionId);\r\n newContent.push(item);\r\n }\r\n } else {\r\n // Non-revision content - keep as-is\r\n newContent.push(item);\r\n }\r\n }\r\n\r\n // Replace paragraph content with the transformed content\r\n paragraph.setContent(newContent);\r\n\r\n // Handle paragraph mark revision markers (w:del/w:ins in w:pPr/w:rPr)\r\n // Both accept and reject clear the marker — these are metadata-only markers (no content),\r\n // so there is no content to add or remove, only the marker itself to clear.\r\n const formatting = paragraph.getFormatting();\r\n if (formatting.paragraphMarkDeletion) {\r\n const del = formatting.paragraphMarkDeletion;\r\n if (this.matchesMarkerCriteria(del, criteria)) {\r\n paragraph.clearParagraphMarkDeletion();\r\n processedIds.push(del.id.toString());\r\n } else {\r\n remainingIds.push(del.id.toString());\r\n }\r\n }\r\n if (formatting.paragraphMarkInsertion) {\r\n const ins = formatting.paragraphMarkInsertion;\r\n if (this.matchesMarkerCriteria(ins, criteria)) {\r\n paragraph.clearParagraphMarkInsertion();\r\n processedIds.push(ins.id.toString());\r\n } else {\r\n remainingIds.push(ins.id.toString());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if a paragraph mark revision marker matches the given criteria.\r\n * Simplified version of matchesCriteria for non-Revision marker objects.\r\n */\r\n private static matchesMarkerCriteria(\r\n marker: { id: number; author: string; date: Date },\r\n criteria: SelectionCriteria\r\n ): boolean {\r\n // If no criteria specified, match nothing\r\n if (\r\n !criteria.ids &&\r\n !criteria.types &&\r\n !criteria.authors &&\r\n !criteria.dateRange &&\r\n !criteria.categories &&\r\n !criteria.custom\r\n ) {\r\n return false;\r\n }\r\n\r\n // Filter by IDs\r\n if (criteria.ids && !criteria.ids.includes(marker.id)) {\r\n return false;\r\n }\r\n\r\n // Filter by authors\r\n if (criteria.authors && !criteria.authors.includes(marker.author)) {\r\n return false;\r\n }\r\n\r\n // Filter by date range\r\n if (criteria.dateRange) {\r\n if (marker.date < criteria.dateRange.start || marker.date > criteria.dateRange.end) {\r\n return false;\r\n }\r\n }\r\n\r\n // types, categories, and custom filters don't apply to paragraph mark markers\r\n // (they are not Revision objects with a type/category)\r\n // If criteria only specifies types/categories/custom, markers won't match\r\n if (criteria.types || criteria.categories || criteria.custom) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Accept a single revision item (unwrap insertions, remove deletions).\r\n */\r\n private static acceptRevisionItem(\r\n revision: Revision,\r\n newContent: ParagraphContent[]\r\n ): void {\r\n const revisionType = revision.getType();\r\n const childContent = revision.getContent();\r\n\r\n switch (revisionType) {\r\n case 'insert':\r\n case 'moveTo':\r\n // Unwrap: Extract child content into parent position\r\n for (const child of childContent) {\r\n if (isRunContent(child)) {\r\n newContent.push(child as Run);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n break;\r\n\r\n case 'delete':\r\n case 'moveFrom':\r\n // Remove: Don't add to newContent - content is deleted\r\n break;\r\n\r\n case 'runPropertiesChange':\r\n case 'paragraphPropertiesChange':\r\n case 'tablePropertiesChange':\r\n case 'tableExceptionPropertiesChange':\r\n case 'tableRowPropertiesChange':\r\n case 'tableCellPropertiesChange':\r\n case 'sectionPropertiesChange':\r\n case 'numberingChange':\r\n // Property changes: Keep content, remove change metadata\r\n for (const child of childContent) {\r\n if (isRunContent(child)) {\r\n newContent.push(child as Run);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n break;\r\n\r\n default:\r\n // Unknown type - keep the revision as-is for safety\r\n newContent.push(revision);\r\n }\r\n }\r\n\r\n /**\r\n * Reject a single revision item (opposite of accept).\r\n * - Rejecting an insertion removes the content\r\n * - Rejecting a deletion keeps the content (unwraps it)\r\n */\r\n private static rejectRevisionItem(\r\n revision: Revision,\r\n newContent: ParagraphContent[]\r\n ): void {\r\n const revisionType = revision.getType();\r\n const childContent = revision.getContent();\r\n\r\n switch (revisionType) {\r\n case 'insert':\r\n case 'moveTo':\r\n // Reject insertion: Remove the inserted content entirely\r\n break;\r\n\r\n case 'delete':\r\n case 'moveFrom':\r\n // Reject deletion: Keep the deleted content (unwrap)\r\n for (const child of childContent) {\r\n if (isRunContent(child)) {\r\n newContent.push(child as Run);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n break;\r\n\r\n case 'runPropertiesChange':\r\n case 'paragraphPropertiesChange':\r\n case 'tablePropertiesChange':\r\n case 'tableExceptionPropertiesChange':\r\n case 'tableRowPropertiesChange':\r\n case 'tableCellPropertiesChange':\r\n case 'sectionPropertiesChange':\r\n case 'numberingChange':\r\n // Rejecting property changes: Would need to restore old properties\r\n // For now, just keep content without the change metadata\r\n // (Full implementation would restore previousProperties)\r\n for (const child of childContent) {\r\n if (isRunContent(child)) {\r\n newContent.push(child as Run);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n break;\r\n\r\n default:\r\n // Unknown type - keep the revision as-is for safety\r\n newContent.push(revision);\r\n }\r\n }\r\n\r\n /**\r\n * Preview what would happen without making changes.\r\n *\r\n * @param doc - Document to analyze\r\n * @param criteria - Selection criteria\r\n * @param action - Action to preview\r\n * @returns Preview of what would happen\r\n */\r\n static preview(\r\n doc: Document,\r\n criteria: SelectionCriteria,\r\n action: 'accept' | 'reject'\r\n ): SelectiveAcceptResult {\r\n // Preview is the same as the actual operation but without side effects\r\n return action === 'accept'\r\n ? this.accept(doc, criteria)\r\n : this.reject(doc, criteria);\r\n }\r\n\r\n /**\r\n * Accept all revisions by a specific author.\r\n *\r\n * @param doc - Document to process\r\n * @param author - Author name to accept\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptByAuthor(doc: Document, author: string): SelectiveAcceptResult {\r\n return this.accept(doc, { authors: [author] });\r\n }\r\n\r\n /**\r\n * Reject all revisions by a specific author.\r\n *\r\n * @param doc - Document to process\r\n * @param author - Author name to reject\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static rejectByAuthor(doc: Document, author: string): SelectiveAcceptResult {\r\n return this.reject(doc, { authors: [author] });\r\n }\r\n\r\n /**\r\n * Accept all revisions of specific types.\r\n *\r\n * @param doc - Document to process\r\n * @param types - Revision types to accept\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\r\n return this.accept(doc, { types });\r\n }\r\n\r\n /**\r\n * Reject all revisions of specific types.\r\n *\r\n * @param doc - Document to process\r\n * @param types - Revision types to reject\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static rejectByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\r\n return this.reject(doc, { types });\r\n }\r\n\r\n /**\r\n * Accept all revisions before a specific date.\r\n *\r\n * @param doc - Document to process\r\n * @param date - Cutoff date (exclusive)\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptBeforeDate(doc: Document, date: Date): SelectiveAcceptResult {\r\n return this.accept(doc, {\r\n dateRange: { start: new Date(0), end: date },\r\n });\r\n }\r\n\r\n /**\r\n * Accept all revisions after a specific date.\r\n *\r\n * @param doc - Document to process\r\n * @param date - Start date (exclusive)\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptAfterDate(doc: Document, date: Date): SelectiveAcceptResult {\r\n return this.accept(doc, {\r\n dateRange: { start: date, end: new Date() },\r\n });\r\n }\r\n\r\n /**\r\n * Accept all insertions only.\r\n *\r\n * @param doc - Document to process\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptInsertionsOnly(doc: Document): SelectiveAcceptResult {\r\n return this.accept(doc, { types: ['insert'] });\r\n }\r\n\r\n /**\r\n * Accept all deletions only.\r\n *\r\n * @param doc - Document to process\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptDeletionsOnly(doc: Document): SelectiveAcceptResult {\r\n return this.accept(doc, { types: ['delete'] });\r\n }\r\n\r\n /**\r\n * Reject all formatting changes (keep content changes).\r\n *\r\n * @param doc - Document to process\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static rejectFormattingChanges(doc: Document): SelectiveAcceptResult {\r\n return this.reject(doc, { categories: ['formatting'] });\r\n }\r\n\r\n /**\r\n * Accept content changes only (reject formatting).\r\n *\r\n * @param doc - Document to process\r\n * @returns Result with accepted, rejected, and remaining revision IDs\r\n */\r\n static acceptContentChangesOnly(doc: Document): SelectiveAcceptResult {\r\n return this.accept(doc, { categories: ['content'] });\r\n }\r\n\r\n /**\r\n * Partition revisions into matching and non-matching based on criteria.\r\n */\r\n private static partitionRevisions(\r\n revisions: Revision[],\r\n criteria: SelectionCriteria\r\n ): { matching: Revision[]; nonMatching: Revision[] } {\r\n const matching: Revision[] = [];\r\n const nonMatching: Revision[] = [];\r\n\r\n for (const rev of revisions) {\r\n if (this.matchesCriteria(rev, criteria)) {\r\n matching.push(rev);\r\n } else {\r\n nonMatching.push(rev);\r\n }\r\n }\r\n\r\n return { matching, nonMatching };\r\n }\r\n\r\n /**\r\n * Check if a revision matches the given criteria.\r\n */\r\n private static matchesCriteria(\r\n revision: Revision,\r\n criteria: SelectionCriteria\r\n ): boolean {\r\n // If no criteria specified, match nothing\r\n if (\r\n !criteria.ids &&\r\n !criteria.types &&\r\n !criteria.authors &&\r\n !criteria.dateRange &&\r\n !criteria.categories &&\r\n !criteria.custom\r\n ) {\r\n return false;\r\n }\r\n\r\n // Filter by IDs\r\n if (criteria.ids && !criteria.ids.includes(revision.getId())) {\r\n return false;\r\n }\r\n\r\n // Filter by types\r\n if (criteria.types && !criteria.types.includes(revision.getType())) {\r\n return false;\r\n }\r\n\r\n // Filter by authors\r\n if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {\r\n return false;\r\n }\r\n\r\n // Filter by date range\r\n if (criteria.dateRange) {\r\n const date = revision.getDate();\r\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\r\n return false;\r\n }\r\n }\r\n\r\n // Filter by categories\r\n if (criteria.categories) {\r\n const category = this.getRevisionCategory(revision);\r\n if (!criteria.categories.includes(category)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Custom filter\r\n if (criteria.custom && !criteria.custom(revision)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the semantic category of a revision.\r\n */\r\n private static getRevisionCategory(revision: Revision): ChangeCategory {\r\n const type = revision.getType();\r\n\r\n if (type === 'insert' || type === 'delete') {\r\n return 'content';\r\n }\r\n if (\r\n type === 'runPropertiesChange' ||\r\n type === 'paragraphPropertiesChange' ||\r\n type === 'numberingChange'\r\n ) {\r\n return 'formatting';\r\n }\r\n if (\r\n type === 'moveFrom' ||\r\n type === 'moveTo' ||\r\n type === 'sectionPropertiesChange'\r\n ) {\r\n return 'structural';\r\n }\r\n if (\r\n type === 'tablePropertiesChange' ||\r\n type === 'tableExceptionPropertiesChange' ||\r\n type === 'tableRowPropertiesChange' ||\r\n type === 'tableCellPropertiesChange' ||\r\n type === 'tableCellInsert' ||\r\n type === 'tableCellDelete' ||\r\n type === 'tableCellMerge'\r\n ) {\r\n return 'table';\r\n }\r\n\r\n return 'content';\r\n }\r\n\r\n /**\r\n * Create an empty result.\r\n */\r\n private static emptyResult(): SelectiveAcceptResult {\r\n return {\r\n accepted: [],\r\n rejected: [],\r\n remaining: [],\r\n summary: {\r\n totalProcessed: 0,\r\n acceptedCount: 0,\r\n rejectedCount: 0,\r\n remainingCount: 0,\r\n },\r\n };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SelectiveRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SelectiveRevisionAcceptor - Accept or reject specific revisions based on criteria\n *\n * Provides granular control over revision acceptance using in-memory DOM transformation.\n * Extends the all-or-nothing approach with selective acceptance by author, type, date,\n * and custom criteria.\n *\n * Uses the industry-standard in-memory transformation approach (like OpenXML PowerTools),\n * allowing subsequent modifications to be saved correctly.\n *\n * @module SelectiveRevisionAcceptor\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n */\n\nimport type { Document } from '../core/Document';\nimport type { Paragraph, ParagraphContent } from '../elements/Paragraph';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport type { Run } from '../elements/Run';\nimport type { Hyperlink } from '../elements/Hyperlink';\nimport { isRunContent, isHyperlinkContent } from '../elements/RevisionContent';\nimport { ChangeCategory } from './ChangelogGenerator';\nimport { SelectionCriteria } from './RevisionAwareProcessor';\n\n/**\n * Result of selective revision acceptance.\n */\nexport interface SelectiveAcceptResult {\n /** IDs of accepted revisions */\n accepted: string[];\n /** IDs of rejected/removed revisions */\n rejected: string[];\n /** IDs of revisions that remain */\n remaining: string[];\n /** Summary of actions taken */\n summary: {\n totalProcessed: number;\n acceptedCount: number;\n rejectedCount: number;\n remainingCount: number;\n };\n}\n\n/**\n * Provides granular control over revision acceptance using in-memory DOM transformation.\n * Allows subsequent modifications to be saved correctly.\n */\nexport class SelectiveRevisionAcceptor {\n /**\n * Accept revisions matching criteria using in-memory DOM transformation.\n * Matching revisions: content kept, revision wrapper removed.\n * Non-matching revisions: preserved in the document.\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static accept(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult {\n const accepted: string[] = [];\n const remaining: string[] = [];\n\n // Check if doc has full Document API (getAllParagraphs, getTables)\n // or if it's a minimal mock (only getRevisionManager)\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n // Full in-memory DOM transformation\n const paragraphs = (doc as any).getAllParagraphs();\n for (const paragraph of paragraphs) {\n this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);\n }\n\n // Process paragraphs in tables\n const tables = (doc as any).getTables();\n for (const table of tables) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);\n }\n }\n }\n }\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const allRevisions = revisionManager.getAllRevisions();\n for (const rev of allRevisions) {\n if (this.matchesCriteria(rev, criteria)) {\n accepted.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n // Clear accepted revisions from RevisionManager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const id of accepted) {\n revisionManager.removeById(parseInt(id, 10));\n }\n }\n\n return {\n accepted,\n rejected: [],\n remaining,\n summary: {\n totalProcessed: accepted.length + remaining.length,\n acceptedCount: accepted.length,\n rejectedCount: 0,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Reject revisions matching criteria using in-memory DOM transformation.\n * Matching revisions: content AND wrapper removed (opposite of accept).\n * Non-matching revisions: preserved in the document.\n *\n * For insertions: Rejecting removes the inserted content entirely.\n * For deletions: Rejecting keeps the deleted content (opposite of accepting).\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static reject(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult {\n const rejected: string[] = [];\n const remaining: string[] = [];\n\n // Check if doc has full Document API (getAllParagraphs, getTables)\n // or if it's a minimal mock (only getRevisionManager)\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n // Full in-memory DOM transformation\n const paragraphs = (doc as any).getAllParagraphs();\n for (const paragraph of paragraphs) {\n this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);\n }\n\n // Process paragraphs in tables\n const tables = (doc as any).getTables();\n for (const table of tables) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);\n }\n }\n }\n }\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const allRevisions = revisionManager.getAllRevisions();\n for (const rev of allRevisions) {\n if (this.matchesCriteria(rev, criteria)) {\n rejected.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n // Clear rejected revisions from RevisionManager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const id of rejected) {\n revisionManager.removeById(parseInt(id, 10));\n }\n }\n\n return {\n accepted: [],\n rejected,\n remaining,\n summary: {\n totalProcessed: rejected.length + remaining.length,\n acceptedCount: 0,\n rejectedCount: rejected.length,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Process a paragraph for selective revision acceptance/rejection.\n * Transforms matching revisions in-place using DOM transformation.\n */\n private static processSelectiveParagraph(\n paragraph: Paragraph,\n criteria: SelectionCriteria,\n action: 'accept' | 'reject',\n processedIds: string[],\n remainingIds: string[]\n ): void {\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionId = item.getId().toString();\n\n if (this.matchesCriteria(item, criteria)) {\n // This revision matches the criteria - process it\n processedIds.push(revisionId);\n\n if (action === 'accept') {\n // Accept: Transform based on revision type\n this.acceptRevisionItem(item, newContent);\n } else {\n // Reject: Transform opposite of accept\n this.rejectRevisionItem(item, newContent);\n }\n } else {\n // This revision doesn't match - keep it\n remainingIds.push(revisionId);\n newContent.push(item);\n }\n } else {\n // Non-revision content - keep as-is\n newContent.push(item);\n }\n }\n\n // Replace paragraph content with the transformed content\n paragraph.setContent(newContent);\n\n // Handle paragraph mark revision markers (w:del/w:ins in w:pPr/w:rPr)\n // Both accept and reject clear the marker — these are metadata-only markers (no content),\n // so there is no content to add or remove, only the marker itself to clear.\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n const del = formatting.paragraphMarkDeletion;\n if (this.matchesMarkerCriteria(del, criteria)) {\n paragraph.clearParagraphMarkDeletion();\n processedIds.push(del.id.toString());\n } else {\n remainingIds.push(del.id.toString());\n }\n }\n if (formatting.paragraphMarkInsertion) {\n const ins = formatting.paragraphMarkInsertion;\n if (this.matchesMarkerCriteria(ins, criteria)) {\n paragraph.clearParagraphMarkInsertion();\n processedIds.push(ins.id.toString());\n } else {\n remainingIds.push(ins.id.toString());\n }\n }\n }\n\n /**\n * Check if a paragraph mark revision marker matches the given criteria.\n * Simplified version of matchesCriteria for non-Revision marker objects.\n */\n private static matchesMarkerCriteria(\n marker: { id: number; author: string; date: Date },\n criteria: SelectionCriteria\n ): boolean {\n // If no criteria specified, match nothing\n if (\n !criteria.ids &&\n !criteria.types &&\n !criteria.authors &&\n !criteria.dateRange &&\n !criteria.categories &&\n !criteria.custom\n ) {\n return false;\n }\n\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(marker.id)) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(marker.author)) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n if (marker.date < criteria.dateRange.start || marker.date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // types, categories, and custom filters don't apply to paragraph mark markers\n // (they are not Revision objects with a type/category)\n // If criteria only specifies types/categories/custom, markers won't match\n if (criteria.types || criteria.categories || criteria.custom) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Accept a single revision item (unwrap insertions, remove deletions).\n */\n private static acceptRevisionItem(revision: Revision, newContent: ParagraphContent[]): void {\n const revisionType = revision.getType();\n const childContent = revision.getContent();\n\n switch (revisionType) {\n case 'insert':\n case 'moveTo':\n // Unwrap: Extract child content into parent position\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n case 'delete':\n case 'moveFrom':\n // Remove: Don't add to newContent - content is deleted\n break;\n\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'sectionPropertiesChange':\n case 'numberingChange':\n // Property changes: Keep content, remove change metadata\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n default:\n // Unknown type - keep the revision as-is for safety\n newContent.push(revision);\n }\n }\n\n /**\n * Reject a single revision item (opposite of accept).\n * - Rejecting an insertion removes the content\n * - Rejecting a deletion keeps the content (unwraps it)\n */\n private static rejectRevisionItem(revision: Revision, newContent: ParagraphContent[]): void {\n const revisionType = revision.getType();\n const childContent = revision.getContent();\n\n switch (revisionType) {\n case 'insert':\n case 'moveTo':\n // Reject insertion: Remove the inserted content entirely\n break;\n\n case 'delete':\n case 'moveFrom':\n // Reject deletion: Keep the deleted content (unwrap)\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'sectionPropertiesChange':\n case 'numberingChange':\n // Rejecting property changes: Would need to restore old properties\n // For now, just keep content without the change metadata\n // (Full implementation would restore previousProperties)\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n default:\n // Unknown type - keep the revision as-is for safety\n newContent.push(revision);\n }\n }\n\n /**\n * Preview what would happen without making changes.\n *\n * @param doc - Document to analyze\n * @param criteria - Selection criteria\n * @param action - Action to preview\n * @returns Preview of what would happen\n */\n static preview(\n doc: Document,\n criteria: SelectionCriteria,\n action: 'accept' | 'reject'\n ): SelectiveAcceptResult {\n // Preview is the same as the actual operation but without side effects\n return action === 'accept' ? this.accept(doc, criteria) : this.reject(doc, criteria);\n }\n\n /**\n * Accept all revisions by a specific author.\n *\n * @param doc - Document to process\n * @param author - Author name to accept\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptByAuthor(doc: Document, author: string): SelectiveAcceptResult {\n return this.accept(doc, { authors: [author] });\n }\n\n /**\n * Reject all revisions by a specific author.\n *\n * @param doc - Document to process\n * @param author - Author name to reject\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectByAuthor(doc: Document, author: string): SelectiveAcceptResult {\n return this.reject(doc, { authors: [author] });\n }\n\n /**\n * Accept all revisions of specific types.\n *\n * @param doc - Document to process\n * @param types - Revision types to accept\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\n return this.accept(doc, { types });\n }\n\n /**\n * Reject all revisions of specific types.\n *\n * @param doc - Document to process\n * @param types - Revision types to reject\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\n return this.reject(doc, { types });\n }\n\n /**\n * Accept all revisions before a specific date.\n *\n * @param doc - Document to process\n * @param date - Cutoff date (exclusive)\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptBeforeDate(doc: Document, date: Date): SelectiveAcceptResult {\n return this.accept(doc, {\n dateRange: { start: new Date(0), end: date },\n });\n }\n\n /**\n * Accept all revisions after a specific date.\n *\n * @param doc - Document to process\n * @param date - Start date (exclusive)\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptAfterDate(doc: Document, date: Date): SelectiveAcceptResult {\n return this.accept(doc, {\n dateRange: { start: date, end: new Date() },\n });\n }\n\n /**\n * Accept all insertions only.\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptInsertionsOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { types: ['insert'] });\n }\n\n /**\n * Accept all deletions only.\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptDeletionsOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { types: ['delete'] });\n }\n\n /**\n * Reject all formatting changes (keep content changes).\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectFormattingChanges(doc: Document): SelectiveAcceptResult {\n return this.reject(doc, { categories: ['formatting'] });\n }\n\n /**\n * Accept content changes only (reject formatting).\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptContentChangesOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { categories: ['content'] });\n }\n\n /**\n * Partition revisions into matching and non-matching based on criteria.\n */\n private static partitionRevisions(\n revisions: Revision[],\n criteria: SelectionCriteria\n ): { matching: Revision[]; nonMatching: Revision[] } {\n const matching: Revision[] = [];\n const nonMatching: Revision[] = [];\n\n for (const rev of revisions) {\n if (this.matchesCriteria(rev, criteria)) {\n matching.push(rev);\n } else {\n nonMatching.push(rev);\n }\n }\n\n return { matching, nonMatching };\n }\n\n /**\n * Check if a revision matches the given criteria.\n */\n private static matchesCriteria(revision: Revision, criteria: SelectionCriteria): boolean {\n // If no criteria specified, match nothing\n if (\n !criteria.ids &&\n !criteria.types &&\n !criteria.authors &&\n !criteria.dateRange &&\n !criteria.categories &&\n !criteria.custom\n ) {\n return false;\n }\n\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(revision.getId())) {\n return false;\n }\n\n // Filter by types\n if (criteria.types && !criteria.types.includes(revision.getType())) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n const date = revision.getDate();\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // Filter by categories\n if (criteria.categories) {\n const category = this.getRevisionCategory(revision);\n if (!criteria.categories.includes(category)) {\n return false;\n }\n }\n\n // Custom filter\n if (criteria.custom && !criteria.custom(revision)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get the semantic category of a revision.\n */\n private static getRevisionCategory(revision: Revision): ChangeCategory {\n const type = revision.getType();\n\n if (type === 'insert' || type === 'delete') {\n return 'content';\n }\n if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n return 'formatting';\n }\n if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n return 'structural';\n }\n if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n return 'table';\n }\n\n return 'content';\n }\n\n /**\n * Create an empty result.\n */\n private static emptyResult(): SelectiveAcceptResult {\n return {\n accepted: [],\n rejected: [],\n remaining: [],\n summary: {\n totalProcessed: 0,\n acceptedCount: 0,\n rejectedCount: 0,\n remainingCount: 0,\n },\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShadingResolver.d.ts","sourceRoot":"","sources":["../../src/utils/ShadingResolver.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAYjE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,GAC3B,aAAa,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"ShadingResolver.d.ts","sourceRoot":"","sources":["../../src/utils/ShadingResolver.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAYjE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,GAC3B,aAAa,GAAG,SAAS,CAyD3B"}
|
|
@@ -31,7 +31,7 @@ function resolveCellShading(cell, table, stylesManager) {
|
|
|
31
31
|
if (cnfStyle) {
|
|
32
32
|
const activeConditionals = (0, cnfStyleDecoder_1.getActiveConditionalsInPriorityOrder)(cnfStyle);
|
|
33
33
|
for (const condType of activeConditionals) {
|
|
34
|
-
const match = conditionals.find((c) => c.type ===
|
|
34
|
+
const match = conditionals.find((c) => c.type === condType);
|
|
35
35
|
if (match?.cellFormatting?.shading) {
|
|
36
36
|
const condShading = match.cellFormatting.shading;
|
|
37
37
|
if (condShading.pattern === 'nil')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShadingResolver.js","sourceRoot":"","sources":["../../src/utils/ShadingResolver.ts"],"names":[],"mappings":";;AA8BA,
|
|
1
|
+
{"version":3,"file":"ShadingResolver.js","sourceRoot":"","sources":["../../src/utils/ShadingResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ShadingResolver - Resolves effective cell shading through the ECMA-376 style hierarchy\n *\n * Per ECMA-376 §17.7.6, cell shading is resolved in priority order:\n * 1. Direct cell shading\n * 2. Row table property exceptions (tblPrEx)\n * 3. Conditional table style (tblStylePr) based on cnfStyle bitmask\n * 4. Table style default cell shading\n * 5. Direct table shading\n *\n * Special values:\n * - pattern: \"nil\" = explicitly clear (stop resolution)\n * - fill: \"auto\" = inherit (continue resolution)\n */\n\nimport type { ShadingConfig } from '../elements/CommonTypes';\nimport type { Table } from '../elements/Table';\nimport type { TableCell } from '../elements/TableCell';\nimport type { StylesManager } from '../formatting/StylesManager';\nimport { getActiveConditionalsInPriorityOrder } from './cnfStyleDecoder';\nimport type { ConditionalFormattingType } from '../formatting/Style';\n\n/**\n * Resolves the effective shading for a table cell through the style hierarchy.\n *\n * @param cell - The table cell to resolve shading for\n * @param table - The parent table\n * @param stylesManager - The document's styles manager for style lookup\n * @returns The resolved ShadingConfig, or undefined if no shading applies\n */\nexport function resolveCellShading(\n cell: TableCell,\n table: Table,\n stylesManager: StylesManager\n): ShadingConfig | undefined {\n // 1. Direct cell shading\n const directShading = cell.getShading();\n if (directShading) {\n if (directShading.pattern === 'nil') return undefined;\n if (directShading.fill && directShading.fill !== 'auto') return directShading;\n }\n\n // 2. Row table property exceptions\n const row = findRowForCell(cell, table);\n if (row) {\n const exceptions = row.getTablePropertyExceptions();\n if (exceptions?.shading) {\n if (exceptions.shading.pattern === 'nil') return undefined;\n if (exceptions.shading.fill && exceptions.shading.fill !== 'auto') return exceptions.shading;\n }\n }\n\n // 3. Conditional table style shading\n const tableStyleId = table.getStyle();\n if (tableStyleId) {\n const style = stylesManager.getStyle(tableStyleId);\n if (style) {\n const styleProps = style.getProperties();\n const conditionals = styleProps.tableStyle?.conditionalFormatting;\n if (conditionals) {\n const cnfStyle = cell.getCnfStyle();\n if (cnfStyle) {\n const activeConditionals = getActiveConditionalsInPriorityOrder(cnfStyle);\n for (const condType of activeConditionals) {\n const match = conditionals.find((c) => c.type === condType);\n if (match?.cellFormatting?.shading) {\n const condShading = match.cellFormatting.shading;\n if (condShading.pattern === 'nil') return undefined;\n return condShading;\n }\n }\n }\n }\n\n // 4. Table style default cell shading\n if (styleProps.tableStyle?.cell?.shading) {\n const defaultCellShading = styleProps.tableStyle.cell.shading;\n if (defaultCellShading.pattern === 'nil') return undefined;\n return defaultCellShading;\n }\n }\n }\n\n // 5. Direct table shading\n const tableShading = table.getShading();\n if (tableShading) {\n if (tableShading.pattern === 'nil') return undefined;\n return tableShading;\n }\n\n return undefined;\n}\n\n/**\n * Finds the row that contains a given cell.\n */\nfunction findRowForCell(cell: TableCell, table: Table) {\n for (const row of table.getRows()) {\n const cells = row.getCells();\n if (cells.includes(cell)) {\n return row;\n }\n }\n return undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptRevisions.d.ts","sourceRoot":"","sources":["../../src/utils/acceptRevisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"acceptRevisions.d.ts","sourceRoot":"","sources":["../../src/utils/acceptRevisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA6rB/C,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAeD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAGpE"}
|
|
@@ -47,8 +47,7 @@ class RevisionAcceptor {
|
|
|
47
47
|
acceptPropertyChanges: true,
|
|
48
48
|
});
|
|
49
49
|
this.remapImageRelationshipsInTree(processed);
|
|
50
|
-
const outputXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
|
|
51
|
-
this.objectToXml(processed);
|
|
50
|
+
const outputXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' + this.objectToXml(processed);
|
|
52
51
|
this.zipHandler.updateFile(partPath, outputXml);
|
|
53
52
|
}
|
|
54
53
|
processDocumentPartRegex(partPath) {
|
|
@@ -263,11 +262,27 @@ class RevisionAcceptor {
|
|
|
263
262
|
typeof element === 'object' &&
|
|
264
263
|
Object.keys(element).some((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
265
264
|
const CANNOT_SELF_CLOSE = [
|
|
266
|
-
'w:t',
|
|
267
|
-
'w:
|
|
268
|
-
'w:
|
|
265
|
+
'w:t',
|
|
266
|
+
'w:r',
|
|
267
|
+
'w:p',
|
|
268
|
+
'w:tbl',
|
|
269
|
+
'w:tr',
|
|
270
|
+
'w:tc',
|
|
271
|
+
'w:body',
|
|
272
|
+
'w:document',
|
|
273
|
+
'w:hyperlink',
|
|
274
|
+
'w:sdt',
|
|
275
|
+
'w:sdtContent',
|
|
276
|
+
'w:sdtPr',
|
|
277
|
+
'w:pPr',
|
|
278
|
+
'w:rPr',
|
|
279
|
+
'w:sectPr',
|
|
280
|
+
'w:del',
|
|
281
|
+
'w:ins',
|
|
282
|
+
'w:moveFrom',
|
|
283
|
+
'w:moveTo',
|
|
269
284
|
];
|
|
270
|
-
if (!hasChildren &&
|
|
285
|
+
if (!hasChildren && !element?.['#text']) {
|
|
271
286
|
if (CANNOT_SELF_CLOSE.includes(tagName)) {
|
|
272
287
|
xml += `></${tagName}>`;
|
|
273
288
|
}
|
|
@@ -305,9 +320,7 @@ class RevisionAcceptor {
|
|
|
305
320
|
}
|
|
306
321
|
else {
|
|
307
322
|
for (const key of Object.keys(element)) {
|
|
308
|
-
if (!key.startsWith('@_') &&
|
|
309
|
-
key !== '#text' &&
|
|
310
|
-
key !== '_orderedChildren') {
|
|
323
|
+
if (!key.startsWith('@_') && key !== '#text' && key !== '_orderedChildren') {
|
|
311
324
|
const children = element[key];
|
|
312
325
|
if (Array.isArray(children)) {
|
|
313
326
|
for (const child of children) {
|
|
@@ -362,9 +375,7 @@ class RevisionAcceptor {
|
|
|
362
375
|
if (key === '@_r:embed') {
|
|
363
376
|
callback(obj[key], obj, key);
|
|
364
377
|
}
|
|
365
|
-
else if (!key.startsWith('@_') &&
|
|
366
|
-
key !== '#text' &&
|
|
367
|
-
key !== '_orderedChildren') {
|
|
378
|
+
else if (!key.startsWith('@_') && key !== '#text' && key !== '_orderedChildren') {
|
|
368
379
|
const value = obj[key];
|
|
369
380
|
if (Array.isArray(value)) {
|
|
370
381
|
for (const item of value) {
|