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":"InMemoryRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * InMemoryRevisionAcceptor - Accept revisions by transforming the in-memory object model\r\n *\r\n * This approach follows the industry standard (OpenXML PowerTools, Aspose.Words):\r\n * - Transforms Revision objects in paragraph.content[] to their \"accepted\" state\r\n * - For insertions: Unwrap - extract child Runs/Hyperlinks into parent paragraph\r\n * - For deletions: Remove - delete the revision and its content from the model\r\n * - For property changes: Remove the change metadata, keep the current formatting\r\n *\r\n * Unlike the raw XML approach (acceptRevisions.ts), this allows subsequent modifications\r\n * to the in-memory model to be correctly serialized on save().\r\n *\r\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\r\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\r\n */\r\n\r\nimport type { Document } from '../core/Document';\r\nimport { Paragraph } from '../elements/Paragraph';\r\nimport type { 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, isImageRunContent } from '../elements/RevisionContent';\r\nimport type { ImageRun } from '../elements/ImageRun';\r\nimport { Table } from '../elements/Table';\r\nimport { Section } from '../elements/Section';\r\nimport { getGlobalLogger, createScopedLogger, ILogger } from './logger';\r\n\r\n/**\r\n * Get scoped logger for this module\r\n */\r\nfunction getLogger(): ILogger {\r\n return createScopedLogger(getGlobalLogger(), 'InMemoryRevisionAcceptor');\r\n}\r\n\r\n/**\r\n * Options for accepting revisions\r\n */\r\nexport interface AcceptRevisionsOptions {\r\n /** Accept insertion revisions (w:ins) - default: true */\r\n acceptInsertions?: boolean;\r\n /** Accept deletion revisions (w:del) - default: true */\r\n acceptDeletions?: boolean;\r\n /** Accept move operations (w:moveFrom, w:moveTo) - default: true */\r\n acceptMoves?: boolean;\r\n /** Accept property change revisions (rPrChange, pPrChange, etc.) - default: true */\r\n acceptPropertyChanges?: boolean;\r\n /** Remove empty tables after revision acceptance - default: true */\r\n cleanupEmptyTables?: boolean;\r\n}\r\n\r\n/**\r\n * Result of accepting revisions\r\n */\r\nexport interface AcceptRevisionsResult {\r\n /** Number of insertions accepted */\r\n insertionsAccepted: number;\r\n /** Number of deletions accepted */\r\n deletionsAccepted: number;\r\n /** Number of move operations accepted */\r\n movesAccepted: number;\r\n /** Number of property changes accepted */\r\n propertyChangesAccepted: number;\r\n /** Total revisions processed */\r\n totalAccepted: number;\r\n /** Number of empty tables removed during cleanup */\r\n emptyTablesRemoved: number;\r\n}\r\n\r\n/**\r\n * Revision types that represent content changes (contain actual text/runs)\r\n */\r\nconst CONTENT_REVISION_TYPES: RevisionType[] = [\r\n 'insert',\r\n 'delete',\r\n 'moveFrom',\r\n 'moveTo',\r\n];\r\n\r\n/**\r\n * Revision types that represent property/formatting changes\r\n */\r\nconst PROPERTY_REVISION_TYPES: RevisionType[] = [\r\n 'runPropertiesChange',\r\n 'paragraphPropertiesChange',\r\n 'tablePropertiesChange',\r\n 'tableExceptionPropertiesChange',\r\n 'tableRowPropertiesChange',\r\n 'tableCellPropertiesChange',\r\n 'sectionPropertiesChange',\r\n 'numberingChange',\r\n];\r\n\r\n/**\r\n * Strip revision markup from raw XML string.\r\n * Used for nested tables stored as raw XML that cannot be processed via the in-memory model.\r\n *\r\n * Follows the same rules as the main revision acceptor:\r\n * - Insertions: Keep content, remove wrapper tags\r\n * - Deletions: Remove entirely (content and tags)\r\n * - MoveFrom: Remove entirely (source of move)\r\n * - MoveTo: Keep content, remove wrapper\r\n * - Property changes: Remove change tracking elements\r\n * - Range markers: Remove boundary markers\r\n *\r\n * @param xml - Raw XML string containing revision markup\r\n * @returns Cleaned XML with revisions accepted\r\n */\r\nexport function stripRevisionsFromXml(xml: string): string {\r\n let result = xml;\r\n\r\n // Step 1: Remove range markers (must be done first)\r\n const rangePatterns = [\r\n /<w:moveFromRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeStart>)/gs,\r\n /<w:moveFromRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeEnd>)/gs,\r\n /<w:moveToRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveToRangeStart>)/gs,\r\n /<w:moveToRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveToRangeEnd>)/gs,\r\n /<w:customXmlInsRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeStart>)/gs,\r\n /<w:customXmlInsRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeEnd>)/gs,\r\n /<w:customXmlDelRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeStart>)/gs,\r\n /<w:customXmlDelRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeEnd>)/gs,\r\n ];\r\n for (const pattern of rangePatterns) {\r\n result = result.replace(pattern, '');\r\n }\r\n\r\n // Step 2: Remove property change elements\r\n const propChangePatterns = [\r\n /<w:rPrChange[^>]*>[\\s\\S]*?<\\/w:rPrChange>/g,\r\n /<w:pPrChange[^>]*>[\\s\\S]*?<\\/w:pPrChange>/g,\r\n /<w:tblPrChange[^>]*>[\\s\\S]*?<\\/w:tblPrChange>/g,\r\n /<w:tblPrExChange[^>]*>[\\s\\S]*?<\\/w:tblPrExChange>/g,\r\n /<w:tcPrChange[^>]*>[\\s\\S]*?<\\/w:tcPrChange>/g,\r\n /<w:trPrChange[^>]*>[\\s\\S]*?<\\/w:trPrChange>/g,\r\n /<w:sectPrChange[^>]*>[\\s\\S]*?<\\/w:sectPrChange>/g,\r\n /<w:tblGridChange[^>]*>[\\s\\S]*?<\\/w:tblGridChange>/g,\r\n /<w:numberingChange[^>]*>[\\s\\S]*?<\\/w:numberingChange>/g,\r\n ];\r\n for (const pattern of propChangePatterns) {\r\n result = result.replace(pattern, '');\r\n }\r\n\r\n // Step 3: Remove deletions entirely (including content)\r\n // Iterate until no more deletions (handles nested cases)\r\n let prevLen = 0;\r\n while (result.length !== prevLen) {\r\n prevLen = result.length;\r\n result = result.replace(/<w:del\\b[^>]*>[\\s\\S]*?<\\/w:del>/g, '');\r\n }\r\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\r\n\r\n // Step 4: Remove moveFrom entirely (source of moved content)\r\n prevLen = 0;\r\n while (result.length !== prevLen) {\r\n prevLen = result.length;\r\n result = result.replace(/<w:moveFrom\\b[^>]*>[\\s\\S]*?<\\/w:moveFrom>/g, '');\r\n }\r\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\r\n\r\n // Step 5: Unwrap moveTo (keep content, remove wrapper)\r\n result = result.replace(/<\\/w:moveTo>/g, '');\r\n result = result.replace(/<w:moveTo\\b[^>]*>/g, '');\r\n\r\n // Step 6: Unwrap insertions (keep content, remove wrapper)\r\n result = result.replace(/<\\/w:ins>/g, '');\r\n result = result.replace(/<w:ins\\b[^>]*>/g, '');\r\n\r\n // Step 7: Clean up orphaned tags\r\n result = result.replace(/<w:ins\\b[^>]*\\/>/g, '');\r\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\r\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\r\n result = result.replace(/<w:moveTo\\b[^>]*\\/>/g, '');\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Accept all revisions in the document by transforming the in-memory model.\r\n *\r\n * This is the industry-standard approach used by OpenXML PowerTools, Aspose.Words,\r\n * and other production DOCX libraries. It allows subsequent modifications to the\r\n * document to work correctly.\r\n *\r\n * @param doc - Document to process\r\n * @param options - Options for which revision types to accept\r\n * @returns Result with counts of accepted revisions\r\n */\r\nexport function acceptRevisionsInMemory(\r\n doc: Document,\r\n options: AcceptRevisionsOptions = {}\r\n): AcceptRevisionsResult {\r\n const logger = getLogger();\r\n const opts: Required<AcceptRevisionsOptions> = {\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 cleanupEmptyTables: options.cleanupEmptyTables ?? true,\r\n };\r\n\r\n const result: AcceptRevisionsResult = {\r\n insertionsAccepted: 0,\r\n deletionsAccepted: 0,\r\n movesAccepted: 0,\r\n propertyChangesAccepted: 0,\r\n totalAccepted: 0,\r\n emptyTablesRemoved: 0,\r\n };\r\n\r\n logger.info('Accepting revisions in-memory', { options: opts });\r\n\r\n // Validate move pairs before accepting if moves are being accepted\r\n // Orphaned moves could result in content loss (moveFrom without moveTo = content deleted)\r\n if (opts.acceptMoves) {\r\n const revisionManager = doc.getRevisionManager();\r\n if (revisionManager) {\r\n const movePairValidation = revisionManager.validateMovePairs();\r\n if (!movePairValidation.valid) {\r\n if (movePairValidation.orphanedMoveFrom.length > 0) {\r\n logger.warn(\r\n 'Orphaned moveFrom revisions detected - accepting these will DELETE content permanently ' +\r\n '(content was moved from here but no moveTo destination exists)',\r\n { orphanedMoveIds: movePairValidation.orphanedMoveFrom }\r\n );\r\n }\r\n if (movePairValidation.orphanedMoveTo.length > 0) {\r\n logger.warn(\r\n 'Orphaned moveTo revisions detected - content may be duplicated ' +\r\n '(content moved to here but no moveFrom source exists)',\r\n { orphanedMoveIds: movePairValidation.orphanedMoveTo }\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Process all paragraphs in the document body\r\n const paragraphs = doc.getAllParagraphs();\r\n for (const paragraph of paragraphs) {\r\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\r\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\r\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\r\n result.movesAccepted += paragraphResult.movesAccepted;\r\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\r\n }\r\n\r\n // Process paragraphs in tables and clear table/row/cell property changes\r\n const tables = doc.getTables();\r\n for (const table of tables) {\r\n // Clear tblPrChange on table\r\n if (opts.acceptPropertyChanges && table.getTblPrChange()) {\r\n table.clearTblPrChange();\r\n result.propertyChangesAccepted++;\r\n }\r\n\r\n for (const row of table.getRows()) {\r\n // Clear trPrChange on row\r\n if (opts.acceptPropertyChanges && row.getTrPrChange()) {\r\n row.clearTrPrChange();\r\n result.propertyChangesAccepted++;\r\n }\r\n\r\n for (const cell of row.getCells()) {\r\n // Clear tcPrChange on cell\r\n if (opts.acceptPropertyChanges && cell.getTcPrChange()) {\r\n cell.clearTcPrChange();\r\n result.propertyChangesAccepted++;\r\n }\r\n\r\n // Clear cell structural revision markers (cellIns/cellDel/cellMerge)\r\n if (opts.acceptPropertyChanges && cell.getCellRevision()) {\r\n cell.clearCellRevision();\r\n result.propertyChangesAccepted++;\r\n }\r\n\r\n // Process paragraphs in the cell\r\n for (const paragraph of cell.getParagraphs()) {\r\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\r\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\r\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\r\n result.movesAccepted += paragraphResult.movesAccepted;\r\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\r\n }\r\n\r\n // Process raw nested content (nested tables stored as XML)\r\n // These cannot be processed via the in-memory model, so we use XML-based stripping\r\n if (cell.hasRawNestedContent()) {\r\n const rawContent = cell.getRawNestedContent();\r\n for (let i = 0; i < rawContent.length; i++) {\r\n const item = rawContent[i];\r\n if (item) {\r\n const cleanedXml = stripRevisionsFromXml(item.xml);\r\n if (cleanedXml !== item.xml) {\r\n cell.updateRawNestedContent(i, cleanedXml);\r\n // Count revisions stripped from nested content\r\n // We can't distinguish types in raw XML, so count as property changes\r\n result.propertyChangesAccepted++;\r\n logger.debug('Stripped revisions from nested content', {\r\n type: item.type,\r\n position: item.position,\r\n originalLength: item.xml.length,\r\n cleanedLength: cleanedXml.length,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Process paragraphs in headers\r\n const headerFooterManager = doc.getHeaderFooterManager();\r\n if (headerFooterManager) {\r\n const headers = headerFooterManager.getAllHeaders();\r\n for (const headerEntry of headers) {\r\n const elements = headerEntry.header.getElements();\r\n for (const element of elements) {\r\n // Element can be Paragraph or Table - use instanceof for type safety\r\n if (element instanceof Paragraph) {\r\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\r\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\r\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\r\n result.movesAccepted += paragraphResult.movesAccepted;\r\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\r\n } else if (element instanceof Table) {\r\n // It's a Table - process its cells\r\n for (const row of element.getRows()) {\r\n for (const cell of row.getCells()) {\r\n for (const paragraph of cell.getParagraphs()) {\r\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\r\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\r\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\r\n result.movesAccepted += paragraphResult.movesAccepted;\r\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\r\n }\r\n // Process raw nested content in header tables\r\n if (cell.hasRawNestedContent()) {\r\n const rawContent = cell.getRawNestedContent();\r\n for (let i = 0; i < rawContent.length; i++) {\r\n const item = rawContent[i];\r\n if (item) {\r\n const cleanedXml = stripRevisionsFromXml(item.xml);\r\n if (cleanedXml !== item.xml) {\r\n cell.updateRawNestedContent(i, cleanedXml);\r\n result.propertyChangesAccepted++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Process paragraphs in footers\r\n const footers = headerFooterManager.getAllFooters();\r\n for (const footerEntry of footers) {\r\n const elements = footerEntry.footer.getElements();\r\n for (const element of elements) {\r\n // Element can be Paragraph or Table - use instanceof for type safety\r\n if (element instanceof Paragraph) {\r\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\r\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\r\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\r\n result.movesAccepted += paragraphResult.movesAccepted;\r\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\r\n } else if (element instanceof Table) {\r\n // It's a Table - process its cells\r\n for (const row of element.getRows()) {\r\n for (const cell of row.getCells()) {\r\n for (const paragraph of cell.getParagraphs()) {\r\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\r\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\r\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\r\n result.movesAccepted += paragraphResult.movesAccepted;\r\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\r\n }\r\n // Process raw nested content in footer tables\r\n if (cell.hasRawNestedContent()) {\r\n const rawContent = cell.getRawNestedContent();\r\n for (let i = 0; i < rawContent.length; i++) {\r\n const item = rawContent[i];\r\n if (item) {\r\n const cleanedXml = stripRevisionsFromXml(item.xml);\r\n if (cleanedXml !== item.xml) {\r\n cell.updateRawNestedContent(i, cleanedXml);\r\n result.propertyChangesAccepted++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clear sectPrChange on document section\r\n if (opts.acceptPropertyChanges) {\r\n const section = doc.getSection();\r\n if (section?.getSectPrChange()) {\r\n section.clearSectPrChange();\r\n result.propertyChangesAccepted++;\r\n }\r\n }\r\n\r\n // Clear revision manager\r\n const revisionManager = doc.getRevisionManager();\r\n if (revisionManager) {\r\n revisionManager.clear();\r\n }\r\n\r\n // Disable track changes setting\r\n doc.disableTrackChanges();\r\n\r\n // Cleanup empty tables if enabled\r\n // This removes tables that have no visible content after revision acceptance\r\n // (e.g., tables where all content was deleted via tracked changes)\r\n if (opts.cleanupEmptyTables) {\r\n result.emptyTablesRemoved = cleanupEmptyTables(doc, logger);\r\n }\r\n\r\n result.totalAccepted =\r\n result.insertionsAccepted +\r\n result.deletionsAccepted +\r\n result.movesAccepted +\r\n result.propertyChangesAccepted;\r\n\r\n logger.info('Revisions accepted in-memory', {\r\n insertions: result.insertionsAccepted,\r\n deletions: result.deletionsAccepted,\r\n moves: result.movesAccepted,\r\n propertyChanges: result.propertyChangesAccepted,\r\n total: result.totalAccepted,\r\n emptyTablesRemoved: result.emptyTablesRemoved,\r\n });\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Accept revisions in a single paragraph by transforming its content array.\r\n *\r\n * The transformation follows these rules:\r\n * - Insertions (w:ins): Unwrap - extract child content into parent position\r\n * - Deletions (w:del): Remove - delete revision and its content\r\n * - MoveFrom (w:moveFrom): Remove - content exists at moveTo destination\r\n * - MoveTo (w:moveTo): Unwrap - keep content, remove wrapper\r\n * - Property changes: Remove from model (current formatting is kept)\r\n *\r\n * @param paragraph - Paragraph to process\r\n * @param options - Options for which revision types to accept\r\n * @returns Result with counts of accepted revisions\r\n */\r\nfunction acceptRevisionsInParagraph(\r\n paragraph: Paragraph,\r\n options: Required<AcceptRevisionsOptions>\r\n): AcceptRevisionsResult {\r\n const result: AcceptRevisionsResult = {\r\n insertionsAccepted: 0,\r\n deletionsAccepted: 0,\r\n movesAccepted: 0,\r\n propertyChangesAccepted: 0,\r\n totalAccepted: 0,\r\n emptyTablesRemoved: 0,\r\n };\r\n\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 revisionType = item.getType();\r\n\r\n // Handle insertion revisions (w:ins)\r\n if (revisionType === 'insert' && options.acceptInsertions) {\r\n // Unwrap: Extract child content into parent position\r\n const childContent = item.getContent();\r\n for (const child of childContent) {\r\n // Check ImageRun FIRST since ImageRun extends Run\r\n if (isImageRunContent(child)) {\r\n newContent.push(child);\r\n } else if (isRunContent(child)) {\r\n newContent.push(child);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n result.insertionsAccepted++;\r\n continue;\r\n }\r\n\r\n // Handle deletion revisions (w:del)\r\n if (revisionType === 'delete' && options.acceptDeletions) {\r\n // Remove: Don't add to newContent - content is deleted\r\n result.deletionsAccepted++;\r\n continue;\r\n }\r\n\r\n // Handle moveFrom revisions (source of moved content)\r\n if (revisionType === 'moveFrom' && options.acceptMoves) {\r\n // Remove: Content exists at moveTo destination\r\n result.movesAccepted++;\r\n continue;\r\n }\r\n\r\n // Handle moveTo revisions (destination of moved content)\r\n if (revisionType === 'moveTo' && options.acceptMoves) {\r\n // Unwrap: Keep content, remove wrapper\r\n const childContent = item.getContent();\r\n for (const child of childContent) {\r\n // Check ImageRun FIRST since ImageRun extends Run\r\n if (isImageRunContent(child)) {\r\n newContent.push(child);\r\n } else if (isRunContent(child)) {\r\n newContent.push(child);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n result.movesAccepted++;\r\n continue;\r\n }\r\n\r\n // Handle property change revisions\r\n if (PROPERTY_REVISION_TYPES.includes(revisionType) && options.acceptPropertyChanges) {\r\n // For property changes, the revision is metadata attached to runs\r\n // The current formatting (newProperties) is already applied to the run\r\n // We just need to remove the change tracking metadata\r\n // The content inside should be preserved\r\n const childContent = item.getContent();\r\n for (const child of childContent) {\r\n // Check ImageRun FIRST since ImageRun extends Run\r\n if (isImageRunContent(child)) {\r\n newContent.push(child);\r\n } else if (isRunContent(child)) {\r\n newContent.push(child);\r\n } else if (isHyperlinkContent(child)) {\r\n newContent.push(child);\r\n }\r\n }\r\n result.propertyChangesAccepted++;\r\n continue;\r\n }\r\n\r\n // If we reach here, this revision type is not being accepted\r\n // Keep it in the content\r\n newContent.push(item);\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 // Clear paragraph property change tracking (pPrChange) if accepting property changes\r\n // This removes the w:pPrChange element from the paragraph's formatting\r\n if (options.acceptPropertyChanges) {\r\n const formatting = paragraph.getFormatting();\r\n if (formatting.pPrChange) {\r\n paragraph.clearParagraphPropertiesChange();\r\n result.propertyChangesAccepted++;\r\n }\r\n }\r\n\r\n // Clear paragraph mark deletion tracking if accepting deletions\r\n // This removes the w:del element from w:pPr/w:rPr\r\n if (options.acceptDeletions) {\r\n const formatting = paragraph.getFormatting();\r\n if (formatting.paragraphMarkDeletion) {\r\n paragraph.clearParagraphMarkDeletion();\r\n result.deletionsAccepted++;\r\n }\r\n }\r\n\r\n // Clear paragraph mark insertion tracking if accepting insertions\r\n // This removes the w:ins element from w:pPr/w:rPr\r\n if (options.acceptInsertions) {\r\n const formatting = paragraph.getFormatting();\r\n if (formatting.paragraphMarkInsertion) {\r\n paragraph.clearParagraphMarkInsertion();\r\n result.insertionsAccepted++;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Check if a paragraph has any revisions\r\n */\r\nexport function paragraphHasRevisions(paragraph: Paragraph): boolean {\r\n const content = paragraph.getContent();\r\n if (content.some((item) => item instanceof Revision)) {\r\n return true;\r\n }\r\n // Also check paragraph mark revision markers in w:pPr/w:rPr\r\n const formatting = paragraph.getFormatting();\r\n if (formatting.paragraphMarkDeletion || formatting.paragraphMarkInsertion) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get all revisions from a paragraph\r\n */\r\nexport function getRevisionsFromParagraph(paragraph: Paragraph): Revision[] {\r\n const content = paragraph.getContent();\r\n return content.filter((item): item is Revision => item instanceof Revision);\r\n}\r\n\r\n/**\r\n * Count revisions by type in a document\r\n */\r\nexport function countRevisionsByType(doc: Document): Map<RevisionType, number> {\r\n const counts = new Map<RevisionType, number>();\r\n\r\n const paragraphs = doc.getAllParagraphs();\r\n for (const paragraph of paragraphs) {\r\n const revisions = getRevisionsFromParagraph(paragraph);\r\n for (const revision of revisions) {\r\n const type = revision.getType();\r\n counts.set(type, (counts.get(type) || 0) + 1);\r\n }\r\n }\r\n\r\n return counts;\r\n}\r\n\r\n/**\r\n * Remove tables that have no visible content after revision acceptance.\r\n *\r\n * A table is considered empty if ALL cells in ALL rows have no text content.\r\n * This handles cases where all table content was deleted via tracked changes -\r\n * the deletion markers are stripped but the empty table structure remains.\r\n *\r\n * @param doc - Document to clean up\r\n * @param logger - Logger instance for debug output\r\n * @returns Number of empty tables removed\r\n */\r\nfunction cleanupEmptyTables(doc: Document, logger: ILogger): number {\r\n const tables = doc.getTables();\r\n let removedCount = 0;\r\n const tablesToRemove: number[] = [];\r\n\r\n for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {\r\n const table = tables[tableIndex];\r\n if (!table) continue;\r\n\r\n let hasContent = false;\r\n const rows = table.getRows();\r\n\r\n for (const row of rows) {\r\n const cells = row.getCells();\r\n for (const cell of cells) {\r\n const paragraphs = cell.getParagraphs();\r\n for (const para of paragraphs) {\r\n const text = para.getText().trim();\r\n if (text.length > 0) {\r\n hasContent = true;\r\n break;\r\n }\r\n }\r\n if (hasContent) break;\r\n }\r\n if (hasContent) break;\r\n }\r\n\r\n if (!hasContent) {\r\n // Mark this table for removal (store index)\r\n tablesToRemove.push(tableIndex);\r\n logger.debug('Found empty table for removal', { tableIndex });\r\n }\r\n }\r\n\r\n // Remove tables in reverse order to preserve indices\r\n for (let i = tablesToRemove.length - 1; i >= 0; i--) {\r\n const tableIndex = tablesToRemove[i];\r\n if (tableIndex !== undefined && doc.removeTable(tableIndex)) {\r\n removedCount++;\r\n logger.debug('Removed empty table', { tableIndex });\r\n }\r\n }\r\n\r\n if (removedCount > 0) {\r\n logger.info('Empty table cleanup complete', { tablesRemoved: removedCount });\r\n }\r\n\r\n return removedCount;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"InMemoryRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * InMemoryRevisionAcceptor - Accept revisions by transforming the in-memory object model\n *\n * This approach follows the industry standard (OpenXML PowerTools, Aspose.Words):\n * - Transforms Revision objects in paragraph.content[] to their \"accepted\" state\n * - For insertions: Unwrap - extract child Runs/Hyperlinks into parent paragraph\n * - For deletions: Remove - delete the revision and its content from the model\n * - For property changes: Remove the change metadata, keep the current formatting\n *\n * Unlike the raw XML approach (acceptRevisions.ts), this allows subsequent modifications\n * to the in-memory model to be correctly serialized on save().\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\n */\n\nimport type { Document } from '../core/Document';\nimport { Paragraph } from '../elements/Paragraph';\nimport type { 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, isImageRunContent } from '../elements/RevisionContent';\nimport type { ImageRun } from '../elements/ImageRun';\nimport { Table } from '../elements/Table';\nimport { Section } from '../elements/Section';\nimport { getGlobalLogger, createScopedLogger, ILogger } from './logger';\n\n/**\n * Get scoped logger for this module\n */\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'InMemoryRevisionAcceptor');\n}\n\n/**\n * Options for accepting revisions\n */\nexport interface AcceptRevisionsOptions {\n /** Accept insertion revisions (w:ins) - default: true */\n acceptInsertions?: boolean;\n /** Accept deletion revisions (w:del) - default: true */\n acceptDeletions?: boolean;\n /** Accept move operations (w:moveFrom, w:moveTo) - default: true */\n acceptMoves?: boolean;\n /** Accept property change revisions (rPrChange, pPrChange, etc.) - default: true */\n acceptPropertyChanges?: boolean;\n /** Remove empty tables after revision acceptance - default: true */\n cleanupEmptyTables?: boolean;\n}\n\n/**\n * Result of accepting revisions\n */\nexport interface AcceptRevisionsResult {\n /** Number of insertions accepted */\n insertionsAccepted: number;\n /** Number of deletions accepted */\n deletionsAccepted: number;\n /** Number of move operations accepted */\n movesAccepted: number;\n /** Number of property changes accepted */\n propertyChangesAccepted: number;\n /** Total revisions processed */\n totalAccepted: number;\n /** Number of empty tables removed during cleanup */\n emptyTablesRemoved: number;\n}\n\n/**\n * Revision types that represent content changes (contain actual text/runs)\n */\nconst CONTENT_REVISION_TYPES: RevisionType[] = ['insert', 'delete', 'moveFrom', 'moveTo'];\n\n/**\n * Revision types that represent property/formatting changes\n */\nconst PROPERTY_REVISION_TYPES: RevisionType[] = [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n];\n\n/**\n * Strip revision markup from raw XML string.\n * Used for nested tables stored as raw XML that cannot be processed via the in-memory model.\n *\n * Follows the same rules as the main revision acceptor:\n * - Insertions: Keep content, remove wrapper tags\n * - Deletions: Remove entirely (content and tags)\n * - MoveFrom: Remove entirely (source of move)\n * - MoveTo: Keep content, remove wrapper\n * - Property changes: Remove change tracking elements\n * - Range markers: Remove boundary markers\n *\n * @param xml - Raw XML string containing revision markup\n * @returns Cleaned XML with revisions accepted\n */\nexport function stripRevisionsFromXml(xml: string): string {\n let result = xml;\n\n // Step 1: Remove range markers (must be done first)\n const rangePatterns = [\n /<w:moveFromRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeStart>)/gs,\n /<w:moveFromRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeEnd>)/gs,\n /<w:moveToRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveToRangeStart>)/gs,\n /<w:moveToRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveToRangeEnd>)/gs,\n /<w:customXmlInsRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeStart>)/gs,\n /<w:customXmlInsRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeEnd>)/gs,\n /<w:customXmlDelRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeStart>)/gs,\n /<w:customXmlDelRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeEnd>)/gs,\n ];\n for (const pattern of rangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 2: Remove property change elements\n const propChangePatterns = [\n /<w:rPrChange[^>]*>[\\s\\S]*?<\\/w:rPrChange>/g,\n /<w:pPrChange[^>]*>[\\s\\S]*?<\\/w:pPrChange>/g,\n /<w:tblPrChange[^>]*>[\\s\\S]*?<\\/w:tblPrChange>/g,\n /<w:tblPrExChange[^>]*>[\\s\\S]*?<\\/w:tblPrExChange>/g,\n /<w:tcPrChange[^>]*>[\\s\\S]*?<\\/w:tcPrChange>/g,\n /<w:trPrChange[^>]*>[\\s\\S]*?<\\/w:trPrChange>/g,\n /<w:sectPrChange[^>]*>[\\s\\S]*?<\\/w:sectPrChange>/g,\n /<w:tblGridChange[^>]*>[\\s\\S]*?<\\/w:tblGridChange>/g,\n /<w:numberingChange[^>]*>[\\s\\S]*?<\\/w:numberingChange>/g,\n ];\n for (const pattern of propChangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 3: Remove deletions entirely (including content)\n // Iterate until no more deletions (handles nested cases)\n let prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:del\\b[^>]*>[\\s\\S]*?<\\/w:del>/g, '');\n }\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n\n // Step 4: Remove moveFrom entirely (source of moved content)\n prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:moveFrom\\b[^>]*>[\\s\\S]*?<\\/w:moveFrom>/g, '');\n }\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n\n // Step 5: Unwrap moveTo (keep content, remove wrapper)\n result = result.replace(/<\\/w:moveTo>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*>/g, '');\n\n // Step 6: Unwrap insertions (keep content, remove wrapper)\n result = result.replace(/<\\/w:ins>/g, '');\n result = result.replace(/<w:ins\\b[^>]*>/g, '');\n\n // Step 7: Clean up orphaned tags\n result = result.replace(/<w:ins\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*\\/>/g, '');\n\n return result;\n}\n\n/**\n * Accept all revisions in the document by transforming the in-memory model.\n *\n * This is the industry-standard approach used by OpenXML PowerTools, Aspose.Words,\n * and other production DOCX libraries. It allows subsequent modifications to the\n * document to work correctly.\n *\n * @param doc - Document to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nexport function acceptRevisionsInMemory(\n doc: Document,\n options: AcceptRevisionsOptions = {}\n): AcceptRevisionsResult {\n const logger = getLogger();\n const opts: Required<AcceptRevisionsOptions> = {\n acceptInsertions: options.acceptInsertions ?? true,\n acceptDeletions: options.acceptDeletions ?? true,\n acceptMoves: options.acceptMoves ?? true,\n acceptPropertyChanges: options.acceptPropertyChanges ?? true,\n cleanupEmptyTables: options.cleanupEmptyTables ?? true,\n };\n\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n logger.info('Accepting revisions in-memory', { options: opts });\n\n // Validate move pairs before accepting if moves are being accepted\n // Orphaned moves could result in content loss (moveFrom without moveTo = content deleted)\n if (opts.acceptMoves) {\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const movePairValidation = revisionManager.validateMovePairs();\n if (!movePairValidation.valid) {\n if (movePairValidation.orphanedMoveFrom.length > 0) {\n logger.warn(\n 'Orphaned moveFrom revisions detected - accepting these will DELETE content permanently ' +\n '(content was moved from here but no moveTo destination exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveFrom }\n );\n }\n if (movePairValidation.orphanedMoveTo.length > 0) {\n logger.warn(\n 'Orphaned moveTo revisions detected - content may be duplicated ' +\n '(content moved to here but no moveFrom source exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveTo }\n );\n }\n }\n }\n }\n\n // Process all paragraphs in the document body\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process paragraphs in tables and clear table/row/cell property changes\n const tables = doc.getTables();\n for (const table of tables) {\n // Clear tblPrChange on table\n if (opts.acceptPropertyChanges && table.getTblPrChange()) {\n table.clearTblPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const row of table.getRows()) {\n // Clear trPrChange on row\n if (opts.acceptPropertyChanges && row.getTrPrChange()) {\n row.clearTrPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const cell of row.getCells()) {\n // Clear tcPrChange on cell\n if (opts.acceptPropertyChanges && cell.getTcPrChange()) {\n cell.clearTcPrChange();\n result.propertyChangesAccepted++;\n }\n\n // Clear cell structural revision markers (cellIns/cellDel/cellMerge)\n if (opts.acceptPropertyChanges && cell.getCellRevision()) {\n cell.clearCellRevision();\n result.propertyChangesAccepted++;\n }\n\n // Process paragraphs in the cell\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process raw nested content (nested tables stored as XML)\n // These cannot be processed via the in-memory model, so we use XML-based stripping\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n // Count revisions stripped from nested content\n // We can't distinguish types in raw XML, so count as property changes\n result.propertyChangesAccepted++;\n logger.debug('Stripped revisions from nested content', {\n type: item.type,\n position: item.position,\n originalLength: item.xml.length,\n cleanedLength: cleanedXml.length,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in headers\n const headerFooterManager = doc.getHeaderFooterManager();\n if (headerFooterManager) {\n const headers = headerFooterManager.getAllHeaders();\n for (const headerEntry of headers) {\n const elements = headerEntry.header.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in header tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in footers\n const footers = headerFooterManager.getAllFooters();\n for (const footerEntry of footers) {\n const elements = footerEntry.footer.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in footer tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Clear sectPrChange on document section\n if (opts.acceptPropertyChanges) {\n const section = doc.getSection();\n if (section?.getSectPrChange()) {\n section.clearSectPrChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear revision manager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n revisionManager.clear();\n }\n\n // Disable track changes setting\n doc.disableTrackChanges();\n\n // Cleanup empty tables if enabled\n // This removes tables that have no visible content after revision acceptance\n // (e.g., tables where all content was deleted via tracked changes)\n if (opts.cleanupEmptyTables) {\n result.emptyTablesRemoved = cleanupEmptyTables(doc, logger);\n }\n\n result.totalAccepted =\n result.insertionsAccepted +\n result.deletionsAccepted +\n result.movesAccepted +\n result.propertyChangesAccepted;\n\n logger.info('Revisions accepted in-memory', {\n insertions: result.insertionsAccepted,\n deletions: result.deletionsAccepted,\n moves: result.movesAccepted,\n propertyChanges: result.propertyChangesAccepted,\n total: result.totalAccepted,\n emptyTablesRemoved: result.emptyTablesRemoved,\n });\n\n return result;\n}\n\n/**\n * Accept revisions in a single paragraph by transforming its content array.\n *\n * The transformation follows these rules:\n * - Insertions (w:ins): Unwrap - extract child content into parent position\n * - Deletions (w:del): Remove - delete revision and its content\n * - MoveFrom (w:moveFrom): Remove - content exists at moveTo destination\n * - MoveTo (w:moveTo): Unwrap - keep content, remove wrapper\n * - Property changes: Remove from model (current formatting is kept)\n *\n * @param paragraph - Paragraph to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nfunction acceptRevisionsInParagraph(\n paragraph: Paragraph,\n options: Required<AcceptRevisionsOptions>\n): AcceptRevisionsResult {\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionType = item.getType();\n\n // Handle insertion revisions (w:ins)\n if (revisionType === 'insert' && options.acceptInsertions) {\n // Unwrap: Extract child content into parent position\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.insertionsAccepted++;\n continue;\n }\n\n // Handle deletion revisions (w:del)\n if (revisionType === 'delete' && options.acceptDeletions) {\n // Remove: Don't add to newContent - content is deleted\n result.deletionsAccepted++;\n continue;\n }\n\n // Handle moveFrom revisions (source of moved content)\n if (revisionType === 'moveFrom' && options.acceptMoves) {\n // Remove: Content exists at moveTo destination\n result.movesAccepted++;\n continue;\n }\n\n // Handle moveTo revisions (destination of moved content)\n if (revisionType === 'moveTo' && options.acceptMoves) {\n // Unwrap: Keep content, remove wrapper\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.movesAccepted++;\n continue;\n }\n\n // Handle property change revisions\n if (PROPERTY_REVISION_TYPES.includes(revisionType) && options.acceptPropertyChanges) {\n // For property changes, the revision is metadata attached to runs\n // The current formatting (newProperties) is already applied to the run\n // We just need to remove the change tracking metadata\n // The content inside should be preserved\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.propertyChangesAccepted++;\n continue;\n }\n\n // If we reach here, this revision type is not being accepted\n // Keep it in the content\n newContent.push(item);\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 // Clear paragraph property change tracking (pPrChange) if accepting property changes\n // This removes the w:pPrChange element from the paragraph's formatting\n if (options.acceptPropertyChanges) {\n const formatting = paragraph.getFormatting();\n if (formatting.pPrChange) {\n paragraph.clearParagraphPropertiesChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear paragraph mark deletion tracking if accepting deletions\n // This removes the w:del element from w:pPr/w:rPr\n if (options.acceptDeletions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n paragraph.clearParagraphMarkDeletion();\n result.deletionsAccepted++;\n }\n }\n\n // Clear paragraph mark insertion tracking if accepting insertions\n // This removes the w:ins element from w:pPr/w:rPr\n if (options.acceptInsertions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkInsertion) {\n paragraph.clearParagraphMarkInsertion();\n result.insertionsAccepted++;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a paragraph has any revisions\n */\nexport function paragraphHasRevisions(paragraph: Paragraph): boolean {\n const content = paragraph.getContent();\n if (content.some((item) => item instanceof Revision)) {\n return true;\n }\n // Also check paragraph mark revision markers in w:pPr/w:rPr\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion || formatting.paragraphMarkInsertion) {\n return true;\n }\n return false;\n}\n\n/**\n * Get all revisions from a paragraph\n */\nexport function getRevisionsFromParagraph(paragraph: Paragraph): Revision[] {\n const content = paragraph.getContent();\n return content.filter((item): item is Revision => item instanceof Revision);\n}\n\n/**\n * Count revisions by type in a document\n */\nexport function countRevisionsByType(doc: Document): Map<RevisionType, number> {\n const counts = new Map<RevisionType, number>();\n\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const revisions = getRevisionsFromParagraph(paragraph);\n for (const revision of revisions) {\n const type = revision.getType();\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n }\n\n return counts;\n}\n\n/**\n * Remove tables that have no visible content after revision acceptance.\n *\n * A table is considered empty if ALL cells in ALL rows have no text content.\n * This handles cases where all table content was deleted via tracked changes -\n * the deletion markers are stripped but the empty table structure remains.\n *\n * @param doc - Document to clean up\n * @param logger - Logger instance for debug output\n * @returns Number of empty tables removed\n */\nfunction cleanupEmptyTables(doc: Document, logger: ILogger): number {\n const tables = doc.getTables();\n let removedCount = 0;\n const tablesToRemove: number[] = [];\n\n for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {\n const table = tables[tableIndex];\n if (!table) continue;\n\n let hasContent = false;\n const rows = table.getRows();\n\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const paragraphs = cell.getParagraphs();\n for (const para of paragraphs) {\n const text = para.getText().trim();\n if (text.length > 0) {\n hasContent = true;\n break;\n }\n }\n if (hasContent) break;\n }\n if (hasContent) break;\n }\n\n if (!hasContent) {\n // Mark this table for removal (store index)\n tablesToRemove.push(tableIndex);\n logger.debug('Found empty table for removal', { tableIndex });\n }\n }\n\n // Remove tables in reverse order to preserve indices\n for (let i = tablesToRemove.length - 1; i >= 0; i--) {\n const tableIndex = tablesToRemove[i];\n if (tableIndex !== undefined && doc.removeTable(tableIndex)) {\n removedCount++;\n logger.debug('Removed empty table', { tableIndex });\n }\n }\n\n if (removedCount > 0) {\n logger.info('Empty table cleanup complete', { tablesRemoved: removedCount });\n }\n\n return removedCount;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MoveOperationHelper.d.ts","sourceRoot":"","sources":["../../src/utils/MoveOperationHelper.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAKtC,MAAM,WAAW,oBAAoB;IAEnC,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,mBAAmB;IAElC,MAAM,EAAE;QAEN,UAAU,EAAE,WAAW,CAAC;QAExB,QAAQ,EAAE,QAAQ,CAAC;QAEnB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF,WAAW,EAAE;QAEX,UAAU,EAAE,WAAW,CAAC;QAExB,MAAM,EAAE,QAAQ,CAAC;QAEjB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,mBAAmB;IA+B9B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;
|
|
1
|
+
{"version":3,"file":"MoveOperationHelper.d.ts","sourceRoot":"","sources":["../../src/utils/MoveOperationHelper.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAKtC,MAAM,WAAW,oBAAoB;IAEnC,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,mBAAmB;IAElC,MAAM,EAAE;QAEN,UAAU,EAAE,WAAW,CAAC;QAExB,QAAQ,EAAE,QAAQ,CAAC;QAEnB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF,WAAW,EAAE;QAEX,UAAU,EAAE,WAAW,CAAC;QAExB,MAAM,EAAE,QAAQ,CAAC;QAEjB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,mBAAmB;IA+B9B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;IAmF9E,MAAM,CAAC,gBAAgB,CACrB,eAAe,EAAE,OAAO,uBAAuB,EAAE,SAAS,EAC1D,aAAa,EAAE,OAAO,uBAAuB,EAAE,SAAS,EACxD,OAAO,EAAE,oBAAoB,GAC5B,mBAAmB;IAoBtB,MAAM,CAAC,eAAe,IAAI,IAAI;CAI/B"}
|
|
@@ -20,7 +20,7 @@ class MoveOperationHelper {
|
|
|
20
20
|
moveFrom.setId(moveFromId);
|
|
21
21
|
const moveFromRangeEnd = RangeMarker_1.RangeMarker.createMoveFromEnd(moveFromRangeId);
|
|
22
22
|
const contentArray = Array.isArray(content) ? content : [content];
|
|
23
|
-
const clonedContent = contentArray.map(run => {
|
|
23
|
+
const clonedContent = contentArray.map((run) => {
|
|
24
24
|
const cloned = new Run_1.Run(run.getText(), { ...run.getFormatting() });
|
|
25
25
|
return cloned;
|
|
26
26
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MoveOperationHelper.js","sourceRoot":"","sources":["../../src/utils/MoveOperationHelper.ts"],"names":[],"mappings":";;;AAmCA,mDAAgD;AAChD,yDAAsD;AACtD,yCAAsC;AA+CtC,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC5B,IAAI,yBAAyB,GAAG,IAAI,CAAC;AAKrC,MAAa,mBAAmB;IA+B9B,MAAM,CAAC,mBAAmB,CAAC,OAA6B;QACtD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC;QAGvD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE,mBAAmB,EAAE,CAAC;QAGjE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAI5E,MAAM,eAAe,GAAG,SAAS,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,SAAS,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;QAG7B,MAAM,kBAAkB,GAAG,yBAAW,CAAC,mBAAmB,CACxD,eAAe,EACf,MAAM,EACN,MAAM,EACN,IAAI,CACL,CAAC;QAEF,MAAM,QAAQ,GAAG,mBAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACxE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE3B,MAAM,gBAAgB,GAAG,yBAAW,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAGxE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAE3C,MAAM,MAAM,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,yBAAW,CAAC,iBAAiB,CACpD,aAAa,EACb,MAAM,EACN,MAAM,EACN,IAAI,CACL,CAAC;QAEF,MAAM,MAAM,GAAG,mBAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEvB,MAAM,cAAc,GAAG,yBAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAElE,OAAO;YACL,MAAM,EAAE;gBACN,UAAU,EAAE,kBAAkB;gBAC9B,QAAQ;gBACR,QAAQ,EAAE,gBAAgB;aAC3B;YACD,WAAW,EAAE;gBACX,UAAU,EAAE,gBAAgB;gBAC5B,MAAM;gBACN,QAAQ,EAAE,cAAc;aACzB;YACD,MAAM;SACP,CAAC;IACJ,CAAC;IA0BD,MAAM,CAAC,gBAAgB,CACrB,eAA0D,EAC1D,aAAwD,EACxD,OAA6B;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAGjD,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzD,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAGvD,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC5D,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACrD,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE1D,OAAO,MAAM,CAAC;IAChB,CAAC;IAMD,MAAM,CAAC,eAAe;QACpB,mBAAmB,GAAG,CAAC,CAAC;QACxB,yBAAyB,GAAG,IAAI,CAAC;IACnC,CAAC;CACF;AAnJD,kDAmJC","sourcesContent":["/**\r\n * MoveOperationHelper - Creates complete move operations with range markers\r\n *\r\n * Per ECMA-376, move operations in tracked changes require:\r\n * 1. w:moveFromRangeStart (marks start of source region)\r\n * 2. w:moveFrom (contains the moved content)\r\n * 3. w:moveFromRangeEnd (marks end of source region)\r\n * 4. w:moveToRangeStart (marks start of destination region)\r\n * 5. w:moveTo (contains the moved content copy)\r\n * 6. w:moveToRangeEnd (marks end of destination region)\r\n *\r\n * The range markers and move elements share a common 'name' (for range markers)\r\n * and 'moveId' (for move elements) that links them together.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Create a complete move operation\r\n * const moveOp = MoveOperationHelper.createMoveOperation({\r\n * author: 'John Doe',\r\n * content: [new Run('moved text')],\r\n * idProvider: () => document.getIdManager().getNextId(),\r\n * });\r\n *\r\n * // Add to source paragraph\r\n * sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\r\n * sourceParagraph.addRevision(moveOp.source.moveFrom);\r\n * sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\r\n *\r\n * // Add to destination paragraph\r\n * destParagraph.addRangeMarker(moveOp.destination.rangeStart);\r\n * destParagraph.addRevision(moveOp.destination.moveTo);\r\n * destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\r\n * ```\r\n */\r\n\r\nimport { Revision } from '../elements/Revision';\r\nimport { RangeMarker } from '../elements/RangeMarker';\r\nimport { Run } from '../elements/Run';\r\n\r\n/**\r\n * Options for creating a move operation\r\n */\r\nexport interface MoveOperationOptions {\r\n /** Author who made the move */\r\n author: string;\r\n /** Content being moved (Run or array of Runs) */\r\n content: Run | Run[];\r\n /** Date of the move (defaults to now) */\r\n date?: Date;\r\n /** ID provider function - returns the next available annotation ID */\r\n idProvider?: () => number;\r\n /** Optional move ID (auto-generated if not provided) */\r\n moveId?: string;\r\n}\r\n\r\n/**\r\n * Result of creating a move operation\r\n */\r\nexport interface MoveOperationResult {\r\n /** Elements to add to the source paragraph (where content was moved FROM) */\r\n source: {\r\n /** Range start marker (w:moveFromRangeStart) */\r\n rangeStart: RangeMarker;\r\n /** Move revision (w:moveFrom) */\r\n moveFrom: Revision;\r\n /** Range end marker (w:moveFromRangeEnd) */\r\n rangeEnd: RangeMarker;\r\n };\r\n /** Elements to add to the destination paragraph (where content was moved TO) */\r\n destination: {\r\n /** Range start marker (w:moveToRangeStart) */\r\n rangeStart: RangeMarker;\r\n /** Move revision (w:moveTo) */\r\n moveTo: Revision;\r\n /** Range end marker (w:moveToRangeEnd) */\r\n rangeEnd: RangeMarker;\r\n };\r\n /** The move ID linking all elements together */\r\n moveId: string;\r\n}\r\n\r\n/**\r\n * Simple ID counter for when no provider is specified\r\n */\r\nlet globalMoveIdCounter = 0;\r\nlet globalAnnotationIdCounter = 1000; // Start high to avoid conflicts\r\n\r\n/**\r\n * Helper class for creating complete move operations\r\n */\r\nexport class MoveOperationHelper {\r\n /**\r\n * Creates a complete move operation with all required elements.\r\n *\r\n * This generates:\r\n * - Source: w:moveFromRangeStart, w:moveFrom, w:moveFromRangeEnd\r\n * - Destination: w:moveToRangeStart, w:moveTo, w:moveToRangeEnd\r\n *\r\n * All elements are linked by the moveId (for revisions) and name (for range markers).\r\n *\r\n * @param options - Move operation options\r\n * @returns Complete move operation with all elements\r\n *\r\n * @example\r\n * ```typescript\r\n * const moveOp = MoveOperationHelper.createMoveOperation({\r\n * author: 'John Doe',\r\n * content: new Run('text to move'),\r\n * });\r\n *\r\n * // Add to source paragraph (where text was)\r\n * sourcePara.addRangeMarker(moveOp.source.rangeStart);\r\n * sourcePara.addRevision(moveOp.source.moveFrom);\r\n * sourcePara.addRangeMarker(moveOp.source.rangeEnd);\r\n *\r\n * // Add to destination paragraph (where text moved to)\r\n * destPara.addRangeMarker(moveOp.destination.rangeStart);\r\n * destPara.addRevision(moveOp.destination.moveTo);\r\n * destPara.addRangeMarker(moveOp.destination.rangeEnd);\r\n * ```\r\n */\r\n static createMoveOperation(options: MoveOperationOptions): MoveOperationResult {\r\n const { author, content, date = new Date() } = options;\r\n\r\n // Generate move ID if not provided\r\n const moveId = options.moveId || `move-${++globalMoveIdCounter}`;\r\n\r\n // Get IDs from provider or use simple counter\r\n const getNextId = options.idProvider || (() => ++globalAnnotationIdCounter);\r\n\r\n // Allocate IDs for all elements\r\n // Range markers use same ID for start/end pairs\r\n const moveFromRangeId = getNextId();\r\n const moveFromId = getNextId();\r\n const moveToRangeId = getNextId();\r\n const moveToId = getNextId();\r\n\r\n // Create source elements\r\n const moveFromRangeStart = RangeMarker.createMoveFromStart(\r\n moveFromRangeId,\r\n moveId,\r\n author,\r\n date\r\n );\r\n\r\n const moveFrom = Revision.createMoveFrom(author, content, moveId, date);\r\n moveFrom.setId(moveFromId);\r\n\r\n const moveFromRangeEnd = RangeMarker.createMoveFromEnd(moveFromRangeId);\r\n\r\n // Create destination elements (clone content for moveTo)\r\n const contentArray = Array.isArray(content) ? content : [content];\r\n const clonedContent = contentArray.map(run => {\r\n // Clone the run to have independent content at destination\r\n const cloned = new Run(run.getText(), { ...run.getFormatting() });\r\n return cloned;\r\n });\r\n\r\n const moveToRangeStart = RangeMarker.createMoveToStart(\r\n moveToRangeId,\r\n moveId,\r\n author,\r\n date\r\n );\r\n\r\n const moveTo = Revision.createMoveTo(author, clonedContent, moveId, date);\r\n moveTo.setId(moveToId);\r\n\r\n const moveToRangeEnd = RangeMarker.createMoveToEnd(moveToRangeId);\r\n\r\n return {\r\n source: {\r\n rangeStart: moveFromRangeStart,\r\n moveFrom,\r\n rangeEnd: moveFromRangeEnd,\r\n },\r\n destination: {\r\n rangeStart: moveToRangeStart,\r\n moveTo,\r\n rangeEnd: moveToRangeEnd,\r\n },\r\n moveId,\r\n };\r\n }\r\n\r\n /**\r\n * Adds a complete move operation to source and destination paragraphs.\r\n *\r\n * This is a convenience method that creates the move operation and adds\r\n * all elements to the appropriate paragraphs in the correct order.\r\n *\r\n * @param sourceParagraph - Paragraph where content was moved FROM\r\n * @param destParagraph - Paragraph where content was moved TO\r\n * @param options - Move operation options\r\n * @returns The move operation result for reference\r\n *\r\n * @example\r\n * ```typescript\r\n * import { Paragraph } from 'docxmlater';\r\n *\r\n * const sourcePara = document.getParagraphs()[0];\r\n * const destPara = document.getParagraphs()[5];\r\n *\r\n * MoveOperationHelper.addMoveOperation(sourcePara, destPara, {\r\n * author: 'John Doe',\r\n * content: new Run('moved text'),\r\n * });\r\n * ```\r\n */\r\n static addMoveOperation(\r\n sourceParagraph: import('../elements/Paragraph').Paragraph,\r\n destParagraph: import('../elements/Paragraph').Paragraph,\r\n options: MoveOperationOptions\r\n ): MoveOperationResult {\r\n const moveOp = this.createMoveOperation(options);\r\n\r\n // Add to source paragraph in order\r\n sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\r\n sourceParagraph.addRevision(moveOp.source.moveFrom);\r\n sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\r\n\r\n // Add to destination paragraph in order\r\n destParagraph.addRangeMarker(moveOp.destination.rangeStart);\r\n destParagraph.addRevision(moveOp.destination.moveTo);\r\n destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\r\n\r\n return moveOp;\r\n }\r\n\r\n /**\r\n * Resets the global ID counters (for testing purposes).\r\n * @internal\r\n */\r\n static resetIdCounters(): void {\r\n globalMoveIdCounter = 0;\r\n globalAnnotationIdCounter = 1000;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"MoveOperationHelper.js","sourceRoot":"","sources":["../../src/utils/MoveOperationHelper.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MoveOperationHelper - Creates complete move operations with range markers\n *\n * Per ECMA-376, move operations in tracked changes require:\n * 1. w:moveFromRangeStart (marks start of source region)\n * 2. w:moveFrom (contains the moved content)\n * 3. w:moveFromRangeEnd (marks end of source region)\n * 4. w:moveToRangeStart (marks start of destination region)\n * 5. w:moveTo (contains the moved content copy)\n * 6. w:moveToRangeEnd (marks end of destination region)\n *\n * The range markers and move elements share a common 'name' (for range markers)\n * and 'moveId' (for move elements) that links them together.\n *\n * @example\n * ```typescript\n * // Create a complete move operation\n * const moveOp = MoveOperationHelper.createMoveOperation({\n * author: 'John Doe',\n * content: [new Run('moved text')],\n * idProvider: () => document.getIdManager().getNextId(),\n * });\n *\n * // Add to source paragraph\n * sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\n * sourceParagraph.addRevision(moveOp.source.moveFrom);\n * sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\n *\n * // Add to destination paragraph\n * destParagraph.addRangeMarker(moveOp.destination.rangeStart);\n * destParagraph.addRevision(moveOp.destination.moveTo);\n * destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\n * ```\n */\n\nimport { Revision } from '../elements/Revision';\nimport { RangeMarker } from '../elements/RangeMarker';\nimport { Run } from '../elements/Run';\n\n/**\n * Options for creating a move operation\n */\nexport interface MoveOperationOptions {\n /** Author who made the move */\n author: string;\n /** Content being moved (Run or array of Runs) */\n content: Run | Run[];\n /** Date of the move (defaults to now) */\n date?: Date;\n /** ID provider function - returns the next available annotation ID */\n idProvider?: () => number;\n /** Optional move ID (auto-generated if not provided) */\n moveId?: string;\n}\n\n/**\n * Result of creating a move operation\n */\nexport interface MoveOperationResult {\n /** Elements to add to the source paragraph (where content was moved FROM) */\n source: {\n /** Range start marker (w:moveFromRangeStart) */\n rangeStart: RangeMarker;\n /** Move revision (w:moveFrom) */\n moveFrom: Revision;\n /** Range end marker (w:moveFromRangeEnd) */\n rangeEnd: RangeMarker;\n };\n /** Elements to add to the destination paragraph (where content was moved TO) */\n destination: {\n /** Range start marker (w:moveToRangeStart) */\n rangeStart: RangeMarker;\n /** Move revision (w:moveTo) */\n moveTo: Revision;\n /** Range end marker (w:moveToRangeEnd) */\n rangeEnd: RangeMarker;\n };\n /** The move ID linking all elements together */\n moveId: string;\n}\n\n/**\n * Simple ID counter for when no provider is specified\n */\nlet globalMoveIdCounter = 0;\nlet globalAnnotationIdCounter = 1000; // Start high to avoid conflicts\n\n/**\n * Helper class for creating complete move operations\n */\nexport class MoveOperationHelper {\n /**\n * Creates a complete move operation with all required elements.\n *\n * This generates:\n * - Source: w:moveFromRangeStart, w:moveFrom, w:moveFromRangeEnd\n * - Destination: w:moveToRangeStart, w:moveTo, w:moveToRangeEnd\n *\n * All elements are linked by the moveId (for revisions) and name (for range markers).\n *\n * @param options - Move operation options\n * @returns Complete move operation with all elements\n *\n * @example\n * ```typescript\n * const moveOp = MoveOperationHelper.createMoveOperation({\n * author: 'John Doe',\n * content: new Run('text to move'),\n * });\n *\n * // Add to source paragraph (where text was)\n * sourcePara.addRangeMarker(moveOp.source.rangeStart);\n * sourcePara.addRevision(moveOp.source.moveFrom);\n * sourcePara.addRangeMarker(moveOp.source.rangeEnd);\n *\n * // Add to destination paragraph (where text moved to)\n * destPara.addRangeMarker(moveOp.destination.rangeStart);\n * destPara.addRevision(moveOp.destination.moveTo);\n * destPara.addRangeMarker(moveOp.destination.rangeEnd);\n * ```\n */\n static createMoveOperation(options: MoveOperationOptions): MoveOperationResult {\n const { author, content, date = new Date() } = options;\n\n // Generate move ID if not provided\n const moveId = options.moveId || `move-${++globalMoveIdCounter}`;\n\n // Get IDs from provider or use simple counter\n const getNextId = options.idProvider || (() => ++globalAnnotationIdCounter);\n\n // Allocate IDs for all elements\n // Range markers use same ID for start/end pairs\n const moveFromRangeId = getNextId();\n const moveFromId = getNextId();\n const moveToRangeId = getNextId();\n const moveToId = getNextId();\n\n // Create source elements\n const moveFromRangeStart = RangeMarker.createMoveFromStart(\n moveFromRangeId,\n moveId,\n author,\n date\n );\n\n const moveFrom = Revision.createMoveFrom(author, content, moveId, date);\n moveFrom.setId(moveFromId);\n\n const moveFromRangeEnd = RangeMarker.createMoveFromEnd(moveFromRangeId);\n\n // Create destination elements (clone content for moveTo)\n const contentArray = Array.isArray(content) ? content : [content];\n const clonedContent = contentArray.map((run) => {\n // Clone the run to have independent content at destination\n const cloned = new Run(run.getText(), { ...run.getFormatting() });\n return cloned;\n });\n\n const moveToRangeStart = RangeMarker.createMoveToStart(moveToRangeId, moveId, author, date);\n\n const moveTo = Revision.createMoveTo(author, clonedContent, moveId, date);\n moveTo.setId(moveToId);\n\n const moveToRangeEnd = RangeMarker.createMoveToEnd(moveToRangeId);\n\n return {\n source: {\n rangeStart: moveFromRangeStart,\n moveFrom,\n rangeEnd: moveFromRangeEnd,\n },\n destination: {\n rangeStart: moveToRangeStart,\n moveTo,\n rangeEnd: moveToRangeEnd,\n },\n moveId,\n };\n }\n\n /**\n * Adds a complete move operation to source and destination paragraphs.\n *\n * This is a convenience method that creates the move operation and adds\n * all elements to the appropriate paragraphs in the correct order.\n *\n * @param sourceParagraph - Paragraph where content was moved FROM\n * @param destParagraph - Paragraph where content was moved TO\n * @param options - Move operation options\n * @returns The move operation result for reference\n *\n * @example\n * ```typescript\n * import { Paragraph } from 'docxmlater';\n *\n * const sourcePara = document.getParagraphs()[0];\n * const destPara = document.getParagraphs()[5];\n *\n * MoveOperationHelper.addMoveOperation(sourcePara, destPara, {\n * author: 'John Doe',\n * content: new Run('moved text'),\n * });\n * ```\n */\n static addMoveOperation(\n sourceParagraph: import('../elements/Paragraph').Paragraph,\n destParagraph: import('../elements/Paragraph').Paragraph,\n options: MoveOperationOptions\n ): MoveOperationResult {\n const moveOp = this.createMoveOperation(options);\n\n // Add to source paragraph in order\n sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\n sourceParagraph.addRevision(moveOp.source.moveFrom);\n sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\n\n // Add to destination paragraph in order\n destParagraph.addRangeMarker(moveOp.destination.rangeStart);\n destParagraph.addRevision(moveOp.destination.moveTo);\n destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\n\n return moveOp;\n }\n\n /**\n * Resets the global ID counters (for testing purposes).\n * @internal\n */\n static resetIdCounters(): void {\n globalMoveIdCounter = 0;\n globalAnnotationIdCounter = 1000;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevisionAwareProcessor.d.ts","sourceRoot":"","sources":["../../src/utils/RevisionAwareProcessor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtE,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,UAAU,GACV,mBAAmB,CAAC;AAKxB,MAAM,WAAW,yBAAyB;IAExC,IAAI,EAAE,oBAAoB,CAAC;IAE3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAKD,MAAM,WAAW,iBAAiB;IAEhC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAEf,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC;IAEvC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;CAC1C;AAKD,MAAM,WAAW,wBAAwB;IAEvC,OAAO,EAAE,OAAO,CAAC;IAEjB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAE5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAE7B,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,SAAS,EAAE,YAAY,EAAE,CAAC;IAE1B,GAAG,EAAE,kBAAkB,EAAE,CAAC;CAC3B;AAKD,MAAM,WAAW,YAAY;IAE3B,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IAEnB,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAE/C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAKD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,qBAAa,sBAAsB;WASpB,OAAO,CAClB,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"RevisionAwareProcessor.d.ts","sourceRoot":"","sources":["../../src/utils/RevisionAwareProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,7 +115,7 @@ class RevisionAwareProcessor {
|
|
|
115
115
|
return acceptedIds;
|
|
116
116
|
}
|
|
117
117
|
static filterRevisions(revisions, criteria) {
|
|
118
|
-
return revisions.filter(rev => {
|
|
118
|
+
return revisions.filter((rev) => {
|
|
119
119
|
if (criteria.ids && !criteria.ids.includes(rev.getId())) {
|
|
120
120
|
return false;
|
|
121
121
|
}
|
|
@@ -153,9 +153,7 @@ class RevisionAwareProcessor {
|
|
|
153
153
|
type === 'numberingChange') {
|
|
154
154
|
return 'formatting';
|
|
155
155
|
}
|
|
156
|
-
if (type === 'moveFrom' ||
|
|
157
|
-
type === 'moveTo' ||
|
|
158
|
-
type === 'sectionPropertiesChange') {
|
|
156
|
+
if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {
|
|
159
157
|
return 'structural';
|
|
160
158
|
}
|
|
161
159
|
if (type === 'tablePropertiesChange' ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevisionAwareProcessor.js","sourceRoot":"","sources":["../../src/utils/RevisionAwareProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * RevisionAwareProcessor - Handles document revisions before and during processing\r\n *\r\n * Provides three modes for handling existing Word tracked changes:\r\n * - accept_all: Accept all revisions before processing (default)\r\n * - preserve: Preserve revisions, skip conflicting operations\r\n * - preserve_and_wrap: Preserve revisions, wrap conflicts in new revisions\r\n *\r\n * Implements ECMA-376 compliant revision handling.\r\n *\r\n * @module RevisionAwareProcessor\r\n */\r\n\r\nimport type { Document } from '../core/Document';\r\nimport { Revision, RevisionType } from '../elements/Revision';\r\nimport { RevisionManager } from '../elements/RevisionManager';\r\nimport { ChangeCategory, ChangeLocation } from './ChangelogGenerator';\r\n\r\n/**\r\n * Revision handling modes for document processing.\r\n */\r\nexport type RevisionHandlingMode =\r\n | 'accept_all' // Accept all revisions before processing\r\n | 'preserve' // Preserve revisions, skip conflicting operations\r\n | 'preserve_and_wrap'; // Preserve revisions, wrap conflicts in new revisions\r\n\r\n/**\r\n * Options for revision-aware processing.\r\n */\r\nexport interface RevisionProcessingOptions {\r\n /** How to handle existing revisions */\r\n mode: RevisionHandlingMode;\r\n /** Author name for new revisions (required for 'preserve_and_wrap' mode) */\r\n author?: string;\r\n /** Selective acceptance criteria (optional, for partial acceptance) */\r\n acceptCriteria?: SelectionCriteria;\r\n}\r\n\r\n/**\r\n * Criteria for selecting specific revisions.\r\n */\r\nexport interface SelectionCriteria {\r\n /** Specific revision IDs */\r\n ids?: number[];\r\n /** Filter by revision types */\r\n types?: RevisionType[];\r\n /** Filter by authors */\r\n authors?: string[];\r\n /** Filter by date range */\r\n dateRange?: { start: Date; end: Date };\r\n /** Filter by category */\r\n categories?: ChangeCategory[];\r\n /** Custom filter function */\r\n custom?: (revision: Revision) => boolean;\r\n}\r\n\r\n/**\r\n * Result of revision-aware processing.\r\n */\r\nexport interface RevisionProcessingResult {\r\n /** Whether processing completed successfully */\r\n success: boolean;\r\n /** IDs of revisions that were accepted */\r\n acceptedRevisions: string[];\r\n /** IDs of revisions that were preserved */\r\n preservedRevisions: string[];\r\n /** IDs of new revisions created (preserve_and_wrap mode) */\r\n newRevisions: string[];\r\n /** Conflicts encountered during processing */\r\n conflicts: ConflictInfo[];\r\n /** Processing log entries */\r\n log: ProcessingLogEntry[];\r\n}\r\n\r\n/**\r\n * Information about a conflict between an operation and a revision.\r\n */\r\nexport interface ConflictInfo {\r\n /** Description of the operation that conflicted */\r\n operation: string;\r\n /** ID of the conflicting revision */\r\n revisionId: string;\r\n /** How the conflict was resolved */\r\n resolution: 'accepted' | 'skipped' | 'wrapped';\r\n /** Location of the conflict */\r\n location: ChangeLocation;\r\n}\r\n\r\n/**\r\n * Log entry for processing actions.\r\n */\r\nexport interface ProcessingLogEntry {\r\n timestamp: Date;\r\n action: string;\r\n details: string;\r\n revisionId?: string;\r\n}\r\n\r\n/**\r\n * Handles document revisions before and during processing.\r\n * Implements ECMA-376 compliant revision handling.\r\n */\r\nexport class RevisionAwareProcessor {\r\n /**\r\n * Prepare document for processing by handling revisions.\r\n * Call this before applying any document modifications.\r\n *\r\n * @param doc - Document to prepare\r\n * @param options - Processing options\r\n * @returns Processing result with details of actions taken\r\n */\r\n static async prepare(\r\n doc: Document,\r\n options: RevisionProcessingOptions\r\n ): Promise<RevisionProcessingResult> {\r\n const log: ProcessingLogEntry[] = [];\r\n const acceptedRevisions: string[] = [];\r\n const preservedRevisions: string[] = [];\r\n const newRevisions: string[] = [];\r\n const conflicts: ConflictInfo[] = [];\r\n\r\n const addLog = (action: string, details: string, revisionId?: string) => {\r\n log.push({\r\n timestamp: new Date(),\r\n action,\r\n details,\r\n revisionId,\r\n });\r\n };\r\n\r\n addLog('start', `Starting revision processing with mode: ${options.mode}`);\r\n\r\n try {\r\n const revisionManager = doc.getRevisionManager();\r\n const hasInMemoryRevisions = revisionManager?.hasRevisions() ?? false;\r\n const hasRawXmlRevisions = doc.hasRawXmlRevisions();\r\n\r\n // Check both in-memory model AND raw XML for revisions\r\n // Raw XML may contain revisions that weren't fully parsed into memory\r\n if (!hasInMemoryRevisions && !hasRawXmlRevisions) {\r\n addLog('complete', 'No revisions found in document');\r\n return {\r\n success: true,\r\n acceptedRevisions,\r\n preservedRevisions,\r\n newRevisions,\r\n conflicts,\r\n log,\r\n };\r\n }\r\n\r\n const allRevisions = revisionManager?.getAllRevisions() ?? [];\r\n const inMemoryCount = allRevisions.length;\r\n const rawXmlNote = hasRawXmlRevisions ? ' (raw XML contains revision markup)' : '';\r\n addLog('info', `Found ${inMemoryCount} parsed revisions in document${rawXmlNote}`);\r\n\r\n switch (options.mode) {\r\n case 'accept_all':\r\n // Accept all revisions\r\n await this.acceptAllRevisions(doc, allRevisions, acceptedRevisions, addLog);\r\n break;\r\n\r\n case 'preserve':\r\n // Preserve all revisions by preventing document.xml regeneration\r\n // This keeps the original XML with w:ins/w:del elements intact\r\n for (const rev of allRevisions) {\r\n preservedRevisions.push(rev.getId().toString());\r\n }\r\n doc.preserveRawXml();\r\n addLog('complete', `Preserved ${preservedRevisions.length} revisions (raw XML preservation enabled)`);\r\n break;\r\n\r\n case 'preserve_and_wrap':\r\n // Preserve all revisions, track for later wrapping\r\n // Also enable raw XML preservation to keep existing revisions\r\n for (const rev of allRevisions) {\r\n preservedRevisions.push(rev.getId().toString());\r\n }\r\n doc.preserveRawXml();\r\n addLog('info', `Will preserve and wrap conflicts for ${preservedRevisions.length} revisions`);\r\n addLog('info', `New revisions will be authored by: ${options.author || 'Unknown'}`);\r\n break;\r\n\r\n default:\r\n addLog('error', `Unknown processing mode: ${options.mode}`);\r\n return {\r\n success: false,\r\n acceptedRevisions,\r\n preservedRevisions,\r\n newRevisions,\r\n conflicts,\r\n log,\r\n };\r\n }\r\n\r\n addLog('complete', 'Revision processing completed successfully');\r\n\r\n return {\r\n success: true,\r\n acceptedRevisions,\r\n preservedRevisions,\r\n newRevisions,\r\n conflicts,\r\n log,\r\n };\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n addLog('error', `Processing failed: ${errorMessage}`);\r\n\r\n return {\r\n success: false,\r\n acceptedRevisions,\r\n preservedRevisions,\r\n newRevisions,\r\n conflicts,\r\n log,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Accept all revisions in the document using Document.acceptAllRevisions().\r\n *\r\n * This delegates to Document.acceptAllRevisions() which uses in-memory DOM transformation\r\n * (the industry-standard approach used by OpenXML PowerTools, Aspose.Words, etc.):\r\n *\r\n * 1. Transforms Revision objects in paragraph.content arrays\r\n * 2. Insertions (w:ins): Unwraps content - keeps Runs/Hyperlinks, removes Revision wrapper\r\n * 3. Deletions (w:del): Removes content entirely from the model\r\n * 4. Move operations: moveFrom removed, moveTo unwrapped\r\n * 5. Property changes: Removes change metadata, keeps current formatting\r\n *\r\n * This approach allows subsequent modifications to be saved correctly because the\r\n * in-memory model is transformed (not raw XML), so save() regenerates document.xml\r\n * with both the accepted changes AND any subsequent modifications.\r\n *\r\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\r\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138\r\n */\r\n private static async acceptAllRevisions(\r\n doc: Document,\r\n revisions: Revision[],\r\n acceptedIds: string[],\r\n addLog: (action: string, details: string, revisionId?: string) => void\r\n ): Promise<void> {\r\n addLog('info', 'Accepting all revisions using in-memory DOM transformation');\r\n\r\n // Track accepted revision IDs before acceptance (for logging)\r\n for (const rev of revisions) {\r\n acceptedIds.push(rev.getId().toString());\r\n }\r\n\r\n // Use Document.acceptAllRevisions() which uses in-memory transformation\r\n // This allows subsequent modifications to be saved correctly\r\n await doc.acceptAllRevisions();\r\n\r\n // Log each accepted revision\r\n for (const id of acceptedIds) {\r\n addLog('accept', `Accepted revision ${id}`, id);\r\n }\r\n\r\n addLog('complete', `Accepted ${acceptedIds.length} revisions (in-memory transformation)`);\r\n }\r\n\r\n /**\r\n * Accept revisions matching the given criteria.\r\n * Uses existing RevisionAcceptor under the hood.\r\n *\r\n * @param doc - Document to process\r\n * @param criteria - Selection criteria\r\n * @returns Array of accepted revision IDs\r\n */\r\n static acceptSelective(\r\n doc: Document,\r\n criteria: SelectionCriteria\r\n ): string[] {\r\n const revisionManager = doc.getRevisionManager();\r\n if (!revisionManager) {\r\n return [];\r\n }\r\n\r\n const allRevisions = revisionManager.getAllRevisions();\r\n const matchingRevisions = this.filterRevisions(allRevisions, criteria);\r\n\r\n const acceptedIds: string[] = [];\r\n for (const rev of matchingRevisions) {\r\n acceptedIds.push(rev.getId().toString());\r\n // Note: Actual acceptance would require XML manipulation\r\n // For now, this returns which revisions WOULD be accepted\r\n }\r\n\r\n return acceptedIds;\r\n }\r\n\r\n /**\r\n * Filter revisions based on criteria.\r\n */\r\n private static filterRevisions(\r\n revisions: Revision[],\r\n criteria: SelectionCriteria\r\n ): Revision[] {\r\n return revisions.filter(rev => {\r\n // Filter by IDs\r\n if (criteria.ids && !criteria.ids.includes(rev.getId())) {\r\n return false;\r\n }\r\n\r\n // Filter by types\r\n if (criteria.types && !criteria.types.includes(rev.getType())) {\r\n return false;\r\n }\r\n\r\n // Filter by authors\r\n if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {\r\n return false;\r\n }\r\n\r\n // Filter by date range\r\n if (criteria.dateRange) {\r\n const date = rev.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(rev);\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(rev)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\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 * Check if an operation at the given location would conflict with any revision.\r\n *\r\n * @param doc - Document to check\r\n * @param paragraphIndex - Paragraph index\r\n * @param runIndex - Optional run index\r\n * @returns Conflicting revision or null\r\n */\r\n static checkConflict(\r\n doc: Document,\r\n paragraphIndex: number,\r\n runIndex?: number\r\n ): Revision | null {\r\n const revisionManager = doc.getRevisionManager();\r\n if (!revisionManager) {\r\n return null;\r\n }\r\n\r\n // Get revisions that might affect this paragraph\r\n const revisions = revisionManager.getRevisionsForParagraph(paragraphIndex);\r\n\r\n // For now, return the first revision at this location\r\n // In a more complete implementation, we would check run-level conflicts\r\n return revisions.length > 0 ? revisions[0]! : null;\r\n }\r\n\r\n /**\r\n * Get all revisions that would be affected by an operation.\r\n *\r\n * @param doc - Document to check\r\n * @param paragraphIndex - Paragraph index\r\n * @param runIndex - Optional run index\r\n * @returns Array of affected revisions\r\n */\r\n static getAffectedRevisions(\r\n doc: Document,\r\n paragraphIndex: number,\r\n runIndex?: number\r\n ): Revision[] {\r\n const revisionManager = doc.getRevisionManager();\r\n if (!revisionManager) {\r\n return [];\r\n }\r\n\r\n return revisionManager.getRevisionsForParagraph(paragraphIndex);\r\n }\r\n\r\n /**\r\n * Wrap content in a new revision (for preserve_and_wrap mode).\r\n * Creates a new revision tracking the change.\r\n *\r\n * @param doc - Document to modify\r\n * @param paragraphIndex - Paragraph index\r\n * @param runIndex - Run index\r\n * @param author - Author for the new revision\r\n * @param type - Type of revision to create\r\n * @returns ID of the new revision\r\n */\r\n static wrapInRevision(\r\n doc: Document,\r\n paragraphIndex: number,\r\n runIndex: number,\r\n author: string,\r\n type: 'insert' | 'delete'\r\n ): string {\r\n const revisionManager = doc.getRevisionManager();\r\n if (!revisionManager) {\r\n throw new Error('Document does not have a revision manager');\r\n }\r\n\r\n // Get the paragraphs from the document\r\n const paragraphs = doc.getParagraphs();\r\n if (paragraphIndex < 0 || paragraphIndex >= paragraphs.length) {\r\n throw new Error(`Invalid paragraph index: ${paragraphIndex}`);\r\n }\r\n\r\n const paragraph = paragraphs[paragraphIndex];\r\n if (!paragraph) {\r\n throw new Error(`Paragraph at index ${paragraphIndex} not found`);\r\n }\r\n\r\n const runs = paragraph.getRuns();\r\n if (runIndex < 0 || runIndex >= runs.length) {\r\n throw new Error(`Invalid run index: ${runIndex}`);\r\n }\r\n\r\n const run = runs[runIndex];\r\n if (!run) {\r\n throw new Error(`Run at index ${runIndex} not found`);\r\n }\r\n\r\n // Create new revision\r\n const revision = new Revision({\r\n author,\r\n type,\r\n content: run,\r\n date: new Date(),\r\n });\r\n\r\n // Register with manager\r\n revisionManager.register(revision);\r\n\r\n return revision.getId().toString();\r\n }\r\n\r\n /**\r\n * Check if document has any tracked changes.\r\n *\r\n * @param doc - Document to check\r\n * @returns True if document has tracked changes\r\n */\r\n static hasTrackedChanges(doc: Document): boolean {\r\n const revisionManager = doc.getRevisionManager();\r\n return revisionManager ? revisionManager.hasRevisions() : false;\r\n }\r\n\r\n /**\r\n * Get summary of tracked changes in document.\r\n *\r\n * @param doc - Document to summarize\r\n * @returns Summary object or null if no revision manager\r\n */\r\n static getTrackedChangesSummary(doc: Document): {\r\n total: number;\r\n insertions: number;\r\n deletions: number;\r\n formatting: number;\r\n moves: number;\r\n authors: string[];\r\n } | null {\r\n const revisionManager = doc.getRevisionManager();\r\n if (!revisionManager) {\r\n return null;\r\n }\r\n\r\n const summary = revisionManager.getSummary();\r\n return {\r\n total: summary.total,\r\n insertions: summary.byType.insertions,\r\n deletions: summary.byType.deletions,\r\n formatting: summary.byType.propertyChanges,\r\n moves: summary.byType.moves,\r\n authors: summary.authors,\r\n };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RevisionAwareProcessor.js","sourceRoot":"","sources":["../../src/utils/RevisionAwareProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionAwareProcessor - Handles document revisions before and during processing\n *\n * Provides three modes for handling existing Word tracked changes:\n * - accept_all: Accept all revisions before processing (default)\n * - preserve: Preserve revisions, skip conflicting operations\n * - preserve_and_wrap: Preserve revisions, wrap conflicts in new revisions\n *\n * Implements ECMA-376 compliant revision handling.\n *\n * @module RevisionAwareProcessor\n */\n\nimport type { Document } from '../core/Document';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { RevisionManager } from '../elements/RevisionManager';\nimport { ChangeCategory, ChangeLocation } from './ChangelogGenerator';\n\n/**\n * Revision handling modes for document processing.\n */\nexport type RevisionHandlingMode =\n | 'accept_all' // Accept all revisions before processing\n | 'preserve' // Preserve revisions, skip conflicting operations\n | 'preserve_and_wrap'; // Preserve revisions, wrap conflicts in new revisions\n\n/**\n * Options for revision-aware processing.\n */\nexport interface RevisionProcessingOptions {\n /** How to handle existing revisions */\n mode: RevisionHandlingMode;\n /** Author name for new revisions (required for 'preserve_and_wrap' mode) */\n author?: string;\n /** Selective acceptance criteria (optional, for partial acceptance) */\n acceptCriteria?: SelectionCriteria;\n}\n\n/**\n * Criteria for selecting specific revisions.\n */\nexport interface SelectionCriteria {\n /** Specific revision IDs */\n ids?: number[];\n /** Filter by revision types */\n types?: RevisionType[];\n /** Filter by authors */\n authors?: string[];\n /** Filter by date range */\n dateRange?: { start: Date; end: Date };\n /** Filter by category */\n categories?: ChangeCategory[];\n /** Custom filter function */\n custom?: (revision: Revision) => boolean;\n}\n\n/**\n * Result of revision-aware processing.\n */\nexport interface RevisionProcessingResult {\n /** Whether processing completed successfully */\n success: boolean;\n /** IDs of revisions that were accepted */\n acceptedRevisions: string[];\n /** IDs of revisions that were preserved */\n preservedRevisions: string[];\n /** IDs of new revisions created (preserve_and_wrap mode) */\n newRevisions: string[];\n /** Conflicts encountered during processing */\n conflicts: ConflictInfo[];\n /** Processing log entries */\n log: ProcessingLogEntry[];\n}\n\n/**\n * Information about a conflict between an operation and a revision.\n */\nexport interface ConflictInfo {\n /** Description of the operation that conflicted */\n operation: string;\n /** ID of the conflicting revision */\n revisionId: string;\n /** How the conflict was resolved */\n resolution: 'accepted' | 'skipped' | 'wrapped';\n /** Location of the conflict */\n location: ChangeLocation;\n}\n\n/**\n * Log entry for processing actions.\n */\nexport interface ProcessingLogEntry {\n timestamp: Date;\n action: string;\n details: string;\n revisionId?: string;\n}\n\n/**\n * Handles document revisions before and during processing.\n * Implements ECMA-376 compliant revision handling.\n */\nexport class RevisionAwareProcessor {\n /**\n * Prepare document for processing by handling revisions.\n * Call this before applying any document modifications.\n *\n * @param doc - Document to prepare\n * @param options - Processing options\n * @returns Processing result with details of actions taken\n */\n static async prepare(\n doc: Document,\n options: RevisionProcessingOptions\n ): Promise<RevisionProcessingResult> {\n const log: ProcessingLogEntry[] = [];\n const acceptedRevisions: string[] = [];\n const preservedRevisions: string[] = [];\n const newRevisions: string[] = [];\n const conflicts: ConflictInfo[] = [];\n\n const addLog = (action: string, details: string, revisionId?: string) => {\n log.push({\n timestamp: new Date(),\n action,\n details,\n revisionId,\n });\n };\n\n addLog('start', `Starting revision processing with mode: ${options.mode}`);\n\n try {\n const revisionManager = doc.getRevisionManager();\n const hasInMemoryRevisions = revisionManager?.hasRevisions() ?? false;\n const hasRawXmlRevisions = doc.hasRawXmlRevisions();\n\n // Check both in-memory model AND raw XML for revisions\n // Raw XML may contain revisions that weren't fully parsed into memory\n if (!hasInMemoryRevisions && !hasRawXmlRevisions) {\n addLog('complete', 'No revisions found in document');\n return {\n success: true,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n\n const allRevisions = revisionManager?.getAllRevisions() ?? [];\n const inMemoryCount = allRevisions.length;\n const rawXmlNote = hasRawXmlRevisions ? ' (raw XML contains revision markup)' : '';\n addLog('info', `Found ${inMemoryCount} parsed revisions in document${rawXmlNote}`);\n\n switch (options.mode) {\n case 'accept_all':\n // Accept all revisions\n await this.acceptAllRevisions(doc, allRevisions, acceptedRevisions, addLog);\n break;\n\n case 'preserve':\n // Preserve all revisions by preventing document.xml regeneration\n // This keeps the original XML with w:ins/w:del elements intact\n for (const rev of allRevisions) {\n preservedRevisions.push(rev.getId().toString());\n }\n doc.preserveRawXml();\n addLog(\n 'complete',\n `Preserved ${preservedRevisions.length} revisions (raw XML preservation enabled)`\n );\n break;\n\n case 'preserve_and_wrap':\n // Preserve all revisions, track for later wrapping\n // Also enable raw XML preservation to keep existing revisions\n for (const rev of allRevisions) {\n preservedRevisions.push(rev.getId().toString());\n }\n doc.preserveRawXml();\n addLog(\n 'info',\n `Will preserve and wrap conflicts for ${preservedRevisions.length} revisions`\n );\n addLog('info', `New revisions will be authored by: ${options.author || 'Unknown'}`);\n break;\n\n default:\n addLog('error', `Unknown processing mode: ${options.mode}`);\n return {\n success: false,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n\n addLog('complete', 'Revision processing completed successfully');\n\n return {\n success: true,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n addLog('error', `Processing failed: ${errorMessage}`);\n\n return {\n success: false,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n }\n\n /**\n * Accept all revisions in the document using Document.acceptAllRevisions().\n *\n * This delegates to Document.acceptAllRevisions() which uses in-memory DOM transformation\n * (the industry-standard approach used by OpenXML PowerTools, Aspose.Words, etc.):\n *\n * 1. Transforms Revision objects in paragraph.content arrays\n * 2. Insertions (w:ins): Unwraps content - keeps Runs/Hyperlinks, removes Revision wrapper\n * 3. Deletions (w:del): Removes content entirely from the model\n * 4. Move operations: moveFrom removed, moveTo unwrapped\n * 5. Property changes: Removes change metadata, keeps current formatting\n *\n * This approach allows subsequent modifications to be saved correctly because the\n * in-memory model is transformed (not raw XML), so save() regenerates document.xml\n * with both the accepted changes AND any subsequent modifications.\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138\n */\n private static async acceptAllRevisions(\n doc: Document,\n revisions: Revision[],\n acceptedIds: string[],\n addLog: (action: string, details: string, revisionId?: string) => void\n ): Promise<void> {\n addLog('info', 'Accepting all revisions using in-memory DOM transformation');\n\n // Track accepted revision IDs before acceptance (for logging)\n for (const rev of revisions) {\n acceptedIds.push(rev.getId().toString());\n }\n\n // Use Document.acceptAllRevisions() which uses in-memory transformation\n // This allows subsequent modifications to be saved correctly\n await doc.acceptAllRevisions();\n\n // Log each accepted revision\n for (const id of acceptedIds) {\n addLog('accept', `Accepted revision ${id}`, id);\n }\n\n addLog('complete', `Accepted ${acceptedIds.length} revisions (in-memory transformation)`);\n }\n\n /**\n * Accept revisions matching the given criteria.\n * Uses existing RevisionAcceptor under the hood.\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Array of accepted revision IDs\n */\n static acceptSelective(doc: Document, criteria: SelectionCriteria): string[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n const allRevisions = revisionManager.getAllRevisions();\n const matchingRevisions = this.filterRevisions(allRevisions, criteria);\n\n const acceptedIds: string[] = [];\n for (const rev of matchingRevisions) {\n acceptedIds.push(rev.getId().toString());\n // Note: Actual acceptance would require XML manipulation\n // For now, this returns which revisions WOULD be accepted\n }\n\n return acceptedIds;\n }\n\n /**\n * Filter revisions based on criteria.\n */\n private static filterRevisions(revisions: Revision[], criteria: SelectionCriteria): Revision[] {\n return revisions.filter((rev) => {\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(rev.getId())) {\n return false;\n }\n\n // Filter by types\n if (criteria.types && !criteria.types.includes(rev.getType())) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n const date = rev.getDate();\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // Filter by categories\n if (criteria.categories) {\n const category = this.getRevisionCategory(rev);\n if (!criteria.categories.includes(category)) {\n return false;\n }\n }\n\n // Custom filter\n if (criteria.custom && !criteria.custom(rev)) {\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Get the semantic category of a revision.\n */\n private static getRevisionCategory(revision: Revision): ChangeCategory {\n const type = revision.getType();\n\n if (type === 'insert' || type === 'delete') {\n return 'content';\n }\n if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n return 'formatting';\n }\n if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n return 'structural';\n }\n if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n return 'table';\n }\n\n return 'content';\n }\n\n /**\n * Check if an operation at the given location would conflict with any revision.\n *\n * @param doc - Document to check\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Optional run index\n * @returns Conflicting revision or null\n */\n static checkConflict(doc: Document, paragraphIndex: number, runIndex?: number): Revision | null {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return null;\n }\n\n // Get revisions that might affect this paragraph\n const revisions = revisionManager.getRevisionsForParagraph(paragraphIndex);\n\n // For now, return the first revision at this location\n // In a more complete implementation, we would check run-level conflicts\n return revisions.length > 0 ? revisions[0]! : null;\n }\n\n /**\n * Get all revisions that would be affected by an operation.\n *\n * @param doc - Document to check\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Optional run index\n * @returns Array of affected revisions\n */\n static getAffectedRevisions(\n doc: Document,\n paragraphIndex: number,\n runIndex?: number\n ): Revision[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n return revisionManager.getRevisionsForParagraph(paragraphIndex);\n }\n\n /**\n * Wrap content in a new revision (for preserve_and_wrap mode).\n * Creates a new revision tracking the change.\n *\n * @param doc - Document to modify\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Run index\n * @param author - Author for the new revision\n * @param type - Type of revision to create\n * @returns ID of the new revision\n */\n static wrapInRevision(\n doc: Document,\n paragraphIndex: number,\n runIndex: number,\n author: string,\n type: 'insert' | 'delete'\n ): string {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n throw new Error('Document does not have a revision manager');\n }\n\n // Get the paragraphs from the document\n const paragraphs = doc.getParagraphs();\n if (paragraphIndex < 0 || paragraphIndex >= paragraphs.length) {\n throw new Error(`Invalid paragraph index: ${paragraphIndex}`);\n }\n\n const paragraph = paragraphs[paragraphIndex];\n if (!paragraph) {\n throw new Error(`Paragraph at index ${paragraphIndex} not found`);\n }\n\n const runs = paragraph.getRuns();\n if (runIndex < 0 || runIndex >= runs.length) {\n throw new Error(`Invalid run index: ${runIndex}`);\n }\n\n const run = runs[runIndex];\n if (!run) {\n throw new Error(`Run at index ${runIndex} not found`);\n }\n\n // Create new revision\n const revision = new Revision({\n author,\n type,\n content: run,\n date: new Date(),\n });\n\n // Register with manager\n revisionManager.register(revision);\n\n return revision.getId().toString();\n }\n\n /**\n * Check if document has any tracked changes.\n *\n * @param doc - Document to check\n * @returns True if document has tracked changes\n */\n static hasTrackedChanges(doc: Document): boolean {\n const revisionManager = doc.getRevisionManager();\n return revisionManager ? revisionManager.hasRevisions() : false;\n }\n\n /**\n * Get summary of tracked changes in document.\n *\n * @param doc - Document to summarize\n * @returns Summary object or null if no revision manager\n */\n static getTrackedChangesSummary(doc: Document): {\n total: number;\n insertions: number;\n deletions: number;\n formatting: number;\n moves: number;\n authors: string[];\n } | null {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return null;\n }\n\n const summary = revisionManager.getSummary();\n return {\n total: summary.total,\n insertions: summary.byType.insertions,\n deletions: summary.byType.deletions,\n formatting: summary.byType.propertyChanges,\n moves: summary.byType.moves,\n authors: summary.authors,\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevisionWalker.d.ts","sourceRoot":"","sources":["../../src/utils/RevisionWalker.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,qBAAqB;IAEpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAaD,QAAA,MAAM,iBAAiB;;;;;CAmCtB,CAAC;AAcF,qBAAa,cAAc;IAczB,MAAM,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"RevisionWalker.d.ts","sourceRoot":"","sources":["../../src/utils/RevisionWalker.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,qBAAqB;IAEpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAaD,QAAA,MAAM,iBAAiB;;;;;CAmCtB,CAAC;AAcF,qBAAa,cAAc;IAczB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,eAAe;IAoB1F,OAAO,CAAC,MAAM,CAAC,SAAS;IAoBxB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IA8B/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsB/B,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B,OAAO,CAAC,MAAM,CAAC,YAAY;IA4B3B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA+HhC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmBhC,OAAO,CAAC,MAAM,CAAC,eAAe;IAoB9B,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAarC,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAY9C,MAAM,CAAC,4BAA4B,IAAI,OAAO,iBAAiB;CAGhE"}
|
|
@@ -136,9 +136,7 @@ class RevisionWalker {
|
|
|
136
136
|
childCounters.set(childType, childIdx + 1);
|
|
137
137
|
const childElements = revElement[childType];
|
|
138
138
|
if (childElements) {
|
|
139
|
-
const childArray = Array.isArray(childElements)
|
|
140
|
-
? childElements
|
|
141
|
-
: [childElements];
|
|
139
|
+
const childArray = Array.isArray(childElements) ? childElements : [childElements];
|
|
142
140
|
if (childIdx < childArray.length) {
|
|
143
141
|
orderedElements.push({
|
|
144
142
|
type: childType,
|
|
@@ -149,14 +147,10 @@ class RevisionWalker {
|
|
|
149
147
|
}
|
|
150
148
|
}
|
|
151
149
|
else {
|
|
152
|
-
const childKeys = Object.keys(revElement).filter((k) => !k.startsWith('@_') &&
|
|
153
|
-
k !== '#text' &&
|
|
154
|
-
k !== '_orderedChildren');
|
|
150
|
+
const childKeys = Object.keys(revElement).filter((k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren');
|
|
155
151
|
for (const childKey of childKeys) {
|
|
156
152
|
const childValue = revElement[childKey];
|
|
157
|
-
const childArray = Array.isArray(childValue)
|
|
158
|
-
? childValue
|
|
159
|
-
: [childValue];
|
|
153
|
+
const childArray = Array.isArray(childValue) ? childValue : [childValue];
|
|
160
154
|
for (const child of childArray) {
|
|
161
155
|
orderedElements.push({ type: childKey, element: child });
|
|
162
156
|
}
|
|
@@ -169,9 +163,7 @@ class RevisionWalker {
|
|
|
169
163
|
typeCounters.set(type, idx + 1);
|
|
170
164
|
const parentElements = parent[type];
|
|
171
165
|
if (parentElements) {
|
|
172
|
-
const parentArray = Array.isArray(parentElements)
|
|
173
|
-
? parentElements
|
|
174
|
-
: [parentElements];
|
|
166
|
+
const parentArray = Array.isArray(parentElements) ? parentElements : [parentElements];
|
|
175
167
|
if (idx < parentArray.length) {
|
|
176
168
|
orderedElements.push({ type, element: parentArray[idx] });
|
|
177
169
|
}
|