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
package/src/core/Document.ts
CHANGED
|
@@ -3,31 +3,32 @@
|
|
|
3
3
|
* Provides a simple interface for creating DOCX files without managing ZIP and XML manually
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
6
|
+
import { parseOnOffAttribute } from '../utils/parsingHelpers.js';
|
|
7
|
+
import { Bookmark } from '../elements/Bookmark.js';
|
|
8
|
+
import { BookmarkManager } from '../elements/BookmarkManager.js';
|
|
9
|
+
import { Comment } from '../elements/Comment.js';
|
|
10
|
+
import { PreservedElement } from '../elements/PreservedElement.js';
|
|
11
|
+
import { CommentManager } from '../elements/CommentManager.js';
|
|
12
|
+
import { Endnote } from '../elements/Endnote.js';
|
|
13
|
+
import { EndnoteManager } from '../elements/EndnoteManager.js';
|
|
14
|
+
import { Field, ComplexField } from '../elements/Field.js';
|
|
15
|
+
import { Footnote } from '../elements/Footnote.js';
|
|
16
|
+
import { FootnoteManager } from '../elements/FootnoteManager.js';
|
|
17
|
+
import { Footer } from '../elements/Footer.js';
|
|
18
|
+
import { Header } from '../elements/Header.js';
|
|
19
|
+
import { HeaderFooterManager } from '../elements/HeaderFooterManager.js';
|
|
20
|
+
import { Hyperlink } from '../elements/Hyperlink.js';
|
|
21
|
+
import { Image } from '../elements/Image.js';
|
|
22
|
+
import { ImageManager } from '../elements/ImageManager.js';
|
|
23
|
+
import { ImageRun } from '../elements/ImageRun.js';
|
|
24
|
+
import { Paragraph, ParagraphContent, FieldLike } from '../elements/Paragraph.js';
|
|
25
|
+
import { RangeMarker } from '../elements/RangeMarker.js';
|
|
26
|
+
import { Revision, RevisionType } from '../elements/Revision.js';
|
|
27
|
+
import { RevisionManager } from '../elements/RevisionManager.js';
|
|
28
|
+
import { RevisionLocation } from '../elements/PropertyChangeTypes.js';
|
|
29
|
+
import { Run, RunFormatting } from '../elements/Run.js';
|
|
30
|
+
import { Shape } from '../elements/Shape.js';
|
|
31
|
+
import { TextBox } from '../elements/TextBox.js';
|
|
31
32
|
import {
|
|
32
33
|
RevisionValidator,
|
|
33
34
|
RevisionAutoFixer,
|
|
@@ -35,25 +36,33 @@ import {
|
|
|
35
36
|
AutoFixOptions,
|
|
36
37
|
ValidationResult,
|
|
37
38
|
AutoFixResult,
|
|
38
|
-
} from '../validation';
|
|
39
|
-
import { Section } from '../elements/Section';
|
|
40
|
-
import { StructuredDocumentTag } from '../elements/StructuredDocumentTag';
|
|
41
|
-
import { Table, TableBorder } from '../elements/Table';
|
|
42
|
-
import { TableCell } from '../elements/TableCell';
|
|
43
|
-
import { TableOfContentsElement } from '../elements/TableOfContentsElement';
|
|
44
|
-
import { resolveCellShading } from '../
|
|
39
|
+
} from '../validation/index.js';
|
|
40
|
+
import { Section } from '../elements/Section.js';
|
|
41
|
+
import { StructuredDocumentTag } from '../elements/StructuredDocumentTag.js';
|
|
42
|
+
import { Table, TableBorder } from '../elements/Table.js';
|
|
43
|
+
import { TableCell } from '../elements/TableCell.js';
|
|
44
|
+
import { TableOfContentsElement } from '../elements/TableOfContentsElement.js';
|
|
45
|
+
import { resolveCellShading } from '../processors/ShadingResolver.js';
|
|
45
46
|
import {
|
|
46
47
|
NumberingManager,
|
|
47
48
|
NumberingConsolidationOptions,
|
|
48
49
|
NumberingConsolidationResult,
|
|
49
|
-
} from '../formatting/NumberingManager';
|
|
50
|
-
import { Style, StyleProperties } from '../formatting/Style';
|
|
51
|
-
import { StylesManager } from '../formatting/StylesManager';
|
|
52
|
-
import { FormatOptions, StyleApplyOptions } from '../types/formatting';
|
|
53
|
-
import {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
} from '../formatting/NumberingManager.js';
|
|
51
|
+
import { Style, StyleProperties } from '../formatting/Style.js';
|
|
52
|
+
import { StylesManager } from '../formatting/StylesManager.js';
|
|
53
|
+
import { FormatOptions, StyleApplyOptions } from '../types/formatting.js';
|
|
54
|
+
import {
|
|
55
|
+
CompatibilityMode,
|
|
56
|
+
CompatibilityInfo,
|
|
57
|
+
CompatSetting,
|
|
58
|
+
} from '../types/compatibility-types.js';
|
|
59
|
+
import {
|
|
60
|
+
DocumentProtection,
|
|
61
|
+
RevisionViewSettings,
|
|
62
|
+
WebSettingsInfo,
|
|
63
|
+
} from '../types/settings-types.js';
|
|
64
|
+
import { CompatibilityUpgrader, UpgradeReport } from '../processors/CompatibilityUpgrader.js';
|
|
65
|
+
import { MODERN_COMPAT_SETTINGS } from '../constants/legacyCompatFlags.js';
|
|
57
66
|
// ListNormalizationOptions and ListNormalizationReport removed - normalizeTableLists moved to consumer
|
|
58
67
|
import {
|
|
59
68
|
ApplyStylesOptions,
|
|
@@ -61,10 +70,10 @@ import {
|
|
|
61
70
|
StyleConfig,
|
|
62
71
|
StyleRunFormatting,
|
|
63
72
|
StyleParagraphFormatting,
|
|
64
|
-
} from '../types/styleConfig';
|
|
73
|
+
} from '../types/styleConfig.js';
|
|
65
74
|
// ListNormalizer import removed - moved to consumer
|
|
66
|
-
import { defaultLogger, ILogger, getGlobalLogger, createScopedLogger } from '../utils/logger';
|
|
67
|
-
import { UNITS } from '../utils/units';
|
|
75
|
+
import { defaultLogger, ILogger, getGlobalLogger, createScopedLogger } from '../utils/logger.js';
|
|
76
|
+
import { UNITS } from '../utils/units.js';
|
|
68
77
|
|
|
69
78
|
// Create scoped logger for Document operations
|
|
70
79
|
function getLogger(): ILogger {
|
|
@@ -72,71 +81,36 @@ function getLogger(): ILogger {
|
|
|
72
81
|
}
|
|
73
82
|
// Raw XML revision acceptance - used at load time BEFORE parsing
|
|
74
83
|
// cleanupRevisionMetadata - cleanup metadata files after in-memory acceptance
|
|
75
|
-
import { acceptAllRevisions, cleanupRevisionMetadata } from '../
|
|
84
|
+
import { acceptAllRevisions, cleanupRevisionMetadata } from '../processors/acceptRevisions.js';
|
|
76
85
|
// In-memory revision acceptance - used AFTER parsing, allows subsequent modifications
|
|
77
|
-
import { acceptRevisionsInMemory } from '../
|
|
78
|
-
import { stripTrackedChanges } from '../
|
|
79
|
-
import { diffText, diffHasUnchangedParts } from '../utils/textDiff';
|
|
80
|
-
import { XMLBuilder } from '../xml/XMLBuilder';
|
|
81
|
-
import { XMLParser } from '../xml/XMLParser';
|
|
82
|
-
import { DocumentTrackingContext } from '../tracking/DocumentTrackingContext';
|
|
83
|
-
import type { TrackingContext } from '../tracking/TrackingContext';
|
|
84
|
-
import { ZipHandler } from '../zip/ZipHandler';
|
|
85
|
-
import { DOCX_PATHS } from '../zip/types';
|
|
86
|
-
import { DocumentGenerator } from './DocumentGenerator';
|
|
87
|
-
import { DocumentIdManager } from './DocumentIdManager';
|
|
88
|
-
import { DocumentParser } from './DocumentParser';
|
|
89
|
-
import { DocumentValidator } from './DocumentValidator';
|
|
90
|
-
import {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
lastModifiedBy?: string;
|
|
106
|
-
revision?: number;
|
|
107
|
-
created?: Date;
|
|
108
|
-
modified?: Date;
|
|
109
|
-
language?: string;
|
|
110
|
-
category?: string;
|
|
111
|
-
contentStatus?: string;
|
|
112
|
-
|
|
113
|
-
// Extended Properties (docProps/app.xml)
|
|
114
|
-
application?: string;
|
|
115
|
-
appVersion?: string;
|
|
116
|
-
company?: string;
|
|
117
|
-
manager?: string;
|
|
118
|
-
version?: string;
|
|
119
|
-
|
|
120
|
-
// Custom Properties (docProps/custom.xml)
|
|
121
|
-
customProperties?: Record<string, string | number | boolean | Date>;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Document part representation
|
|
126
|
-
* Represents any part within a DOCX package (XML, binary, etc.)
|
|
127
|
-
*/
|
|
128
|
-
export interface DocumentPart {
|
|
129
|
-
/** Part name/path within the package */
|
|
130
|
-
name: string;
|
|
131
|
-
/** Part content (string for XML/text, Buffer for binary) */
|
|
132
|
-
content: string | Buffer;
|
|
133
|
-
/** MIME content type */
|
|
134
|
-
contentType?: string;
|
|
135
|
-
/** Whether the part is binary */
|
|
136
|
-
isBinary?: boolean;
|
|
137
|
-
/** Part size in bytes */
|
|
138
|
-
size?: number;
|
|
139
|
-
}
|
|
86
|
+
import { acceptRevisionsInMemory } from '../processors/InMemoryRevisionAcceptor.js';
|
|
87
|
+
import { stripTrackedChanges } from '../processors/stripTrackedChanges.js';
|
|
88
|
+
import { diffText, diffHasUnchangedParts } from '../utils/textDiff.js';
|
|
89
|
+
import { XMLBuilder } from '../xml/XMLBuilder.js';
|
|
90
|
+
import { XMLParser } from '../xml/XMLParser.js';
|
|
91
|
+
import { DocumentTrackingContext } from '../tracking/DocumentTrackingContext.js';
|
|
92
|
+
import type { TrackingContext } from '../tracking/TrackingContext.js';
|
|
93
|
+
import { ZipHandler } from '../zip/ZipHandler.js';
|
|
94
|
+
import { DOCX_PATHS } from '../zip/types.js';
|
|
95
|
+
import { DocumentGenerator } from './DocumentGenerator.js';
|
|
96
|
+
import { DocumentIdManager } from './DocumentIdManager.js';
|
|
97
|
+
import { DocumentParser } from './DocumentParser.js';
|
|
98
|
+
import { DocumentValidator } from './DocumentValidator.js';
|
|
99
|
+
import {
|
|
100
|
+
DocumentEventEmitter,
|
|
101
|
+
type DocumentEventListener,
|
|
102
|
+
type DocumentEventType,
|
|
103
|
+
} from './DocumentEvents.js';
|
|
104
|
+
import { RelationshipManager } from './RelationshipManager.js';
|
|
105
|
+
import { RelationshipType } from './Relationship.js';
|
|
106
|
+
import { BodyElement } from './DocumentContent.js';
|
|
107
|
+
import { optimizeImage, ImageOptimizationResult } from '../images/ImageOptimizer.js';
|
|
108
|
+
|
|
109
|
+
// DocumentProperties / DocumentPart now live in `src/types/document-types.ts`
|
|
110
|
+
// to break the Document ↔ DocumentParser/Generator/Validator cycle.
|
|
111
|
+
// They are re-exported below for backward compat.
|
|
112
|
+
export type { DocumentProperties, DocumentPart } from '../types/document-types.js';
|
|
113
|
+
import type { DocumentProperties, DocumentPart } from '../types/document-types.js';
|
|
140
114
|
|
|
141
115
|
/**
|
|
142
116
|
* Document creation options
|
|
@@ -355,6 +329,23 @@ export class Document {
|
|
|
355
329
|
private _originalCommentsXml?: string;
|
|
356
330
|
private _commentsModified = false;
|
|
357
331
|
private _originalCommentCompanionFiles = new Map<string, string>();
|
|
332
|
+
|
|
333
|
+
/** Event emitter for lifecycle and mutation events. */
|
|
334
|
+
private _events = new DocumentEventEmitter();
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Serialization queue for save / toBuffer operations.
|
|
338
|
+
*
|
|
339
|
+
* Document is single-threaded by design — `prepareSave()` mutates shared
|
|
340
|
+
* managers (StylesManager, NumberingManager, ImageManager) without
|
|
341
|
+
* locking, so two concurrent saves would race on those managers and on
|
|
342
|
+
* the shared `zipHandler` files. The lock chains save / toBuffer calls
|
|
343
|
+
* onto a serial Promise so callers can fire `Promise.all([save(a),
|
|
344
|
+
* save(b)])` without corrupting state. Errors do not poison the queue —
|
|
345
|
+
* a failed save still releases the next waiter.
|
|
346
|
+
*/
|
|
347
|
+
private _saveQueue: Promise<unknown> = Promise.resolve();
|
|
348
|
+
|
|
358
349
|
/** Parts explicitly removed via removePart() — skip regeneration during save */
|
|
359
350
|
private _removedParts = new Set<string>();
|
|
360
351
|
|
|
@@ -796,7 +787,9 @@ export class Document {
|
|
|
796
787
|
const zipHandler = new ZipHandler();
|
|
797
788
|
await zipHandler.load(filePath);
|
|
798
789
|
|
|
799
|
-
|
|
790
|
+
const doc = await Document.initializeFromZip(zipHandler, options);
|
|
791
|
+
doc._events.emit('afterLoad', { source: 'file', path: filePath });
|
|
792
|
+
return doc;
|
|
800
793
|
}
|
|
801
794
|
|
|
802
795
|
/**
|
|
@@ -834,7 +827,9 @@ export class Document {
|
|
|
834
827
|
const zipHandler = new ZipHandler();
|
|
835
828
|
await zipHandler.loadFromBuffer(buffer);
|
|
836
829
|
|
|
837
|
-
|
|
830
|
+
const doc = await Document.initializeFromZip(zipHandler, options);
|
|
831
|
+
doc._events.emit('afterLoad', { source: 'buffer' });
|
|
832
|
+
return doc;
|
|
838
833
|
}
|
|
839
834
|
|
|
840
835
|
/**
|
|
@@ -975,32 +970,67 @@ export class Document {
|
|
|
975
970
|
}
|
|
976
971
|
}
|
|
977
972
|
|
|
978
|
-
//
|
|
979
|
-
|
|
980
|
-
|
|
973
|
+
// Helper: parse a settings-level CT_OnOff flag. Returns undefined when the
|
|
974
|
+
// element is absent, or the actual boolean (respecting w:val's ST_OnOff
|
|
975
|
+
// value — "0"/"1"/"true"/"false"/"on"/"off") when present. A bare element
|
|
976
|
+
// without w:val defaults to true per ECMA-376 §17.17.4.
|
|
977
|
+
const parseSettingCtOnOff = (tagName: string): boolean | undefined => {
|
|
978
|
+
const re = new RegExp(`<${tagName}\\b([^>]*)\\/?>`);
|
|
979
|
+
const m = re.exec(settingsXml);
|
|
980
|
+
if (!m) return undefined;
|
|
981
|
+
const attrs = m[1] ?? '';
|
|
982
|
+
const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
|
|
983
|
+
if (!valMatch || valMatch[1] === undefined) return true;
|
|
984
|
+
const v = valMatch[1].toLowerCase();
|
|
985
|
+
return v !== '0' && v !== 'false' && v !== 'off';
|
|
986
|
+
};
|
|
987
|
+
|
|
988
|
+
// Parse w:doNotTrackFormatting - CT_OnOff; when true, formatting tracking
|
|
989
|
+
// is disabled. (Previously tested presence only, so `<w:doNotTrackFormatting
|
|
990
|
+
// w:val="0"/>` was silently taken to disable tracking even though it means
|
|
991
|
+
// "do not [do not track formatting]" = track formatting normally.)
|
|
992
|
+
const doNotTrackFormattingVal = parseSettingCtOnOff('w:doNotTrackFormatting');
|
|
993
|
+
if (doNotTrackFormattingVal === true) {
|
|
981
994
|
this.trackFormatting = false;
|
|
982
|
-
}
|
|
983
|
-
// Parse w:trackFormatting - explicit presence means formatting tracking is enabled
|
|
984
|
-
const hasTrackFormatting = /<w:trackFormatting\b[^>]*\/?>/.test(settingsXml);
|
|
985
|
-
if (hasTrackFormatting) {
|
|
995
|
+
} else if (doNotTrackFormattingVal === false) {
|
|
986
996
|
this.trackFormatting = true;
|
|
987
997
|
}
|
|
998
|
+
// Parse w:trackFormatting - CT_OnOff; explicit true enables formatting tracking.
|
|
999
|
+
const trackFormattingVal = parseSettingCtOnOff('w:trackFormatting');
|
|
1000
|
+
if (trackFormattingVal !== undefined) {
|
|
1001
|
+
this.trackFormatting = trackFormattingVal;
|
|
1002
|
+
}
|
|
988
1003
|
|
|
989
|
-
// Parse w:revisionView
|
|
1004
|
+
// Parse w:revisionView per ECMA-376 §17.15.1.77 (CT_TrackChangesView).
|
|
1005
|
+
// @w:insDel / @w:formatting / @w:inkAnnotations are ST_OnOff attributes;
|
|
1006
|
+
// accept every literal (1/0/true/false/on/off). Prior code used `!== '0'`
|
|
1007
|
+
// which flipped "false" and "off" to true, silently misreporting the
|
|
1008
|
+
// tracked-changes display configuration.
|
|
990
1009
|
const revisionViewMatch = /<w:revisionView\b([^>]*)\/?>/.exec(settingsXml);
|
|
991
1010
|
if (revisionViewMatch) {
|
|
992
1011
|
const attrs = revisionViewMatch[1] || '';
|
|
993
1012
|
const insDelMatch = /w:insDel\s*=\s*"([^"]*)"/.exec(attrs);
|
|
994
1013
|
const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
|
|
995
1014
|
const inkMatch = /w:inkAnnotations\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1015
|
+
// CT_TrackChangesView also carries w:markup (all revision markup)
|
|
1016
|
+
// and w:comments (balloon visibility). Both were previously dropped
|
|
1017
|
+
// on the parser even though the element was already extracted.
|
|
1018
|
+
const markupMatch = /w:markup\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1019
|
+
const commentsMatch = /w:comments\s*=\s*"([^"]*)"/.exec(attrs);
|
|
996
1020
|
if (insDelMatch?.[1] !== undefined) {
|
|
997
|
-
this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1]
|
|
1021
|
+
this.revisionViewSettings.showInsertionsAndDeletions = parseOnOffAttribute(insDelMatch[1]);
|
|
998
1022
|
}
|
|
999
1023
|
if (formattingMatch?.[1] !== undefined) {
|
|
1000
|
-
this.revisionViewSettings.showFormatting = formattingMatch[1]
|
|
1024
|
+
this.revisionViewSettings.showFormatting = parseOnOffAttribute(formattingMatch[1]);
|
|
1001
1025
|
}
|
|
1002
1026
|
if (inkMatch?.[1] !== undefined) {
|
|
1003
|
-
this.revisionViewSettings.showInkAnnotations = inkMatch[1]
|
|
1027
|
+
this.revisionViewSettings.showInkAnnotations = parseOnOffAttribute(inkMatch[1]);
|
|
1028
|
+
}
|
|
1029
|
+
if (markupMatch?.[1] !== undefined) {
|
|
1030
|
+
this.revisionViewSettings.showMarkup = parseOnOffAttribute(markupMatch[1]);
|
|
1031
|
+
}
|
|
1032
|
+
if (commentsMatch?.[1] !== undefined) {
|
|
1033
|
+
this.revisionViewSettings.showComments = parseOnOffAttribute(commentsMatch[1]);
|
|
1004
1034
|
}
|
|
1005
1035
|
}
|
|
1006
1036
|
|
|
@@ -1012,9 +1042,19 @@ export class Document {
|
|
|
1012
1042
|
const enforcementMatch = /w:enforcement\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1013
1043
|
if (editMatch?.[1]) {
|
|
1014
1044
|
const edit = editMatch[1] as 'readOnly' | 'comments' | 'trackedChanges' | 'forms';
|
|
1015
|
-
|
|
1045
|
+
// @w:enforcement is ST_OnOff — honour every literal. Default true when absent
|
|
1046
|
+
// per ECMA-376 §17.15.1.29. Prior `!== '0'` missed "false" and "off".
|
|
1047
|
+
const enforcement = enforcementMatch?.[1] ? parseOnOffAttribute(enforcementMatch[1]) : true;
|
|
1016
1048
|
this.documentProtection = { edit, enforcement };
|
|
1017
1049
|
|
|
1050
|
+
// `w:formatting` per CT_DocProtect §17.15.1.29 — ST_OnOff. When true,
|
|
1051
|
+
// formatting changes are allowed even under edit protection. Parse
|
|
1052
|
+
// with parseOnOffAttribute so every ST_OnOff literal maps correctly.
|
|
1053
|
+
const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1054
|
+
if (formattingMatch?.[1] !== undefined) {
|
|
1055
|
+
this.documentProtection.formatting = parseOnOffAttribute(formattingMatch[1]);
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1018
1058
|
// Parse optional crypto attributes
|
|
1019
1059
|
const cryptProviderMatch = /w:cryptProviderType\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1020
1060
|
const cryptAlgClassMatch = /w:cryptAlgorithmClass\s*=\s*"([^"]*)"/.exec(attrs);
|
|
@@ -1036,6 +1076,20 @@ export class Document {
|
|
|
1036
1076
|
this.documentProtection.cryptSpinCount = parseInt(cryptSpinMatch[1], 10);
|
|
1037
1077
|
if (hashMatch?.[1]) this.documentProtection.hash = hashMatch[1];
|
|
1038
1078
|
if (saltMatch?.[1]) this.documentProtection.salt = saltMatch[1];
|
|
1079
|
+
|
|
1080
|
+
// Modern Word 2013+ crypto attributes (ISO/IEC 29500-4 §13).
|
|
1081
|
+
// Previously dropped on parse — a password-protected document
|
|
1082
|
+
// saved by modern Word lost its hash/salt on any programmatic
|
|
1083
|
+
// resave because the legacy `hash`/`salt` regex no longer matches
|
|
1084
|
+
// the modern `hashValue`/`saltValue` attribute names.
|
|
1085
|
+
const algorithmNameMatch = /w:algorithmName\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1086
|
+
const hashValueMatch = /w:hashValue\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1087
|
+
const saltValueMatch = /w:saltValue\s*=\s*"([^"]*)"/.exec(attrs);
|
|
1088
|
+
if (algorithmNameMatch?.[1]) {
|
|
1089
|
+
this.documentProtection.algorithmName = algorithmNameMatch[1];
|
|
1090
|
+
}
|
|
1091
|
+
if (hashValueMatch?.[1]) this.documentProtection.hashValue = hashValueMatch[1];
|
|
1092
|
+
if (saltValueMatch?.[1]) this.documentProtection.saltValue = saltValueMatch[1];
|
|
1039
1093
|
}
|
|
1040
1094
|
}
|
|
1041
1095
|
|
|
@@ -1069,30 +1123,25 @@ export class Document {
|
|
|
1069
1123
|
this._documentView = viewMatch[1];
|
|
1070
1124
|
}
|
|
1071
1125
|
|
|
1072
|
-
//
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1126
|
+
// CT_OnOff settings flags (ECMA-376 §17.15.1). Each honours w:val via the
|
|
1127
|
+
// parseSettingCtOnOff helper defined above — previously these used a simple
|
|
1128
|
+
// presence-detect regex and silently flipped explicit `<w:X w:val="0"/>` to
|
|
1129
|
+
// true, corrupting any source document that recorded an explicit-off state.
|
|
1130
|
+
const evenAndOddHeadersVal = parseSettingCtOnOff('w:evenAndOddHeaders');
|
|
1131
|
+
if (evenAndOddHeadersVal !== undefined) this._evenAndOddHeaders = evenAndOddHeadersVal;
|
|
1076
1132
|
|
|
1077
|
-
|
|
1078
|
-
if (
|
|
1079
|
-
this._mirrorMargins = true;
|
|
1080
|
-
}
|
|
1133
|
+
const mirrorMarginsVal = parseSettingCtOnOff('w:mirrorMargins');
|
|
1134
|
+
if (mirrorMarginsVal !== undefined) this._mirrorMargins = mirrorMarginsVal;
|
|
1081
1135
|
|
|
1082
|
-
|
|
1083
|
-
if (
|
|
1084
|
-
this._autoHyphenation = true;
|
|
1085
|
-
}
|
|
1136
|
+
const autoHyphenationVal = parseSettingCtOnOff('w:autoHyphenation');
|
|
1137
|
+
if (autoHyphenationVal !== undefined) this._autoHyphenation = autoHyphenationVal;
|
|
1086
1138
|
|
|
1087
|
-
|
|
1088
|
-
if (
|
|
1089
|
-
this._hideSpellingErrors = true;
|
|
1090
|
-
}
|
|
1139
|
+
const hideSpellingErrorsVal = parseSettingCtOnOff('w:hideSpellingErrors');
|
|
1140
|
+
if (hideSpellingErrorsVal !== undefined) this._hideSpellingErrors = hideSpellingErrorsVal;
|
|
1091
1141
|
|
|
1092
|
-
|
|
1093
|
-
if (
|
|
1094
|
-
this._hideGrammaticalErrors =
|
|
1095
|
-
}
|
|
1142
|
+
const hideGrammaticalErrorsVal = parseSettingCtOnOff('w:hideGrammaticalErrors');
|
|
1143
|
+
if (hideGrammaticalErrorsVal !== undefined)
|
|
1144
|
+
this._hideGrammaticalErrors = hideGrammaticalErrorsVal;
|
|
1096
1145
|
|
|
1097
1146
|
// Parse w:defaultTabStop per ECMA-376 Part 1 §17.15.1.25
|
|
1098
1147
|
const defaultTabStopMatch = /<w:defaultTabStop\s+w:val\s*=\s*"(\d+)"\s*\/?>/.exec(settingsXml);
|
|
@@ -1100,25 +1149,18 @@ export class Document {
|
|
|
1100
1149
|
this._defaultTabStop = parseInt(defaultTabStopMatch[1], 10);
|
|
1101
1150
|
}
|
|
1102
1151
|
|
|
1103
|
-
|
|
1104
|
-
if (
|
|
1105
|
-
this._updateFields = true;
|
|
1106
|
-
}
|
|
1152
|
+
const updateFieldsVal = parseSettingCtOnOff('w:updateFields');
|
|
1153
|
+
if (updateFieldsVal !== undefined) this._updateFields = updateFieldsVal;
|
|
1107
1154
|
|
|
1108
|
-
|
|
1109
|
-
if (
|
|
1110
|
-
this._embedTrueTypeFonts = true;
|
|
1111
|
-
}
|
|
1155
|
+
const embedTrueTypeFontsVal = parseSettingCtOnOff('w:embedTrueTypeFonts');
|
|
1156
|
+
if (embedTrueTypeFontsVal !== undefined) this._embedTrueTypeFonts = embedTrueTypeFontsVal;
|
|
1112
1157
|
|
|
1113
|
-
|
|
1114
|
-
if (
|
|
1115
|
-
this._saveSubsetFonts = true;
|
|
1116
|
-
}
|
|
1158
|
+
const saveSubsetFontsVal = parseSettingCtOnOff('w:saveSubsetFonts');
|
|
1159
|
+
if (saveSubsetFontsVal !== undefined) this._saveSubsetFonts = saveSubsetFontsVal;
|
|
1117
1160
|
|
|
1118
|
-
//
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
}
|
|
1161
|
+
// w:doNotTrackMoves — tracked-changes-specific CT_OnOff flag.
|
|
1162
|
+
const doNotTrackMovesVal = parseSettingCtOnOff('w:doNotTrackMoves');
|
|
1163
|
+
if (doNotTrackMovesVal !== undefined) this._doNotTrackMoves = doNotTrackMovesVal;
|
|
1122
1164
|
|
|
1123
1165
|
// Parse w:decimalSymbol per ECMA-376 Part 1 §17.15.1.23
|
|
1124
1166
|
const decimalMatch = /<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
|
|
@@ -1615,6 +1657,7 @@ export class Document {
|
|
|
1615
1657
|
}
|
|
1616
1658
|
|
|
1617
1659
|
this.bodyElements.push(paragraph);
|
|
1660
|
+
this._emitElementAdded(paragraph, this.bodyElements.length - 1);
|
|
1618
1661
|
return this;
|
|
1619
1662
|
}
|
|
1620
1663
|
|
|
@@ -1656,7 +1699,10 @@ export class Document {
|
|
|
1656
1699
|
if (text) {
|
|
1657
1700
|
para.addText(text);
|
|
1658
1701
|
}
|
|
1702
|
+
// Apply global defaults (font / size) if registered.
|
|
1703
|
+
Document.applyGlobalDefaultsToParagraph(para);
|
|
1659
1704
|
this.bodyElements.push(para);
|
|
1705
|
+
this._emitElementAdded(para, this.bodyElements.length - 1);
|
|
1660
1706
|
return para;
|
|
1661
1707
|
}
|
|
1662
1708
|
|
|
@@ -1762,6 +1808,7 @@ export class Document {
|
|
|
1762
1808
|
}
|
|
1763
1809
|
|
|
1764
1810
|
this.bodyElements.push(table);
|
|
1811
|
+
this._emitElementAdded(table, this.bodyElements.length - 1);
|
|
1765
1812
|
return this;
|
|
1766
1813
|
}
|
|
1767
1814
|
|
|
@@ -1783,6 +1830,7 @@ export class Document {
|
|
|
1783
1830
|
*/
|
|
1784
1831
|
addStructuredDocumentTag(sdt: StructuredDocumentTag): this {
|
|
1785
1832
|
this.bodyElements.push(sdt);
|
|
1833
|
+
this._emitElementAdded(sdt, this.bodyElements.length - 1);
|
|
1786
1834
|
return this;
|
|
1787
1835
|
}
|
|
1788
1836
|
|
|
@@ -1818,6 +1866,7 @@ export class Document {
|
|
|
1818
1866
|
const table = new Table(rows, columns);
|
|
1819
1867
|
table._setStylesManager(this.stylesManager);
|
|
1820
1868
|
this.bodyElements.push(table);
|
|
1869
|
+
this._emitElementAdded(table, this.bodyElements.length - 1);
|
|
1821
1870
|
return table;
|
|
1822
1871
|
}
|
|
1823
1872
|
|
|
@@ -1844,6 +1893,7 @@ export class Document {
|
|
|
1844
1893
|
const table = Table.fromCSV(csv, delimiter);
|
|
1845
1894
|
table._setStylesManager(this.stylesManager);
|
|
1846
1895
|
this.bodyElements.push(table);
|
|
1896
|
+
this._emitElementAdded(table, this.bodyElements.length - 1);
|
|
1847
1897
|
return table;
|
|
1848
1898
|
}
|
|
1849
1899
|
|
|
@@ -1949,6 +1999,75 @@ export class Document {
|
|
|
1949
1999
|
return result;
|
|
1950
2000
|
}
|
|
1951
2001
|
|
|
2002
|
+
/**
|
|
2003
|
+
* Lazy iterator over every paragraph in the document. Yields the same
|
|
2004
|
+
* set as `getAllParagraphs()` (including paragraphs inside table cells
|
|
2005
|
+
* and nested SDTs) without materialising the full array — for memory
|
|
2006
|
+
* pipelines over very large documents.
|
|
2007
|
+
*
|
|
2008
|
+
* Mutations during iteration are not protected — callers must not
|
|
2009
|
+
* structurally mutate the document while iterating.
|
|
2010
|
+
*/
|
|
2011
|
+
*iterateParagraphs(): IterableIterator<Paragraph> {
|
|
2012
|
+
yield* Document.walkParagraphs(this.bodyElements);
|
|
2013
|
+
}
|
|
2014
|
+
|
|
2015
|
+
private static *walkParagraphs(elements: BodyElement[]): IterableIterator<Paragraph> {
|
|
2016
|
+
for (const element of elements) {
|
|
2017
|
+
if (element instanceof Paragraph) {
|
|
2018
|
+
yield element;
|
|
2019
|
+
} else if (element instanceof Table) {
|
|
2020
|
+
for (const row of element.getRows()) {
|
|
2021
|
+
for (const cell of row.getCells()) {
|
|
2022
|
+
for (const cellPara of cell.getParagraphs()) {
|
|
2023
|
+
yield cellPara;
|
|
2024
|
+
}
|
|
2025
|
+
}
|
|
2026
|
+
}
|
|
2027
|
+
} else if (element instanceof StructuredDocumentTag) {
|
|
2028
|
+
yield* Document.walkParagraphs(element.getContent() as BodyElement[]);
|
|
2029
|
+
}
|
|
2030
|
+
}
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
/**
|
|
2034
|
+
* Lazy iterator over the top-level body elements (paragraphs, tables,
|
|
2035
|
+
* SDTs, custom XML blocks) in document order. Use this when table or
|
|
2036
|
+
* SDT boundaries matter to your pipeline.
|
|
2037
|
+
*/
|
|
2038
|
+
*iterateBodyElements(): IterableIterator<BodyElement> {
|
|
2039
|
+
for (const element of this.bodyElements) {
|
|
2040
|
+
yield element;
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
|
|
2044
|
+
/**
|
|
2045
|
+
* Lazy iterator that yields each section in the document along with
|
|
2046
|
+
* the body elements belonging to it. A section break is identified by
|
|
2047
|
+
* a paragraph carrying its own `sectPr` (CT_SectPr); the document's
|
|
2048
|
+
* root `Section` closes the final group.
|
|
2049
|
+
*
|
|
2050
|
+
* @yields `{ sectPr, elements }` where `sectPr` is the raw section-
|
|
2051
|
+
* properties marker (string or parsed object) for inline section
|
|
2052
|
+
* breaks, or the document's root `Section` for the trailing group.
|
|
2053
|
+
*/
|
|
2054
|
+
*iterateSections(): IterableIterator<{
|
|
2055
|
+
sectPr: string | Record<string, unknown> | Section | null;
|
|
2056
|
+
elements: BodyElement[];
|
|
2057
|
+
}> {
|
|
2058
|
+
let current: BodyElement[] = [];
|
|
2059
|
+
for (const element of this.bodyElements) {
|
|
2060
|
+
current.push(element);
|
|
2061
|
+
if (element instanceof Paragraph && element.formatting.sectPr) {
|
|
2062
|
+
yield { sectPr: element.formatting.sectPr, elements: current };
|
|
2063
|
+
current = [];
|
|
2064
|
+
}
|
|
2065
|
+
}
|
|
2066
|
+
if (current.length > 0) {
|
|
2067
|
+
yield { sectPr: this.section ?? null, elements: current };
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
|
|
1952
2071
|
/**
|
|
1953
2072
|
* Gets all paragraphs in the document (alias for getAllParagraphs)
|
|
1954
2073
|
* @returns Array of all paragraphs recursively
|
|
@@ -2065,6 +2184,7 @@ export class Document {
|
|
|
2065
2184
|
*/
|
|
2066
2185
|
addBodyElement(element: BodyElement): this {
|
|
2067
2186
|
this.bodyElements.push(element);
|
|
2187
|
+
this._emitElementAdded(element, this.bodyElements.length - 1);
|
|
2068
2188
|
return this;
|
|
2069
2189
|
}
|
|
2070
2190
|
|
|
@@ -2510,8 +2630,25 @@ export class Document {
|
|
|
2510
2630
|
* ```
|
|
2511
2631
|
*/
|
|
2512
2632
|
async save(filePath: string): Promise<void> {
|
|
2633
|
+
return this.withSaveLock(() => this.saveImpl(filePath));
|
|
2634
|
+
}
|
|
2635
|
+
|
|
2636
|
+
/**
|
|
2637
|
+
* Chains an operation onto the serial save queue. Concurrent callers
|
|
2638
|
+
* (e.g., `Promise.all([doc.save(a), doc.save(b)])`) are serialised so
|
|
2639
|
+
* `prepareSave()` and the underlying ZIP cannot race. The chain
|
|
2640
|
+
* survives errors — a failed operation releases the next waiter.
|
|
2641
|
+
*/
|
|
2642
|
+
private withSaveLock<T>(operation: () => Promise<T>): Promise<T> {
|
|
2643
|
+
const next = this._saveQueue.then(operation, operation);
|
|
2644
|
+
this._saveQueue = next.catch(() => undefined);
|
|
2645
|
+
return next;
|
|
2646
|
+
}
|
|
2647
|
+
|
|
2648
|
+
private async saveImpl(filePath: string): Promise<void> {
|
|
2513
2649
|
const logger = getLogger();
|
|
2514
2650
|
logger.info('Saving document', { path: filePath, paragraphs: this.getParagraphCount() });
|
|
2651
|
+
this._events.emit('beforeSave', { filePath });
|
|
2515
2652
|
|
|
2516
2653
|
// Use atomic save pattern: save to temp file, then rename
|
|
2517
2654
|
// This prevents partial/corrupted saves if operation fails mid-way
|
|
@@ -2542,6 +2679,7 @@ export class Document {
|
|
|
2542
2679
|
saveSucceeded = true;
|
|
2543
2680
|
this.clearSaveStateSnapshot();
|
|
2544
2681
|
logger.info('Document saved', { path: filePath });
|
|
2682
|
+
this._events.emit('afterSave', { filePath });
|
|
2545
2683
|
} catch (error: unknown) {
|
|
2546
2684
|
// Restore state snapshot on failure - allows retry without data loss
|
|
2547
2685
|
this.restoreSaveStateSnapshot();
|
|
@@ -2592,8 +2730,13 @@ export class Document {
|
|
|
2592
2730
|
* ```
|
|
2593
2731
|
*/
|
|
2594
2732
|
async toBuffer(): Promise<Buffer> {
|
|
2733
|
+
return this.withSaveLock(() => this.toBufferImpl());
|
|
2734
|
+
}
|
|
2735
|
+
|
|
2736
|
+
private async toBufferImpl(): Promise<Buffer> {
|
|
2595
2737
|
const logger = getLogger();
|
|
2596
2738
|
logger.info('Generating document buffer', { paragraphs: this.getParagraphCount() });
|
|
2739
|
+
this._events.emit('beforeSave', {});
|
|
2597
2740
|
|
|
2598
2741
|
// Track whether generation succeeded for proper cleanup
|
|
2599
2742
|
let generateSucceeded = false;
|
|
@@ -2621,6 +2764,7 @@ export class Document {
|
|
|
2621
2764
|
generateSucceeded = true;
|
|
2622
2765
|
this.clearSaveStateSnapshot();
|
|
2623
2766
|
logger.info('Document buffer generated', { bufferSize: buffer.length });
|
|
2767
|
+
this._events.emit('afterSave', { bufferSize: buffer.length });
|
|
2624
2768
|
return buffer;
|
|
2625
2769
|
} catch (error: unknown) {
|
|
2626
2770
|
// Restore state snapshot on failure - allows retry without data loss
|
|
@@ -3335,17 +3479,46 @@ export class Document {
|
|
|
3335
3479
|
if (!this._originalWebSettingsXml) {
|
|
3336
3480
|
return 0;
|
|
3337
3481
|
}
|
|
3338
|
-
const
|
|
3482
|
+
const original = this._originalWebSettingsXml;
|
|
3483
|
+
const matches = original.match(/<w:div\b/g);
|
|
3339
3484
|
const count = matches ? matches.length : 0;
|
|
3340
3485
|
if (count === 0) {
|
|
3341
3486
|
return 0;
|
|
3342
3487
|
}
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
|
|
3488
|
+
// Mutate via try/catch + post-mutation validation. If the regex match
|
|
3489
|
+
// accidentally produces malformed XML (e.g., a partial `<w:divs>` open
|
|
3490
|
+
// tag with no close), revert to the pre-mutation snapshot rather than
|
|
3491
|
+
// persisting corruption.
|
|
3492
|
+
try {
|
|
3493
|
+
const mutated = original.replace(/<w:divs>[\s\S]*?<\/w:divs>/g, '');
|
|
3494
|
+
// Sanity check: result must still parse as well-formed root XML.
|
|
3495
|
+
// `<?xml ...?>` prologue must survive, and tag balance must match.
|
|
3496
|
+
if (!Document.isWellFormedXml(mutated)) {
|
|
3497
|
+
getLogger().warn('stripWebDivs produced malformed XML; reverting');
|
|
3498
|
+
return 0;
|
|
3499
|
+
}
|
|
3500
|
+
this._originalWebSettingsXml = mutated;
|
|
3501
|
+
this._webSettingsModified = true;
|
|
3502
|
+
return count;
|
|
3503
|
+
} catch (err) {
|
|
3504
|
+
getLogger().warn('stripWebDivs failed; reverting', { error: String(err) });
|
|
3505
|
+
this._originalWebSettingsXml = original;
|
|
3506
|
+
return 0;
|
|
3507
|
+
}
|
|
3508
|
+
}
|
|
3509
|
+
|
|
3510
|
+
/**
|
|
3511
|
+
* Lightweight well-formedness check for in-place XML mutations.
|
|
3512
|
+
* Verifies tag balance (open/close counts match for each element name)
|
|
3513
|
+
* and that any XML prologue remains intact. Sufficient for catching
|
|
3514
|
+
* regex string.replace() failures that bisect a tag.
|
|
3515
|
+
*/
|
|
3516
|
+
private static isWellFormedXml(xml: string): boolean {
|
|
3517
|
+
if (xml.length === 0) return true;
|
|
3518
|
+
// Count opening and closing tags. Self-closing tags don't need a closer.
|
|
3519
|
+
const openTags = xml.match(/<([a-zA-Z_][^\s/>]*)\b[^>]*[^/]>/g) || [];
|
|
3520
|
+
const closeTags = xml.match(/<\/([a-zA-Z_][^\s>]*)\s*>/g) || [];
|
|
3521
|
+
return openTags.length === closeTags.length;
|
|
3349
3522
|
}
|
|
3350
3523
|
|
|
3351
3524
|
/**
|
|
@@ -4137,7 +4310,7 @@ export class Document {
|
|
|
4137
4310
|
table: Table,
|
|
4138
4311
|
row: number,
|
|
4139
4312
|
col: number
|
|
4140
|
-
): import('../elements/CommonTypes').ShadingConfig | undefined {
|
|
4313
|
+
): import('../elements/CommonTypes.js').ShadingConfig | undefined {
|
|
4141
4314
|
const tableRow = table.getRow(row);
|
|
4142
4315
|
if (!tableRow) return undefined;
|
|
4143
4316
|
const cell = tableRow.getCell(col);
|
|
@@ -6835,6 +7008,15 @@ export class Document {
|
|
|
6835
7008
|
* });
|
|
6836
7009
|
* ```
|
|
6837
7010
|
*/
|
|
7011
|
+
private static stripThemeFontsIfExplicitFont(runConfig: any): void {
|
|
7012
|
+
if (runConfig?.font) {
|
|
7013
|
+
delete runConfig.fontAsciiTheme;
|
|
7014
|
+
delete runConfig.fontHAnsiTheme;
|
|
7015
|
+
delete runConfig.fontEastAsiaTheme;
|
|
7016
|
+
delete runConfig.fontCsTheme;
|
|
7017
|
+
}
|
|
7018
|
+
}
|
|
7019
|
+
|
|
6838
7020
|
public applyStyles(options?: ApplyStylesOptions): {
|
|
6839
7021
|
heading1: boolean;
|
|
6840
7022
|
heading2: boolean;
|
|
@@ -6915,6 +7097,14 @@ export class Document {
|
|
|
6915
7097
|
},
|
|
6916
7098
|
};
|
|
6917
7099
|
|
|
7100
|
+
// Strip theme font attributes when an explicit font is provided,
|
|
7101
|
+
// because Word prioritizes theme fonts over explicit font names.
|
|
7102
|
+
Document.stripThemeFontsIfExplicitFont(h1Config.run);
|
|
7103
|
+
Document.stripThemeFontsIfExplicitFont(h2Config.run);
|
|
7104
|
+
Document.stripThemeFontsIfExplicitFont(h3Config.run);
|
|
7105
|
+
Document.stripThemeFontsIfExplicitFont(normalConfig.run);
|
|
7106
|
+
Document.stripThemeFontsIfExplicitFont(listParaConfig.run);
|
|
7107
|
+
|
|
6918
7108
|
// Extract preserve blank lines option (defaults to true)
|
|
6919
7109
|
const preserveBlankLines = options?.preserveBlankLinesAfterHeading2Tables ?? true;
|
|
6920
7110
|
|
|
@@ -13031,10 +13221,118 @@ export class Document {
|
|
|
13031
13221
|
* Call this after saving in long-running processes to free memory
|
|
13032
13222
|
* Especially important for API servers processing many documents
|
|
13033
13223
|
*/
|
|
13224
|
+
// ============================================================================
|
|
13225
|
+
// Event API
|
|
13226
|
+
// ============================================================================
|
|
13227
|
+
|
|
13228
|
+
/**
|
|
13229
|
+
* Subscribe to a document lifecycle / mutation event. Returns an
|
|
13230
|
+
* unsubscribe function so callers don't have to retain the listener
|
|
13231
|
+
* reference for `off()`.
|
|
13232
|
+
*
|
|
13233
|
+
* Listener errors are caught and logged via the global logger — a
|
|
13234
|
+
* misbehaving listener cannot abort `save()` or break document state.
|
|
13235
|
+
*
|
|
13236
|
+
* @example
|
|
13237
|
+
* ```typescript
|
|
13238
|
+
* const dispose = doc.on('paragraphAdded', ({ paragraph }) => {
|
|
13239
|
+
* audit.append(paragraph.getText());
|
|
13240
|
+
* });
|
|
13241
|
+
* // later
|
|
13242
|
+
* dispose();
|
|
13243
|
+
* ```
|
|
13244
|
+
*/
|
|
13245
|
+
on<T extends DocumentEventType>(event: T, listener: DocumentEventListener<T>): () => void {
|
|
13246
|
+
return this._events.on(event, listener);
|
|
13247
|
+
}
|
|
13248
|
+
|
|
13249
|
+
/** Remove a previously registered event listener. */
|
|
13250
|
+
off<T extends DocumentEventType>(event: T, listener: DocumentEventListener<T>): void {
|
|
13251
|
+
this._events.off(event, listener);
|
|
13252
|
+
}
|
|
13253
|
+
|
|
13254
|
+
/** Number of listeners registered for a given event. Useful for tests. */
|
|
13255
|
+
listenerCount(event: DocumentEventType): number {
|
|
13256
|
+
return this._events.listenerCount(event);
|
|
13257
|
+
}
|
|
13258
|
+
|
|
13259
|
+
/**
|
|
13260
|
+
* Emit the appropriate mutation event for `element`. No-op for body
|
|
13261
|
+
* element types that don't have a dedicated event (SDT, TOC, custom XML).
|
|
13262
|
+
* Centralised so every public add/insert path emits consistently.
|
|
13263
|
+
*/
|
|
13264
|
+
private _emitElementAdded(element: BodyElement, index: number): void {
|
|
13265
|
+
if (element instanceof Paragraph) {
|
|
13266
|
+
this._events.emit('paragraphAdded', { paragraph: element, index });
|
|
13267
|
+
} else if (element instanceof Table) {
|
|
13268
|
+
this._events.emit('tableAdded', { table: element });
|
|
13269
|
+
}
|
|
13270
|
+
}
|
|
13271
|
+
|
|
13272
|
+
private _emitElementRemoved(element: BodyElement | undefined): void {
|
|
13273
|
+
if (!element) return;
|
|
13274
|
+
if (element instanceof Paragraph) {
|
|
13275
|
+
this._events.emit('paragraphRemoved', { paragraph: element });
|
|
13276
|
+
} else if (element instanceof Table) {
|
|
13277
|
+
this._events.emit('tableRemoved', { table: element });
|
|
13278
|
+
}
|
|
13279
|
+
}
|
|
13280
|
+
|
|
13281
|
+
// ============================================================================
|
|
13282
|
+
// Global defaults
|
|
13283
|
+
// ============================================================================
|
|
13284
|
+
|
|
13285
|
+
/**
|
|
13286
|
+
* Default font, size, and margins applied to paragraphs created via
|
|
13287
|
+
* `createParagraph()` after `Document.setDefaults(...)` is called.
|
|
13288
|
+
* These are runtime defaults — they do not modify document XML directly,
|
|
13289
|
+
* they pre-populate run formatting on newly created elements only.
|
|
13290
|
+
*/
|
|
13291
|
+
private static globalDefaults: {
|
|
13292
|
+
font?: string;
|
|
13293
|
+
fontSize?: number;
|
|
13294
|
+
fontColor?: string;
|
|
13295
|
+
} = {};
|
|
13296
|
+
|
|
13297
|
+
/**
|
|
13298
|
+
* Set framework-wide defaults applied to every new paragraph created
|
|
13299
|
+
* via `Document.create()` + `createParagraph()`. Existing documents and
|
|
13300
|
+
* existing paragraphs are not retroactively modified. Pass an empty
|
|
13301
|
+
* object to clear.
|
|
13302
|
+
*/
|
|
13303
|
+
static setDefaults(defaults: { font?: string; fontSize?: number; fontColor?: string }): void {
|
|
13304
|
+
Document.globalDefaults = { ...defaults };
|
|
13305
|
+
}
|
|
13306
|
+
|
|
13307
|
+
/** Returns the currently registered global defaults (read-only copy). */
|
|
13308
|
+
static getDefaults(): Readonly<{ font?: string; fontSize?: number; fontColor?: string }> {
|
|
13309
|
+
return { ...Document.globalDefaults };
|
|
13310
|
+
}
|
|
13311
|
+
|
|
13312
|
+
/** Reset all global defaults. */
|
|
13313
|
+
static resetDefaults(): void {
|
|
13314
|
+
Document.globalDefaults = {};
|
|
13315
|
+
}
|
|
13316
|
+
|
|
13317
|
+
/** Apply globalDefaults to runs already on a freshly-created paragraph. */
|
|
13318
|
+
private static applyGlobalDefaultsToParagraph(para: Paragraph): void {
|
|
13319
|
+
const d = Document.globalDefaults;
|
|
13320
|
+
if (!d.font && d.fontSize === undefined && !d.fontColor) return;
|
|
13321
|
+
for (const run of para.getRuns()) {
|
|
13322
|
+
const fmt = run.getFormatting();
|
|
13323
|
+
if (d.font && !fmt.font) run.setFont(d.font);
|
|
13324
|
+
if (d.fontSize !== undefined && fmt.size === undefined) run.setSize(d.fontSize);
|
|
13325
|
+
if (d.fontColor && !fmt.color) run.setColor(d.fontColor);
|
|
13326
|
+
}
|
|
13327
|
+
}
|
|
13328
|
+
|
|
13034
13329
|
dispose(): void {
|
|
13035
13330
|
// Clear all internal state to free memory
|
|
13036
13331
|
// NOTE: Use clear() methods instead of creating new instances to properly free memory
|
|
13037
13332
|
|
|
13333
|
+
// Remove all event listeners to free closure references
|
|
13334
|
+
this._events.removeAllListeners();
|
|
13335
|
+
|
|
13038
13336
|
// Clear body elements
|
|
13039
13337
|
this.bodyElements = [];
|
|
13040
13338
|
|
|
@@ -15582,7 +15880,9 @@ export class Document {
|
|
|
15582
15880
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
15583
15881
|
const element = this.bodyElements[index];
|
|
15584
15882
|
if (element instanceof Paragraph) {
|
|
15585
|
-
// When tracking enabled, wrap content in w:del instead of removing
|
|
15883
|
+
// When tracking enabled, wrap content in w:del instead of removing.
|
|
15884
|
+
// No paragraphRemoved event in this branch — the paragraph is still
|
|
15885
|
+
// structurally present, just marked deleted via revision.
|
|
15586
15886
|
if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {
|
|
15587
15887
|
const runs = element.getRuns();
|
|
15588
15888
|
if (runs.length > 0) {
|
|
@@ -15594,6 +15894,7 @@ export class Document {
|
|
|
15594
15894
|
return true;
|
|
15595
15895
|
}
|
|
15596
15896
|
this.bodyElements.splice(index, 1);
|
|
15897
|
+
this._emitElementRemoved(element);
|
|
15597
15898
|
return true;
|
|
15598
15899
|
}
|
|
15599
15900
|
}
|
|
@@ -15628,6 +15929,7 @@ export class Document {
|
|
|
15628
15929
|
const element = this.bodyElements[index];
|
|
15629
15930
|
if (element instanceof Table) {
|
|
15630
15931
|
this.bodyElements.splice(index, 1);
|
|
15932
|
+
this._emitElementRemoved(element);
|
|
15631
15933
|
return true;
|
|
15632
15934
|
}
|
|
15633
15935
|
}
|
|
@@ -15771,6 +16073,7 @@ export class Document {
|
|
|
15771
16073
|
|
|
15772
16074
|
// Insert the paragraph
|
|
15773
16075
|
this.bodyElements.splice(index, 0, paragraph);
|
|
16076
|
+
this._emitElementAdded(paragraph, index);
|
|
15774
16077
|
return this;
|
|
15775
16078
|
}
|
|
15776
16079
|
|
|
@@ -15795,6 +16098,7 @@ export class Document {
|
|
|
15795
16098
|
|
|
15796
16099
|
// Insert the table
|
|
15797
16100
|
this.bodyElements.splice(index, 0, table);
|
|
16101
|
+
this._emitElementAdded(table, index);
|
|
15798
16102
|
return this;
|
|
15799
16103
|
}
|
|
15800
16104
|
|
|
@@ -16002,7 +16306,8 @@ export class Document {
|
|
|
16002
16306
|
*/
|
|
16003
16307
|
removeBodyElementAt(index: number): boolean {
|
|
16004
16308
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
16005
|
-
this.bodyElements.splice(index, 1);
|
|
16309
|
+
const [removed] = this.bodyElements.splice(index, 1);
|
|
16310
|
+
this._emitElementRemoved(removed);
|
|
16006
16311
|
return true;
|
|
16007
16312
|
}
|
|
16008
16313
|
return false;
|
|
@@ -16034,6 +16339,7 @@ export class Document {
|
|
|
16034
16339
|
const index = this.bodyElements.indexOf(element);
|
|
16035
16340
|
if (index === -1) return false;
|
|
16036
16341
|
this.bodyElements.splice(index, 1);
|
|
16342
|
+
this._emitElementRemoved(element);
|
|
16037
16343
|
return true;
|
|
16038
16344
|
}
|
|
16039
16345
|
|
|
@@ -16065,6 +16371,7 @@ export class Document {
|
|
|
16065
16371
|
const index = this.bodyElements.indexOf(reference);
|
|
16066
16372
|
if (index === -1) return false;
|
|
16067
16373
|
this.bodyElements.splice(index + 1, 0, element);
|
|
16374
|
+
this._emitElementAdded(element, index + 1);
|
|
16068
16375
|
return true;
|
|
16069
16376
|
}
|
|
16070
16377
|
|
|
@@ -16092,6 +16399,7 @@ export class Document {
|
|
|
16092
16399
|
const index = this.bodyElements.indexOf(reference);
|
|
16093
16400
|
if (index === -1) return false;
|
|
16094
16401
|
this.bodyElements.splice(index, 0, element);
|
|
16402
|
+
this._emitElementAdded(element, index);
|
|
16095
16403
|
return true;
|
|
16096
16404
|
}
|
|
16097
16405
|
|
|
@@ -16121,6 +16429,8 @@ export class Document {
|
|
|
16121
16429
|
const index = this.bodyElements.indexOf(oldElement);
|
|
16122
16430
|
if (index === -1) return false;
|
|
16123
16431
|
this.bodyElements[index] = newElement;
|
|
16432
|
+
this._emitElementRemoved(oldElement);
|
|
16433
|
+
this._emitElementAdded(newElement, index);
|
|
16124
16434
|
return true;
|
|
16125
16435
|
}
|
|
16126
16436
|
|
|
@@ -16138,6 +16448,7 @@ export class Document {
|
|
|
16138
16448
|
insertBodyElementAt(index: number, element: BodyElement): void {
|
|
16139
16449
|
const clampedIndex = Math.max(0, Math.min(index, this.bodyElements.length));
|
|
16140
16450
|
this.bodyElements.splice(clampedIndex, 0, element);
|
|
16451
|
+
this._emitElementAdded(element, clampedIndex);
|
|
16141
16452
|
}
|
|
16142
16453
|
|
|
16143
16454
|
/**
|