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,531 @@
|
|
|
1
|
+
import { Revision } from '../elements/Revision.js';
|
|
2
|
+
import { Run } from '../elements/Run.js';
|
|
3
|
+
import { Paragraph } from '../elements/Paragraph.js';
|
|
4
|
+
import { Table } from '../elements/Table.js';
|
|
5
|
+
import { TableRow } from '../elements/TableRow.js';
|
|
6
|
+
import { TableCell } from '../elements/TableCell.js';
|
|
7
|
+
import { Section } from '../elements/Section.js';
|
|
8
|
+
import { formatDateForXml } from '../utils/dateFormatting.js';
|
|
9
|
+
import { deepEqual } from '../utils/deepEqual.js';
|
|
10
|
+
export class DocumentTrackingContext {
|
|
11
|
+
enabled = false;
|
|
12
|
+
trackFormatting = true;
|
|
13
|
+
author = 'DocHub';
|
|
14
|
+
revisionManager;
|
|
15
|
+
elementIdCounter = 0;
|
|
16
|
+
elementIdMap = new WeakMap();
|
|
17
|
+
pendingChanges = new Map();
|
|
18
|
+
static FORMATTING_PROPERTIES = new Set([
|
|
19
|
+
'bold',
|
|
20
|
+
'italic',
|
|
21
|
+
'underline',
|
|
22
|
+
'strike',
|
|
23
|
+
'dstrike',
|
|
24
|
+
'subscript',
|
|
25
|
+
'superscript',
|
|
26
|
+
'font',
|
|
27
|
+
'size',
|
|
28
|
+
'color',
|
|
29
|
+
'highlight',
|
|
30
|
+
'smallCaps',
|
|
31
|
+
'allCaps',
|
|
32
|
+
'characterSpacing',
|
|
33
|
+
'scaling',
|
|
34
|
+
'position',
|
|
35
|
+
'emphasis',
|
|
36
|
+
'shadow',
|
|
37
|
+
'emboss',
|
|
38
|
+
'imprint',
|
|
39
|
+
'outline',
|
|
40
|
+
'vanish',
|
|
41
|
+
]);
|
|
42
|
+
constructor(revisionManager) {
|
|
43
|
+
this.revisionManager = revisionManager;
|
|
44
|
+
}
|
|
45
|
+
enable(options) {
|
|
46
|
+
this.enabled = true;
|
|
47
|
+
if (options?.author) {
|
|
48
|
+
this.author = options.author;
|
|
49
|
+
}
|
|
50
|
+
if (options?.trackFormatting !== undefined) {
|
|
51
|
+
this.trackFormatting = options.trackFormatting;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
disable() {
|
|
55
|
+
this.flushPendingChanges();
|
|
56
|
+
this.enabled = false;
|
|
57
|
+
}
|
|
58
|
+
setAuthor(author) {
|
|
59
|
+
if (this.enabled && this.pendingChanges.size > 0) {
|
|
60
|
+
this.flushPendingChanges();
|
|
61
|
+
}
|
|
62
|
+
this.author = author;
|
|
63
|
+
}
|
|
64
|
+
isEnabled() {
|
|
65
|
+
return this.enabled;
|
|
66
|
+
}
|
|
67
|
+
getAuthor() {
|
|
68
|
+
return this.author;
|
|
69
|
+
}
|
|
70
|
+
getRevisionManager() {
|
|
71
|
+
return this.revisionManager;
|
|
72
|
+
}
|
|
73
|
+
isTrackFormattingEnabled() {
|
|
74
|
+
return this.trackFormatting;
|
|
75
|
+
}
|
|
76
|
+
trackRunPropertyChange(run, property, oldValue, newValue) {
|
|
77
|
+
if (!this.enabled)
|
|
78
|
+
return;
|
|
79
|
+
if (this.valuesEqual(oldValue, newValue))
|
|
80
|
+
return;
|
|
81
|
+
if (!this.trackFormatting && DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;
|
|
85
|
+
this.addPendingChange(key, {
|
|
86
|
+
type: 'runPropertiesChange',
|
|
87
|
+
property,
|
|
88
|
+
previousValue: oldValue,
|
|
89
|
+
newValue,
|
|
90
|
+
element: run,
|
|
91
|
+
timestamp: Date.now(),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
trackParagraphPropertyChange(paragraph, property, oldValue, newValue) {
|
|
95
|
+
if (!this.enabled)
|
|
96
|
+
return;
|
|
97
|
+
if (this.valuesEqual(oldValue, newValue))
|
|
98
|
+
return;
|
|
99
|
+
const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;
|
|
100
|
+
this.addPendingChange(key, {
|
|
101
|
+
type: 'paragraphPropertiesChange',
|
|
102
|
+
property,
|
|
103
|
+
previousValue: oldValue,
|
|
104
|
+
newValue,
|
|
105
|
+
element: paragraph,
|
|
106
|
+
timestamp: Date.now(),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
trackHyperlinkChange(hyperlink, changeType, oldValue, newValue) {
|
|
110
|
+
if (!this.enabled)
|
|
111
|
+
return;
|
|
112
|
+
if (this.valuesEqual(oldValue, newValue))
|
|
113
|
+
return;
|
|
114
|
+
const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;
|
|
115
|
+
this.addPendingChange(key, {
|
|
116
|
+
type: 'hyperlinkChange',
|
|
117
|
+
property: changeType,
|
|
118
|
+
previousValue: oldValue,
|
|
119
|
+
newValue,
|
|
120
|
+
element: hyperlink,
|
|
121
|
+
timestamp: Date.now(),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
trackTableChange(element, property, oldValue, newValue) {
|
|
125
|
+
if (!this.enabled)
|
|
126
|
+
return;
|
|
127
|
+
if (this.valuesEqual(oldValue, newValue))
|
|
128
|
+
return;
|
|
129
|
+
let type = 'tablePropertiesChange';
|
|
130
|
+
let elementType = 'Table';
|
|
131
|
+
if (element instanceof TableRow) {
|
|
132
|
+
type = 'tableRowPropertiesChange';
|
|
133
|
+
elementType = 'TableRow';
|
|
134
|
+
}
|
|
135
|
+
else if (element instanceof TableCell) {
|
|
136
|
+
type = 'tableCellPropertiesChange';
|
|
137
|
+
elementType = 'TableCell';
|
|
138
|
+
}
|
|
139
|
+
const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;
|
|
140
|
+
this.addPendingChange(key, {
|
|
141
|
+
type,
|
|
142
|
+
property,
|
|
143
|
+
previousValue: oldValue,
|
|
144
|
+
newValue,
|
|
145
|
+
element,
|
|
146
|
+
timestamp: Date.now(),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
trackSectionChange(section, property, oldValue, newValue) {
|
|
150
|
+
if (!this.enabled)
|
|
151
|
+
return;
|
|
152
|
+
if (this.valuesEqual(oldValue, newValue))
|
|
153
|
+
return;
|
|
154
|
+
const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;
|
|
155
|
+
this.addPendingChange(key, {
|
|
156
|
+
type: 'sectionPropertiesChange',
|
|
157
|
+
property,
|
|
158
|
+
previousValue: oldValue,
|
|
159
|
+
newValue,
|
|
160
|
+
element: section,
|
|
161
|
+
timestamp: Date.now(),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
trackInsertion(element, text) {
|
|
165
|
+
if (!this.enabled)
|
|
166
|
+
return;
|
|
167
|
+
if (!text)
|
|
168
|
+
return;
|
|
169
|
+
const key = `insert:${Date.now()}:${text.substring(0, 20)}`;
|
|
170
|
+
this.addPendingChange(key, {
|
|
171
|
+
type: 'insert',
|
|
172
|
+
property: 'text',
|
|
173
|
+
previousValue: undefined,
|
|
174
|
+
newValue: text,
|
|
175
|
+
element,
|
|
176
|
+
timestamp: Date.now(),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
trackDeletion(element, text) {
|
|
180
|
+
if (!this.enabled)
|
|
181
|
+
return;
|
|
182
|
+
if (!text)
|
|
183
|
+
return;
|
|
184
|
+
const key = `delete:${Date.now()}:${text.substring(0, 20)}`;
|
|
185
|
+
this.addPendingChange(key, {
|
|
186
|
+
type: 'delete',
|
|
187
|
+
property: 'text',
|
|
188
|
+
previousValue: text,
|
|
189
|
+
newValue: undefined,
|
|
190
|
+
element,
|
|
191
|
+
timestamp: Date.now(),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
flushPendingChanges() {
|
|
195
|
+
const revisions = [];
|
|
196
|
+
const paragraphChanges = new Map();
|
|
197
|
+
const tableChanges = new Map();
|
|
198
|
+
const rowChanges = new Map();
|
|
199
|
+
const cellChanges = new Map();
|
|
200
|
+
const sectionChanges = new Map();
|
|
201
|
+
const runChanges = new Map();
|
|
202
|
+
for (const [, pending] of this.pendingChanges) {
|
|
203
|
+
const revision = this.createRevision(pending);
|
|
204
|
+
this.revisionManager.register(revision);
|
|
205
|
+
revisions.push(revision);
|
|
206
|
+
if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {
|
|
207
|
+
const changes = paragraphChanges.get(pending.element) || [];
|
|
208
|
+
changes.push(pending);
|
|
209
|
+
paragraphChanges.set(pending.element, changes);
|
|
210
|
+
}
|
|
211
|
+
else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {
|
|
212
|
+
const changes = tableChanges.get(pending.element) || [];
|
|
213
|
+
changes.push(pending);
|
|
214
|
+
tableChanges.set(pending.element, changes);
|
|
215
|
+
}
|
|
216
|
+
else if (pending.type === 'tableRowPropertiesChange' &&
|
|
217
|
+
pending.element instanceof TableRow) {
|
|
218
|
+
const changes = rowChanges.get(pending.element) || [];
|
|
219
|
+
changes.push(pending);
|
|
220
|
+
rowChanges.set(pending.element, changes);
|
|
221
|
+
}
|
|
222
|
+
else if (pending.type === 'tableCellPropertiesChange' &&
|
|
223
|
+
pending.element instanceof TableCell) {
|
|
224
|
+
const changes = cellChanges.get(pending.element) || [];
|
|
225
|
+
changes.push(pending);
|
|
226
|
+
cellChanges.set(pending.element, changes);
|
|
227
|
+
}
|
|
228
|
+
else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {
|
|
229
|
+
const changes = sectionChanges.get(pending.element) || [];
|
|
230
|
+
changes.push(pending);
|
|
231
|
+
sectionChanges.set(pending.element, changes);
|
|
232
|
+
}
|
|
233
|
+
else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {
|
|
234
|
+
const changes = runChanges.get(pending.element) || [];
|
|
235
|
+
changes.push(pending);
|
|
236
|
+
runChanges.set(pending.element, changes);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
for (const [paragraph, changes] of paragraphChanges) {
|
|
240
|
+
this.applyParagraphPrChange(paragraph, changes);
|
|
241
|
+
}
|
|
242
|
+
for (const [table, changes] of tableChanges) {
|
|
243
|
+
const currentFormatting = table.getFormatting();
|
|
244
|
+
const fullPrevProps = {};
|
|
245
|
+
for (const [key, value] of Object.entries(currentFormatting)) {
|
|
246
|
+
if (value !== undefined) {
|
|
247
|
+
fullPrevProps[key] = value;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
let latestTimestamp = 0;
|
|
251
|
+
for (const change of changes) {
|
|
252
|
+
if (change.previousValue !== undefined) {
|
|
253
|
+
fullPrevProps[change.property] = change.previousValue;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
delete fullPrevProps[change.property];
|
|
257
|
+
}
|
|
258
|
+
if (change.timestamp > latestTimestamp) {
|
|
259
|
+
latestTimestamp = change.timestamp;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const date = formatDateForXml(new Date(latestTimestamp));
|
|
263
|
+
const existing = table.getTblPrChange();
|
|
264
|
+
if (existing) {
|
|
265
|
+
const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };
|
|
266
|
+
table.setTblPrChange({ ...existing, previousProperties: merged });
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
table.setTblPrChange({
|
|
270
|
+
author: this.author,
|
|
271
|
+
date,
|
|
272
|
+
id: String(this.revisionManager.consumeNextId()),
|
|
273
|
+
previousProperties: fullPrevProps,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
for (const [row, changes] of rowChanges) {
|
|
278
|
+
this.applyElementPrChange(changes, (prevProps, getNextId, date) => {
|
|
279
|
+
const existing = row.getTrPrChange();
|
|
280
|
+
if (existing) {
|
|
281
|
+
const merged = { ...(existing.previousProperties || {}), ...prevProps };
|
|
282
|
+
row.setTrPrChange({ ...existing, previousProperties: merged });
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
row.setTrPrChange({
|
|
286
|
+
author: this.author,
|
|
287
|
+
date,
|
|
288
|
+
id: String(getNextId()),
|
|
289
|
+
previousProperties: prevProps,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
for (const [cell, changes] of cellChanges) {
|
|
295
|
+
const currentFormatting = cell.getFormatting();
|
|
296
|
+
const fullPrevProps = {};
|
|
297
|
+
for (const [key, value] of Object.entries(currentFormatting)) {
|
|
298
|
+
if (value !== undefined) {
|
|
299
|
+
fullPrevProps[key] = value;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
let latestTimestamp = 0;
|
|
303
|
+
for (const change of changes) {
|
|
304
|
+
if (change.previousValue !== undefined) {
|
|
305
|
+
fullPrevProps[change.property] = change.previousValue;
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
delete fullPrevProps[change.property];
|
|
309
|
+
}
|
|
310
|
+
if (change.timestamp > latestTimestamp) {
|
|
311
|
+
latestTimestamp = change.timestamp;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const date = formatDateForXml(new Date(latestTimestamp));
|
|
315
|
+
const existing = cell.getTcPrChange();
|
|
316
|
+
if (existing) {
|
|
317
|
+
const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };
|
|
318
|
+
cell.setTcPrChange({ ...existing, previousProperties: merged });
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
cell.setTcPrChange({
|
|
322
|
+
author: this.author,
|
|
323
|
+
date,
|
|
324
|
+
id: String(this.revisionManager.consumeNextId()),
|
|
325
|
+
previousProperties: fullPrevProps,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
for (const [section, changes] of sectionChanges) {
|
|
330
|
+
const currentProps = section.getProperties();
|
|
331
|
+
const fullPrevProps = {};
|
|
332
|
+
for (const [key, value] of Object.entries(currentProps)) {
|
|
333
|
+
if (value !== undefined) {
|
|
334
|
+
fullPrevProps[key] = value;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
let latestTimestamp = 0;
|
|
338
|
+
for (const change of changes) {
|
|
339
|
+
if (change.previousValue !== undefined) {
|
|
340
|
+
fullPrevProps[change.property] = change.previousValue;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
delete fullPrevProps[change.property];
|
|
344
|
+
}
|
|
345
|
+
if (change.timestamp > latestTimestamp) {
|
|
346
|
+
latestTimestamp = change.timestamp;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const date = formatDateForXml(new Date(latestTimestamp));
|
|
350
|
+
const existing = section.getSectPrChange();
|
|
351
|
+
if (existing) {
|
|
352
|
+
const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };
|
|
353
|
+
section.setSectPrChange({ ...existing, previousProperties: merged });
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
section.setSectPrChange({
|
|
357
|
+
author: this.author,
|
|
358
|
+
date,
|
|
359
|
+
id: String(this.revisionManager.consumeNextId()),
|
|
360
|
+
previousProperties: fullPrevProps,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
for (const [run, changes] of runChanges) {
|
|
365
|
+
this.applyRunPrChange(run, changes);
|
|
366
|
+
}
|
|
367
|
+
this.pendingChanges.clear();
|
|
368
|
+
return revisions;
|
|
369
|
+
}
|
|
370
|
+
applyParagraphPrChange(paragraph, changes) {
|
|
371
|
+
const newPreviousProperties = {};
|
|
372
|
+
let latestTimestamp = 0;
|
|
373
|
+
for (const change of changes) {
|
|
374
|
+
newPreviousProperties[change.property] = change.previousValue;
|
|
375
|
+
if (change.timestamp > latestTimestamp) {
|
|
376
|
+
latestTimestamp = change.timestamp;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
const existingChange = paragraph.formatting.pPrChange;
|
|
380
|
+
if (existingChange) {
|
|
381
|
+
const mergedPreviousProperties = {
|
|
382
|
+
...(existingChange.previousProperties || {}),
|
|
383
|
+
};
|
|
384
|
+
for (const [prop, value] of Object.entries(newPreviousProperties)) {
|
|
385
|
+
mergedPreviousProperties[prop] = value;
|
|
386
|
+
}
|
|
387
|
+
paragraph.formatting.pPrChange = {
|
|
388
|
+
author: existingChange.author,
|
|
389
|
+
date: existingChange.date,
|
|
390
|
+
id: existingChange.id,
|
|
391
|
+
previousProperties: mergedPreviousProperties,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
const revisionId = this.revisionManager.consumeNextId();
|
|
396
|
+
paragraph.formatting.pPrChange = {
|
|
397
|
+
author: this.author,
|
|
398
|
+
date: formatDateForXml(new Date(latestTimestamp)),
|
|
399
|
+
id: String(revisionId),
|
|
400
|
+
previousProperties: newPreviousProperties,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
applyRunPrChange(run, changes) {
|
|
405
|
+
const newPreviousProperties = {};
|
|
406
|
+
let latestTimestamp = 0;
|
|
407
|
+
for (const change of changes) {
|
|
408
|
+
newPreviousProperties[change.property] = change.previousValue;
|
|
409
|
+
if (change.timestamp > latestTimestamp) {
|
|
410
|
+
latestTimestamp = change.timestamp;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
const existingChange = run.getPropertyChangeRevision();
|
|
414
|
+
if (existingChange) {
|
|
415
|
+
const mergedPreviousProperties = {
|
|
416
|
+
...(existingChange.previousProperties || {}),
|
|
417
|
+
...newPreviousProperties,
|
|
418
|
+
};
|
|
419
|
+
run.setPropertyChangeRevision({
|
|
420
|
+
...existingChange,
|
|
421
|
+
previousProperties: mergedPreviousProperties,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
const revisionId = this.revisionManager.consumeNextId();
|
|
426
|
+
run.setPropertyChangeRevision({
|
|
427
|
+
id: revisionId,
|
|
428
|
+
author: this.author,
|
|
429
|
+
date: new Date(latestTimestamp),
|
|
430
|
+
previousProperties: newPreviousProperties,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
applyElementPrChange(changes, applier) {
|
|
435
|
+
const prevProps = {};
|
|
436
|
+
let latestTimestamp = 0;
|
|
437
|
+
for (const change of changes) {
|
|
438
|
+
prevProps[change.property] = change.previousValue;
|
|
439
|
+
if (change.timestamp > latestTimestamp) {
|
|
440
|
+
latestTimestamp = change.timestamp;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const date = formatDateForXml(new Date(latestTimestamp));
|
|
444
|
+
applier(prevProps, () => this.revisionManager.consumeNextId(), date);
|
|
445
|
+
}
|
|
446
|
+
addPendingChange(key, change) {
|
|
447
|
+
const existing = this.pendingChanges.get(key);
|
|
448
|
+
if (existing) {
|
|
449
|
+
existing.count = (existing.count || 1) + 1;
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
this.pendingChanges.set(key, { ...change, count: 1 });
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
createRevision(pending) {
|
|
456
|
+
const previousProps = {};
|
|
457
|
+
const newProps = {};
|
|
458
|
+
if (pending.previousValue !== undefined) {
|
|
459
|
+
previousProps[pending.property] = pending.previousValue;
|
|
460
|
+
}
|
|
461
|
+
if (pending.newValue !== undefined) {
|
|
462
|
+
newProps[pending.property] = pending.newValue;
|
|
463
|
+
}
|
|
464
|
+
const run = this.getRunFromElement(pending.element);
|
|
465
|
+
return new Revision({
|
|
466
|
+
author: this.author,
|
|
467
|
+
type: pending.type,
|
|
468
|
+
content: run,
|
|
469
|
+
previousProperties: Object.keys(previousProps).length > 0 ? previousProps : undefined,
|
|
470
|
+
newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,
|
|
471
|
+
date: new Date(pending.timestamp),
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
getRunFromElement(element) {
|
|
475
|
+
if (element instanceof Run) {
|
|
476
|
+
return element;
|
|
477
|
+
}
|
|
478
|
+
if (element instanceof Table)
|
|
479
|
+
return new Run('Table');
|
|
480
|
+
if (element instanceof TableRow)
|
|
481
|
+
return new Run('TableRow');
|
|
482
|
+
if (element instanceof TableCell)
|
|
483
|
+
return new Run('TableCell');
|
|
484
|
+
if (element instanceof Section)
|
|
485
|
+
return new Run('Section');
|
|
486
|
+
if (element instanceof Paragraph)
|
|
487
|
+
return new Run('Paragraph');
|
|
488
|
+
const hasGetText = 'getText' in element && typeof element.getText === 'function';
|
|
489
|
+
const text = hasGetText
|
|
490
|
+
? element.getText()
|
|
491
|
+
: element?.constructor?.name || 'Unknown element';
|
|
492
|
+
return new Run(typeof text === 'string' ? text : String(text));
|
|
493
|
+
}
|
|
494
|
+
getElementId(element) {
|
|
495
|
+
let id = this.elementIdMap.get(element);
|
|
496
|
+
if (id === undefined) {
|
|
497
|
+
id = this.elementIdCounter++;
|
|
498
|
+
this.elementIdMap.set(element, id);
|
|
499
|
+
}
|
|
500
|
+
return id;
|
|
501
|
+
}
|
|
502
|
+
valuesEqual(a, b) {
|
|
503
|
+
return deepEqual(a, b);
|
|
504
|
+
}
|
|
505
|
+
stringifyValue(value) {
|
|
506
|
+
if (value === undefined)
|
|
507
|
+
return 'undefined';
|
|
508
|
+
if (value === null)
|
|
509
|
+
return 'null';
|
|
510
|
+
if (typeof value === 'object') {
|
|
511
|
+
return JSON.stringify(value);
|
|
512
|
+
}
|
|
513
|
+
return String(value);
|
|
514
|
+
}
|
|
515
|
+
createInsertion(content, date) {
|
|
516
|
+
return Revision.createInsertion(this.author, content, date);
|
|
517
|
+
}
|
|
518
|
+
createDeletion(content, date) {
|
|
519
|
+
return Revision.createDeletion(this.author, content, date);
|
|
520
|
+
}
|
|
521
|
+
getPendingCount() {
|
|
522
|
+
return this.pendingChanges.size;
|
|
523
|
+
}
|
|
524
|
+
hasPendingChanges() {
|
|
525
|
+
return this.pendingChanges.size > 0;
|
|
526
|
+
}
|
|
527
|
+
clearPendingChanges() {
|
|
528
|
+
this.pendingChanges.clear();
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
//# sourceMappingURL=DocumentTrackingContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentTrackingContext.js","sourceRoot":"","sources":["../../../src/tracking/DocumentTrackingContext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DocumentTrackingContext - Implementation of automatic change tracking\n *\n * Manages pending changes and creates Revision objects when flushed.\n * Supports consolidation of similar changes within a time window.\n *\n * @module DocumentTrackingContext\n */\n\nimport { Revision, RevisionType } from '../elements/Revision.js';\nimport { RevisionManager } from '../elements/RevisionManager.js';\nimport { Run, type RunFormatting } from '../elements/Run.js';\nimport { Paragraph } from '../elements/Paragraph.js';\nimport { Table } from '../elements/Table.js';\nimport { TableRow } from '../elements/TableRow.js';\nimport { TableCell } from '../elements/TableCell.js';\nimport { Section } from '../elements/Section.js';\nimport type { TrackingContext, PendingChange, TrackableElement } from './TrackingContext.js';\nimport { formatDateForXml } from '../utils/dateFormatting.js';\nimport { deepEqual } from '../utils/deepEqual.js';\n\n/**\n * Enable options for tracking context\n */\nexport interface TrackingEnableOptions {\n /** Author name for new revisions (default: 'DocHub') */\n author?: string;\n /** Whether to track formatting changes (default: true) */\n trackFormatting?: boolean;\n}\n\n/**\n * Implementation of TrackingContext for Document\n */\nexport class DocumentTrackingContext implements TrackingContext {\n private enabled = false;\n private trackFormatting = true;\n private author = 'DocHub';\n private revisionManager: RevisionManager;\n\n /** Counter for assigning stable element IDs */\n private elementIdCounter = 0;\n /** Stable element identity map (WeakMap so elements can be GC'd) */\n private elementIdMap = new WeakMap<object, number>();\n\n /** Pending changes waiting to be flushed */\n private pendingChanges = new Map<string, PendingChange>();\n\n /** Properties considered \"formatting\" (vs structural) */\n private static readonly FORMATTING_PROPERTIES = new Set([\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'dstrike',\n 'subscript',\n 'superscript',\n 'font',\n 'size',\n 'color',\n 'highlight',\n 'smallCaps',\n 'allCaps',\n 'characterSpacing',\n 'scaling',\n 'position',\n 'emphasis',\n 'shadow',\n 'emboss',\n 'imprint',\n 'outline',\n 'vanish',\n ]);\n\n /**\n * Creates a new DocumentTrackingContext\n * @param revisionManager - RevisionManager to register revisions with\n */\n constructor(revisionManager: RevisionManager) {\n this.revisionManager = revisionManager;\n }\n\n /**\n * Enable change tracking\n * @param options - Enable options\n */\n enable(options?: TrackingEnableOptions): void {\n this.enabled = true;\n if (options?.author) {\n this.author = options.author;\n }\n if (options?.trackFormatting !== undefined) {\n this.trackFormatting = options.trackFormatting;\n }\n }\n\n /**\n * Disable change tracking and flush pending changes\n */\n disable(): void {\n this.flushPendingChanges();\n this.enabled = false;\n }\n\n /**\n * Set the author for new revisions\n * Flushes any pending changes before switching to prevent mixed authorship\n * @param author - Author name\n */\n setAuthor(author: string): void {\n // Flush pending changes before switching authors to prevent mixed authorship\n if (this.enabled && this.pendingChanges.size > 0) {\n this.flushPendingChanges();\n }\n this.author = author;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // TrackingContext Interface Implementation\n // ═══════════════════════════════════════════════════════════════════════════\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getAuthor(): string {\n return this.author;\n }\n\n getRevisionManager(): RevisionManager {\n return this.revisionManager;\n }\n\n isTrackFormattingEnabled(): boolean {\n return this.trackFormatting;\n }\n\n trackRunPropertyChange(run: Run, property: string, oldValue: unknown, newValue: unknown): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Skip formatting changes if not tracking them\n if (!this.trackFormatting && DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)) {\n return;\n }\n\n // Create consolidation key with element identity\n const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;\n\n this.addPendingChange(key, {\n type: 'runPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: run,\n timestamp: Date.now(),\n });\n }\n\n trackParagraphPropertyChange(\n paragraph: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;\n\n this.addPendingChange(key, {\n type: 'paragraphPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: paragraph,\n timestamp: Date.now(),\n });\n }\n\n trackHyperlinkChange(\n hyperlink: TrackableElement,\n changeType: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Hyperlink changes use dedicated type for proper categorization\n const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;\n\n this.addPendingChange(key, {\n type: 'hyperlinkChange',\n property: changeType,\n previousValue: oldValue,\n newValue,\n element: hyperlink,\n timestamp: Date.now(),\n });\n }\n\n trackTableChange(\n element: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Determine revision type based on element type using instanceof (minification-safe)\n let type: RevisionType = 'tablePropertiesChange';\n let elementType = 'Table';\n\n if (element instanceof TableRow) {\n type = 'tableRowPropertiesChange';\n elementType = 'TableRow';\n } else if (element instanceof TableCell) {\n type = 'tableCellPropertiesChange';\n elementType = 'TableCell';\n }\n\n const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;\n\n this.addPendingChange(key, {\n type,\n property,\n previousValue: oldValue,\n newValue,\n element,\n timestamp: Date.now(),\n });\n }\n\n trackSectionChange(\n section: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;\n\n this.addPendingChange(key, {\n type: 'sectionPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: section,\n timestamp: Date.now(),\n });\n }\n\n trackInsertion(element: TrackableElement, text: string): void {\n if (!this.enabled) return;\n if (!text) return;\n\n const key = `insert:${Date.now()}:${text.substring(0, 20)}`;\n\n this.addPendingChange(key, {\n type: 'insert',\n property: 'text',\n previousValue: undefined,\n newValue: text,\n element,\n timestamp: Date.now(),\n });\n }\n\n trackDeletion(element: TrackableElement, text: string): void {\n if (!this.enabled) return;\n if (!text) return;\n\n const key = `delete:${Date.now()}:${text.substring(0, 20)}`;\n\n this.addPendingChange(key, {\n type: 'delete',\n property: 'text',\n previousValue: text,\n newValue: undefined,\n element,\n timestamp: Date.now(),\n });\n }\n\n flushPendingChanges(): Revision[] {\n const revisions: Revision[] = [];\n\n // Group pending changes by element for consolidation\n const paragraphChanges = new Map<Paragraph, PendingChange[]>();\n const tableChanges = new Map<Table, PendingChange[]>();\n const rowChanges = new Map<TableRow, PendingChange[]>();\n const cellChanges = new Map<TableCell, PendingChange[]>();\n const sectionChanges = new Map<Section, PendingChange[]>();\n const runChanges = new Map<Run, PendingChange[]>();\n\n for (const [, pending] of this.pendingChanges) {\n const revision = this.createRevision(pending);\n this.revisionManager.register(revision);\n revisions.push(revision);\n\n // Collect changes by element type for *PrChange application\n if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {\n const changes = paragraphChanges.get(pending.element) || [];\n changes.push(pending);\n paragraphChanges.set(pending.element, changes);\n } else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {\n const changes = tableChanges.get(pending.element) || [];\n changes.push(pending);\n tableChanges.set(pending.element, changes);\n } else if (\n pending.type === 'tableRowPropertiesChange' &&\n pending.element instanceof TableRow\n ) {\n const changes = rowChanges.get(pending.element) || [];\n changes.push(pending);\n rowChanges.set(pending.element, changes);\n } else if (\n pending.type === 'tableCellPropertiesChange' &&\n pending.element instanceof TableCell\n ) {\n const changes = cellChanges.get(pending.element) || [];\n changes.push(pending);\n cellChanges.set(pending.element, changes);\n } else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {\n const changes = sectionChanges.get(pending.element) || [];\n changes.push(pending);\n sectionChanges.set(pending.element, changes);\n } else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {\n const changes = runChanges.get(pending.element) || [];\n changes.push(pending);\n runChanges.set(pending.element, changes);\n }\n }\n\n // Apply pPrChange to each paragraph that has property changes\n for (const [paragraph, changes] of paragraphChanges) {\n this.applyParagraphPrChange(paragraph, changes);\n }\n\n // Apply tblPrChange to each Table\n // Per ECMA-376 §17.13.5.36, tblPrChange must contain FULL previous tblPr,\n // not just the delta of changed properties.\n for (const [table, changes] of tableChanges) {\n // Build full snapshot: start from current formatting, roll back changed properties\n const currentFormatting = table.getFormatting();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentFormatting)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = table.getTblPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n table.setTblPrChange({ ...existing, previousProperties: merged });\n } else {\n table.setTblPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply trPrChange to each TableRow\n for (const [row, changes] of rowChanges) {\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\n const existing = row.getTrPrChange();\n if (existing) {\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\n row.setTrPrChange({ ...existing, previousProperties: merged });\n } else {\n row.setTrPrChange({\n author: this.author,\n date,\n id: String(getNextId()),\n previousProperties: prevProps,\n });\n }\n });\n }\n\n // Apply tcPrChange to each TableCell\n // Per ECMA-376 §17.13.5.37, tcPrChange must contain FULL previous tcPr,\n // not just the delta of changed properties.\n for (const [cell, changes] of cellChanges) {\n // Build full snapshot: start from current formatting, roll back changed properties\n const currentFormatting = cell.getFormatting();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentFormatting)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = cell.getTcPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n cell.setTcPrChange({ ...existing, previousProperties: merged });\n } else {\n cell.setTcPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply sectPrChange to each Section\n // Per ECMA-376 §17.13.5.32, sectPrChange must contain FULL previous sectPr,\n // not just the delta of changed properties.\n for (const [section, changes] of sectionChanges) {\n // Build full snapshot: start from current properties, roll back changed properties\n const currentProps = section.getProperties();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentProps)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = section.getSectPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n section.setSectPrChange({ ...existing, previousProperties: merged });\n } else {\n section.setSectPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply rPrChange to each Run that has property changes\n for (const [run, changes] of runChanges) {\n this.applyRunPrChange(run, changes);\n }\n\n this.pendingChanges.clear();\n return revisions;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Private Methods\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply pPrChange to a paragraph (extracted from flushPendingChanges for readability)\n */\n private applyParagraphPrChange(paragraph: Paragraph, changes: PendingChange[]): void {\n const newPreviousProperties: Record<string, unknown> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n // Record previous value even if undefined (property wasn't set before)\n newPreviousProperties[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const existingChange = paragraph.formatting.pPrChange;\n\n if (existingChange) {\n const mergedPreviousProperties: Record<string, unknown> = {\n ...(existingChange.previousProperties || {}),\n };\n for (const [prop, value] of Object.entries(newPreviousProperties)) {\n mergedPreviousProperties[prop] = value;\n }\n paragraph.formatting.pPrChange = {\n author: existingChange.author,\n date: existingChange.date,\n id: existingChange.id,\n previousProperties: mergedPreviousProperties,\n };\n } else {\n const revisionId = this.revisionManager.consumeNextId();\n paragraph.formatting.pPrChange = {\n author: this.author,\n date: formatDateForXml(new Date(latestTimestamp)),\n id: String(revisionId),\n previousProperties: newPreviousProperties,\n };\n }\n }\n\n /**\n * Apply rPrChange to a run (mirrors applyParagraphPrChange for runs)\n */\n private applyRunPrChange(run: Run, changes: PendingChange[]): void {\n const newPreviousProperties: Partial<RunFormatting> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n (newPreviousProperties as Record<string, unknown>)[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const existingChange = run.getPropertyChangeRevision();\n\n if (existingChange) {\n // Merge with existing rPrChange — preserve original author/date,\n // add new previous properties\n const mergedPreviousProperties: Partial<RunFormatting> = {\n ...(existingChange.previousProperties || {}),\n ...newPreviousProperties,\n };\n run.setPropertyChangeRevision({\n ...existingChange,\n previousProperties: mergedPreviousProperties,\n });\n } else {\n const revisionId = this.revisionManager.consumeNextId();\n run.setPropertyChangeRevision({\n id: revisionId,\n author: this.author,\n date: new Date(latestTimestamp),\n previousProperties: newPreviousProperties,\n });\n }\n }\n\n /**\n * Generic helper to apply *PrChange to table/row/cell/section elements\n */\n private applyElementPrChange(\n changes: PendingChange[],\n applier: (prevProps: Record<string, unknown>, getNextId: () => number, date: string) => void\n ): void {\n const prevProps: Record<string, unknown> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n // Record previous value even if undefined (property wasn't set before)\n prevProps[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n applier(prevProps, () => this.revisionManager.consumeNextId(), date);\n }\n\n /**\n * Add a pending change, consolidating with existing if same key\n */\n private addPendingChange(key: string, change: PendingChange): void {\n const existing = this.pendingChanges.get(key);\n if (existing) {\n existing.count = (existing.count || 1) + 1;\n // Keep the first previousValue for consolidated changes\n } else {\n this.pendingChanges.set(key, { ...change, count: 1 });\n }\n }\n\n /**\n * Create a Revision from a pending change\n */\n private createRevision(pending: PendingChange): Revision {\n const previousProps: Record<string, any> = {};\n const newProps: Record<string, any> = {};\n\n if (pending.previousValue !== undefined) {\n previousProps[pending.property] = pending.previousValue;\n }\n if (pending.newValue !== undefined) {\n newProps[pending.property] = pending.newValue;\n }\n\n // Get or create a Run for the revision content\n const run = this.getRunFromElement(pending.element);\n\n return new Revision({\n author: this.author,\n type: pending.type,\n content: run,\n previousProperties: Object.keys(previousProps).length > 0 ? previousProps : undefined,\n newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,\n date: new Date(pending.timestamp),\n });\n }\n\n /**\n * Get or create a Run from an element for revision content\n */\n private getRunFromElement(element: TrackableElement): Run {\n if (element instanceof Run) {\n return element;\n }\n\n // Use instanceof for type-safe element identification (minification-safe)\n if (element instanceof Table) return new Run('Table');\n if (element instanceof TableRow) return new Run('TableRow');\n if (element instanceof TableCell) return new Run('TableCell');\n if (element instanceof Section) return new Run('Section');\n if (element instanceof Paragraph) return new Run('Paragraph');\n\n // Fallback for other elements (e.g., Hyperlink)\n const hasGetText =\n 'getText' in element && typeof (element as { getText?: () => string }).getText === 'function';\n const text = hasGetText\n ? (element as { getText: () => string }).getText()\n : element?.constructor?.name || 'Unknown element';\n return new Run(typeof text === 'string' ? text : String(text));\n }\n\n /**\n * Get a stable unique ID for an element (used in consolidation keys)\n */\n private getElementId(element: TrackableElement): number {\n let id = this.elementIdMap.get(element as object);\n if (id === undefined) {\n id = this.elementIdCounter++;\n this.elementIdMap.set(element as object, id);\n }\n return id;\n }\n\n /**\n * Deep equality check for tracking values (handles objects, primitives, null/undefined)\n */\n private valuesEqual(a: unknown, b: unknown): boolean {\n return deepEqual(a, b);\n }\n\n /**\n * Stringify a value for use in consolidation key\n */\n private stringifyValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n /**\n * Create an insertion revision (factory to avoid circular dependency in Run)\n */\n createInsertion(content: Run, date?: Date): Revision {\n return Revision.createInsertion(this.author, content, date);\n }\n\n /**\n * Create a deletion revision (factory to avoid circular dependency in Run)\n */\n createDeletion(content: Run, date?: Date): Revision {\n return Revision.createDeletion(this.author, content, date);\n }\n\n /**\n * Get count of pending changes\n */\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n /**\n * Check if there are pending changes\n */\n hasPendingChanges(): boolean {\n return this.pendingChanges.size > 0;\n }\n\n /**\n * Clear all pending changes without creating revisions\n */\n clearPendingChanges(): void {\n this.pendingChanges.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackingContext.js","sourceRoot":"","sources":["../../../src/tracking/TrackingContext.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * TrackingContext - Interface for automatic change tracking\n *\n * When enabled via Document.enableTrackChanges(), element setter methods\n * use this context to automatically create Revision objects for changes.\n *\n * @module TrackingContext\n */\n\nimport type { Revision, RevisionType } from '../elements/Revision.js';\nimport type { RevisionManager } from '../elements/RevisionManager.js';\nimport type { Run } from '../elements/Run.js';\nimport type { Paragraph } from '../elements/Paragraph.js';\nimport type { Table } from '../elements/Table.js';\nimport type { TableRow } from '../elements/TableRow.js';\nimport type { TableCell } from '../elements/TableCell.js';\nimport type { Section } from '../elements/Section.js';\n\n/** Union of element types that can be tracked */\nexport type TrackableElement =\n | Run\n | Paragraph\n | Table\n | TableRow\n | TableCell\n | Section\n | { constructor: { name: string } };\n\n/**\n * Pending change entry before flushing to RevisionManager\n */\nexport interface PendingChange {\n /** Type of revision to create */\n type: RevisionType;\n /** Property that changed */\n property: string;\n /** Value before the change */\n previousValue: unknown;\n /** Value after the change */\n newValue: unknown;\n /** Element that was modified */\n element: TrackableElement;\n /** When the change occurred */\n timestamp: number;\n /** Count for consolidated changes */\n count?: number;\n}\n\n/**\n * Interface for tracking changes to document elements.\n *\n * Elements call tracking methods when their setters are invoked.\n * The context decides whether to create revisions based on enabled state.\n */\nexport interface TrackingContext {\n /**\n * Check if change tracking is currently enabled\n */\n isEnabled(): boolean;\n\n /**\n * Get the author name for new revisions\n */\n getAuthor(): string;\n\n /**\n * Get the RevisionManager for registering revisions\n */\n getRevisionManager(): RevisionManager;\n\n /**\n * Check if formatting changes should be tracked\n */\n isTrackFormattingEnabled(): boolean;\n\n /**\n * Track a Run property change (bold, italic, font, color, etc.)\n * @param run - The Run that was modified\n * @param property - Property name (e.g., 'bold', 'color')\n * @param oldValue - Value before the change\n * @param newValue - Value after the change\n */\n trackRunPropertyChange(run: Run, property: string, oldValue: unknown, newValue: unknown): void;\n\n /**\n * Track a Paragraph property change (alignment, spacing, etc.)\n * @param paragraph - The Paragraph that was modified\n * @param property - Property name (e.g., 'alignment', 'spaceBefore')\n * @param oldValue - Value before the change\n * @param newValue - Value after the change\n */\n trackParagraphPropertyChange(\n paragraph: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void;\n\n /**\n * Track a Hyperlink change (URL, anchor, text, formatting)\n * @param hyperlink - The Hyperlink that was modified\n * @param changeType - Type of change (e.g., 'url', 'text', 'formatting')\n * @param oldValue - Value before the change\n * @param newValue - Value after the change\n */\n trackHyperlinkChange(\n hyperlink: TrackableElement,\n changeType: string,\n oldValue: unknown,\n newValue: unknown\n ): void;\n\n /**\n * Track a Table element property change\n * @param element - The table/row/cell that was modified\n * @param property - Property name\n * @param oldValue - Value before the change\n * @param newValue - Value after the change\n */\n trackTableChange(\n element: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void;\n\n /**\n * Track a Section property change\n * @param section - The Section that was modified\n * @param property - Property name (e.g., 'pageSize', 'margins')\n * @param oldValue - Value before the change\n * @param newValue - Value after the change\n */\n trackSectionChange(\n section: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void;\n\n /**\n * Track text insertion\n * @param element - Element containing the insertion\n * @param text - Text that was inserted\n */\n trackInsertion(element: TrackableElement, text: string): void;\n\n /**\n * Track text deletion\n * @param element - Element containing the deletion\n * @param text - Text that was deleted\n */\n trackDeletion(element: TrackableElement, text: string): void;\n\n /**\n * Flush all pending changes and create Revision objects.\n * This is called automatically before document save.\n * @returns Array of created revisions\n */\n flushPendingChanges(): Revision[];\n\n /**\n * Create an insertion revision (factory to avoid circular dependency in Run)\n * @param content - Run or array of content for the insertion\n * @param date - Optional date for the revision\n */\n createInsertion(content: Run, date?: Date): Revision;\n\n /**\n * Create a deletion revision (factory to avoid circular dependency in Run)\n * @param content - Run or array of content for the deletion\n * @param date - Optional date for the revision\n */\n createDeletion(content: Run, date?: Date): Revision;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export var CompatibilityMode;
|
|
2
|
+
(function (CompatibilityMode) {
|
|
3
|
+
CompatibilityMode[CompatibilityMode["Word2003"] = 11] = "Word2003";
|
|
4
|
+
CompatibilityMode[CompatibilityMode["Word2007"] = 12] = "Word2007";
|
|
5
|
+
CompatibilityMode[CompatibilityMode["Word2010"] = 14] = "Word2010";
|
|
6
|
+
CompatibilityMode[CompatibilityMode["Word2013Plus"] = 15] = "Word2013Plus";
|
|
7
|
+
})(CompatibilityMode || (CompatibilityMode = {}));
|
|
8
|
+
//# sourceMappingURL=compatibility-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility-types.js","sourceRoot":"","sources":["../../../src/types/compatibility-types.ts"],"names":[],"mappings":"AASA,MAAM,CAAN,IAAY,iBASX;AATD,WAAY,iBAAiB;IAE3B,kEAAa,CAAA;IAEb,kEAAa,CAAA;IAEb,kEAAa,CAAA;IAEb,0EAAiB,CAAA;AACnB,CAAC,EATW,iBAAiB,KAAjB,iBAAiB,QAS5B","sourcesContent":["/**\n * Word compatibility mode versions.\n *\n * These map to Microsoft's internal version numbers used in the\n * w:compatSetting name=\"compatibilityMode\" value within settings.xml.\n *\n * Per MS-DOCX specification, the default when absent is 12 (Word 2007).\n * See: https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/90138c4d-eb18-4edc-aa6c-dfb799cb1d0d\n */\nexport enum CompatibilityMode {\n /** Word 2003 and earlier — uses MS-DOC feature set */\n Word2003 = 11,\n /** Word 2007 (ECMA-376 1st edition) — DEFAULT when absent */\n Word2007 = 12,\n /** Word 2010 (ISO/IEC 29500 with exclusions) */\n Word2010 = 14,\n /** Word 2013/2016/2019/365 (full modern features) */\n Word2013Plus = 15,\n}\n\n/**\n * A single w:compatSetting entry (name/uri/val triple).\n *\n * These are the modern extensibility mechanism for compatibility settings,\n * added in ECMA-376 2nd edition. They coexist with legacy boolean flags\n * in the Transitional schema.\n */\nexport interface CompatSetting {\n name: string;\n uri: string;\n val: string;\n}\n\n/**\n * Parsed compatibility settings from the w:compat block in settings.xml.\n */\nexport interface CompatibilityInfo {\n /** The numeric compatibility mode value (11, 12, 14, or 15) */\n mode: CompatibilityMode;\n\n /** Whether the document is in a legacy compatibility mode (below 15) */\n isLegacyMode: boolean;\n\n /** Modern w:compatSetting entries (name/uri/val triples) */\n compatSettings: CompatSetting[];\n\n /** Legacy boolean compat flags that are present and enabled (without w: prefix) */\n legacyFlags: string[];\n}\n"]}
|