docxmlater 10.4.0 → 11.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/constants/legacyCompatFlags.d.ts +1 -1
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/core/Document.d.ts +75 -67
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +618 -414
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +11 -10
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +19 -19
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentEvents.d.ts +39 -0
- package/dist/core/DocumentEvents.d.ts.map +1 -0
- package/dist/core/DocumentEvents.js +51 -0
- package/dist/core/DocumentEvents.js.map +1 -0
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +72 -52
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +15 -15
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +2100 -1076
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts +3 -3
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +31 -31
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/ElementRegistry.d.ts +22 -0
- package/dist/core/ElementRegistry.d.ts.map +1 -0
- package/dist/core/ElementRegistry.js +27 -0
- package/dist/core/ElementRegistry.js.map +1 -0
- package/dist/core/Relationship.js +4 -4
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +32 -32
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.d.ts +1 -1
- package/dist/elements/AlternateContent.d.ts.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts +6 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +19 -3
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js +7 -7
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.d.ts +2 -2
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +4 -4
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts +2 -2
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +9 -9
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +9 -4
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -0
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.d.ts +1 -1
- package/dist/elements/CustomXml.d.ts.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts +2 -2
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js +9 -9
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +11 -11
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts +9 -5
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +21 -9
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +10 -10
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/Footer.d.ts +3 -3
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +5 -5
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts +2 -2
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +9 -9
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +11 -11
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.d.ts +3 -3
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +5 -5
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.d.ts +2 -2
- package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -5
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +29 -29
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +67 -67
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +4 -4
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.d.ts +3 -3
- package/dist/elements/ImageRun.d.ts.map +1 -1
- package/dist/elements/ImageRun.js +2 -2
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.d.ts +1 -1
- package/dist/elements/MathElement.d.ts.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +34 -19
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +286 -231
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.d.ts +1 -1
- package/dist/elements/PreservedElement.d.ts.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts +2 -2
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts +14 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js +46 -8
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/RegisteredBodyElement.d.ts +15 -0
- package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
- package/dist/elements/RegisteredBodyElement.js +44 -0
- package/dist/elements/RegisteredBodyElement.js.map +1 -0
- package/dist/elements/Revision.d.ts +8 -8
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +12 -12
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.d.ts +3 -3
- package/dist/elements/RevisionContent.d.ts.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts +2 -2
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +2 -2
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -10
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +199 -173
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts +4 -2
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +152 -145
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts +3 -3
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +12 -12
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +3 -3
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +39 -39
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +16 -10
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +118 -89
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +11 -11
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +108 -78
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js +3 -3
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +2 -2
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.d.ts +2 -2
- package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
- package/dist/elements/TableOfContentsElement.js +5 -5
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts +18 -7
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +127 -74
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts +4 -4
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +6 -6
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/esm/constants/legacyCompatFlags.js +97 -0
- package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
- package/dist/esm/constants/limits.js +36 -0
- package/dist/esm/constants/limits.js.map +1 -0
- package/dist/esm/core/Document.js +8498 -0
- package/dist/esm/core/Document.js.map +1 -0
- package/dist/esm/core/DocumentContent.js +190 -0
- package/dist/esm/core/DocumentContent.js.map +1 -0
- package/dist/esm/core/DocumentEvents.js +47 -0
- package/dist/esm/core/DocumentEvents.js.map +1 -0
- package/dist/esm/core/DocumentGenerator.js +764 -0
- package/dist/esm/core/DocumentGenerator.js.map +1 -0
- package/dist/esm/core/DocumentIdManager.js +67 -0
- package/dist/esm/core/DocumentIdManager.js.map +1 -0
- package/dist/esm/core/DocumentParser.js +8760 -0
- package/dist/esm/core/DocumentParser.js.map +1 -0
- package/dist/esm/core/DocumentValidator.js +222 -0
- package/dist/esm/core/DocumentValidator.js.map +1 -0
- package/dist/esm/core/ElementRegistry.js +24 -0
- package/dist/esm/core/ElementRegistry.js.map +1 -0
- package/dist/esm/core/Relationship.js +177 -0
- package/dist/esm/core/Relationship.js.map +1 -0
- package/dist/esm/core/RelationshipManager.js +202 -0
- package/dist/esm/core/RelationshipManager.js.map +1 -0
- package/dist/esm/elements/AlternateContent.js +19 -0
- package/dist/esm/elements/AlternateContent.js.map +1 -0
- package/dist/esm/elements/Bookmark.js +115 -0
- package/dist/esm/elements/Bookmark.js.map +1 -0
- package/dist/esm/elements/BookmarkManager.js +99 -0
- package/dist/esm/elements/BookmarkManager.js.map +1 -0
- package/dist/esm/elements/Comment.js +181 -0
- package/dist/esm/elements/Comment.js.map +1 -0
- package/dist/esm/elements/CommentManager.js +233 -0
- package/dist/esm/elements/CommentManager.js.map +1 -0
- package/dist/esm/elements/CommonTypes.js +106 -0
- package/dist/esm/elements/CommonTypes.js.map +1 -0
- package/dist/esm/elements/CustomXml.js +19 -0
- package/dist/esm/elements/CustomXml.js.map +1 -0
- package/dist/esm/elements/Endnote.js +107 -0
- package/dist/esm/elements/Endnote.js.map +1 -0
- package/dist/esm/elements/EndnoteManager.js +119 -0
- package/dist/esm/elements/EndnoteManager.js.map +1 -0
- package/dist/esm/elements/Field.js +856 -0
- package/dist/esm/elements/Field.js.map +1 -0
- package/dist/esm/elements/FieldHelpers.js +134 -0
- package/dist/esm/elements/FieldHelpers.js.map +1 -0
- package/dist/esm/elements/FontManager.js +158 -0
- package/dist/esm/elements/FontManager.js.map +1 -0
- package/dist/esm/elements/Footer.js +141 -0
- package/dist/esm/elements/Footer.js.map +1 -0
- package/dist/esm/elements/Footnote.js +107 -0
- package/dist/esm/elements/Footnote.js.map +1 -0
- package/dist/esm/elements/FootnoteManager.js +119 -0
- package/dist/esm/elements/FootnoteManager.js.map +1 -0
- package/dist/esm/elements/Header.js +141 -0
- package/dist/esm/elements/Header.js.map +1 -0
- package/dist/esm/elements/HeaderFooterManager.js +87 -0
- package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
- package/dist/esm/elements/Hyperlink.js +586 -0
- package/dist/esm/elements/Hyperlink.js.map +1 -0
- package/dist/esm/elements/Image.js +1288 -0
- package/dist/esm/elements/Image.js.map +1 -0
- package/dist/esm/elements/ImageManager.js +223 -0
- package/dist/esm/elements/ImageManager.js.map +1 -0
- package/dist/esm/elements/ImageRun.js +29 -0
- package/dist/esm/elements/ImageRun.js.map +1 -0
- package/dist/esm/elements/MathElement.js +37 -0
- package/dist/esm/elements/MathElement.js.map +1 -0
- package/dist/esm/elements/Paragraph.js +2308 -0
- package/dist/esm/elements/Paragraph.js.map +1 -0
- package/dist/esm/elements/PreservedElement.js +29 -0
- package/dist/esm/elements/PreservedElement.js.map +1 -0
- package/dist/esm/elements/PropertyChangeTypes.js +53 -0
- package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
- package/dist/esm/elements/RangeMarker.js +219 -0
- package/dist/esm/elements/RangeMarker.js.map +1 -0
- package/dist/esm/elements/RegisteredBodyElement.js +40 -0
- package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
- package/dist/esm/elements/Revision.js +498 -0
- package/dist/esm/elements/Revision.js.map +1 -0
- package/dist/esm/elements/RevisionContent.js +18 -0
- package/dist/esm/elements/RevisionContent.js.map +1 -0
- package/dist/esm/elements/RevisionManager.js +486 -0
- package/dist/esm/elements/RevisionManager.js.map +1 -0
- package/dist/esm/elements/Run.js +1465 -0
- package/dist/esm/elements/Run.js.map +1 -0
- package/dist/esm/elements/Section.js +978 -0
- package/dist/esm/elements/Section.js.map +1 -0
- package/dist/esm/elements/Shape.js +493 -0
- package/dist/esm/elements/Shape.js.map +1 -0
- package/dist/esm/elements/StructuredDocumentTag.js +471 -0
- package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
- package/dist/esm/elements/Table.js +1456 -0
- package/dist/esm/elements/Table.js.map +1 -0
- package/dist/esm/elements/TableCell.js +835 -0
- package/dist/esm/elements/TableCell.js.map +1 -0
- package/dist/esm/elements/TableGridChange.js +52 -0
- package/dist/esm/elements/TableGridChange.js.map +1 -0
- package/dist/esm/elements/TableOfContents.js +389 -0
- package/dist/esm/elements/TableOfContents.js.map +1 -0
- package/dist/esm/elements/TableOfContentsElement.js +29 -0
- package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
- package/dist/esm/elements/TableRow.js +555 -0
- package/dist/esm/elements/TableRow.js.map +1 -0
- package/dist/esm/elements/TextBox.js +459 -0
- package/dist/esm/elements/TextBox.js.map +1 -0
- package/dist/esm/formatting/AbstractNumbering.js +325 -0
- package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
- package/dist/esm/formatting/NumberingInstance.js +150 -0
- package/dist/esm/formatting/NumberingInstance.js.map +1 -0
- package/dist/esm/formatting/NumberingLevel.js +608 -0
- package/dist/esm/formatting/NumberingLevel.js.map +1 -0
- package/dist/esm/formatting/NumberingManager.js +423 -0
- package/dist/esm/formatting/NumberingManager.js.map +1 -0
- package/dist/esm/formatting/Style.js +1151 -0
- package/dist/esm/formatting/Style.js.map +1 -0
- package/dist/esm/formatting/StylesManager.js +557 -0
- package/dist/esm/formatting/StylesManager.js.map +1 -0
- package/dist/esm/helpers/CleanupHelper.js +350 -0
- package/dist/esm/helpers/CleanupHelper.js.map +1 -0
- package/dist/esm/images/ImageOptimizer.js +161 -0
- package/dist/esm/images/ImageOptimizer.js.map +1 -0
- package/dist/esm/index.js +75 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal.js +16 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/managers/DrawingManager.js +163 -0
- package/dist/esm/managers/DrawingManager.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/processors/ChangelogGenerator.js +970 -0
- package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
- package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
- package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
- package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
- package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
- package/dist/esm/processors/MoveOperationHelper.js +57 -0
- package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
- package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
- package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
- package/dist/esm/processors/RevisionWalker.js +278 -0
- package/dist/esm/processors/RevisionWalker.js.map +1 -0
- package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
- package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
- package/dist/esm/processors/ShadingResolver.js +66 -0
- package/dist/esm/processors/ShadingResolver.js.map +1 -0
- package/dist/esm/processors/acceptRevisions.js +416 -0
- package/dist/esm/processors/acceptRevisions.js.map +1 -0
- package/dist/esm/processors/cnfStyleDecoder.js +89 -0
- package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
- package/dist/esm/processors/stripTrackedChanges.js +201 -0
- package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
- package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
- package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
- package/dist/esm/tracking/TrackingContext.js +2 -0
- package/dist/esm/tracking/TrackingContext.js.map +1 -0
- package/dist/esm/types/compatibility-types.js +8 -0
- package/dist/esm/types/compatibility-types.js.map +1 -0
- package/dist/esm/types/document-types.js +2 -0
- package/dist/esm/types/document-types.js.map +1 -0
- package/dist/esm/types/formatting.js +2 -0
- package/dist/esm/types/formatting.js.map +1 -0
- package/dist/esm/types/list-types.js +2 -0
- package/dist/esm/types/list-types.js.map +1 -0
- package/dist/esm/types/settings-types.js +2 -0
- package/dist/esm/types/settings-types.js.map +1 -0
- package/dist/esm/types/styleConfig.js +2 -0
- package/dist/esm/types/styleConfig.js.map +1 -0
- package/dist/esm/utils/KeyedRegistry.js +32 -0
- package/dist/esm/utils/KeyedRegistry.js.map +1 -0
- package/dist/esm/utils/corruptionDetection.js +155 -0
- package/dist/esm/utils/corruptionDetection.js.map +1 -0
- package/dist/esm/utils/dateFormatting.js +4 -0
- package/dist/esm/utils/dateFormatting.js.map +1 -0
- package/dist/esm/utils/deepClone.js +40 -0
- package/dist/esm/utils/deepClone.js.map +1 -0
- package/dist/esm/utils/deepEqual.js +47 -0
- package/dist/esm/utils/deepEqual.js.map +1 -0
- package/dist/esm/utils/diagnostics.js +69 -0
- package/dist/esm/utils/diagnostics.js.map +1 -0
- package/dist/esm/utils/errorHandling.js +36 -0
- package/dist/esm/utils/errorHandling.js.map +1 -0
- package/dist/esm/utils/formatting.js +93 -0
- package/dist/esm/utils/formatting.js.map +1 -0
- package/dist/esm/utils/list-detection.js +148 -0
- package/dist/esm/utils/list-detection.js.map +1 -0
- package/dist/esm/utils/logger.js +205 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/parsingHelpers.js +56 -0
- package/dist/esm/utils/parsingHelpers.js.map +1 -0
- package/dist/esm/utils/textDiff.js +42 -0
- package/dist/esm/utils/textDiff.js.map +1 -0
- package/dist/esm/utils/units.js +152 -0
- package/dist/esm/utils/units.js.map +1 -0
- package/dist/esm/utils/validation.js +285 -0
- package/dist/esm/utils/validation.js.map +1 -0
- package/dist/esm/utils/xmlSanitization.js +54 -0
- package/dist/esm/utils/xmlSanitization.js.map +1 -0
- package/dist/esm/validation/RevisionAutoFixer.js +340 -0
- package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
- package/dist/esm/validation/RevisionValidator.js +240 -0
- package/dist/esm/validation/RevisionValidator.js.map +1 -0
- package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
- package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
- package/dist/esm/validation/ValidationRules.js +92 -0
- package/dist/esm/validation/ValidationRules.js.map +1 -0
- package/dist/esm/validation/index.js +4 -0
- package/dist/esm/validation/index.js.map +1 -0
- package/dist/esm/xml/XMLBuilder.js +434 -0
- package/dist/esm/xml/XMLBuilder.js.map +1 -0
- package/dist/esm/xml/XMLParser.js +486 -0
- package/dist/esm/xml/XMLParser.js.map +1 -0
- package/dist/esm/zip/ZipHandler.js +298 -0
- package/dist/esm/zip/ZipHandler.js.map +1 -0
- package/dist/esm/zip/ZipReader.js +147 -0
- package/dist/esm/zip/ZipReader.js.map +1 -0
- package/dist/esm/zip/ZipWriter.js +199 -0
- package/dist/esm/zip/ZipWriter.js.map +1 -0
- package/dist/esm/zip/errors.js +43 -0
- package/dist/esm/zip/errors.js.map +1 -0
- package/dist/esm/zip/types.js +31 -0
- package/dist/esm/zip/types.js.map +1 -0
- package/dist/formatting/AbstractNumbering.d.ts +2 -2
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +33 -33
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts +2 -2
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +7 -7
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +11 -2
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +111 -25
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +4 -4
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +28 -28
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +14 -7
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +309 -112
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -2
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +52 -52
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +15 -15
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/index.d.ts +81 -90
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +286 -317
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +16 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +42 -0
- package/dist/internal.js.map +1 -0
- package/dist/managers/DrawingManager.d.ts +3 -3
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js +12 -12
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
- package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
- package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
- package/dist/processors/ChangelogGenerator.js.map +1 -0
- package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
- package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
- package/dist/processors/CompatibilityUpgrader.js.map +1 -0
- package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
- package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
- package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
- package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
- package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
- package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
- package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
- package/dist/processors/MoveOperationHelper.js.map +1 -0
- package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
- package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
- package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
- package/dist/processors/RevisionAwareProcessor.js.map +1 -0
- package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
- package/dist/processors/RevisionWalker.d.ts.map +1 -0
- package/dist/{utils → processors}/RevisionWalker.js +28 -0
- package/dist/processors/RevisionWalker.js.map +1 -0
- package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
- package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
- package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
- package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
- package/dist/processors/ShadingResolver.d.ts +6 -0
- package/dist/processors/ShadingResolver.d.ts.map +1 -0
- package/dist/{utils → processors}/ShadingResolver.js +2 -2
- package/dist/processors/ShadingResolver.js.map +1 -0
- package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
- package/dist/processors/acceptRevisions.d.ts.map +1 -0
- package/dist/{utils → processors}/acceptRevisions.js +24 -4
- package/dist/processors/acceptRevisions.js.map +1 -0
- package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
- package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
- package/dist/processors/cnfStyleDecoder.js.map +1 -0
- package/dist/processors/stripTrackedChanges.d.ts +3 -0
- package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
- package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
- package/dist/processors/stripTrackedChanges.js.map +1 -0
- package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +38 -43
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts +8 -8
- package/dist/tracking/TrackingContext.d.ts.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/document-types.d.ts +28 -0
- package/dist/types/document-types.d.ts.map +1 -0
- package/dist/types/document-types.js +3 -0
- package/dist/types/document-types.js.map +1 -0
- package/dist/types/formatting.d.ts +4 -4
- package/dist/types/formatting.d.ts.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/settings-types.d.ts +6 -0
- package/dist/types/settings-types.d.ts.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/utils/KeyedRegistry.d.ts +13 -0
- package/dist/utils/KeyedRegistry.d.ts.map +1 -0
- package/dist/utils/KeyedRegistry.js +36 -0
- package/dist/utils/KeyedRegistry.js.map +1 -0
- package/dist/utils/corruptionDetection.d.ts +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js +4 -4
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/deepEqual.d.ts +2 -0
- package/dist/utils/deepEqual.d.ts.map +1 -0
- package/dist/utils/deepEqual.js +50 -0
- package/dist/utils/deepEqual.js.map +1 -0
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/parsingHelpers.d.ts +1 -1
- package/dist/utils/parsingHelpers.d.ts.map +1 -1
- package/dist/utils/parsingHelpers.js +2 -2
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/validation.js +7 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.js +2 -2
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +4 -4
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +11 -11
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts +5 -4
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +29 -30
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
- package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
- package/dist/validation/ValidationRuleRegistry.js +43 -0
- package/dist/validation/ValidationRuleRegistry.js.map +1 -0
- package/dist/validation/index.d.ts +3 -3
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +10 -10
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +6 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +11 -6
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.js +6 -6
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js +8 -8
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +14 -14
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.d.ts +1 -1
- package/dist/zip/ZipWriter.d.ts.map +1 -1
- package/dist/zip/ZipWriter.js +10 -10
- package/dist/zip/ZipWriter.js.map +1 -1
- package/package.json +20 -4
- package/src/constants/legacyCompatFlags.ts +1 -1
- package/src/core/Document.ts +478 -167
- package/src/core/DocumentContent.ts +14 -11
- package/src/core/DocumentEvents.ts +90 -0
- package/src/core/DocumentGenerator.ts +49 -22
- package/src/core/DocumentParser.ts +2235 -620
- package/src/core/DocumentValidator.ts +7 -7
- package/src/core/ElementRegistry.ts +69 -0
- package/src/core/Relationship.ts +1 -1
- package/src/core/RelationshipManager.ts +4 -4
- package/src/elements/AlternateContent.ts +1 -1
- package/src/elements/Bookmark.ts +52 -4
- package/src/elements/BookmarkManager.ts +2 -2
- package/src/elements/Comment.ts +3 -3
- package/src/elements/CommentManager.ts +4 -4
- package/src/elements/CommonTypes.ts +45 -7
- package/src/elements/CustomXml.ts +1 -1
- package/src/elements/Endnote.ts +2 -2
- package/src/elements/EndnoteManager.ts +3 -3
- package/src/elements/Field.ts +44 -10
- package/src/elements/FieldHelpers.ts +2 -2
- package/src/elements/Footer.ts +4 -4
- package/src/elements/Footnote.ts +2 -2
- package/src/elements/FootnoteManager.ts +3 -3
- package/src/elements/Header.ts +4 -4
- package/src/elements/HeaderFooterManager.ts +2 -2
- package/src/elements/Hyperlink.ts +16 -12
- package/src/elements/Image.ts +3 -3
- package/src/elements/ImageManager.ts +2 -2
- package/src/elements/ImageRun.ts +3 -3
- package/src/elements/MathElement.ts +1 -1
- package/src/elements/Paragraph.ts +221 -88
- package/src/elements/PreservedElement.ts +1 -1
- package/src/elements/PropertyChangeTypes.ts +2 -2
- package/src/elements/RangeMarker.ts +153 -12
- package/src/elements/RegisteredBodyElement.ts +52 -0
- package/src/elements/Revision.ts +14 -14
- package/src/elements/RevisionContent.ts +3 -3
- package/src/elements/RevisionManager.ts +3 -3
- package/src/elements/Run.ts +221 -94
- package/src/elements/Section.ts +136 -69
- package/src/elements/Shape.ts +4 -4
- package/src/elements/StructuredDocumentTag.ts +3 -3
- package/src/elements/Table.ts +91 -27
- package/src/elements/TableCell.ts +62 -34
- package/src/elements/TableGridChange.ts +1 -1
- package/src/elements/TableOfContents.ts +1 -1
- package/src/elements/TableOfContentsElement.ts +2 -2
- package/src/elements/TableRow.ts +192 -48
- package/src/elements/TextBox.ts +5 -5
- package/src/formatting/AbstractNumbering.ts +3 -3
- package/src/formatting/NumberingInstance.ts +2 -2
- package/src/formatting/NumberingLevel.ts +201 -10
- package/src/formatting/NumberingManager.ts +5 -5
- package/src/formatting/Style.ts +382 -86
- package/src/formatting/StylesManager.ts +4 -4
- package/src/helpers/CleanupHelper.ts +6 -6
- package/src/index.ts +118 -127
- package/src/internal.ts +79 -0
- package/src/managers/DrawingManager.ts +3 -3
- package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
- package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
- package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
- package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
- package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
- package/src/{utils → processors}/RevisionWalker.ts +42 -1
- package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
- package/src/{utils → processors}/ShadingResolver.ts +5 -5
- package/src/{utils → processors}/acceptRevisions.ts +77 -9
- package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
- package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
- package/src/tracking/DocumentTrackingContext.ts +12 -14
- package/src/tracking/TrackingContext.ts +8 -8
- package/src/types/document-types.ts +53 -0
- package/src/types/formatting.ts +4 -4
- package/src/types/settings-types.ts +32 -0
- package/src/utils/KeyedRegistry.ts +41 -0
- package/src/utils/corruptionDetection.ts +2 -2
- package/src/utils/deepEqual.ts +58 -0
- package/src/utils/list-detection.ts +2 -2
- package/src/utils/parsingHelpers.ts +11 -3
- package/src/utils/validation.ts +3 -3
- package/src/utils/xmlSanitization.ts +1 -1
- package/src/validation/RevisionAutoFixer.ts +5 -5
- package/src/validation/RevisionValidator.ts +39 -28
- package/src/validation/ValidationRuleRegistry.ts +86 -0
- package/src/validation/index.ts +3 -3
- package/src/xml/XMLBuilder.ts +13 -3
- package/src/xml/XMLParser.ts +2 -2
- package/src/zip/ZipHandler.ts +4 -4
- package/src/zip/ZipReader.ts +3 -3
- package/src/zip/ZipWriter.ts +3 -3
- package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
- package/dist/utils/ChangelogGenerator.js.map +0 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
- package/dist/utils/CompatibilityUpgrader.js.map +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
- package/dist/utils/MoveOperationHelper.js.map +0 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
- package/dist/utils/RevisionAwareProcessor.js.map +0 -1
- package/dist/utils/RevisionWalker.d.ts.map +0 -1
- package/dist/utils/RevisionWalker.js.map +0 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
- package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
- package/dist/utils/ShadingResolver.d.ts +0 -6
- package/dist/utils/ShadingResolver.d.ts.map +0 -1
- package/dist/utils/ShadingResolver.js.map +0 -1
- package/dist/utils/acceptRevisions.d.ts.map +0 -1
- package/dist/utils/acceptRevisions.js.map +0 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
- package/dist/utils/cnfStyleDecoder.js.map +0 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -3
- package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
- package/dist/utils/stripTrackedChanges.js.map +0 -1
- package/src/__tests__/helper-methods.test.ts +0 -512
- package/src/constants/CLAUDE.md +0 -28
- package/src/core/CLAUDE.md +0 -113
- package/src/elements/CLAUDE.md +0 -142
- package/src/formatting/CLAUDE.md +0 -78
- package/src/managers/CLAUDE.md +0 -47
- package/src/tracking/CLAUDE.md +0 -30
- package/src/types/CLAUDE.md +0 -39
- package/src/utils/CLAUDE.md +0 -168
- package/src/validation/CLAUDE.md +0 -40
- package/src/xml/CLAUDE.md +0 -65
- package/src/zip/CLAUDE.md +0 -55
- /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
- /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompatibilityUpgrader.d.ts","sourceRoot":"","sources":["../../src/processors/CompatibilityUpgrader.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE,MAAM,CAAC;IAGhB,YAAY,EAAE,MAAM,EAAE,CAAC;IAGvB,aAAa,EAAE,MAAM,EAAE,CAAC;IAGxB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,qBAAa,qBAAqB;IAchC,MAAM,CAAC,kBAAkB,CACvB,WAAW,EAAE,MAAM,EACnB,YAAY,SAAK,GAChB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE;IA4IzC,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC;KACnB;IAyBD,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAMtC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CompatibilityUpgrader = void 0;
|
|
4
|
-
const
|
|
4
|
+
const legacyCompatFlags_js_1 = require("../constants/legacyCompatFlags.js");
|
|
5
5
|
class CompatibilityUpgrader {
|
|
6
6
|
static upgradeCompatBlock(settingsXml, previousMode = 12) {
|
|
7
7
|
const removedFlags = [];
|
|
@@ -9,9 +9,9 @@ class CompatibilityUpgrader {
|
|
|
9
9
|
const compatBlockMatch = /<w:compat>([\s\S]*?)<\/w:compat>/.exec(settingsXml);
|
|
10
10
|
const selfClosingCompat = /<w:compat\s*\/>/.exec(settingsXml);
|
|
11
11
|
if (!compatBlockMatch && !selfClosingCompat) {
|
|
12
|
-
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(
|
|
12
|
+
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS);
|
|
13
13
|
const xml = settingsXml.replace(/<\/w:settings>/, modernBlock + '\n</w:settings>');
|
|
14
|
-
for (const s of
|
|
14
|
+
for (const s of legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS) {
|
|
15
15
|
addedSettings.push(s.name);
|
|
16
16
|
}
|
|
17
17
|
return {
|
|
@@ -27,9 +27,9 @@ class CompatibilityUpgrader {
|
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
29
|
if (selfClosingCompat) {
|
|
30
|
-
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(
|
|
30
|
+
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS);
|
|
31
31
|
const xml = settingsXml.replace(/<w:compat\s*\/>/, modernBlock);
|
|
32
|
-
for (const s of
|
|
32
|
+
for (const s of legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS) {
|
|
33
33
|
addedSettings.push(s.name);
|
|
34
34
|
}
|
|
35
35
|
return {
|
|
@@ -49,7 +49,7 @@ class CompatibilityUpgrader {
|
|
|
49
49
|
let flagMatch;
|
|
50
50
|
while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {
|
|
51
51
|
const tagName = flagMatch[1];
|
|
52
|
-
if (tagName && tagName !== 'compatSetting' &&
|
|
52
|
+
if (tagName && tagName !== 'compatSetting' && legacyCompatFlags_js_1.LEGACY_COMPAT_ELEMENT_NAMES.has(tagName)) {
|
|
53
53
|
removedFlags.push(tagName);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
@@ -62,7 +62,7 @@ class CompatibilityUpgrader {
|
|
|
62
62
|
const uriMatch = /w:uri\s*=\s*"([^"]*)"/.exec(attrs);
|
|
63
63
|
const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
|
|
64
64
|
if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {
|
|
65
|
-
if (uriMatch[1] !==
|
|
65
|
+
if (uriMatch[1] !== legacyCompatFlags_js_1.MS_WORD_COMPAT_URI) {
|
|
66
66
|
preservedSettings.push({
|
|
67
67
|
name: nameMatch[1],
|
|
68
68
|
uri: uriMatch[1],
|
|
@@ -78,11 +78,11 @@ class CompatibilityUpgrader {
|
|
|
78
78
|
const attrs = existingMatch[1] ?? '';
|
|
79
79
|
const nameMatch = /w:name\s*=\s*"([^"]*)"/.exec(attrs);
|
|
80
80
|
const uriMatch = /w:uri\s*=\s*"([^"]*)"/.exec(attrs);
|
|
81
|
-
if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] ===
|
|
81
|
+
if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] === legacyCompatFlags_js_1.MS_WORD_COMPAT_URI) {
|
|
82
82
|
existingMsSettings.add(nameMatch[1]);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
for (const s of
|
|
85
|
+
for (const s of legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS) {
|
|
86
86
|
if (!existingMsSettings.has(s.name)) {
|
|
87
87
|
addedSettings.push(s.name);
|
|
88
88
|
}
|
|
@@ -92,7 +92,7 @@ class CompatibilityUpgrader {
|
|
|
92
92
|
addedSettings.push('compatibilityMode');
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
const allSettings = [...
|
|
95
|
+
const allSettings = [...legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS, ...preservedSettings];
|
|
96
96
|
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(allSettings);
|
|
97
97
|
const changed = removedFlags.length > 0 || addedSettings.length > 0 || previousMode !== 15;
|
|
98
98
|
const xml = settingsXml.replace(/<w:compat>[\s\S]*?<\/w:compat>/, modernBlock);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompatibilityUpgrader.js","sourceRoot":"","sources":["../../src/processors/CompatibilityUpgrader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompatibilityUpgrader — Upgrades w:compat block in settings.xml to modern format.\n *\n * Equivalent to Word's File > Info > Convert operation for the compatibility\n * settings portion. Removes legacy boolean compat flags, updates compatSetting\n * entries, and manages modern namespaces.\n *\n * @module\n */\n\nimport {\n LEGACY_COMPAT_ELEMENT_NAMES,\n MODERN_COMPAT_SETTINGS,\n MS_WORD_COMPAT_URI,\n} from '../constants/legacyCompatFlags.js';\nimport type { CompatSetting } from '../types/compatibility-types.js';\n\n/**\n * Report of what changed during an upgrade operation.\n */\nexport interface UpgradeReport {\n /** Previous compatibility mode value (11, 12, 14, or 15) */\n previousMode: number;\n\n /** New compatibility mode (always 15 after upgrade) */\n newMode: number;\n\n /** Legacy compat flags that were removed (without w: prefix) */\n removedFlags: string[];\n\n /** Modern settings that were added (setting names) */\n addedSettings: string[];\n\n /** Whether namespaces were expanded */\n namespacesExpanded: boolean;\n\n /** Whether any changes were actually made (false if already mode 15 with no legacy flags) */\n changed: boolean;\n}\n\n/**\n * Upgrades w:compat blocks in settings.xml to modern Word 2013+ format.\n */\nexport class CompatibilityUpgrader {\n /**\n * Upgrades the w:compat block in settings.xml to mode 15.\n *\n * Operations performed:\n * 1. Remove all legacy boolean compat elements\n * 2. Remove existing Microsoft-URI w:compatSetting entries\n * 3. Insert modern w:compatSetting entries\n * 4. Preserve non-Microsoft w:compatSetting entries (custom URIs)\n *\n * @param settingsXml - The raw settings.xml content\n * @param previousMode - The current compatibility mode value (for the report)\n * @returns Object with upgraded XML and an UpgradeReport\n */\n static upgradeCompatBlock(\n settingsXml: string,\n previousMode = 12\n ): { xml: string; report: UpgradeReport } {\n const removedFlags: string[] = [];\n const addedSettings: string[] = [];\n\n // Check if already mode 15 with no legacy flags\n const compatBlockMatch = /<w:compat>([\\s\\S]*?)<\\/w:compat>/.exec(settingsXml);\n const selfClosingCompat = /<w:compat\\s*\\/>/.exec(settingsXml);\n\n if (!compatBlockMatch && !selfClosingCompat) {\n // No w:compat block — insert a full modern block before </w:settings>\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<\\/w:settings>/, modernBlock + '\\n</w:settings>');\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Handle self-closing <w:compat/>\n if (selfClosingCompat) {\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<w:compat\\s*\\/>/, modernBlock);\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Process existing w:compat block\n const compatBlock = compatBlockMatch![1] ?? '';\n\n // 1. Find and record legacy flags that will be removed\n const legacyFlagRegex = /<w:(\\w+)(?:\\s[^>]*)?\\/?>/g;\n let flagMatch;\n while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {\n const tagName = flagMatch[1];\n if (tagName && tagName !== 'compatSetting' && LEGACY_COMPAT_ELEMENT_NAMES.has(tagName)) {\n removedFlags.push(tagName);\n }\n }\n\n // 2. Collect non-Microsoft compatSetting entries to preserve\n const preservedSettings: CompatSetting[] = [];\n const settingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let settingMatch;\n while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {\n const attrs = settingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {\n // Preserve settings with non-Microsoft URIs\n if (uriMatch[1] !== MS_WORD_COMPAT_URI) {\n preservedSettings.push({\n name: nameMatch[1],\n uri: uriMatch[1],\n val: valMatch[1],\n });\n }\n }\n }\n\n // 3. Determine which modern settings are actually new\n const existingMsSettings = new Set<string>();\n const existingSettingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let existingMatch;\n while ((existingMatch = existingSettingRegex.exec(compatBlock)) !== null) {\n const attrs = existingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] === MS_WORD_COMPAT_URI) {\n existingMsSettings.add(nameMatch[1]);\n }\n }\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n if (!existingMsSettings.has(s.name)) {\n addedSettings.push(s.name);\n }\n }\n // compatibilityMode value change counts as \"added\" if it existed but with different val\n if (existingMsSettings.has('compatibilityMode') && previousMode !== 15) {\n if (!addedSettings.includes('compatibilityMode')) {\n addedSettings.push('compatibilityMode');\n }\n }\n\n // 4. Build the new compat block\n const allSettings = [...MODERN_COMPAT_SETTINGS, ...preservedSettings];\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(allSettings);\n\n // 5. Replace the old block\n const changed = removedFlags.length > 0 || addedSettings.length > 0 || previousMode !== 15;\n const xml = settingsXml.replace(/<w:compat>[\\s\\S]*?<\\/w:compat>/, modernBlock);\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed,\n },\n };\n }\n\n /**\n * Ensures namespace declarations include all modern extended namespaces\n * (w14, w15, w16se, w16cid, etc.) and returns the expanded set.\n *\n * @param namespaces - Current namespace record from document\n * @returns Updated namespace record with modern namespaces added\n */\n static ensureModernNamespaces(namespaces: Record<string, string>): {\n namespaces: Record<string, string>;\n expanded: boolean;\n } {\n const result = { ...namespaces };\n let expanded = false;\n\n const modernNamespaces: Record<string, string> = {\n 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',\n 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',\n 'xmlns:w16se': 'http://schemas.microsoft.com/office/word/2015/wordml/symex',\n 'xmlns:w16cid': 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n };\n\n for (const [key, value] of Object.entries(modernNamespaces)) {\n if (!result[key]) {\n result[key] = value;\n expanded = true;\n }\n }\n\n return { namespaces: result, expanded };\n }\n\n /**\n * Builds a <w:compat> block XML string from an array of compat settings.\n * Does not include legacy boolean flags (they are stripped during upgrade).\n */\n private static buildModernCompatBlock(settings: CompatSetting[]): string {\n const entries = settings.map(\n (s) => ` <w:compatSetting w:name=\"${s.name}\" w:uri=\"${s.uri}\" w:val=\"${s.val}\"/>`\n );\n return `<w:compat>\\n${entries.join('\\n')}\\n </w:compat>`;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Document } from '../core/Document';
|
|
2
|
-
import { Paragraph } from '../elements/Paragraph';
|
|
3
|
-
import { Revision, RevisionType } from '../elements/Revision';
|
|
1
|
+
import type { Document } from '../core/Document.js';
|
|
2
|
+
import { Paragraph } from '../elements/Paragraph.js';
|
|
3
|
+
import { Revision, RevisionType } from '../elements/Revision.js';
|
|
4
4
|
export interface AcceptRevisionsOptions {
|
|
5
5
|
acceptInsertions?: boolean;
|
|
6
6
|
acceptDeletions?: boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/processors/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAoBjE,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,qBAAqB;IAEpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AA+BD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkEzD;AAaD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAwUvB;AA8LD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAWnE;AAKD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE,CAG1E;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAa7E"}
|
|
@@ -5,14 +5,14 @@ exports.acceptRevisionsInMemory = acceptRevisionsInMemory;
|
|
|
5
5
|
exports.paragraphHasRevisions = paragraphHasRevisions;
|
|
6
6
|
exports.getRevisionsFromParagraph = getRevisionsFromParagraph;
|
|
7
7
|
exports.countRevisionsByType = countRevisionsByType;
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
8
|
+
const Paragraph_js_1 = require("../elements/Paragraph.js");
|
|
9
|
+
const Revision_js_1 = require("../elements/Revision.js");
|
|
10
|
+
const RevisionContent_js_1 = require("../elements/RevisionContent.js");
|
|
11
|
+
const Field_js_1 = require("../elements/Field.js");
|
|
12
|
+
const Table_js_1 = require("../elements/Table.js");
|
|
13
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
14
14
|
function getLogger() {
|
|
15
|
-
return (0,
|
|
15
|
+
return (0, logger_js_1.createScopedLogger)((0, logger_js_1.getGlobalLogger)(), 'InMemoryRevisionAcceptor');
|
|
16
16
|
}
|
|
17
17
|
const PROPERTY_REVISION_TYPES = [
|
|
18
18
|
'runPropertiesChange',
|
|
@@ -123,6 +123,23 @@ function acceptRevisionsInMemory(doc, options = {}) {
|
|
|
123
123
|
table.clearTblPrChange();
|
|
124
124
|
result.propertyChangesAccepted++;
|
|
125
125
|
}
|
|
126
|
+
const rowsToRemove = [];
|
|
127
|
+
const allRows = table.getRows();
|
|
128
|
+
for (let rowIdx = 0; rowIdx < allRows.length; rowIdx++) {
|
|
129
|
+
const row = allRows[rowIdx];
|
|
130
|
+
const fmt = row.getFormatting();
|
|
131
|
+
if (fmt.rowInsertion && opts.acceptInsertions) {
|
|
132
|
+
row.setRowInsertion(undefined);
|
|
133
|
+
result.insertionsAccepted++;
|
|
134
|
+
}
|
|
135
|
+
if (fmt.rowDeletion && opts.acceptDeletions) {
|
|
136
|
+
rowsToRemove.push(rowIdx);
|
|
137
|
+
result.deletionsAccepted++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (let i = rowsToRemove.length - 1; i >= 0; i--) {
|
|
141
|
+
table._removeRowAtIndex(rowsToRemove[i]);
|
|
142
|
+
}
|
|
126
143
|
for (const row of table.getRows()) {
|
|
127
144
|
if (opts.acceptPropertyChanges && row.getTrPrChange()) {
|
|
128
145
|
row.clearTrPrChange();
|
|
@@ -133,9 +150,21 @@ function acceptRevisionsInMemory(doc, options = {}) {
|
|
|
133
150
|
cell.clearTcPrChange();
|
|
134
151
|
result.propertyChangesAccepted++;
|
|
135
152
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
153
|
+
const cellRev = cell.getCellRevision();
|
|
154
|
+
if (cellRev) {
|
|
155
|
+
const revType = cellRev.getType();
|
|
156
|
+
if (revType === 'tableCellInsert' && opts.acceptInsertions) {
|
|
157
|
+
cell.clearCellRevision();
|
|
158
|
+
result.insertionsAccepted++;
|
|
159
|
+
}
|
|
160
|
+
else if (revType === 'tableCellDelete' && opts.acceptDeletions) {
|
|
161
|
+
cell.clearCellRevision();
|
|
162
|
+
result.deletionsAccepted++;
|
|
163
|
+
}
|
|
164
|
+
else if (revType === 'tableCellMerge' && opts.acceptPropertyChanges) {
|
|
165
|
+
cell.clearCellRevision();
|
|
166
|
+
result.propertyChangesAccepted++;
|
|
167
|
+
}
|
|
139
168
|
}
|
|
140
169
|
for (const paragraph of cell.getParagraphs()) {
|
|
141
170
|
const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
|
|
@@ -172,14 +201,14 @@ function acceptRevisionsInMemory(doc, options = {}) {
|
|
|
172
201
|
for (const headerEntry of headers) {
|
|
173
202
|
const elements = headerEntry.header.getElements();
|
|
174
203
|
for (const element of elements) {
|
|
175
|
-
if (element instanceof
|
|
204
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
176
205
|
const paragraphResult = acceptRevisionsInParagraph(element, opts);
|
|
177
206
|
result.insertionsAccepted += paragraphResult.insertionsAccepted;
|
|
178
207
|
result.deletionsAccepted += paragraphResult.deletionsAccepted;
|
|
179
208
|
result.movesAccepted += paragraphResult.movesAccepted;
|
|
180
209
|
result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
|
|
181
210
|
}
|
|
182
|
-
else if (element instanceof
|
|
211
|
+
else if (element instanceof Table_js_1.Table) {
|
|
183
212
|
for (const row of element.getRows()) {
|
|
184
213
|
for (const cell of row.getCells()) {
|
|
185
214
|
for (const paragraph of cell.getParagraphs()) {
|
|
@@ -211,14 +240,14 @@ function acceptRevisionsInMemory(doc, options = {}) {
|
|
|
211
240
|
for (const footerEntry of footers) {
|
|
212
241
|
const elements = footerEntry.footer.getElements();
|
|
213
242
|
for (const element of elements) {
|
|
214
|
-
if (element instanceof
|
|
243
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
215
244
|
const paragraphResult = acceptRevisionsInParagraph(element, opts);
|
|
216
245
|
result.insertionsAccepted += paragraphResult.insertionsAccepted;
|
|
217
246
|
result.deletionsAccepted += paragraphResult.deletionsAccepted;
|
|
218
247
|
result.movesAccepted += paragraphResult.movesAccepted;
|
|
219
248
|
result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
|
|
220
249
|
}
|
|
221
|
-
else if (element instanceof
|
|
250
|
+
else if (element instanceof Table_js_1.Table) {
|
|
222
251
|
for (const row of element.getRows()) {
|
|
223
252
|
for (const cell of row.getCells()) {
|
|
224
253
|
for (const paragraph of cell.getParagraphs()) {
|
|
@@ -247,6 +276,30 @@ function acceptRevisionsInMemory(doc, options = {}) {
|
|
|
247
276
|
}
|
|
248
277
|
}
|
|
249
278
|
}
|
|
279
|
+
const footnoteManager = doc.getFootnoteManager?.();
|
|
280
|
+
if (footnoteManager) {
|
|
281
|
+
for (const fn of footnoteManager.getAllFootnotes()) {
|
|
282
|
+
for (const paragraph of fn.getParagraphs()) {
|
|
283
|
+
const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
|
|
284
|
+
result.insertionsAccepted += paragraphResult.insertionsAccepted;
|
|
285
|
+
result.deletionsAccepted += paragraphResult.deletionsAccepted;
|
|
286
|
+
result.movesAccepted += paragraphResult.movesAccepted;
|
|
287
|
+
result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const endnoteManager = doc.getEndnoteManager?.();
|
|
292
|
+
if (endnoteManager) {
|
|
293
|
+
for (const en of endnoteManager.getAllEndnotes()) {
|
|
294
|
+
for (const paragraph of en.getParagraphs()) {
|
|
295
|
+
const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
|
|
296
|
+
result.insertionsAccepted += paragraphResult.insertionsAccepted;
|
|
297
|
+
result.deletionsAccepted += paragraphResult.deletionsAccepted;
|
|
298
|
+
result.movesAccepted += paragraphResult.movesAccepted;
|
|
299
|
+
result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
250
303
|
if (opts.acceptPropertyChanges) {
|
|
251
304
|
const section = doc.getSection();
|
|
252
305
|
if (section?.getSectPrChange()) {
|
|
@@ -289,18 +342,18 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
289
342
|
const content = paragraph.getContent();
|
|
290
343
|
const newContent = [];
|
|
291
344
|
for (const item of content) {
|
|
292
|
-
if (item instanceof
|
|
345
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
293
346
|
const revisionType = item.getType();
|
|
294
347
|
if (revisionType === 'insert' && options.acceptInsertions) {
|
|
295
348
|
const childContent = item.getContent();
|
|
296
349
|
for (const child of childContent) {
|
|
297
|
-
if ((0,
|
|
350
|
+
if ((0, RevisionContent_js_1.isImageRunContent)(child)) {
|
|
298
351
|
newContent.push(child);
|
|
299
352
|
}
|
|
300
|
-
else if ((0,
|
|
353
|
+
else if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
301
354
|
newContent.push(child);
|
|
302
355
|
}
|
|
303
|
-
else if ((0,
|
|
356
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
304
357
|
newContent.push(child);
|
|
305
358
|
}
|
|
306
359
|
}
|
|
@@ -318,13 +371,13 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
318
371
|
if (revisionType === 'moveTo' && options.acceptMoves) {
|
|
319
372
|
const childContent = item.getContent();
|
|
320
373
|
for (const child of childContent) {
|
|
321
|
-
if ((0,
|
|
374
|
+
if ((0, RevisionContent_js_1.isImageRunContent)(child)) {
|
|
322
375
|
newContent.push(child);
|
|
323
376
|
}
|
|
324
|
-
else if ((0,
|
|
377
|
+
else if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
325
378
|
newContent.push(child);
|
|
326
379
|
}
|
|
327
|
-
else if ((0,
|
|
380
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
328
381
|
newContent.push(child);
|
|
329
382
|
}
|
|
330
383
|
}
|
|
@@ -334,13 +387,13 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
334
387
|
if (PROPERTY_REVISION_TYPES.includes(revisionType) && options.acceptPropertyChanges) {
|
|
335
388
|
const childContent = item.getContent();
|
|
336
389
|
for (const child of childContent) {
|
|
337
|
-
if ((0,
|
|
390
|
+
if ((0, RevisionContent_js_1.isImageRunContent)(child)) {
|
|
338
391
|
newContent.push(child);
|
|
339
392
|
}
|
|
340
|
-
else if ((0,
|
|
393
|
+
else if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
341
394
|
newContent.push(child);
|
|
342
395
|
}
|
|
343
|
-
else if ((0,
|
|
396
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
344
397
|
newContent.push(child);
|
|
345
398
|
}
|
|
346
399
|
}
|
|
@@ -349,7 +402,7 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
349
402
|
}
|
|
350
403
|
newContent.push(item);
|
|
351
404
|
}
|
|
352
|
-
else if (item instanceof
|
|
405
|
+
else if (item instanceof Field_js_1.ComplexField && item.hasResultRevisions()) {
|
|
353
406
|
const fieldRevisions = item.getResultRevisions();
|
|
354
407
|
const revisionsToKeep = [];
|
|
355
408
|
for (const rev of fieldRevisions) {
|
|
@@ -389,6 +442,10 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
389
442
|
paragraph.clearParagraphPropertiesChange();
|
|
390
443
|
result.propertyChangesAccepted++;
|
|
391
444
|
}
|
|
445
|
+
if (formatting.paragraphMarkRunPropertiesChange) {
|
|
446
|
+
paragraph.formatting.paragraphMarkRunPropertiesChange = undefined;
|
|
447
|
+
result.propertyChangesAccepted++;
|
|
448
|
+
}
|
|
392
449
|
}
|
|
393
450
|
if (options.acceptDeletions) {
|
|
394
451
|
const formatting = paragraph.getFormatting();
|
|
@@ -408,7 +465,7 @@ function acceptRevisionsInParagraph(paragraph, options) {
|
|
|
408
465
|
}
|
|
409
466
|
function paragraphHasRevisions(paragraph) {
|
|
410
467
|
const content = paragraph.getContent();
|
|
411
|
-
if (content.some((item) => item instanceof
|
|
468
|
+
if (content.some((item) => item instanceof Revision_js_1.Revision)) {
|
|
412
469
|
return true;
|
|
413
470
|
}
|
|
414
471
|
const formatting = paragraph.getFormatting();
|
|
@@ -419,7 +476,7 @@ function paragraphHasRevisions(paragraph) {
|
|
|
419
476
|
}
|
|
420
477
|
function getRevisionsFromParagraph(paragraph) {
|
|
421
478
|
const content = paragraph.getContent();
|
|
422
|
-
return content.filter((item) => item instanceof
|
|
479
|
+
return content.filter((item) => item instanceof Revision_js_1.Revision);
|
|
423
480
|
}
|
|
424
481
|
function countRevisionsByType(doc) {
|
|
425
482
|
const counts = new Map();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryRevisionAcceptor.js","sourceRoot":"","sources":["../../src/processors/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.js';\nimport { Paragraph } from '../elements/Paragraph.js';\nimport type { ParagraphContent } from '../elements/Paragraph.js';\nimport { Revision, RevisionType } from '../elements/Revision.js';\nimport {\n isRunContent,\n isHyperlinkContent,\n isImageRunContent,\n} from '../elements/RevisionContent.js';\nimport { ComplexField } from '../elements/Field.js';\nimport { Table } from '../elements/Table.js';\nimport { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger.js';\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 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 // Row-level tracked ins / del (CT_TrPr: w:ins / w:del per ECMA-376\n // §17.13.5.19 / §17.13.5.14) — these mark the ENTIRE row as a tracked\n // insertion or deletion. Previously the acceptor only cleared the\n // tcPrChange / trPrChange / cellRevision metadata and silently ignored\n // row-level markers, so deleted rows persisted and inserted rows kept\n // their pending state. Collect deletion indices up front so we can\n // splice them out after iteration (reverse order to keep indices stable).\n const rowsToRemove: number[] = [];\n const allRows = table.getRows();\n for (let rowIdx = 0; rowIdx < allRows.length; rowIdx++) {\n const row = allRows[rowIdx]!;\n const fmt = row.getFormatting();\n if (fmt.rowInsertion && opts.acceptInsertions) {\n row.setRowInsertion(undefined);\n result.insertionsAccepted++;\n }\n if (fmt.rowDeletion && opts.acceptDeletions) {\n rowsToRemove.push(rowIdx);\n result.deletionsAccepted++;\n }\n }\n for (let i = rowsToRemove.length - 1; i >= 0; i--) {\n table._removeRowAtIndex(rowsToRemove[i]!);\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 // Route cellIns / cellDel / cellMerge by their semantic revision type\n // (per ECMA-376 §17.13.5.4-6). Previously all three were lumped under\n // `acceptPropertyChanges`, which meant `{ acceptInsertions: true }`\n // alone never cleared a cellIns marker, and `{ acceptPropertyChanges:\n // true }` alone cleared everything including insertions. Correct\n // mapping:\n // - tableCellInsert (w:cellIns) → acceptInsertions\n // - tableCellDelete (w:cellDel) → acceptDeletions\n // - tableCellMerge (w:cellMerge) → acceptPropertyChanges\n const cellRev = cell.getCellRevision();\n if (cellRev) {\n const revType = cellRev.getType();\n if (revType === 'tableCellInsert' && opts.acceptInsertions) {\n cell.clearCellRevision();\n result.insertionsAccepted++;\n } else if (revType === 'tableCellDelete' && opts.acceptDeletions) {\n cell.clearCellRevision();\n result.deletionsAccepted++;\n } else if (revType === 'tableCellMerge' && opts.acceptPropertyChanges) {\n cell.clearCellRevision();\n result.propertyChangesAccepted++;\n }\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 // Walk footnote and endnote paragraphs. Per ECMA-376 §17.11.4 /\n // §17.11.15, notes can hold any block-level content including\n // tracked changes; programmatically-added Revision objects on note\n // paragraphs (e.g.\n // `footnote.getParagraphs()[0].addContent(new Revision(...))`)\n // were never visited by the in-memory acceptor and stayed in the\n // model after `acceptAllRevisions()`. The raw-XML acceptor\n // (iter 135) already handles existing-document note revisions on\n // load, so this loop's job is the programmatic-API path.\n const footnoteManager = doc.getFootnoteManager?.();\n if (footnoteManager) {\n for (const fn of footnoteManager.getAllFootnotes()) {\n for (const paragraph of fn.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 }\n const endnoteManager = doc.getEndnoteManager?.();\n if (endnoteManager) {\n for (const en of endnoteManager.getAllEndnotes()) {\n for (const paragraph of en.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 }\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 if (item instanceof ComplexField && item.hasResultRevisions()) {\n // Accept revisions nested inside ComplexField result sections\n const fieldRevisions = item.getResultRevisions();\n const revisionsToKeep: Revision[] = [];\n\n for (const rev of fieldRevisions) {\n const revType = rev.getType();\n if (revType === 'insert' && options.acceptInsertions) {\n result.insertionsAccepted++;\n } else if (revType === 'delete' && options.acceptDeletions) {\n result.deletionsAccepted++;\n } else if (revType === 'moveTo' && options.acceptMoves) {\n result.movesAccepted++;\n } else if (revType === 'moveFrom' && options.acceptMoves) {\n result.movesAccepted++;\n } else {\n revisionsToKeep.push(rev);\n }\n }\n\n if (revisionsToKeep.length < fieldRevisions.length) {\n // Some revisions were accepted — use getAcceptedResultText() for correct interleaved ordering\n item.setResult(item.getAcceptedResultText());\n if (revisionsToKeep.length > 0) {\n item.setResultRevisions(revisionsToKeep);\n }\n }\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 // Paragraph-mark rPrChange (CT_ParaRPrChange, §17.3.1.30) — same\n // rationale as pPrChange: acceptance clears the \"previous\" snapshot,\n // current formatting (paragraphMarkRunProperties) stays intact.\n if (formatting.paragraphMarkRunPropertiesChange) {\n paragraph.formatting.paragraphMarkRunPropertiesChange = undefined;\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,6 +1,6 @@
|
|
|
1
|
-
import { Revision } from '../elements/Revision';
|
|
2
|
-
import { RangeMarker } from '../elements/RangeMarker';
|
|
3
|
-
import { Run } from '../elements/Run';
|
|
1
|
+
import { Revision } from '../elements/Revision.js';
|
|
2
|
+
import { RangeMarker } from '../elements/RangeMarker.js';
|
|
3
|
+
import { Run } from '../elements/Run.js';
|
|
4
4
|
export interface MoveOperationOptions {
|
|
5
5
|
author: string;
|
|
6
6
|
content: Run | Run[];
|
|
@@ -23,7 +23,7 @@ export interface MoveOperationResult {
|
|
|
23
23
|
}
|
|
24
24
|
export declare class MoveOperationHelper {
|
|
25
25
|
static createMoveOperation(options: MoveOperationOptions): MoveOperationResult;
|
|
26
|
-
static addMoveOperation(sourceParagraph: import('../elements/Paragraph').Paragraph, destParagraph: import('../elements/Paragraph').Paragraph, options: MoveOperationOptions): MoveOperationResult;
|
|
26
|
+
static addMoveOperation(sourceParagraph: import('../elements/Paragraph.js').Paragraph, destParagraph: import('../elements/Paragraph.js').Paragraph, options: MoveOperationOptions): MoveOperationResult;
|
|
27
27
|
static resetIdCounters(): void;
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=MoveOperationHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoveOperationHelper.d.ts","sourceRoot":"","sources":["../../src/processors/MoveOperationHelper.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAKzC,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,0BAA0B,EAAE,SAAS,EAC7D,aAAa,EAAE,OAAO,0BAA0B,EAAE,SAAS,EAC3D,OAAO,EAAE,oBAAoB,GAC5B,mBAAmB;IAoBtB,MAAM,CAAC,eAAe,IAAI,IAAI;CAI/B"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MoveOperationHelper = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
4
|
+
const Revision_js_1 = require("../elements/Revision.js");
|
|
5
|
+
const RangeMarker_js_1 = require("../elements/RangeMarker.js");
|
|
6
|
+
const Run_js_1 = require("../elements/Run.js");
|
|
7
7
|
let globalMoveIdCounter = 0;
|
|
8
8
|
let globalAnnotationIdCounter = 1000;
|
|
9
9
|
class MoveOperationHelper {
|
|
@@ -15,19 +15,19 @@ class MoveOperationHelper {
|
|
|
15
15
|
const moveFromId = getNextId();
|
|
16
16
|
const moveToRangeId = getNextId();
|
|
17
17
|
const moveToId = getNextId();
|
|
18
|
-
const moveFromRangeStart =
|
|
19
|
-
const moveFrom =
|
|
18
|
+
const moveFromRangeStart = RangeMarker_js_1.RangeMarker.createMoveFromStart(moveFromRangeId, moveId, author, date);
|
|
19
|
+
const moveFrom = Revision_js_1.Revision.createMoveFrom(author, content, moveId, date);
|
|
20
20
|
moveFrom.setId(moveFromId);
|
|
21
|
-
const moveFromRangeEnd =
|
|
21
|
+
const moveFromRangeEnd = RangeMarker_js_1.RangeMarker.createMoveFromEnd(moveFromRangeId);
|
|
22
22
|
const contentArray = Array.isArray(content) ? content : [content];
|
|
23
23
|
const clonedContent = contentArray.map((run) => {
|
|
24
|
-
const cloned = new
|
|
24
|
+
const cloned = new Run_js_1.Run(run.getText(), { ...run.getFormatting() });
|
|
25
25
|
return cloned;
|
|
26
26
|
});
|
|
27
|
-
const moveToRangeStart =
|
|
28
|
-
const moveTo =
|
|
27
|
+
const moveToRangeStart = RangeMarker_js_1.RangeMarker.createMoveToStart(moveToRangeId, moveId, author, date);
|
|
28
|
+
const moveTo = Revision_js_1.Revision.createMoveTo(author, clonedContent, moveId, date);
|
|
29
29
|
moveTo.setId(moveToId);
|
|
30
|
-
const moveToRangeEnd =
|
|
30
|
+
const moveToRangeEnd = RangeMarker_js_1.RangeMarker.createMoveToEnd(moveToRangeId);
|
|
31
31
|
return {
|
|
32
32
|
source: {
|
|
33
33
|
rangeStart: moveFromRangeStart,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoveOperationHelper.js","sourceRoot":"","sources":["../../src/processors/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.js';\nimport { RangeMarker } from '../elements/RangeMarker.js';\nimport { Run } from '../elements/Run.js';\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.js').Paragraph,\n destParagraph: import('../elements/Paragraph.js').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,6 +1,6 @@
|
|
|
1
|
-
import type { Document } from '../core/Document';
|
|
2
|
-
import { Revision, RevisionType } from '../elements/Revision';
|
|
3
|
-
import { ChangeCategory, ChangeLocation } from './ChangelogGenerator';
|
|
1
|
+
import type { Document } from '../core/Document.js';
|
|
2
|
+
import { Revision, RevisionType } from '../elements/Revision.js';
|
|
3
|
+
import { ChangeCategory, ChangeLocation } from './ChangelogGenerator.js';
|
|
4
4
|
export type RevisionHandlingMode = 'accept_all' | 'preserve' | 'preserve_and_wrap';
|
|
5
5
|
export interface RevisionProcessingOptions {
|
|
6
6
|
mode: RevisionHandlingMode;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionAwareProcessor.d.ts","sourceRoot":"","sources":["../../src/processors/RevisionAwareProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RevisionAwareProcessor = void 0;
|
|
4
|
-
const
|
|
4
|
+
const Revision_js_1 = require("../elements/Revision.js");
|
|
5
5
|
class RevisionAwareProcessor {
|
|
6
6
|
static async prepare(doc, options) {
|
|
7
7
|
const log = [];
|
|
@@ -203,7 +203,7 @@ class RevisionAwareProcessor {
|
|
|
203
203
|
if (!run) {
|
|
204
204
|
throw new Error(`Run at index ${runIndex} not found`);
|
|
205
205
|
}
|
|
206
|
-
const revision = new
|
|
206
|
+
const revision = new Revision_js_1.Revision({
|
|
207
207
|
author,
|
|
208
208
|
type,
|
|
209
209
|
content: run,
|