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/dist/core/Document.js
CHANGED
|
@@ -34,86 +34,88 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.Document = void 0;
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const
|
|
37
|
+
const parsingHelpers_js_1 = require("../utils/parsingHelpers.js");
|
|
38
|
+
const Bookmark_js_1 = require("../elements/Bookmark.js");
|
|
39
|
+
const BookmarkManager_js_1 = require("../elements/BookmarkManager.js");
|
|
40
|
+
const PreservedElement_js_1 = require("../elements/PreservedElement.js");
|
|
41
|
+
const CommentManager_js_1 = require("../elements/CommentManager.js");
|
|
42
|
+
const EndnoteManager_js_1 = require("../elements/EndnoteManager.js");
|
|
43
|
+
const Field_js_1 = require("../elements/Field.js");
|
|
44
|
+
const FootnoteManager_js_1 = require("../elements/FootnoteManager.js");
|
|
45
|
+
const HeaderFooterManager_js_1 = require("../elements/HeaderFooterManager.js");
|
|
46
|
+
const Hyperlink_js_1 = require("../elements/Hyperlink.js");
|
|
47
|
+
const ImageManager_js_1 = require("../elements/ImageManager.js");
|
|
48
|
+
const ImageRun_js_1 = require("../elements/ImageRun.js");
|
|
49
|
+
const Paragraph_js_1 = require("../elements/Paragraph.js");
|
|
50
|
+
const RangeMarker_js_1 = require("../elements/RangeMarker.js");
|
|
51
|
+
const Revision_js_1 = require("../elements/Revision.js");
|
|
52
|
+
const RevisionManager_js_1 = require("../elements/RevisionManager.js");
|
|
53
|
+
const Run_js_1 = require("../elements/Run.js");
|
|
54
|
+
const Shape_js_1 = require("../elements/Shape.js");
|
|
55
|
+
const TextBox_js_1 = require("../elements/TextBox.js");
|
|
56
|
+
const index_js_1 = require("../validation/index.js");
|
|
57
|
+
const Section_js_1 = require("../elements/Section.js");
|
|
58
|
+
const StructuredDocumentTag_js_1 = require("../elements/StructuredDocumentTag.js");
|
|
59
|
+
const Table_js_1 = require("../elements/Table.js");
|
|
60
|
+
const TableCell_js_1 = require("../elements/TableCell.js");
|
|
61
|
+
const TableOfContentsElement_js_1 = require("../elements/TableOfContentsElement.js");
|
|
62
|
+
const ShadingResolver_js_1 = require("../processors/ShadingResolver.js");
|
|
63
|
+
const NumberingManager_js_1 = require("../formatting/NumberingManager.js");
|
|
64
|
+
const Style_js_1 = require("../formatting/Style.js");
|
|
65
|
+
const StylesManager_js_1 = require("../formatting/StylesManager.js");
|
|
66
|
+
const compatibility_types_js_1 = require("../types/compatibility-types.js");
|
|
67
|
+
const CompatibilityUpgrader_js_1 = require("../processors/CompatibilityUpgrader.js");
|
|
68
|
+
const legacyCompatFlags_js_1 = require("../constants/legacyCompatFlags.js");
|
|
69
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
70
|
+
const units_js_1 = require("../utils/units.js");
|
|
70
71
|
function getLogger() {
|
|
71
|
-
return (0,
|
|
72
|
+
return (0, logger_js_1.createScopedLogger)((0, logger_js_1.getGlobalLogger)(), 'Document');
|
|
72
73
|
}
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
const
|
|
74
|
+
const acceptRevisions_js_1 = require("../processors/acceptRevisions.js");
|
|
75
|
+
const InMemoryRevisionAcceptor_js_1 = require("../processors/InMemoryRevisionAcceptor.js");
|
|
76
|
+
const stripTrackedChanges_js_1 = require("../processors/stripTrackedChanges.js");
|
|
77
|
+
const textDiff_js_1 = require("../utils/textDiff.js");
|
|
78
|
+
const XMLBuilder_js_1 = require("../xml/XMLBuilder.js");
|
|
79
|
+
const XMLParser_js_1 = require("../xml/XMLParser.js");
|
|
80
|
+
const DocumentTrackingContext_js_1 = require("../tracking/DocumentTrackingContext.js");
|
|
81
|
+
const ZipHandler_js_1 = require("../zip/ZipHandler.js");
|
|
82
|
+
const types_js_1 = require("../zip/types.js");
|
|
83
|
+
const DocumentGenerator_js_1 = require("./DocumentGenerator.js");
|
|
84
|
+
const DocumentIdManager_js_1 = require("./DocumentIdManager.js");
|
|
85
|
+
const DocumentParser_js_1 = require("./DocumentParser.js");
|
|
86
|
+
const DocumentValidator_js_1 = require("./DocumentValidator.js");
|
|
87
|
+
const DocumentEvents_js_1 = require("./DocumentEvents.js");
|
|
88
|
+
const RelationshipManager_js_1 = require("./RelationshipManager.js");
|
|
89
|
+
const Relationship_js_1 = require("./Relationship.js");
|
|
90
|
+
const ImageOptimizer_js_1 = require("../images/ImageOptimizer.js");
|
|
89
91
|
class Document {
|
|
90
92
|
constructor(zipHandler, options = {}, initDefaults = true) {
|
|
91
|
-
this.zipHandler = zipHandler || new
|
|
93
|
+
this.zipHandler = zipHandler || new ZipHandler_js_1.ZipHandler();
|
|
92
94
|
this.bodyElements = [];
|
|
93
95
|
this.properties = options.properties || {};
|
|
94
96
|
this.namespaces = {};
|
|
95
|
-
this.stylesManager =
|
|
96
|
-
this.numberingManager =
|
|
97
|
-
this.section = new
|
|
98
|
-
this.imageManager =
|
|
97
|
+
this.stylesManager = StylesManager_js_1.StylesManager.create();
|
|
98
|
+
this.numberingManager = NumberingManager_js_1.NumberingManager.create();
|
|
99
|
+
this.section = new Section_js_1.Section();
|
|
100
|
+
this.imageManager = ImageManager_js_1.ImageManager.create();
|
|
99
101
|
this.relationshipManager = initDefaults
|
|
100
|
-
?
|
|
101
|
-
:
|
|
102
|
-
this.headerFooterManager =
|
|
103
|
-
this.bookmarkManager =
|
|
104
|
-
this.revisionManager =
|
|
105
|
-
this.commentManager =
|
|
106
|
-
this.footnoteManager =
|
|
107
|
-
this.endnoteManager =
|
|
108
|
-
this.documentIdManager =
|
|
102
|
+
? RelationshipManager_js_1.RelationshipManager.createForDocument()
|
|
103
|
+
: RelationshipManager_js_1.RelationshipManager.create();
|
|
104
|
+
this.headerFooterManager = HeaderFooterManager_js_1.HeaderFooterManager.create();
|
|
105
|
+
this.bookmarkManager = BookmarkManager_js_1.BookmarkManager.create();
|
|
106
|
+
this.revisionManager = RevisionManager_js_1.RevisionManager.create();
|
|
107
|
+
this.commentManager = CommentManager_js_1.CommentManager.create();
|
|
108
|
+
this.footnoteManager = FootnoteManager_js_1.FootnoteManager.create();
|
|
109
|
+
this.endnoteManager = EndnoteManager_js_1.EndnoteManager.create();
|
|
110
|
+
this.documentIdManager = DocumentIdManager_js_1.DocumentIdManager.create();
|
|
109
111
|
this.bookmarkManager.setIdProvider(() => this.documentIdManager.getNextId(), (existingId) => this.documentIdManager.ensureNextIdAbove(existingId));
|
|
110
112
|
this.revisionManager.setIdProvider(() => this.documentIdManager.getNextId(), (existingId) => this.documentIdManager.ensureNextIdAbove(existingId));
|
|
111
113
|
this.commentManager.setIdProvider(() => this.documentIdManager.getNextId(), (existingId) => this.documentIdManager.ensureNextIdAbove(existingId));
|
|
112
|
-
this.trackingContext = new
|
|
113
|
-
this.parser = new
|
|
114
|
-
this.generator = new
|
|
115
|
-
this.validator = new
|
|
116
|
-
this.logger = options.logger ||
|
|
114
|
+
this.trackingContext = new DocumentTrackingContext_js_1.DocumentTrackingContext(this.revisionManager);
|
|
115
|
+
this.parser = new DocumentParser_js_1.DocumentParser();
|
|
116
|
+
this.generator = new DocumentGenerator_js_1.DocumentGenerator();
|
|
117
|
+
this.validator = new DocumentValidator_js_1.DocumentValidator();
|
|
118
|
+
this.logger = options.logger || logger_js_1.defaultLogger;
|
|
117
119
|
this.trackChangesEnabled = false;
|
|
118
120
|
this.trackFormatting = true;
|
|
119
121
|
this.revisionViewSettings = {
|
|
@@ -168,6 +170,8 @@ class Document {
|
|
|
168
170
|
_originalCommentsXml;
|
|
169
171
|
_commentsModified = false;
|
|
170
172
|
_originalCommentCompanionFiles = new Map();
|
|
173
|
+
_events = new DocumentEvents_js_1.DocumentEventEmitter();
|
|
174
|
+
_saveQueue = Promise.resolve();
|
|
171
175
|
_removedParts = new Set();
|
|
172
176
|
_appPropsModified = false;
|
|
173
177
|
_footnotesModified = false;
|
|
@@ -338,7 +342,7 @@ class Document {
|
|
|
338
342
|
para.addText(match[6], { font: 'Courier New' });
|
|
339
343
|
}
|
|
340
344
|
else if (match[7] !== undefined && match[8] !== undefined) {
|
|
341
|
-
para.addHyperlink(new
|
|
345
|
+
para.addHyperlink(new Hyperlink_js_1.Hyperlink({ url: match[8], text: match[7] }));
|
|
342
346
|
}
|
|
343
347
|
lastIndex = match.index + match[0].length;
|
|
344
348
|
}
|
|
@@ -363,21 +367,25 @@ class Document {
|
|
|
363
367
|
}
|
|
364
368
|
if (rows.length === 0)
|
|
365
369
|
return null;
|
|
366
|
-
return
|
|
370
|
+
return Table_js_1.Table.fromArray(rows);
|
|
367
371
|
}
|
|
368
372
|
static async load(filePath, options) {
|
|
369
373
|
const logger = getLogger();
|
|
370
374
|
logger.info('Loading document from file', { path: filePath });
|
|
371
|
-
const zipHandler = new
|
|
375
|
+
const zipHandler = new ZipHandler_js_1.ZipHandler();
|
|
372
376
|
await zipHandler.load(filePath);
|
|
373
|
-
|
|
377
|
+
const doc = await Document.initializeFromZip(zipHandler, options);
|
|
378
|
+
doc._events.emit('afterLoad', { source: 'file', path: filePath });
|
|
379
|
+
return doc;
|
|
374
380
|
}
|
|
375
381
|
static async loadFromBuffer(buffer, options) {
|
|
376
382
|
const logger = getLogger();
|
|
377
383
|
logger.info('Loading document from buffer', { bufferSize: buffer.length });
|
|
378
|
-
const zipHandler = new
|
|
384
|
+
const zipHandler = new ZipHandler_js_1.ZipHandler();
|
|
379
385
|
await zipHandler.loadFromBuffer(buffer);
|
|
380
|
-
|
|
386
|
+
const doc = await Document.initializeFromZip(zipHandler, options);
|
|
387
|
+
doc._events.emit('afterLoad', { source: 'buffer' });
|
|
388
|
+
return doc;
|
|
381
389
|
}
|
|
382
390
|
static async initializeFromZip(zipHandler, options) {
|
|
383
391
|
const logger = getLogger();
|
|
@@ -386,10 +394,10 @@ class Document {
|
|
|
386
394
|
? 'preserve'
|
|
387
395
|
: (options?.revisionHandling ?? 'accept');
|
|
388
396
|
if (revisionHandling === 'accept') {
|
|
389
|
-
await (0,
|
|
397
|
+
await (0, acceptRevisions_js_1.acceptAllRevisions)(zipHandler);
|
|
390
398
|
}
|
|
391
399
|
else if (revisionHandling === 'strip') {
|
|
392
|
-
await (0,
|
|
400
|
+
await (0, stripTrackedChanges_js_1.stripTrackedChanges)(zipHandler);
|
|
393
401
|
}
|
|
394
402
|
else if (revisionHandling === 'preserve') {
|
|
395
403
|
if (!useInMemoryAccept) {
|
|
@@ -408,24 +416,24 @@ class Document {
|
|
|
408
416
|
if (contentTypesXml) {
|
|
409
417
|
doc._originalContentTypes = doc.parseContentTypes(contentTypesXml);
|
|
410
418
|
}
|
|
411
|
-
const stylesXml = zipHandler.getFileAsString(
|
|
419
|
+
const stylesXml = zipHandler.getFileAsString(types_js_1.DOCX_PATHS.STYLES);
|
|
412
420
|
if (stylesXml) {
|
|
413
421
|
doc._originalStylesXml = stylesXml;
|
|
414
422
|
}
|
|
415
|
-
const numberingXml = zipHandler.getFileAsString(
|
|
423
|
+
const numberingXml = zipHandler.getFileAsString(types_js_1.DOCX_PATHS.NUMBERING);
|
|
416
424
|
if (numberingXml) {
|
|
417
425
|
doc._originalNumberingXml = numberingXml;
|
|
418
426
|
}
|
|
419
|
-
const settingsXml = zipHandler.getFileAsString(
|
|
427
|
+
const settingsXml = zipHandler.getFileAsString(types_js_1.DOCX_PATHS.SETTINGS);
|
|
420
428
|
if (settingsXml) {
|
|
421
429
|
doc._originalSettingsXml = settingsXml;
|
|
422
430
|
doc.parseSettingsFromXml(settingsXml);
|
|
423
431
|
}
|
|
424
|
-
const appPropsXml = zipHandler.getFileAsString(
|
|
432
|
+
const appPropsXml = zipHandler.getFileAsString(types_js_1.DOCX_PATHS.APP_PROPS);
|
|
425
433
|
if (appPropsXml) {
|
|
426
434
|
doc._originalAppPropsXml = appPropsXml;
|
|
427
435
|
}
|
|
428
|
-
const webSettingsXml = zipHandler.getFileAsString(
|
|
436
|
+
const webSettingsXml = zipHandler.getFileAsString(types_js_1.DOCX_PATHS.WEB_SETTINGS);
|
|
429
437
|
if (webSettingsXml) {
|
|
430
438
|
doc._originalWebSettingsXml = webSettingsXml;
|
|
431
439
|
doc.parseWebSettingsFromXml(webSettingsXml);
|
|
@@ -459,28 +467,51 @@ class Document {
|
|
|
459
467
|
this.trackChangesEnabled = true;
|
|
460
468
|
}
|
|
461
469
|
}
|
|
462
|
-
const
|
|
463
|
-
|
|
470
|
+
const parseSettingCtOnOff = (tagName) => {
|
|
471
|
+
const re = new RegExp(`<${tagName}\\b([^>]*)\\/?>`);
|
|
472
|
+
const m = re.exec(settingsXml);
|
|
473
|
+
if (!m)
|
|
474
|
+
return undefined;
|
|
475
|
+
const attrs = m[1] ?? '';
|
|
476
|
+
const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
|
|
477
|
+
if (!valMatch || valMatch[1] === undefined)
|
|
478
|
+
return true;
|
|
479
|
+
const v = valMatch[1].toLowerCase();
|
|
480
|
+
return v !== '0' && v !== 'false' && v !== 'off';
|
|
481
|
+
};
|
|
482
|
+
const doNotTrackFormattingVal = parseSettingCtOnOff('w:doNotTrackFormatting');
|
|
483
|
+
if (doNotTrackFormattingVal === true) {
|
|
464
484
|
this.trackFormatting = false;
|
|
465
485
|
}
|
|
466
|
-
|
|
467
|
-
if (hasTrackFormatting) {
|
|
486
|
+
else if (doNotTrackFormattingVal === false) {
|
|
468
487
|
this.trackFormatting = true;
|
|
469
488
|
}
|
|
489
|
+
const trackFormattingVal = parseSettingCtOnOff('w:trackFormatting');
|
|
490
|
+
if (trackFormattingVal !== undefined) {
|
|
491
|
+
this.trackFormatting = trackFormattingVal;
|
|
492
|
+
}
|
|
470
493
|
const revisionViewMatch = /<w:revisionView\b([^>]*)\/?>/.exec(settingsXml);
|
|
471
494
|
if (revisionViewMatch) {
|
|
472
495
|
const attrs = revisionViewMatch[1] || '';
|
|
473
496
|
const insDelMatch = /w:insDel\s*=\s*"([^"]*)"/.exec(attrs);
|
|
474
497
|
const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
|
|
475
498
|
const inkMatch = /w:inkAnnotations\s*=\s*"([^"]*)"/.exec(attrs);
|
|
499
|
+
const markupMatch = /w:markup\s*=\s*"([^"]*)"/.exec(attrs);
|
|
500
|
+
const commentsMatch = /w:comments\s*=\s*"([^"]*)"/.exec(attrs);
|
|
476
501
|
if (insDelMatch?.[1] !== undefined) {
|
|
477
|
-
this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1]
|
|
502
|
+
this.revisionViewSettings.showInsertionsAndDeletions = (0, parsingHelpers_js_1.parseOnOffAttribute)(insDelMatch[1]);
|
|
478
503
|
}
|
|
479
504
|
if (formattingMatch?.[1] !== undefined) {
|
|
480
|
-
this.revisionViewSettings.showFormatting = formattingMatch[1]
|
|
505
|
+
this.revisionViewSettings.showFormatting = (0, parsingHelpers_js_1.parseOnOffAttribute)(formattingMatch[1]);
|
|
481
506
|
}
|
|
482
507
|
if (inkMatch?.[1] !== undefined) {
|
|
483
|
-
this.revisionViewSettings.showInkAnnotations = inkMatch[1]
|
|
508
|
+
this.revisionViewSettings.showInkAnnotations = (0, parsingHelpers_js_1.parseOnOffAttribute)(inkMatch[1]);
|
|
509
|
+
}
|
|
510
|
+
if (markupMatch?.[1] !== undefined) {
|
|
511
|
+
this.revisionViewSettings.showMarkup = (0, parsingHelpers_js_1.parseOnOffAttribute)(markupMatch[1]);
|
|
512
|
+
}
|
|
513
|
+
if (commentsMatch?.[1] !== undefined) {
|
|
514
|
+
this.revisionViewSettings.showComments = (0, parsingHelpers_js_1.parseOnOffAttribute)(commentsMatch[1]);
|
|
484
515
|
}
|
|
485
516
|
}
|
|
486
517
|
const protMatch = /<w:documentProtection\b([^>]*)\/?>/.exec(settingsXml);
|
|
@@ -490,8 +521,12 @@ class Document {
|
|
|
490
521
|
const enforcementMatch = /w:enforcement\s*=\s*"([^"]*)"/.exec(attrs);
|
|
491
522
|
if (editMatch?.[1]) {
|
|
492
523
|
const edit = editMatch[1];
|
|
493
|
-
const enforcement = enforcementMatch?.[1] ? enforcementMatch[1]
|
|
524
|
+
const enforcement = enforcementMatch?.[1] ? (0, parsingHelpers_js_1.parseOnOffAttribute)(enforcementMatch[1]) : true;
|
|
494
525
|
this.documentProtection = { edit, enforcement };
|
|
526
|
+
const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
|
|
527
|
+
if (formattingMatch?.[1] !== undefined) {
|
|
528
|
+
this.documentProtection.formatting = (0, parsingHelpers_js_1.parseOnOffAttribute)(formattingMatch[1]);
|
|
529
|
+
}
|
|
495
530
|
const cryptProviderMatch = /w:cryptProviderType\s*=\s*"([^"]*)"/.exec(attrs);
|
|
496
531
|
const cryptAlgClassMatch = /w:cryptAlgorithmClass\s*=\s*"([^"]*)"/.exec(attrs);
|
|
497
532
|
const cryptAlgTypeMatch = /w:cryptAlgorithmType\s*=\s*"([^"]*)"/.exec(attrs);
|
|
@@ -513,6 +548,16 @@ class Document {
|
|
|
513
548
|
this.documentProtection.hash = hashMatch[1];
|
|
514
549
|
if (saltMatch?.[1])
|
|
515
550
|
this.documentProtection.salt = saltMatch[1];
|
|
551
|
+
const algorithmNameMatch = /w:algorithmName\s*=\s*"([^"]*)"/.exec(attrs);
|
|
552
|
+
const hashValueMatch = /w:hashValue\s*=\s*"([^"]*)"/.exec(attrs);
|
|
553
|
+
const saltValueMatch = /w:saltValue\s*=\s*"([^"]*)"/.exec(attrs);
|
|
554
|
+
if (algorithmNameMatch?.[1]) {
|
|
555
|
+
this.documentProtection.algorithmName = algorithmNameMatch[1];
|
|
556
|
+
}
|
|
557
|
+
if (hashValueMatch?.[1])
|
|
558
|
+
this.documentProtection.hashValue = hashValueMatch[1];
|
|
559
|
+
if (saltValueMatch?.[1])
|
|
560
|
+
this.documentProtection.saltValue = saltValueMatch[1];
|
|
516
561
|
}
|
|
517
562
|
}
|
|
518
563
|
const rsidsBlockMatch = /<w:rsids>([\s\S]*?)<\/w:rsids>/.exec(settingsXml);
|
|
@@ -536,37 +581,37 @@ class Document {
|
|
|
536
581
|
if (viewMatch?.[1]) {
|
|
537
582
|
this._documentView = viewMatch[1];
|
|
538
583
|
}
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
584
|
+
const evenAndOddHeadersVal = parseSettingCtOnOff('w:evenAndOddHeaders');
|
|
585
|
+
if (evenAndOddHeadersVal !== undefined)
|
|
586
|
+
this._evenAndOddHeaders = evenAndOddHeadersVal;
|
|
587
|
+
const mirrorMarginsVal = parseSettingCtOnOff('w:mirrorMargins');
|
|
588
|
+
if (mirrorMarginsVal !== undefined)
|
|
589
|
+
this._mirrorMargins = mirrorMarginsVal;
|
|
590
|
+
const autoHyphenationVal = parseSettingCtOnOff('w:autoHyphenation');
|
|
591
|
+
if (autoHyphenationVal !== undefined)
|
|
592
|
+
this._autoHyphenation = autoHyphenationVal;
|
|
593
|
+
const hideSpellingErrorsVal = parseSettingCtOnOff('w:hideSpellingErrors');
|
|
594
|
+
if (hideSpellingErrorsVal !== undefined)
|
|
595
|
+
this._hideSpellingErrors = hideSpellingErrorsVal;
|
|
596
|
+
const hideGrammaticalErrorsVal = parseSettingCtOnOff('w:hideGrammaticalErrors');
|
|
597
|
+
if (hideGrammaticalErrorsVal !== undefined)
|
|
598
|
+
this._hideGrammaticalErrors = hideGrammaticalErrorsVal;
|
|
554
599
|
const defaultTabStopMatch = /<w:defaultTabStop\s+w:val\s*=\s*"(\d+)"\s*\/?>/.exec(settingsXml);
|
|
555
600
|
if (defaultTabStopMatch?.[1]) {
|
|
556
601
|
this._defaultTabStop = parseInt(defaultTabStopMatch[1], 10);
|
|
557
602
|
}
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
603
|
+
const updateFieldsVal = parseSettingCtOnOff('w:updateFields');
|
|
604
|
+
if (updateFieldsVal !== undefined)
|
|
605
|
+
this._updateFields = updateFieldsVal;
|
|
606
|
+
const embedTrueTypeFontsVal = parseSettingCtOnOff('w:embedTrueTypeFonts');
|
|
607
|
+
if (embedTrueTypeFontsVal !== undefined)
|
|
608
|
+
this._embedTrueTypeFonts = embedTrueTypeFontsVal;
|
|
609
|
+
const saveSubsetFontsVal = parseSettingCtOnOff('w:saveSubsetFonts');
|
|
610
|
+
if (saveSubsetFontsVal !== undefined)
|
|
611
|
+
this._saveSubsetFonts = saveSubsetFontsVal;
|
|
612
|
+
const doNotTrackMovesVal = parseSettingCtOnOff('w:doNotTrackMoves');
|
|
613
|
+
if (doNotTrackMovesVal !== undefined)
|
|
614
|
+
this._doNotTrackMoves = doNotTrackMovesVal;
|
|
570
615
|
const decimalMatch = /<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
|
|
571
616
|
if (decimalMatch?.[1]) {
|
|
572
617
|
this._decimalSymbol = decimalMatch[1];
|
|
@@ -580,7 +625,7 @@ class Document {
|
|
|
580
625
|
parseCompatBlock(settingsXml) {
|
|
581
626
|
const compatSettings = [];
|
|
582
627
|
const legacyFlags = [];
|
|
583
|
-
let mode =
|
|
628
|
+
let mode = compatibility_types_js_1.CompatibilityMode.Word2007;
|
|
584
629
|
const compatBlockMatch = /<w:compat>([\s\S]*?)<\/w:compat>/.exec(settingsXml);
|
|
585
630
|
if (compatBlockMatch?.[1]) {
|
|
586
631
|
const compatBlock = compatBlockMatch[1];
|
|
@@ -618,7 +663,7 @@ class Document {
|
|
|
618
663
|
}
|
|
619
664
|
return {
|
|
620
665
|
mode,
|
|
621
|
-
isLegacyMode: mode <
|
|
666
|
+
isLegacyMode: mode < compatibility_types_js_1.CompatibilityMode.Word2013Plus,
|
|
622
667
|
compatSettings,
|
|
623
668
|
legacyFlags,
|
|
624
669
|
};
|
|
@@ -634,7 +679,7 @@ class Document {
|
|
|
634
679
|
this.stylesManager.addStyle(style);
|
|
635
680
|
}
|
|
636
681
|
for (const element of this.bodyElements) {
|
|
637
|
-
if (element instanceof
|
|
682
|
+
if (element instanceof Table_js_1.Table) {
|
|
638
683
|
element._setStylesManager(this.stylesManager);
|
|
639
684
|
}
|
|
640
685
|
}
|
|
@@ -693,16 +738,16 @@ class Document {
|
|
|
693
738
|
}
|
|
694
739
|
this._originalCommentsXml = commentsXml;
|
|
695
740
|
for (const path of [
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
741
|
+
types_js_1.DOCX_PATHS.COMMENTS_EXTENDED,
|
|
742
|
+
types_js_1.DOCX_PATHS.COMMENTS_IDS,
|
|
743
|
+
types_js_1.DOCX_PATHS.COMMENTS_EXTENSIBLE,
|
|
699
744
|
]) {
|
|
700
745
|
const content = this.zipHandler.getFileAsString(path);
|
|
701
746
|
if (content) {
|
|
702
747
|
this._originalCommentCompanionFiles.set(path, content);
|
|
703
748
|
}
|
|
704
749
|
}
|
|
705
|
-
const parser = new
|
|
750
|
+
const parser = new DocumentParser_js_1.DocumentParser();
|
|
706
751
|
const comments = parser.parseCommentsXml(commentsXml);
|
|
707
752
|
for (const comment of comments) {
|
|
708
753
|
this.commentManager.registerExisting(comment);
|
|
@@ -710,13 +755,13 @@ class Document {
|
|
|
710
755
|
this.commentManager.linkReplies();
|
|
711
756
|
}
|
|
712
757
|
parseAndRegisterFootnotes() {
|
|
713
|
-
const footnotesXml = this.zipHandler.getFileAsString(
|
|
758
|
+
const footnotesXml = this.zipHandler.getFileAsString(types_js_1.DOCX_PATHS.FOOTNOTES);
|
|
714
759
|
if (!footnotesXml) {
|
|
715
760
|
return;
|
|
716
761
|
}
|
|
717
762
|
this._originalFootnotesXml = footnotesXml;
|
|
718
763
|
try {
|
|
719
|
-
const parser = new
|
|
764
|
+
const parser = new DocumentParser_js_1.DocumentParser();
|
|
720
765
|
const footnotes = parser.parseFootnotesXml(footnotesXml);
|
|
721
766
|
for (const footnote of footnotes) {
|
|
722
767
|
const id = footnote.getId();
|
|
@@ -732,13 +777,13 @@ class Document {
|
|
|
732
777
|
}
|
|
733
778
|
}
|
|
734
779
|
parseAndRegisterEndnotes() {
|
|
735
|
-
const endnotesXml = this.zipHandler.getFileAsString(
|
|
780
|
+
const endnotesXml = this.zipHandler.getFileAsString(types_js_1.DOCX_PATHS.ENDNOTES);
|
|
736
781
|
if (!endnotesXml) {
|
|
737
782
|
return;
|
|
738
783
|
}
|
|
739
784
|
this._originalEndnotesXml = endnotesXml;
|
|
740
785
|
try {
|
|
741
|
-
const parser = new
|
|
786
|
+
const parser = new DocumentParser_js_1.DocumentParser();
|
|
742
787
|
const endnotes = parser.parseEndnotesXml(endnotesXml);
|
|
743
788
|
for (const endnote of endnotes) {
|
|
744
789
|
const id = endnote.getId();
|
|
@@ -779,15 +824,15 @@ class Document {
|
|
|
779
824
|
}
|
|
780
825
|
}
|
|
781
826
|
initializeRequiredFiles() {
|
|
782
|
-
this.zipHandler.addFile(
|
|
783
|
-
this.zipHandler.addFile(
|
|
784
|
-
this.zipHandler.addFile(
|
|
827
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.CONTENT_TYPES, this.generator.generateContentTypes());
|
|
828
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.RELS, this.generator.generateRels());
|
|
829
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.DOCUMENT, this.generator.generateDocumentXml(this.bodyElements, this.section, this.namespaces, this._documentBackground));
|
|
785
830
|
this.zipHandler.addFile('word/_rels/document.xml.rels', this.relationshipManager.generateXml());
|
|
786
|
-
this.zipHandler.addFile(
|
|
787
|
-
this.zipHandler.addFile(
|
|
831
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.STYLES, this.stylesManager.generateStylesXml());
|
|
832
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.NUMBERING, this.numberingManager.generateNumberingXml());
|
|
788
833
|
this.zipHandler.addFile('word/fontTable.xml', this.generator.generateFontTable());
|
|
789
|
-
this.zipHandler.addFile(
|
|
790
|
-
this.zipHandler.addFile(
|
|
834
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.WEB_SETTINGS, this.generator.generateWebSettings());
|
|
835
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.SETTINGS, this.generator.generateSettings({
|
|
791
836
|
trackChangesEnabled: this.trackChangesEnabled,
|
|
792
837
|
trackFormatting: this.trackFormatting,
|
|
793
838
|
revisionView: this.revisionViewSettings,
|
|
@@ -796,7 +841,7 @@ class Document {
|
|
|
796
841
|
documentProtection: this.documentProtection,
|
|
797
842
|
}));
|
|
798
843
|
this._compatInfo = {
|
|
799
|
-
mode:
|
|
844
|
+
mode: compatibility_types_js_1.CompatibilityMode.Word2013Plus,
|
|
800
845
|
isLegacyMode: false,
|
|
801
846
|
compatSettings: [
|
|
802
847
|
{ name: 'compatibilityMode', uri: 'http://schemas.microsoft.com/office/word', val: '15' },
|
|
@@ -824,8 +869,8 @@ class Document {
|
|
|
824
869
|
legacyFlags: [],
|
|
825
870
|
};
|
|
826
871
|
this.zipHandler.addFile('word/theme/theme1.xml', this.generator.generateTheme());
|
|
827
|
-
this.zipHandler.addFile(
|
|
828
|
-
this.zipHandler.addFile(
|
|
872
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.CORE_PROPS, this.generator.generateCoreProps(this.properties));
|
|
873
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.APP_PROPS, this.generator.generateAppProps(this.properties));
|
|
829
874
|
}
|
|
830
875
|
addParagraph(paragraph) {
|
|
831
876
|
paragraph._setStylesManager(this.stylesManager);
|
|
@@ -834,16 +879,17 @@ class Document {
|
|
|
834
879
|
const runs = paragraph.getRuns();
|
|
835
880
|
if (runs.length > 0) {
|
|
836
881
|
const author = this.trackingContext.getAuthor();
|
|
837
|
-
const insertion =
|
|
882
|
+
const insertion = Revision_js_1.Revision.createInsertion(author, runs);
|
|
838
883
|
this.trackingContext.getRevisionManager().register(insertion);
|
|
839
884
|
paragraph.addRevision(insertion);
|
|
840
885
|
}
|
|
841
886
|
}
|
|
842
887
|
this.bodyElements.push(paragraph);
|
|
888
|
+
this._emitElementAdded(paragraph, this.bodyElements.length - 1);
|
|
843
889
|
return this;
|
|
844
890
|
}
|
|
845
891
|
createParagraph(text) {
|
|
846
|
-
const para = new
|
|
892
|
+
const para = new Paragraph_js_1.Paragraph();
|
|
847
893
|
para._setStylesManager(this.stylesManager);
|
|
848
894
|
if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {
|
|
849
895
|
para._setTrackingContext(this.trackingContext);
|
|
@@ -851,7 +897,9 @@ class Document {
|
|
|
851
897
|
if (text) {
|
|
852
898
|
para.addText(text);
|
|
853
899
|
}
|
|
900
|
+
Document.applyGlobalDefaultsToParagraph(para);
|
|
854
901
|
this.bodyElements.push(para);
|
|
902
|
+
this._emitElementAdded(para, this.bodyElements.length - 1);
|
|
855
903
|
return para;
|
|
856
904
|
}
|
|
857
905
|
addHeading(text, level = 1) {
|
|
@@ -859,7 +907,7 @@ class Document {
|
|
|
859
907
|
}
|
|
860
908
|
addPageBreak() {
|
|
861
909
|
const para = this.createParagraph();
|
|
862
|
-
const run = new
|
|
910
|
+
const run = new Run_js_1.Run('');
|
|
863
911
|
run.addBreak('page');
|
|
864
912
|
para.addRun(run);
|
|
865
913
|
return para;
|
|
@@ -875,34 +923,38 @@ class Document {
|
|
|
875
923
|
this.bindTrackingToElement(table);
|
|
876
924
|
}
|
|
877
925
|
this.bodyElements.push(table);
|
|
926
|
+
this._emitElementAdded(table, this.bodyElements.length - 1);
|
|
878
927
|
return this;
|
|
879
928
|
}
|
|
880
929
|
addStructuredDocumentTag(sdt) {
|
|
881
930
|
this.bodyElements.push(sdt);
|
|
931
|
+
this._emitElementAdded(sdt, this.bodyElements.length - 1);
|
|
882
932
|
return this;
|
|
883
933
|
}
|
|
884
934
|
createTable(rows, columns) {
|
|
885
|
-
const table = new
|
|
935
|
+
const table = new Table_js_1.Table(rows, columns);
|
|
886
936
|
table._setStylesManager(this.stylesManager);
|
|
887
937
|
this.bodyElements.push(table);
|
|
938
|
+
this._emitElementAdded(table, this.bodyElements.length - 1);
|
|
888
939
|
return table;
|
|
889
940
|
}
|
|
890
941
|
createTableFromCSV(csv, delimiter = ',') {
|
|
891
|
-
const table =
|
|
942
|
+
const table = Table_js_1.Table.fromCSV(csv, delimiter);
|
|
892
943
|
table._setStylesManager(this.stylesManager);
|
|
893
944
|
this.bodyElements.push(table);
|
|
945
|
+
this._emitElementAdded(table, this.bodyElements.length - 1);
|
|
894
946
|
return table;
|
|
895
947
|
}
|
|
896
948
|
getTables() {
|
|
897
|
-
return this.bodyElements.filter((el) => el instanceof
|
|
949
|
+
return this.bodyElements.filter((el) => el instanceof Table_js_1.Table);
|
|
898
950
|
}
|
|
899
951
|
walkElements(visitor) {
|
|
900
952
|
const walk = (elements) => {
|
|
901
953
|
for (const element of elements) {
|
|
902
|
-
if (element instanceof
|
|
954
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
903
955
|
visitor(element);
|
|
904
956
|
}
|
|
905
|
-
else if (element instanceof
|
|
957
|
+
else if (element instanceof Table_js_1.Table) {
|
|
906
958
|
visitor(element);
|
|
907
959
|
for (const row of element.getRows()) {
|
|
908
960
|
for (const cell of row.getCells()) {
|
|
@@ -912,7 +964,7 @@ class Document {
|
|
|
912
964
|
}
|
|
913
965
|
}
|
|
914
966
|
}
|
|
915
|
-
else if (element instanceof
|
|
967
|
+
else if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
916
968
|
visitor(element);
|
|
917
969
|
walk(element.getContent());
|
|
918
970
|
}
|
|
@@ -923,58 +975,99 @@ class Document {
|
|
|
923
975
|
getAllParagraphs() {
|
|
924
976
|
const result = [];
|
|
925
977
|
this.walkElements((element) => {
|
|
926
|
-
if (element instanceof
|
|
978
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
927
979
|
result.push(element);
|
|
928
980
|
}
|
|
929
981
|
});
|
|
930
982
|
return result;
|
|
931
983
|
}
|
|
984
|
+
*iterateParagraphs() {
|
|
985
|
+
yield* Document.walkParagraphs(this.bodyElements);
|
|
986
|
+
}
|
|
987
|
+
static *walkParagraphs(elements) {
|
|
988
|
+
for (const element of elements) {
|
|
989
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
990
|
+
yield element;
|
|
991
|
+
}
|
|
992
|
+
else if (element instanceof Table_js_1.Table) {
|
|
993
|
+
for (const row of element.getRows()) {
|
|
994
|
+
for (const cell of row.getCells()) {
|
|
995
|
+
for (const cellPara of cell.getParagraphs()) {
|
|
996
|
+
yield cellPara;
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
else if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
1002
|
+
yield* Document.walkParagraphs(element.getContent());
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
*iterateBodyElements() {
|
|
1007
|
+
for (const element of this.bodyElements) {
|
|
1008
|
+
yield element;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
*iterateSections() {
|
|
1012
|
+
let current = [];
|
|
1013
|
+
for (const element of this.bodyElements) {
|
|
1014
|
+
current.push(element);
|
|
1015
|
+
if (element instanceof Paragraph_js_1.Paragraph && element.formatting.sectPr) {
|
|
1016
|
+
yield { sectPr: element.formatting.sectPr, elements: current };
|
|
1017
|
+
current = [];
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
if (current.length > 0) {
|
|
1021
|
+
yield { sectPr: this.section ?? null, elements: current };
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
932
1024
|
getParagraphs() {
|
|
933
1025
|
return this.getAllParagraphs();
|
|
934
1026
|
}
|
|
935
1027
|
getParagraphAt(index) {
|
|
936
|
-
const paragraphs = this.bodyElements.filter((el) => el instanceof
|
|
1028
|
+
const paragraphs = this.bodyElements.filter((el) => el instanceof Paragraph_js_1.Paragraph);
|
|
937
1029
|
return paragraphs[index];
|
|
938
1030
|
}
|
|
939
1031
|
getTableAt(index) {
|
|
940
|
-
const tables = this.bodyElements.filter((el) => el instanceof
|
|
1032
|
+
const tables = this.bodyElements.filter((el) => el instanceof Table_js_1.Table);
|
|
941
1033
|
return tables[index];
|
|
942
1034
|
}
|
|
943
1035
|
getBodyElementAt(index) {
|
|
944
1036
|
return this.bodyElements[index];
|
|
945
1037
|
}
|
|
946
1038
|
getParagraphIndex(paragraph) {
|
|
947
|
-
const paragraphs = this.bodyElements.filter((el) => el instanceof
|
|
1039
|
+
const paragraphs = this.bodyElements.filter((el) => el instanceof Paragraph_js_1.Paragraph);
|
|
948
1040
|
return paragraphs.indexOf(paragraph);
|
|
949
1041
|
}
|
|
950
1042
|
getTableIndex(table) {
|
|
951
|
-
const tables = this.bodyElements.filter((el) => el instanceof
|
|
1043
|
+
const tables = this.bodyElements.filter((el) => el instanceof Table_js_1.Table);
|
|
952
1044
|
return tables.indexOf(table);
|
|
953
1045
|
}
|
|
954
1046
|
getNextParagraph(paragraph) {
|
|
955
|
-
const paragraphs = this.bodyElements.filter((el) => el instanceof
|
|
1047
|
+
const paragraphs = this.bodyElements.filter((el) => el instanceof Paragraph_js_1.Paragraph);
|
|
956
1048
|
const index = paragraphs.indexOf(paragraph);
|
|
957
1049
|
return index >= 0 && index < paragraphs.length - 1 ? paragraphs[index + 1] : undefined;
|
|
958
1050
|
}
|
|
959
1051
|
getPreviousParagraph(paragraph) {
|
|
960
|
-
const paragraphs = this.bodyElements.filter((el) => el instanceof
|
|
1052
|
+
const paragraphs = this.bodyElements.filter((el) => el instanceof Paragraph_js_1.Paragraph);
|
|
961
1053
|
const index = paragraphs.indexOf(paragraph);
|
|
962
1054
|
return index > 0 ? paragraphs[index - 1] : undefined;
|
|
963
1055
|
}
|
|
964
1056
|
getAllTables() {
|
|
965
1057
|
const result = [];
|
|
966
1058
|
this.walkElements((element) => {
|
|
967
|
-
if (element instanceof
|
|
1059
|
+
if (element instanceof Table_js_1.Table) {
|
|
968
1060
|
result.push(element);
|
|
969
1061
|
}
|
|
970
1062
|
});
|
|
971
1063
|
return result;
|
|
972
1064
|
}
|
|
973
1065
|
getTableOfContentsElements() {
|
|
974
|
-
return this.bodyElements.filter((el) => el instanceof
|
|
1066
|
+
return this.bodyElements.filter((el) => el instanceof TableOfContentsElement_js_1.TableOfContentsElement);
|
|
975
1067
|
}
|
|
976
1068
|
addBodyElement(element) {
|
|
977
1069
|
this.bodyElements.push(element);
|
|
1070
|
+
this._emitElementAdded(element, this.bodyElements.length - 1);
|
|
978
1071
|
return this;
|
|
979
1072
|
}
|
|
980
1073
|
getBodyElements() {
|
|
@@ -991,7 +1084,7 @@ class Document {
|
|
|
991
1084
|
return this;
|
|
992
1085
|
}
|
|
993
1086
|
setProperties(properties) {
|
|
994
|
-
const validated =
|
|
1087
|
+
const validated = DocumentValidator_js_1.DocumentValidator.validateProperties(properties);
|
|
995
1088
|
this.properties = { ...this.properties, ...validated };
|
|
996
1089
|
return this;
|
|
997
1090
|
}
|
|
@@ -1126,8 +1219,17 @@ class Document {
|
|
|
1126
1219
|
this.updateContentTypesWithImagesHeadersFootersAndComments();
|
|
1127
1220
|
}
|
|
1128
1221
|
async save(filePath) {
|
|
1222
|
+
return this.withSaveLock(() => this.saveImpl(filePath));
|
|
1223
|
+
}
|
|
1224
|
+
withSaveLock(operation) {
|
|
1225
|
+
const next = this._saveQueue.then(operation, operation);
|
|
1226
|
+
this._saveQueue = next.catch(() => undefined);
|
|
1227
|
+
return next;
|
|
1228
|
+
}
|
|
1229
|
+
async saveImpl(filePath) {
|
|
1129
1230
|
const logger = getLogger();
|
|
1130
1231
|
logger.info('Saving document', { path: filePath, paragraphs: this.getParagraphCount() });
|
|
1232
|
+
this._events.emit('beforeSave', { filePath });
|
|
1131
1233
|
const tempPath = `${filePath}.tmp.${Date.now()}`;
|
|
1132
1234
|
let saveSucceeded = false;
|
|
1133
1235
|
this.createSaveStateSnapshot();
|
|
@@ -1142,6 +1244,7 @@ class Document {
|
|
|
1142
1244
|
saveSucceeded = true;
|
|
1143
1245
|
this.clearSaveStateSnapshot();
|
|
1144
1246
|
logger.info('Document saved', { path: filePath });
|
|
1247
|
+
this._events.emit('afterSave', { filePath });
|
|
1145
1248
|
}
|
|
1146
1249
|
catch (error) {
|
|
1147
1250
|
this.restoreSaveStateSnapshot();
|
|
@@ -1161,8 +1264,12 @@ class Document {
|
|
|
1161
1264
|
}
|
|
1162
1265
|
}
|
|
1163
1266
|
async toBuffer() {
|
|
1267
|
+
return this.withSaveLock(() => this.toBufferImpl());
|
|
1268
|
+
}
|
|
1269
|
+
async toBufferImpl() {
|
|
1164
1270
|
const logger = getLogger();
|
|
1165
1271
|
logger.info('Generating document buffer', { paragraphs: this.getParagraphCount() });
|
|
1272
|
+
this._events.emit('beforeSave', {});
|
|
1166
1273
|
let generateSucceeded = false;
|
|
1167
1274
|
this.createSaveStateSnapshot();
|
|
1168
1275
|
try {
|
|
@@ -1180,6 +1287,7 @@ class Document {
|
|
|
1180
1287
|
generateSucceeded = true;
|
|
1181
1288
|
this.clearSaveStateSnapshot();
|
|
1182
1289
|
logger.info('Document buffer generated', { bufferSize: buffer.length });
|
|
1290
|
+
this._events.emit('afterSave', { bufferSize: buffer.length });
|
|
1183
1291
|
return buffer;
|
|
1184
1292
|
}
|
|
1185
1293
|
catch (error) {
|
|
@@ -1211,7 +1319,7 @@ class Document {
|
|
|
1211
1319
|
updateDocumentXml() {
|
|
1212
1320
|
let xml = this.generator.generateDocumentXml(this.bodyElements, this.section, this.namespaces, this._documentBackground);
|
|
1213
1321
|
xml = this.syncTOCFieldInstructions(xml);
|
|
1214
|
-
this.zipHandler.updateFile(
|
|
1322
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.DOCUMENT, xml);
|
|
1215
1323
|
}
|
|
1216
1324
|
_postProcessDocumentXml() {
|
|
1217
1325
|
if (!this._flattenIncludePictureFields &&
|
|
@@ -1219,7 +1327,7 @@ class Document {
|
|
|
1219
1327
|
!this._clearDirectSpacingStyles) {
|
|
1220
1328
|
return;
|
|
1221
1329
|
}
|
|
1222
|
-
let docXml = this.zipHandler.getFileAsString(
|
|
1330
|
+
let docXml = this.zipHandler.getFileAsString(types_js_1.DOCX_PATHS.DOCUMENT);
|
|
1223
1331
|
if (!docXml) {
|
|
1224
1332
|
return;
|
|
1225
1333
|
}
|
|
@@ -1235,7 +1343,7 @@ class Document {
|
|
|
1235
1343
|
docXml = this._clearDirectSpacingFromStyledParagraphs(docXml, this._clearDirectSpacingStyles);
|
|
1236
1344
|
this._clearDirectSpacingStyles = null;
|
|
1237
1345
|
}
|
|
1238
|
-
this.zipHandler.updateFile(
|
|
1346
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.DOCUMENT, docXml);
|
|
1239
1347
|
}
|
|
1240
1348
|
_flattenIncludePictureFieldsInXml(xml) {
|
|
1241
1349
|
const fieldTokens = [];
|
|
@@ -1459,25 +1567,25 @@ class Document {
|
|
|
1459
1567
|
}
|
|
1460
1568
|
}
|
|
1461
1569
|
updateCoreProps() {
|
|
1462
|
-
if (this._removedParts.has(
|
|
1570
|
+
if (this._removedParts.has(types_js_1.DOCX_PATHS.CORE_PROPS) ||
|
|
1463
1571
|
this._removedParts.has('docProps/core.xml'))
|
|
1464
1572
|
return;
|
|
1465
1573
|
const xml = this.generator.generateCoreProps(this.properties);
|
|
1466
|
-
this.zipHandler.updateFile(
|
|
1574
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.CORE_PROPS, xml);
|
|
1467
1575
|
}
|
|
1468
1576
|
updateAppProps() {
|
|
1469
|
-
if (this._removedParts.has(
|
|
1577
|
+
if (this._removedParts.has(types_js_1.DOCX_PATHS.APP_PROPS) || this._removedParts.has('docProps/app.xml'))
|
|
1470
1578
|
return;
|
|
1471
1579
|
if (this._originalAppPropsXml && !this._appPropsModified) {
|
|
1472
1580
|
return;
|
|
1473
1581
|
}
|
|
1474
1582
|
if (this._originalAppPropsXml && this._appPropsModified) {
|
|
1475
1583
|
const mergedXml = this.mergeAppPropsWithOriginal();
|
|
1476
|
-
this.zipHandler.updateFile(
|
|
1584
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.APP_PROPS, mergedXml);
|
|
1477
1585
|
}
|
|
1478
1586
|
else {
|
|
1479
1587
|
const xml = this.generator.generateAppProps(this.properties);
|
|
1480
|
-
this.zipHandler.updateFile(
|
|
1588
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.APP_PROPS, xml);
|
|
1481
1589
|
}
|
|
1482
1590
|
}
|
|
1483
1591
|
mergeAppPropsWithOriginal() {
|
|
@@ -1486,7 +1594,7 @@ class Document {
|
|
|
1486
1594
|
}
|
|
1487
1595
|
let xml = this._originalAppPropsXml;
|
|
1488
1596
|
if (this.properties.company !== undefined) {
|
|
1489
|
-
const escaped =
|
|
1597
|
+
const escaped = XMLBuilder_js_1.XMLBuilder.sanitizeXmlContent(this.properties.company);
|
|
1490
1598
|
if (xml.includes('<Company>')) {
|
|
1491
1599
|
xml = xml.replace(/<Company>[^<]*<\/Company>/, `<Company>${escaped}</Company>`);
|
|
1492
1600
|
}
|
|
@@ -1495,19 +1603,19 @@ class Document {
|
|
|
1495
1603
|
}
|
|
1496
1604
|
}
|
|
1497
1605
|
if (this.properties.application !== undefined) {
|
|
1498
|
-
const escaped =
|
|
1606
|
+
const escaped = XMLBuilder_js_1.XMLBuilder.sanitizeXmlContent(this.properties.application);
|
|
1499
1607
|
if (xml.includes('<Application>')) {
|
|
1500
1608
|
xml = xml.replace(/<Application>[^<]*<\/Application>/, `<Application>${escaped}</Application>`);
|
|
1501
1609
|
}
|
|
1502
1610
|
}
|
|
1503
1611
|
if (this.properties.appVersion !== undefined) {
|
|
1504
|
-
const escaped =
|
|
1612
|
+
const escaped = XMLBuilder_js_1.XMLBuilder.sanitizeXmlContent(this.properties.appVersion);
|
|
1505
1613
|
if (xml.includes('<AppVersion>')) {
|
|
1506
1614
|
xml = xml.replace(/<AppVersion>[^<]*<\/AppVersion>/, `<AppVersion>${escaped}</AppVersion>`);
|
|
1507
1615
|
}
|
|
1508
1616
|
}
|
|
1509
1617
|
if (this.properties.manager !== undefined) {
|
|
1510
|
-
const escaped =
|
|
1618
|
+
const escaped = XMLBuilder_js_1.XMLBuilder.sanitizeXmlContent(this.properties.manager);
|
|
1511
1619
|
if (xml.includes('<Manager>')) {
|
|
1512
1620
|
xml = xml.replace(/<Manager>[^<]*<\/Manager>/, `<Manager>${escaped}</Manager>`);
|
|
1513
1621
|
}
|
|
@@ -1534,10 +1642,10 @@ class Document {
|
|
|
1534
1642
|
return;
|
|
1535
1643
|
}
|
|
1536
1644
|
if (this._originalWebSettingsXml) {
|
|
1537
|
-
this.zipHandler.updateFile(
|
|
1645
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.WEB_SETTINGS, this._originalWebSettingsXml);
|
|
1538
1646
|
}
|
|
1539
1647
|
else {
|
|
1540
|
-
this.zipHandler.updateFile(
|
|
1648
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.WEB_SETTINGS, this.generator.generateWebSettings(this._webSettings));
|
|
1541
1649
|
}
|
|
1542
1650
|
}
|
|
1543
1651
|
getWebSettingsInfo() {
|
|
@@ -1555,14 +1663,34 @@ class Document {
|
|
|
1555
1663
|
if (!this._originalWebSettingsXml) {
|
|
1556
1664
|
return 0;
|
|
1557
1665
|
}
|
|
1558
|
-
const
|
|
1666
|
+
const original = this._originalWebSettingsXml;
|
|
1667
|
+
const matches = original.match(/<w:div\b/g);
|
|
1559
1668
|
const count = matches ? matches.length : 0;
|
|
1560
1669
|
if (count === 0) {
|
|
1561
1670
|
return 0;
|
|
1562
1671
|
}
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1672
|
+
try {
|
|
1673
|
+
const mutated = original.replace(/<w:divs>[\s\S]*?<\/w:divs>/g, '');
|
|
1674
|
+
if (!Document.isWellFormedXml(mutated)) {
|
|
1675
|
+
getLogger().warn('stripWebDivs produced malformed XML; reverting');
|
|
1676
|
+
return 0;
|
|
1677
|
+
}
|
|
1678
|
+
this._originalWebSettingsXml = mutated;
|
|
1679
|
+
this._webSettingsModified = true;
|
|
1680
|
+
return count;
|
|
1681
|
+
}
|
|
1682
|
+
catch (err) {
|
|
1683
|
+
getLogger().warn('stripWebDivs failed; reverting', { error: String(err) });
|
|
1684
|
+
this._originalWebSettingsXml = original;
|
|
1685
|
+
return 0;
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
static isWellFormedXml(xml) {
|
|
1689
|
+
if (xml.length === 0)
|
|
1690
|
+
return true;
|
|
1691
|
+
const openTags = xml.match(/<([a-zA-Z_][^\s/>]*)\b[^>]*[^/]>/g) || [];
|
|
1692
|
+
const closeTags = xml.match(/<\/([a-zA-Z_][^\s>]*)\s*>/g) || [];
|
|
1693
|
+
return openTags.length === closeTags.length;
|
|
1566
1694
|
}
|
|
1567
1695
|
sanitizeWebSettings() {
|
|
1568
1696
|
let divCount = 0;
|
|
@@ -1604,11 +1732,11 @@ class Document {
|
|
|
1604
1732
|
updateStylesXml() {
|
|
1605
1733
|
if (this._originalStylesXml) {
|
|
1606
1734
|
const mergedXml = this.mergeStylesWithOriginal();
|
|
1607
|
-
this.zipHandler.updateFile(
|
|
1735
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.STYLES, mergedXml);
|
|
1608
1736
|
}
|
|
1609
1737
|
else {
|
|
1610
1738
|
const xml = this.stylesManager.generateStylesXml();
|
|
1611
|
-
this.zipHandler.updateFile(
|
|
1739
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.STYLES, xml);
|
|
1612
1740
|
}
|
|
1613
1741
|
}
|
|
1614
1742
|
mergeStylesWithOriginal() {
|
|
@@ -1628,7 +1756,7 @@ class Document {
|
|
|
1628
1756
|
}
|
|
1629
1757
|
let resultXml = this._originalStylesXml;
|
|
1630
1758
|
for (const [styleId, style] of modifiedStyles) {
|
|
1631
|
-
const newStyleXml =
|
|
1759
|
+
const newStyleXml = XMLBuilder_js_1.XMLBuilder.elementToString(style.toXML());
|
|
1632
1760
|
const escapedStyleId = styleId.replace(/[.*+?^${}()|[\]\\"]/g, '\\$&');
|
|
1633
1761
|
const stylePattern = new RegExp(`<w:style[^>]*\\sw:styleId="${escapedStyleId}"[^>]*>[\\s\\S]*?</w:style>`);
|
|
1634
1762
|
if (stylePattern.test(resultXml)) {
|
|
@@ -1642,20 +1770,20 @@ class Document {
|
|
|
1642
1770
|
}
|
|
1643
1771
|
updateNumberingXml() {
|
|
1644
1772
|
if (this._originalNumberingXml && !this.numberingManager.isModified()) {
|
|
1645
|
-
this.zipHandler.updateFile(
|
|
1773
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.NUMBERING, this._originalNumberingXml);
|
|
1646
1774
|
}
|
|
1647
1775
|
else if (this._originalNumberingXml) {
|
|
1648
1776
|
const mergedXml = this.mergeNumberingWithOriginal();
|
|
1649
|
-
this.zipHandler.updateFile(
|
|
1777
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.NUMBERING, mergedXml);
|
|
1650
1778
|
this.cleanupNumberingRels(mergedXml);
|
|
1651
1779
|
}
|
|
1652
1780
|
else {
|
|
1653
1781
|
const xml = this.numberingManager.generateNumberingXml();
|
|
1654
|
-
this.zipHandler.updateFile(
|
|
1782
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.NUMBERING, xml);
|
|
1655
1783
|
}
|
|
1656
1784
|
}
|
|
1657
1785
|
cleanupNumberingRels(mergedXml) {
|
|
1658
|
-
const relsXml = this.zipHandler.getFileAsString(
|
|
1786
|
+
const relsXml = this.zipHandler.getFileAsString(types_js_1.DOCX_PATHS.NUMBERING_RELS);
|
|
1659
1787
|
if (!relsXml)
|
|
1660
1788
|
return;
|
|
1661
1789
|
const usedRIds = new Set();
|
|
@@ -1679,10 +1807,10 @@ class Document {
|
|
|
1679
1807
|
}
|
|
1680
1808
|
if (entriesToRemove.length > 0) {
|
|
1681
1809
|
if (!/<Relationship\s/.test(cleanedRels)) {
|
|
1682
|
-
this.zipHandler.removeFile(
|
|
1810
|
+
this.zipHandler.removeFile(types_js_1.DOCX_PATHS.NUMBERING_RELS);
|
|
1683
1811
|
}
|
|
1684
1812
|
else {
|
|
1685
|
-
this.zipHandler.updateFile(
|
|
1813
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.NUMBERING_RELS, cleanedRels);
|
|
1686
1814
|
}
|
|
1687
1815
|
this.logger.info(`Removed ${entriesToRemove.length} orphaned numbering relationship(s)`);
|
|
1688
1816
|
}
|
|
@@ -1706,7 +1834,7 @@ class Document {
|
|
|
1706
1834
|
const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);
|
|
1707
1835
|
if (!abstractNum)
|
|
1708
1836
|
continue;
|
|
1709
|
-
const newXml =
|
|
1837
|
+
const newXml = XMLBuilder_js_1.XMLBuilder.elementToString(abstractNum.toXML());
|
|
1710
1838
|
const escapedId = String(abstractNumId).replace(/[.*+?^${}()|[\]\\"]/g, '\\$&');
|
|
1711
1839
|
const pattern = new RegExp(`<w:abstractNum[^>]*\\sw:abstractNumId="${escapedId}"[^>]*>[\\s\\S]*?</w:abstractNum>`);
|
|
1712
1840
|
if (pattern.test(resultXml)) {
|
|
@@ -1726,7 +1854,7 @@ class Document {
|
|
|
1726
1854
|
const instance = this.numberingManager.getInstance(numId);
|
|
1727
1855
|
if (!instance)
|
|
1728
1856
|
continue;
|
|
1729
|
-
const newXml =
|
|
1857
|
+
const newXml = XMLBuilder_js_1.XMLBuilder.elementToString(instance.toXML());
|
|
1730
1858
|
const escapedNumId = String(numId).replace(/[.*+?^${}()|[\]\\"]/g, '\\$&');
|
|
1731
1859
|
const pattern = new RegExp(`<w:num\\b[^>]*\\sw:numId="${escapedNumId}"[^>]*>[\\s\\S]*?</w:num>`);
|
|
1732
1860
|
if (pattern.test(resultXml)) {
|
|
@@ -1784,7 +1912,7 @@ class Document {
|
|
|
1784
1912
|
}
|
|
1785
1913
|
updateSettingsXml() {
|
|
1786
1914
|
const xml = this.mergeSettingsWithOriginal();
|
|
1787
|
-
this.zipHandler.updateFile(
|
|
1915
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.SETTINGS, xml);
|
|
1788
1916
|
}
|
|
1789
1917
|
mergeSettingsWithOriginal() {
|
|
1790
1918
|
if (!this._originalSettingsXml) {
|
|
@@ -1819,7 +1947,7 @@ class Document {
|
|
|
1819
1947
|
return xml;
|
|
1820
1948
|
}
|
|
1821
1949
|
xml = xml.replace(/<w:view\b[^>]*\/?>\s*/g, '');
|
|
1822
|
-
const viewXml = `<w:view w:val="${
|
|
1950
|
+
const viewXml = `<w:view w:val="${XMLBuilder_js_1.XMLBuilder.escapeXmlAttribute(this._documentView)}"/>`;
|
|
1823
1951
|
xml = xml.replace(/(<w:settings\b[^>]*>)/, `$1\n ${viewXml}`);
|
|
1824
1952
|
return xml;
|
|
1825
1953
|
}
|
|
@@ -1871,7 +1999,7 @@ class Document {
|
|
|
1871
1999
|
return xml;
|
|
1872
2000
|
}
|
|
1873
2001
|
const prot = this.documentProtection;
|
|
1874
|
-
const esc =
|
|
2002
|
+
const esc = XMLBuilder_js_1.XMLBuilder.escapeXmlAttribute;
|
|
1875
2003
|
let protXml = `\n <w:documentProtection w:edit="${esc(prot.edit)}" w:enforcement="${prot.enforcement ? '1' : '0'}"`;
|
|
1876
2004
|
if (prot.cryptProviderType)
|
|
1877
2005
|
protXml += ` w:cryptProviderType="${esc(prot.cryptProviderType)}"`;
|
|
@@ -1904,7 +2032,7 @@ class Document {
|
|
|
1904
2032
|
if (this.rsids.size === 0) {
|
|
1905
2033
|
return xml;
|
|
1906
2034
|
}
|
|
1907
|
-
const esc =
|
|
2035
|
+
const esc = XMLBuilder_js_1.XMLBuilder.escapeXmlAttribute;
|
|
1908
2036
|
let rsidsXml = '\n <w:rsids>';
|
|
1909
2037
|
if (this.rsidRoot) {
|
|
1910
2038
|
rsidsXml += `\n <w:rsidRoot w:val="${esc(this.rsidRoot)}"/>`;
|
|
@@ -2019,7 +2147,7 @@ class Document {
|
|
|
2019
2147
|
const cell = tableRow.getCell(col);
|
|
2020
2148
|
if (!cell)
|
|
2021
2149
|
return undefined;
|
|
2022
|
-
return (0,
|
|
2150
|
+
return (0, ShadingResolver_js_1.resolveCellShading)(cell, table, this.stylesManager);
|
|
2023
2151
|
}
|
|
2024
2152
|
addStyle(style) {
|
|
2025
2153
|
this.stylesManager.addStyle(style);
|
|
@@ -2070,7 +2198,7 @@ class Document {
|
|
|
2070
2198
|
? { ...currentProps.runFormatting, ...properties.runFormatting }
|
|
2071
2199
|
: currentProps.runFormatting,
|
|
2072
2200
|
};
|
|
2073
|
-
const updatedStyle =
|
|
2201
|
+
const updatedStyle = Style_js_1.Style.create(updatedProps);
|
|
2074
2202
|
this.stylesManager.addStyle(updatedStyle);
|
|
2075
2203
|
return true;
|
|
2076
2204
|
}
|
|
@@ -2078,7 +2206,7 @@ class Document {
|
|
|
2078
2206
|
let count = 0;
|
|
2079
2207
|
for (const element of this.bodyElements) {
|
|
2080
2208
|
if (predicate(element)) {
|
|
2081
|
-
if (element instanceof
|
|
2209
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2082
2210
|
element.setStyle(styleId);
|
|
2083
2211
|
count++;
|
|
2084
2212
|
}
|
|
@@ -2101,7 +2229,7 @@ class Document {
|
|
|
2101
2229
|
findElementsByStyle(styleId) {
|
|
2102
2230
|
const results = [];
|
|
2103
2231
|
for (const element of this.bodyElements) {
|
|
2104
|
-
if (element instanceof
|
|
2232
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2105
2233
|
const formatting = element.getFormatting();
|
|
2106
2234
|
if (formatting.style === styleId) {
|
|
2107
2235
|
results.push(element);
|
|
@@ -2131,7 +2259,7 @@ class Document {
|
|
|
2131
2259
|
applyStyleToAllParagraphsWithStyle(currentStyleId, newStyleId) {
|
|
2132
2260
|
let count = 0;
|
|
2133
2261
|
for (const element of this.bodyElements) {
|
|
2134
|
-
if (element instanceof
|
|
2262
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2135
2263
|
const formatting = element.getFormatting();
|
|
2136
2264
|
if (formatting.style === currentStyleId) {
|
|
2137
2265
|
element.setStyle(newStyleId);
|
|
@@ -2173,7 +2301,7 @@ class Document {
|
|
|
2173
2301
|
count++;
|
|
2174
2302
|
};
|
|
2175
2303
|
for (const element of this.bodyElements) {
|
|
2176
|
-
if (element instanceof
|
|
2304
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2177
2305
|
applyToParagraph(element);
|
|
2178
2306
|
}
|
|
2179
2307
|
}
|
|
@@ -2248,7 +2376,7 @@ class Document {
|
|
|
2248
2376
|
if (paragraphs.length > 0) {
|
|
2249
2377
|
const firstPara = paragraphs[0];
|
|
2250
2378
|
if (firstPara) {
|
|
2251
|
-
const bookmark = new
|
|
2379
|
+
const bookmark = new Bookmark_js_1.Bookmark({ name: '_top' });
|
|
2252
2380
|
const registered = this.bookmarkManager.register(bookmark);
|
|
2253
2381
|
firstPara.addBookmark(registered);
|
|
2254
2382
|
}
|
|
@@ -2463,7 +2591,7 @@ class Document {
|
|
|
2463
2591
|
for (const paragraph of this.getAllParagraphs()) {
|
|
2464
2592
|
const content = paragraph.getContent();
|
|
2465
2593
|
for (const item of content) {
|
|
2466
|
-
if (item instanceof
|
|
2594
|
+
if (item instanceof ImageRun_js_1.ImageRun) {
|
|
2467
2595
|
const image = item.getImageElement();
|
|
2468
2596
|
const relId = image.getRelationshipId();
|
|
2469
2597
|
if (relId && largeImageIds.has(relId)) {
|
|
@@ -2481,7 +2609,7 @@ class Document {
|
|
|
2481
2609
|
let count = 0;
|
|
2482
2610
|
const minEmus = Math.round(minPixels * 9525);
|
|
2483
2611
|
const processImageRun = (item) => {
|
|
2484
|
-
if (item instanceof
|
|
2612
|
+
if (item instanceof ImageRun_js_1.ImageRun) {
|
|
2485
2613
|
const image = item.getImageElement();
|
|
2486
2614
|
const width = image.getWidth();
|
|
2487
2615
|
const height = image.getHeight();
|
|
@@ -2509,7 +2637,7 @@ class Document {
|
|
|
2509
2637
|
if (processImageRun(item)) {
|
|
2510
2638
|
hasLargeImage = true;
|
|
2511
2639
|
}
|
|
2512
|
-
else if (item instanceof
|
|
2640
|
+
else if (item instanceof Revision_js_1.Revision) {
|
|
2513
2641
|
if (processRevision(item)) {
|
|
2514
2642
|
hasLargeImage = true;
|
|
2515
2643
|
}
|
|
@@ -2606,12 +2734,12 @@ class Document {
|
|
|
2606
2734
|
const paragraphs = this.getAllParagraphs();
|
|
2607
2735
|
this.collectNumIdsFromParagraphs(paragraphs, usedNumIds);
|
|
2608
2736
|
for (const element of this.bodyElements) {
|
|
2609
|
-
if (element instanceof
|
|
2737
|
+
if (element instanceof Table_js_1.Table) {
|
|
2610
2738
|
this.collectNumIdsFromTable(element, usedNumIds);
|
|
2611
2739
|
}
|
|
2612
|
-
else if (element instanceof
|
|
2740
|
+
else if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
2613
2741
|
for (const content of element.getContent()) {
|
|
2614
|
-
if (content instanceof
|
|
2742
|
+
if (content instanceof Table_js_1.Table) {
|
|
2615
2743
|
this.collectNumIdsFromTable(content, usedNumIds);
|
|
2616
2744
|
}
|
|
2617
2745
|
}
|
|
@@ -2632,8 +2760,8 @@ class Document {
|
|
|
2632
2760
|
for (const filePath of this.zipHandler.getFilePaths()) {
|
|
2633
2761
|
if (filePath.startsWith('word/header') ||
|
|
2634
2762
|
filePath.startsWith('word/footer') ||
|
|
2635
|
-
filePath ===
|
|
2636
|
-
filePath ===
|
|
2763
|
+
filePath === types_js_1.DOCX_PATHS.FOOTNOTES ||
|
|
2764
|
+
filePath === types_js_1.DOCX_PATHS.ENDNOTES) {
|
|
2637
2765
|
const xml = this.zipHandler.getFileAsString(filePath);
|
|
2638
2766
|
if (xml) {
|
|
2639
2767
|
this.collectNumIdsFromXml(xml, usedNumIds);
|
|
@@ -2696,18 +2824,18 @@ class Document {
|
|
|
2696
2824
|
}
|
|
2697
2825
|
};
|
|
2698
2826
|
for (const element of this.bodyElements) {
|
|
2699
|
-
if (element instanceof
|
|
2827
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2700
2828
|
collectFromParagraph(element);
|
|
2701
2829
|
}
|
|
2702
|
-
else if (element instanceof
|
|
2830
|
+
else if (element instanceof Table_js_1.Table) {
|
|
2703
2831
|
collectFromTable(element);
|
|
2704
2832
|
}
|
|
2705
|
-
else if (element instanceof
|
|
2833
|
+
else if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
2706
2834
|
for (const content of element.getContent()) {
|
|
2707
|
-
if (content instanceof
|
|
2835
|
+
if (content instanceof Paragraph_js_1.Paragraph) {
|
|
2708
2836
|
collectFromParagraph(content);
|
|
2709
2837
|
}
|
|
2710
|
-
else if (content instanceof
|
|
2838
|
+
else if (content instanceof Table_js_1.Table) {
|
|
2711
2839
|
collectFromTable(content);
|
|
2712
2840
|
}
|
|
2713
2841
|
}
|
|
@@ -2718,7 +2846,7 @@ class Document {
|
|
|
2718
2846
|
if (!endIds.has(id)) {
|
|
2719
2847
|
const lastPara = this.getLastParagraph();
|
|
2720
2848
|
if (lastPara) {
|
|
2721
|
-
lastPara.addBookmarkEnd(new
|
|
2849
|
+
lastPara.addBookmarkEnd(new Bookmark_js_1.Bookmark({ id, name: `_repair_${id}`, skipNormalization: true }));
|
|
2722
2850
|
this.logger.warn(`Bookmark validation: added missing bookmarkEnd for ID ${id}`);
|
|
2723
2851
|
repairs++;
|
|
2724
2852
|
}
|
|
@@ -2764,13 +2892,13 @@ class Document {
|
|
|
2764
2892
|
}
|
|
2765
2893
|
}
|
|
2766
2894
|
for (const item of para.getContent()) {
|
|
2767
|
-
if (item instanceof
|
|
2895
|
+
if (item instanceof Shape_js_1.Shape) {
|
|
2768
2896
|
item.setDocPrId(docPrId++);
|
|
2769
2897
|
}
|
|
2770
|
-
else if (item instanceof
|
|
2898
|
+
else if (item instanceof TextBox_js_1.TextBox) {
|
|
2771
2899
|
item.setDocPrId(docPrId++);
|
|
2772
2900
|
}
|
|
2773
|
-
else if (item instanceof
|
|
2901
|
+
else if (item instanceof ImageRun_js_1.ImageRun) {
|
|
2774
2902
|
item.getImageElement().setDocPrId(docPrId++);
|
|
2775
2903
|
}
|
|
2776
2904
|
}
|
|
@@ -2782,10 +2910,10 @@ class Document {
|
|
|
2782
2910
|
}
|
|
2783
2911
|
};
|
|
2784
2912
|
for (const element of this.bodyElements) {
|
|
2785
|
-
if (element instanceof
|
|
2913
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2786
2914
|
processParagraph(element);
|
|
2787
2915
|
}
|
|
2788
|
-
else if (element instanceof
|
|
2916
|
+
else if (element instanceof Table_js_1.Table) {
|
|
2789
2917
|
for (const row of element.getRows()) {
|
|
2790
2918
|
for (const cell of row.getCells()) {
|
|
2791
2919
|
for (const para of cell.getParagraphs()) {
|
|
@@ -2805,10 +2933,10 @@ class Document {
|
|
|
2805
2933
|
getLastParagraph() {
|
|
2806
2934
|
for (let i = this.bodyElements.length - 1; i >= 0; i--) {
|
|
2807
2935
|
const element = this.bodyElements[i];
|
|
2808
|
-
if (element instanceof
|
|
2936
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2809
2937
|
return element;
|
|
2810
2938
|
}
|
|
2811
|
-
if (element instanceof
|
|
2939
|
+
if (element instanceof Table_js_1.Table) {
|
|
2812
2940
|
const para = element.getLastParagraph();
|
|
2813
2941
|
if (para)
|
|
2814
2942
|
return para;
|
|
@@ -2836,18 +2964,18 @@ class Document {
|
|
|
2836
2964
|
}
|
|
2837
2965
|
};
|
|
2838
2966
|
for (const element of this.bodyElements) {
|
|
2839
|
-
if (element instanceof
|
|
2967
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2840
2968
|
removeFromParagraph(element);
|
|
2841
2969
|
}
|
|
2842
|
-
else if (element instanceof
|
|
2970
|
+
else if (element instanceof Table_js_1.Table) {
|
|
2843
2971
|
removeFromTable(element);
|
|
2844
2972
|
}
|
|
2845
|
-
else if (element instanceof
|
|
2973
|
+
else if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
2846
2974
|
for (const content of element.getContent()) {
|
|
2847
|
-
if (content instanceof
|
|
2975
|
+
if (content instanceof Paragraph_js_1.Paragraph) {
|
|
2848
2976
|
removeFromParagraph(content);
|
|
2849
2977
|
}
|
|
2850
|
-
else if (content instanceof
|
|
2978
|
+
else if (content instanceof Table_js_1.Table) {
|
|
2851
2979
|
removeFromTable(content);
|
|
2852
2980
|
}
|
|
2853
2981
|
}
|
|
@@ -2868,10 +2996,10 @@ class Document {
|
|
|
2868
2996
|
}
|
|
2869
2997
|
collectNumIdsFromElements(elements, usedNumIds) {
|
|
2870
2998
|
for (const element of elements) {
|
|
2871
|
-
if (element instanceof
|
|
2999
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2872
3000
|
this.collectNumIdsFromParagraphs([element], usedNumIds);
|
|
2873
3001
|
}
|
|
2874
|
-
else if (element instanceof
|
|
3002
|
+
else if (element instanceof Table_js_1.Table) {
|
|
2875
3003
|
for (const row of element.getRows()) {
|
|
2876
3004
|
for (const cell of row.getCells()) {
|
|
2877
3005
|
this.collectNumIdsFromParagraphs(cell.getParagraphs(), usedNumIds);
|
|
@@ -2905,19 +3033,19 @@ class Document {
|
|
|
2905
3033
|
let insertedCount = 0;
|
|
2906
3034
|
for (let i = 0; i < this.bodyElements.length; i++) {
|
|
2907
3035
|
const element = this.bodyElements[i];
|
|
2908
|
-
if (element instanceof
|
|
3036
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
2909
3037
|
const numbering = element.getNumbering();
|
|
2910
3038
|
if (numbering) {
|
|
2911
3039
|
const nextElement = this.bodyElements[i + 1];
|
|
2912
3040
|
const isListEnd = !nextElement ||
|
|
2913
|
-
!(nextElement instanceof
|
|
3041
|
+
!(nextElement instanceof Paragraph_js_1.Paragraph) ||
|
|
2914
3042
|
nextElement.getNumbering()?.numId !== numbering.numId;
|
|
2915
3043
|
if (isListEnd) {
|
|
2916
|
-
const alreadyHasBlank = nextElement instanceof
|
|
3044
|
+
const alreadyHasBlank = nextElement instanceof Paragraph_js_1.Paragraph &&
|
|
2917
3045
|
nextElement.getText().trim() === '' &&
|
|
2918
3046
|
nextElement.getContent().length === 0;
|
|
2919
3047
|
if (!alreadyHasBlank) {
|
|
2920
|
-
const blankPara = new
|
|
3048
|
+
const blankPara = new Paragraph_js_1.Paragraph();
|
|
2921
3049
|
blankPara.setStyle('Normal');
|
|
2922
3050
|
this.bodyElements.splice(i + 1, 0, blankPara);
|
|
2923
3051
|
insertedCount++;
|
|
@@ -2955,7 +3083,7 @@ class Document {
|
|
|
2955
3083
|
sectionProps.titlePage = false;
|
|
2956
3084
|
}
|
|
2957
3085
|
for (const element of this.bodyElements) {
|
|
2958
|
-
if (element instanceof
|
|
3086
|
+
if (element instanceof Paragraph_js_1.Paragraph && typeof element.formatting.sectPr === 'string') {
|
|
2959
3087
|
let sectPrXml = element.formatting.sectPr;
|
|
2960
3088
|
sectPrXml = sectPrXml.replace(/<w:headerReference[^/]*\/>/g, '');
|
|
2961
3089
|
sectPrXml = sectPrXml.replace(/<w:headerReference[^>]*>[\s\S]*?<\/w:headerReference>/g, '');
|
|
@@ -2981,11 +3109,11 @@ class Document {
|
|
|
2981
3109
|
return count;
|
|
2982
3110
|
}
|
|
2983
3111
|
getStylesXml() {
|
|
2984
|
-
const stylesFile = this.zipHandler.getFileAsString(
|
|
3112
|
+
const stylesFile = this.zipHandler.getFileAsString(types_js_1.DOCX_PATHS.STYLES);
|
|
2985
3113
|
return stylesFile || this.stylesManager.generateStylesXml();
|
|
2986
3114
|
}
|
|
2987
3115
|
setStylesXml(xml) {
|
|
2988
|
-
this.zipHandler.updateFile(
|
|
3116
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.STYLES, xml);
|
|
2989
3117
|
this.stylesManager.clear();
|
|
2990
3118
|
}
|
|
2991
3119
|
getZipHandler() {
|
|
@@ -3130,7 +3258,7 @@ class Document {
|
|
|
3130
3258
|
if (paraIndex === -1) {
|
|
3131
3259
|
throw new Error('Paragraph not found in document body elements');
|
|
3132
3260
|
}
|
|
3133
|
-
const table = new
|
|
3261
|
+
const table = new Table_js_1.Table(1, 1);
|
|
3134
3262
|
const cell = table.getCell(0, 0);
|
|
3135
3263
|
if (!cell) {
|
|
3136
3264
|
throw new Error('Failed to get cell from newly created table');
|
|
@@ -3230,10 +3358,10 @@ class Document {
|
|
|
3230
3358
|
const runs = [];
|
|
3231
3359
|
const content = para.getContent();
|
|
3232
3360
|
for (const item of content) {
|
|
3233
|
-
if (item instanceof
|
|
3361
|
+
if (item instanceof Run_js_1.Run) {
|
|
3234
3362
|
runs.push(item);
|
|
3235
3363
|
}
|
|
3236
|
-
else if (item instanceof
|
|
3364
|
+
else if (item instanceof Revision_js_1.Revision) {
|
|
3237
3365
|
const revType = item.getType();
|
|
3238
3366
|
if (revType === 'delete' || revType === 'moveFrom') {
|
|
3239
3367
|
continue;
|
|
@@ -3241,13 +3369,21 @@ class Document {
|
|
|
3241
3369
|
const revisionRuns = item.getRuns();
|
|
3242
3370
|
runs.push(...revisionRuns);
|
|
3243
3371
|
}
|
|
3244
|
-
else if (item instanceof
|
|
3372
|
+
else if (item instanceof Hyperlink_js_1.Hyperlink) {
|
|
3245
3373
|
const hyperlinkRun = item.getRun();
|
|
3246
3374
|
runs.push(hyperlinkRun);
|
|
3247
3375
|
}
|
|
3248
3376
|
}
|
|
3249
3377
|
return runs;
|
|
3250
3378
|
}
|
|
3379
|
+
static stripThemeFontsIfExplicitFont(runConfig) {
|
|
3380
|
+
if (runConfig?.font) {
|
|
3381
|
+
delete runConfig.fontAsciiTheme;
|
|
3382
|
+
delete runConfig.fontHAnsiTheme;
|
|
3383
|
+
delete runConfig.fontEastAsiaTheme;
|
|
3384
|
+
delete runConfig.fontCsTheme;
|
|
3385
|
+
}
|
|
3386
|
+
}
|
|
3251
3387
|
applyStyles(options) {
|
|
3252
3388
|
const results = {
|
|
3253
3389
|
heading1: false,
|
|
@@ -3316,6 +3452,11 @@ class Document {
|
|
|
3316
3452
|
...options?.listParagraph?.paragraph,
|
|
3317
3453
|
},
|
|
3318
3454
|
};
|
|
3455
|
+
Document.stripThemeFontsIfExplicitFont(h1Config.run);
|
|
3456
|
+
Document.stripThemeFontsIfExplicitFont(h2Config.run);
|
|
3457
|
+
Document.stripThemeFontsIfExplicitFont(h3Config.run);
|
|
3458
|
+
Document.stripThemeFontsIfExplicitFont(normalConfig.run);
|
|
3459
|
+
Document.stripThemeFontsIfExplicitFont(listParaConfig.run);
|
|
3319
3460
|
const preserveBlankLines = options?.preserveBlankLinesAfterHeading2Tables ?? true;
|
|
3320
3461
|
if (heading1 && h1Config.run && h1Config.paragraph) {
|
|
3321
3462
|
if (h1Config.run)
|
|
@@ -3367,7 +3508,7 @@ class Document {
|
|
|
3367
3508
|
const indent = listParaConfig.paragraph.indentation;
|
|
3368
3509
|
if (indent?.hanging !== undefined && indent?.left !== undefined) {
|
|
3369
3510
|
if (indent.hanging > indent.left) {
|
|
3370
|
-
const logger = (0,
|
|
3511
|
+
const logger = (0, logger_js_1.getGlobalLogger)();
|
|
3371
3512
|
logger.warn(`[Document] ListParagraph indentation: hanging (${indent.hanging}) > left (${indent.left}). ` +
|
|
3372
3513
|
`Capping hanging to left to prevent negative bullet position.`);
|
|
3373
3514
|
indent.hanging = indent.left;
|
|
@@ -3597,13 +3738,13 @@ class Document {
|
|
|
3597
3738
|
if (tableIndex !== -1) {
|
|
3598
3739
|
const nextElement = this.bodyElements[tableIndex + 1];
|
|
3599
3740
|
const isNextElementBlank = (() => {
|
|
3600
|
-
if (!(nextElement instanceof
|
|
3741
|
+
if (!(nextElement instanceof Paragraph_js_1.Paragraph))
|
|
3601
3742
|
return false;
|
|
3602
3743
|
const content = nextElement.getContent();
|
|
3603
3744
|
if (!content || content.length === 0)
|
|
3604
3745
|
return true;
|
|
3605
3746
|
for (const item of content) {
|
|
3606
|
-
if (item instanceof
|
|
3747
|
+
if (item instanceof Hyperlink_js_1.Hyperlink) {
|
|
3607
3748
|
return false;
|
|
3608
3749
|
}
|
|
3609
3750
|
if (item.getText) {
|
|
@@ -3615,7 +3756,7 @@ class Document {
|
|
|
3615
3756
|
return true;
|
|
3616
3757
|
})();
|
|
3617
3758
|
if (!isNextElementBlank) {
|
|
3618
|
-
const blankPara =
|
|
3759
|
+
const blankPara = Paragraph_js_1.Paragraph.create();
|
|
3619
3760
|
blankPara.setSpaceAfter(120);
|
|
3620
3761
|
if (preserveBlankLines) {
|
|
3621
3762
|
blankPara.setPreserved(true);
|
|
@@ -3909,7 +4050,7 @@ class Document {
|
|
|
3909
4050
|
}
|
|
3910
4051
|
let tocStyle = this.stylesManager.getStyle(styleId);
|
|
3911
4052
|
if (!tocStyle) {
|
|
3912
|
-
tocStyle =
|
|
4053
|
+
tocStyle = Style_js_1.Style.createTOCStyle(level, {
|
|
3913
4054
|
run: options.run,
|
|
3914
4055
|
paragraph: paragraphOverride,
|
|
3915
4056
|
});
|
|
@@ -4187,28 +4328,28 @@ class Document {
|
|
|
4187
4328
|
para.setAlignment(options.alignment);
|
|
4188
4329
|
}
|
|
4189
4330
|
if (options.spaceAbove !== undefined) {
|
|
4190
|
-
para.setSpaceBefore(options.spaceAbove *
|
|
4331
|
+
para.setSpaceBefore(options.spaceAbove * units_js_1.UNITS.TWIPS_PER_POINT);
|
|
4191
4332
|
}
|
|
4192
4333
|
if (options.spaceBelow !== undefined) {
|
|
4193
|
-
para.setSpaceAfter(options.spaceBelow *
|
|
4334
|
+
para.setSpaceAfter(options.spaceBelow * units_js_1.UNITS.TWIPS_PER_POINT);
|
|
4194
4335
|
}
|
|
4195
4336
|
if (options.lineSpacing !== undefined) {
|
|
4196
|
-
para.setLineSpacing(options.lineSpacing *
|
|
4337
|
+
para.setLineSpacing(options.lineSpacing * units_js_1.UNITS.TWIPS_PER_POINT);
|
|
4197
4338
|
}
|
|
4198
4339
|
if (options.indentLeft !== undefined) {
|
|
4199
|
-
para.setLeftIndent(options.indentLeft *
|
|
4340
|
+
para.setLeftIndent(options.indentLeft * units_js_1.UNITS.TWIPS_PER_INCH);
|
|
4200
4341
|
}
|
|
4201
4342
|
if (options.indentRight !== undefined) {
|
|
4202
|
-
para.setRightIndent(options.indentRight *
|
|
4343
|
+
para.setRightIndent(options.indentRight * units_js_1.UNITS.TWIPS_PER_INCH);
|
|
4203
4344
|
}
|
|
4204
4345
|
if (options.indentFirst !== undefined) {
|
|
4205
|
-
para.setFirstLineIndent(options.indentFirst *
|
|
4346
|
+
para.setFirstLineIndent(options.indentFirst * units_js_1.UNITS.TWIPS_PER_INCH);
|
|
4206
4347
|
}
|
|
4207
4348
|
if (options.indentHanging !== undefined) {
|
|
4208
4349
|
if (!para.formatting.indentation) {
|
|
4209
4350
|
para.formatting.indentation = {};
|
|
4210
4351
|
}
|
|
4211
|
-
para.formatting.indentation.hanging = options.indentHanging *
|
|
4352
|
+
para.formatting.indentation.hanging = options.indentHanging * units_js_1.UNITS.TWIPS_PER_INCH;
|
|
4212
4353
|
}
|
|
4213
4354
|
if (options.keepWithNext) {
|
|
4214
4355
|
para.setKeepNext(true);
|
|
@@ -4513,7 +4654,7 @@ class Document {
|
|
|
4513
4654
|
findHeadingStylesUsedByParagraphs() {
|
|
4514
4655
|
const usedStyles = new Map();
|
|
4515
4656
|
const processElement = (element) => {
|
|
4516
|
-
if (element instanceof
|
|
4657
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
4517
4658
|
const styleId = element.getStyle();
|
|
4518
4659
|
if (styleId) {
|
|
4519
4660
|
const style = this.stylesManager.getStyle(styleId);
|
|
@@ -4529,7 +4670,7 @@ class Document {
|
|
|
4529
4670
|
}
|
|
4530
4671
|
}
|
|
4531
4672
|
}
|
|
4532
|
-
else if (element instanceof
|
|
4673
|
+
else if (element instanceof Table_js_1.Table) {
|
|
4533
4674
|
for (let row = 0; row < element.getRowCount(); row++) {
|
|
4534
4675
|
const rowObj = element.getRow(row);
|
|
4535
4676
|
if (rowObj) {
|
|
@@ -4554,7 +4695,7 @@ class Document {
|
|
|
4554
4695
|
const headings = [];
|
|
4555
4696
|
const levelSet = new Set(levels);
|
|
4556
4697
|
try {
|
|
4557
|
-
const parsed =
|
|
4698
|
+
const parsed = XMLParser_js_1.XMLParser.parseToObject(docXml, { trimValues: false });
|
|
4558
4699
|
const document = parsed['w:document'];
|
|
4559
4700
|
if (!document) {
|
|
4560
4701
|
return headings;
|
|
@@ -4663,7 +4804,7 @@ class Document {
|
|
|
4663
4804
|
}
|
|
4664
4805
|
}
|
|
4665
4806
|
catch (error) {
|
|
4666
|
-
|
|
4807
|
+
logger_js_1.defaultLogger.error('Error parsing document.xml for headings:', error instanceof Error
|
|
4667
4808
|
? { message: error.message, stack: error.stack }
|
|
4668
4809
|
: { error: String(error) });
|
|
4669
4810
|
}
|
|
@@ -4751,7 +4892,7 @@ class Document {
|
|
|
4751
4892
|
.replace(/'/g, ''');
|
|
4752
4893
|
}
|
|
4753
4894
|
async populateTOCsInFile(filePath) {
|
|
4754
|
-
const handler = new
|
|
4895
|
+
const handler = new ZipHandler_js_1.ZipHandler();
|
|
4755
4896
|
await handler.load(filePath);
|
|
4756
4897
|
const docXml = handler.getFileAsString('word/document.xml');
|
|
4757
4898
|
if (!docXml) {
|
|
@@ -5005,14 +5146,14 @@ class Document {
|
|
|
5005
5146
|
const target = `media/image${this.imageManager.getImageCount() + 1}.${image.getExtension()}`;
|
|
5006
5147
|
const relationship = this.relationshipManager.addImage(target);
|
|
5007
5148
|
this.imageManager.registerImage(image, relationship.getId());
|
|
5008
|
-
const para = new
|
|
5149
|
+
const para = new Paragraph_js_1.Paragraph();
|
|
5009
5150
|
const imageRun = this.createImageRun(image);
|
|
5010
5151
|
para.addRun(imageRun);
|
|
5011
5152
|
this.bodyElements.push(para);
|
|
5012
5153
|
return this;
|
|
5013
5154
|
}
|
|
5014
5155
|
createImageRun(image) {
|
|
5015
|
-
return new
|
|
5156
|
+
return new ImageRun_js_1.ImageRun(image);
|
|
5016
5157
|
}
|
|
5017
5158
|
getImageManager() {
|
|
5018
5159
|
return this.imageManager;
|
|
@@ -5062,14 +5203,14 @@ class Document {
|
|
|
5062
5203
|
if (this.commentManager.getCount() > 0) {
|
|
5063
5204
|
const xml = this.commentManager.generateCommentsXml();
|
|
5064
5205
|
this.zipHandler.addFile('word/comments.xml', xml);
|
|
5065
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5206
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.COMMENTS);
|
|
5066
5207
|
if (existingRels.length === 0) {
|
|
5067
5208
|
this.relationshipManager.addComments();
|
|
5068
5209
|
}
|
|
5069
5210
|
}
|
|
5070
5211
|
else {
|
|
5071
5212
|
this.zipHandler.removeFile('word/comments.xml');
|
|
5072
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5213
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.COMMENTS);
|
|
5073
5214
|
for (const rel of existingRels) {
|
|
5074
5215
|
this.relationshipManager.removeRelationship(rel.getId());
|
|
5075
5216
|
}
|
|
@@ -5081,7 +5222,7 @@ class Document {
|
|
|
5081
5222
|
for (const [path, content] of this._originalCommentCompanionFiles) {
|
|
5082
5223
|
this.zipHandler.addFile(path, content);
|
|
5083
5224
|
}
|
|
5084
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5225
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.COMMENTS);
|
|
5085
5226
|
if (existingRels.length === 0) {
|
|
5086
5227
|
this.relationshipManager.addComments();
|
|
5087
5228
|
}
|
|
@@ -5089,7 +5230,7 @@ class Document {
|
|
|
5089
5230
|
else if (this.commentManager.getCount() > 0) {
|
|
5090
5231
|
const xml = this.commentManager.generateCommentsXml();
|
|
5091
5232
|
this.zipHandler.addFile('word/comments.xml', xml);
|
|
5092
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5233
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.COMMENTS);
|
|
5093
5234
|
if (existingRels.length === 0) {
|
|
5094
5235
|
this.relationshipManager.addComments();
|
|
5095
5236
|
}
|
|
@@ -5097,9 +5238,9 @@ class Document {
|
|
|
5097
5238
|
}
|
|
5098
5239
|
removeCommentCompanionFiles() {
|
|
5099
5240
|
const companionPaths = [
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5241
|
+
types_js_1.DOCX_PATHS.COMMENTS_EXTENDED,
|
|
5242
|
+
types_js_1.DOCX_PATHS.COMMENTS_IDS,
|
|
5243
|
+
types_js_1.DOCX_PATHS.COMMENTS_EXTENSIBLE,
|
|
5103
5244
|
];
|
|
5104
5245
|
for (const filePath of companionPaths) {
|
|
5105
5246
|
this.zipHandler.removeFile(filePath);
|
|
@@ -5114,16 +5255,16 @@ class Document {
|
|
|
5114
5255
|
saveFootnotes() {
|
|
5115
5256
|
if (this._footnotesModified || this.footnoteManager.getCount() > 0) {
|
|
5116
5257
|
const xml = this.footnoteManager.generateFootnotesXml();
|
|
5117
|
-
this.zipHandler.addFile(
|
|
5118
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5258
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.FOOTNOTES, xml);
|
|
5259
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.FOOTNOTES);
|
|
5119
5260
|
if (existingRels.length === 0) {
|
|
5120
5261
|
this.relationshipManager.addFootnotes();
|
|
5121
5262
|
}
|
|
5122
5263
|
this.generatePartLevelHyperlinkRels(this.footnoteManager.getAllFootnotes().flatMap((fn) => fn.getParagraphs()), 'word/_rels/footnotes.xml.rels');
|
|
5123
5264
|
}
|
|
5124
5265
|
else if (this._originalFootnotesXml) {
|
|
5125
|
-
this.zipHandler.addFile(
|
|
5126
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5266
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.FOOTNOTES, this._originalFootnotesXml);
|
|
5267
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.FOOTNOTES);
|
|
5127
5268
|
if (existingRels.length === 0) {
|
|
5128
5269
|
this.relationshipManager.addFootnotes();
|
|
5129
5270
|
}
|
|
@@ -5132,16 +5273,16 @@ class Document {
|
|
|
5132
5273
|
saveEndnotes() {
|
|
5133
5274
|
if (this._endnotesModified || this.endnoteManager.getCount() > 0) {
|
|
5134
5275
|
const xml = this.endnoteManager.generateEndnotesXml();
|
|
5135
|
-
this.zipHandler.addFile(
|
|
5136
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5276
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.ENDNOTES, xml);
|
|
5277
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.ENDNOTES);
|
|
5137
5278
|
if (existingRels.length === 0) {
|
|
5138
5279
|
this.relationshipManager.addEndnotes();
|
|
5139
5280
|
}
|
|
5140
5281
|
this.generatePartLevelHyperlinkRels(this.endnoteManager.getAllEndnotes().flatMap((en) => en.getParagraphs()), 'word/_rels/endnotes.xml.rels');
|
|
5141
5282
|
}
|
|
5142
5283
|
else if (this._originalEndnotesXml) {
|
|
5143
|
-
this.zipHandler.addFile(
|
|
5144
|
-
const existingRels = this.relationshipManager.getRelationshipsByType(
|
|
5284
|
+
this.zipHandler.addFile(types_js_1.DOCX_PATHS.ENDNOTES, this._originalEndnotesXml);
|
|
5285
|
+
const existingRels = this.relationshipManager.getRelationshipsByType(Relationship_js_1.RelationshipType.ENDNOTES);
|
|
5145
5286
|
if (existingRels.length === 0) {
|
|
5146
5287
|
this.relationshipManager.addEndnotes();
|
|
5147
5288
|
}
|
|
@@ -5150,10 +5291,10 @@ class Document {
|
|
|
5150
5291
|
extractParagraphsFromElements(elements) {
|
|
5151
5292
|
const result = [];
|
|
5152
5293
|
for (const el of elements) {
|
|
5153
|
-
if (el instanceof
|
|
5294
|
+
if (el instanceof Paragraph_js_1.Paragraph) {
|
|
5154
5295
|
result.push(el);
|
|
5155
5296
|
}
|
|
5156
|
-
else if (el instanceof
|
|
5297
|
+
else if (el instanceof Table_js_1.Table) {
|
|
5157
5298
|
for (const row of el.getRows()) {
|
|
5158
5299
|
for (const cell of row.getCells()) {
|
|
5159
5300
|
result.push(...cell.getParagraphs());
|
|
@@ -5167,16 +5308,16 @@ class Document {
|
|
|
5167
5308
|
const hyperlinkRels = [];
|
|
5168
5309
|
for (const para of paragraphs) {
|
|
5169
5310
|
for (const item of para.getContent()) {
|
|
5170
|
-
if (item instanceof
|
|
5311
|
+
if (item instanceof Hyperlink_js_1.Hyperlink && item.isExternal()) {
|
|
5171
5312
|
const relId = item.getRelationshipId();
|
|
5172
5313
|
const url = item.getUrl();
|
|
5173
5314
|
if (relId && url) {
|
|
5174
5315
|
hyperlinkRels.push({ id: relId, url });
|
|
5175
5316
|
}
|
|
5176
5317
|
}
|
|
5177
|
-
if (item instanceof
|
|
5318
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
5178
5319
|
for (const revContent of item.getContent()) {
|
|
5179
|
-
if (revContent instanceof
|
|
5320
|
+
if (revContent instanceof Hyperlink_js_1.Hyperlink && revContent.isExternal()) {
|
|
5180
5321
|
const relId = revContent.getRelationshipId();
|
|
5181
5322
|
const url = revContent.getUrl();
|
|
5182
5323
|
if (relId && url) {
|
|
@@ -5192,8 +5333,8 @@ class Document {
|
|
|
5192
5333
|
xml +=
|
|
5193
5334
|
'<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n';
|
|
5194
5335
|
for (const rel of hyperlinkRels) {
|
|
5195
|
-
const escapedId =
|
|
5196
|
-
const escapedUrl =
|
|
5336
|
+
const escapedId = XMLBuilder_js_1.XMLBuilder.escapeXmlAttribute(rel.id);
|
|
5337
|
+
const escapedUrl = XMLBuilder_js_1.XMLBuilder.escapeXmlAttribute(rel.url);
|
|
5197
5338
|
xml += ` <Relationship Id="${escapedId}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="${escapedUrl}" TargetMode="External"/>\n`;
|
|
5198
5339
|
}
|
|
5199
5340
|
xml += '</Relationships>';
|
|
@@ -5207,7 +5348,7 @@ class Document {
|
|
|
5207
5348
|
const authors = new Set();
|
|
5208
5349
|
for (const para of this.getAllParagraphs()) {
|
|
5209
5350
|
for (const item of para.getContent()) {
|
|
5210
|
-
if (item instanceof
|
|
5351
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
5211
5352
|
const author = item.getAuthor();
|
|
5212
5353
|
if (author)
|
|
5213
5354
|
authors.add(author);
|
|
@@ -5224,7 +5365,7 @@ class Document {
|
|
|
5224
5365
|
}
|
|
5225
5366
|
}
|
|
5226
5367
|
for (const element of this.bodyElements) {
|
|
5227
|
-
if (element instanceof
|
|
5368
|
+
if (element instanceof Table_js_1.Table) {
|
|
5228
5369
|
this.collectAuthorsFromTable(element, authors);
|
|
5229
5370
|
}
|
|
5230
5371
|
}
|
|
@@ -5265,7 +5406,7 @@ class Document {
|
|
|
5265
5406
|
const newPeopleXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<w15:people xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="w15">${personElements}</w15:people>`;
|
|
5266
5407
|
this.zipHandler.addFile('word/people.xml', newPeopleXml);
|
|
5267
5408
|
}
|
|
5268
|
-
const peopleType =
|
|
5409
|
+
const peopleType = Relationship_js_1.RelationshipType.PEOPLE;
|
|
5269
5410
|
const existingPeopleRels = this.relationshipManager.getRelationshipsByType(peopleType);
|
|
5270
5411
|
if (existingPeopleRels.length === 0) {
|
|
5271
5412
|
this.relationshipManager.addPeople();
|
|
@@ -5286,7 +5427,7 @@ class Document {
|
|
|
5286
5427
|
continue;
|
|
5287
5428
|
for (const para of cell.getParagraphs()) {
|
|
5288
5429
|
for (const item of para.getContent()) {
|
|
5289
|
-
if (item instanceof
|
|
5430
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
5290
5431
|
const author = item.getAuthor();
|
|
5291
5432
|
if (author)
|
|
5292
5433
|
authors.add(author);
|
|
@@ -5330,7 +5471,7 @@ class Document {
|
|
|
5330
5471
|
updateContentTypesWithImagesHeadersFootersAndComments() {
|
|
5331
5472
|
const hasCustomProps = this.properties.customProperties && Object.keys(this.properties.customProperties).length > 0;
|
|
5332
5473
|
const contentTypes = this.generator.generateContentTypesWithImagesHeadersFootersAndComments(this.imageManager, this.headerFooterManager, this.commentManager, this.zipHandler, undefined, hasCustomProps, this._originalContentTypes, this.footnoteManager, this.endnoteManager);
|
|
5333
|
-
this.zipHandler.updateFile(
|
|
5474
|
+
this.zipHandler.updateFile(types_js_1.DOCX_PATHS.CONTENT_TYPES, contentTypes);
|
|
5334
5475
|
}
|
|
5335
5476
|
getBookmarkManager() {
|
|
5336
5477
|
return this.bookmarkManager;
|
|
@@ -5356,7 +5497,7 @@ class Document {
|
|
|
5356
5497
|
const BOOKMARK_NAME = '_top';
|
|
5357
5498
|
let bookmark = this.getBookmark(BOOKMARK_NAME);
|
|
5358
5499
|
if (!bookmark) {
|
|
5359
|
-
bookmark = new
|
|
5500
|
+
bookmark = new Bookmark_js_1.Bookmark({
|
|
5360
5501
|
id: 0,
|
|
5361
5502
|
name: BOOKMARK_NAME,
|
|
5362
5503
|
skipNormalization: true,
|
|
@@ -5367,7 +5508,7 @@ class Document {
|
|
|
5367
5508
|
paragraphs[0].addBookmark(bookmark);
|
|
5368
5509
|
}
|
|
5369
5510
|
else {
|
|
5370
|
-
const topParagraph = new
|
|
5511
|
+
const topParagraph = new Paragraph_js_1.Paragraph();
|
|
5371
5512
|
topParagraph.addBookmark(bookmark);
|
|
5372
5513
|
this.bodyElements.unshift(topParagraph);
|
|
5373
5514
|
}
|
|
@@ -5376,7 +5517,7 @@ class Document {
|
|
|
5376
5517
|
bookmark,
|
|
5377
5518
|
anchor: BOOKMARK_NAME,
|
|
5378
5519
|
hyperlink: (text, formatting) => {
|
|
5379
|
-
return
|
|
5520
|
+
return Hyperlink_js_1.Hyperlink.createInternal(BOOKMARK_NAME, text, formatting);
|
|
5380
5521
|
},
|
|
5381
5522
|
};
|
|
5382
5523
|
}
|
|
@@ -5389,16 +5530,16 @@ class Document {
|
|
|
5389
5530
|
let i = 0;
|
|
5390
5531
|
while (i < this.bodyElements.length) {
|
|
5391
5532
|
const element = this.bodyElements[i];
|
|
5392
|
-
if (element instanceof
|
|
5533
|
+
if (element instanceof Table_js_1.Table &&
|
|
5393
5534
|
element.getRowCount() === 1 &&
|
|
5394
5535
|
element.getColumnCount() === 1) {
|
|
5395
5536
|
oneByOneCount++;
|
|
5396
5537
|
if (oneByOneCount > 1) {
|
|
5397
5538
|
const prevElement = i > 0 ? this.bodyElements[i - 1] : undefined;
|
|
5398
|
-
const hasLink = prevElement instanceof
|
|
5539
|
+
const hasLink = prevElement instanceof Paragraph_js_1.Paragraph && this._paragraphHasTopLink(prevElement);
|
|
5399
5540
|
if (!hasLink) {
|
|
5400
|
-
const para = new
|
|
5401
|
-
const link =
|
|
5541
|
+
const para = new Paragraph_js_1.Paragraph();
|
|
5542
|
+
const link = Hyperlink_js_1.Hyperlink.createInternal('_top', linkText, {
|
|
5402
5543
|
color: '0000FF',
|
|
5403
5544
|
underline: 'single',
|
|
5404
5545
|
...formatting,
|
|
@@ -5416,16 +5557,16 @@ class Document {
|
|
|
5416
5557
|
}
|
|
5417
5558
|
_paragraphHasTopLink(paragraph) {
|
|
5418
5559
|
for (const item of paragraph.getContent()) {
|
|
5419
|
-
if (item instanceof
|
|
5560
|
+
if (item instanceof Hyperlink_js_1.Hyperlink && item.getAnchor() === '_top') {
|
|
5420
5561
|
return true;
|
|
5421
5562
|
}
|
|
5422
|
-
if (item instanceof
|
|
5563
|
+
if (item instanceof Field_js_1.ComplexField && item.isHyperlinkField()) {
|
|
5423
5564
|
const parsed = item.getParsedHyperlink();
|
|
5424
5565
|
if (parsed?.anchor === '_top') {
|
|
5425
5566
|
return true;
|
|
5426
5567
|
}
|
|
5427
5568
|
}
|
|
5428
|
-
if (item instanceof
|
|
5569
|
+
if (item instanceof PreservedElement_js_1.PreservedElement && item.getRawXml().includes('w:anchor="_top"')) {
|
|
5429
5570
|
return true;
|
|
5430
5571
|
}
|
|
5431
5572
|
}
|
|
@@ -5435,13 +5576,13 @@ class Document {
|
|
|
5435
5576
|
return this.revisionManager;
|
|
5436
5577
|
}
|
|
5437
5578
|
validateRevisions(options) {
|
|
5438
|
-
return
|
|
5579
|
+
return index_js_1.RevisionValidator.validate(this, options);
|
|
5439
5580
|
}
|
|
5440
5581
|
autoFixRevisions(options) {
|
|
5441
|
-
return
|
|
5582
|
+
return index_js_1.RevisionAutoFixer.fix(this, options);
|
|
5442
5583
|
}
|
|
5443
5584
|
isRevisionsValid() {
|
|
5444
|
-
return
|
|
5585
|
+
return index_js_1.RevisionValidator.isValid(this);
|
|
5445
5586
|
}
|
|
5446
5587
|
validateAndFixRevisions(options) {
|
|
5447
5588
|
const validation = this.validateRevisions(options?.validation);
|
|
@@ -5458,15 +5599,15 @@ class Document {
|
|
|
5458
5599
|
return { validation, fix };
|
|
5459
5600
|
}
|
|
5460
5601
|
createInsertion(author, content, date) {
|
|
5461
|
-
const revision =
|
|
5602
|
+
const revision = Revision_js_1.Revision.createInsertion(author, content, date);
|
|
5462
5603
|
return this.revisionManager.register(revision);
|
|
5463
5604
|
}
|
|
5464
5605
|
createDeletion(author, content, date) {
|
|
5465
|
-
const revision =
|
|
5606
|
+
const revision = Revision_js_1.Revision.createDeletion(author, content, date);
|
|
5466
5607
|
return this.revisionManager.register(revision);
|
|
5467
5608
|
}
|
|
5468
5609
|
createRevisionFromText(type, author, text, date) {
|
|
5469
|
-
const revision =
|
|
5610
|
+
const revision = Revision_js_1.Revision.fromText(type, author, text, date);
|
|
5470
5611
|
return this.revisionManager.register(revision);
|
|
5471
5612
|
}
|
|
5472
5613
|
findParagraphIndex(paragraph) {
|
|
@@ -5505,8 +5646,8 @@ class Document {
|
|
|
5505
5646
|
return revision;
|
|
5506
5647
|
}
|
|
5507
5648
|
trackFieldInstructionDeletion(paragraph, author, fieldInstruction, date) {
|
|
5508
|
-
const run = new
|
|
5509
|
-
const revision =
|
|
5649
|
+
const run = new Run_js_1.Run(fieldInstruction);
|
|
5650
|
+
const revision = Revision_js_1.Revision.createFieldInstructionDeletion(author, run, date);
|
|
5510
5651
|
this.revisionManager.register(revision);
|
|
5511
5652
|
const location = this.createRevisionLocation(paragraph);
|
|
5512
5653
|
if (location) {
|
|
@@ -5732,7 +5873,7 @@ class Document {
|
|
|
5732
5873
|
return this.documentProtection;
|
|
5733
5874
|
}
|
|
5734
5875
|
getCompatibilityMode() {
|
|
5735
|
-
return this._compatInfo?.mode ??
|
|
5876
|
+
return this._compatInfo?.mode ?? compatibility_types_js_1.CompatibilityMode.Word2007;
|
|
5736
5877
|
}
|
|
5737
5878
|
getDocumentBackground() {
|
|
5738
5879
|
return this._documentBackground ? { ...this._documentBackground } : undefined;
|
|
@@ -5798,7 +5939,7 @@ class Document {
|
|
|
5798
5939
|
setDefaultFont(fontName, sizeInPoints) {
|
|
5799
5940
|
let normalStyle = this.stylesManager.getStyle('Normal');
|
|
5800
5941
|
if (!normalStyle) {
|
|
5801
|
-
normalStyle = new
|
|
5942
|
+
normalStyle = new Style_js_1.Style({
|
|
5802
5943
|
styleId: 'Normal',
|
|
5803
5944
|
name: 'Normal',
|
|
5804
5945
|
type: 'paragraph',
|
|
@@ -5817,7 +5958,7 @@ class Document {
|
|
|
5817
5958
|
setDefaultFontSize(sizeInPoints) {
|
|
5818
5959
|
let normalStyle = this.stylesManager.getStyle('Normal');
|
|
5819
5960
|
if (!normalStyle) {
|
|
5820
|
-
normalStyle = new
|
|
5961
|
+
normalStyle = new Style_js_1.Style({
|
|
5821
5962
|
styleId: 'Normal',
|
|
5822
5963
|
name: 'Normal',
|
|
5823
5964
|
type: 'paragraph',
|
|
@@ -5872,7 +6013,7 @@ class Document {
|
|
|
5872
6013
|
}
|
|
5873
6014
|
getCompatibilityInfo() {
|
|
5874
6015
|
return (this._compatInfo ?? {
|
|
5875
|
-
mode:
|
|
6016
|
+
mode: compatibility_types_js_1.CompatibilityMode.Word2007,
|
|
5876
6017
|
isLegacyMode: true,
|
|
5877
6018
|
compatSettings: [],
|
|
5878
6019
|
legacyFlags: [],
|
|
@@ -5881,7 +6022,7 @@ class Document {
|
|
|
5881
6022
|
upgradeToModernFormat() {
|
|
5882
6023
|
const currentMode = this.getCompatibilityMode();
|
|
5883
6024
|
const currentInfo = this.getCompatibilityInfo();
|
|
5884
|
-
if (currentMode ===
|
|
6025
|
+
if (currentMode === compatibility_types_js_1.CompatibilityMode.Word2013Plus && currentInfo.legacyFlags.length === 0) {
|
|
5885
6026
|
return {
|
|
5886
6027
|
previousMode: currentMode,
|
|
5887
6028
|
newMode: 15,
|
|
@@ -5892,65 +6033,65 @@ class Document {
|
|
|
5892
6033
|
};
|
|
5893
6034
|
}
|
|
5894
6035
|
if (this._originalSettingsXml) {
|
|
5895
|
-
const result =
|
|
6036
|
+
const result = CompatibilityUpgrader_js_1.CompatibilityUpgrader.upgradeCompatBlock(this._originalSettingsXml, currentMode);
|
|
5896
6037
|
this._originalSettingsXml = result.xml;
|
|
5897
6038
|
this._settingsModified = true;
|
|
5898
|
-
const nsResult =
|
|
6039
|
+
const nsResult = CompatibilityUpgrader_js_1.CompatibilityUpgrader.ensureModernNamespaces(this.namespaces);
|
|
5899
6040
|
this.namespaces = nsResult.namespaces;
|
|
5900
6041
|
result.report.namespacesExpanded = nsResult.expanded;
|
|
5901
6042
|
this._compatInfo = {
|
|
5902
|
-
mode:
|
|
6043
|
+
mode: compatibility_types_js_1.CompatibilityMode.Word2013Plus,
|
|
5903
6044
|
isLegacyMode: false,
|
|
5904
|
-
compatSettings: [...
|
|
6045
|
+
compatSettings: [...legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS],
|
|
5905
6046
|
legacyFlags: [],
|
|
5906
6047
|
};
|
|
5907
6048
|
return result.report;
|
|
5908
6049
|
}
|
|
5909
6050
|
this._compatInfo = {
|
|
5910
|
-
mode:
|
|
6051
|
+
mode: compatibility_types_js_1.CompatibilityMode.Word2013Plus,
|
|
5911
6052
|
isLegacyMode: false,
|
|
5912
|
-
compatSettings: [...
|
|
6053
|
+
compatSettings: [...legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS],
|
|
5913
6054
|
legacyFlags: [],
|
|
5914
6055
|
};
|
|
5915
|
-
const nsResult =
|
|
6056
|
+
const nsResult = CompatibilityUpgrader_js_1.CompatibilityUpgrader.ensureModernNamespaces(this.namespaces);
|
|
5916
6057
|
this.namespaces = nsResult.namespaces;
|
|
5917
6058
|
return {
|
|
5918
6059
|
previousMode: currentMode,
|
|
5919
6060
|
newMode: 15,
|
|
5920
6061
|
removedFlags: [],
|
|
5921
|
-
addedSettings:
|
|
6062
|
+
addedSettings: legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS.map((s) => s.name),
|
|
5922
6063
|
namespacesExpanded: nsResult.expanded,
|
|
5923
|
-
changed: currentMode !==
|
|
6064
|
+
changed: currentMode !== compatibility_types_js_1.CompatibilityMode.Word2013Plus,
|
|
5924
6065
|
};
|
|
5925
6066
|
}
|
|
5926
6067
|
createRunPropertiesChange(author, content, previousProperties, date) {
|
|
5927
|
-
const revision =
|
|
6068
|
+
const revision = Revision_js_1.Revision.createRunPropertiesChange(author, content, previousProperties, date);
|
|
5928
6069
|
return this.revisionManager.register(revision);
|
|
5929
6070
|
}
|
|
5930
6071
|
createParagraphPropertiesChange(author, content, previousProperties, date) {
|
|
5931
|
-
const revision =
|
|
6072
|
+
const revision = Revision_js_1.Revision.createParagraphPropertiesChange(author, content, previousProperties, date);
|
|
5932
6073
|
return this.revisionManager.register(revision);
|
|
5933
6074
|
}
|
|
5934
6075
|
createTablePropertiesChange(author, content, previousProperties, date) {
|
|
5935
|
-
const revision =
|
|
6076
|
+
const revision = Revision_js_1.Revision.createTablePropertiesChange(author, content, previousProperties, date);
|
|
5936
6077
|
return this.revisionManager.register(revision);
|
|
5937
6078
|
}
|
|
5938
6079
|
createMoveFrom(author, content, moveId, date) {
|
|
5939
|
-
const revision =
|
|
6080
|
+
const revision = Revision_js_1.Revision.createMoveFrom(author, content, moveId, date);
|
|
5940
6081
|
return this.revisionManager.register(revision);
|
|
5941
6082
|
}
|
|
5942
6083
|
createMoveTo(author, content, moveId, date) {
|
|
5943
|
-
const revision =
|
|
6084
|
+
const revision = Revision_js_1.Revision.createMoveTo(author, content, moveId, date);
|
|
5944
6085
|
return this.revisionManager.register(revision);
|
|
5945
6086
|
}
|
|
5946
6087
|
trackMove(author, content, date) {
|
|
5947
6088
|
const moveId = `move${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
5948
6089
|
const moveName = `move${Date.now()}`;
|
|
5949
6090
|
const rangeIdStart = this.revisionManager.getStats().nextId;
|
|
5950
|
-
const moveFromRangeStart =
|
|
5951
|
-
const moveFromRangeEnd =
|
|
5952
|
-
const moveToRangeStart =
|
|
5953
|
-
const moveToRangeEnd =
|
|
6091
|
+
const moveFromRangeStart = RangeMarker_js_1.RangeMarker.createMoveFromStart(rangeIdStart, moveName, author, date);
|
|
6092
|
+
const moveFromRangeEnd = RangeMarker_js_1.RangeMarker.createMoveFromEnd(rangeIdStart);
|
|
6093
|
+
const moveToRangeStart = RangeMarker_js_1.RangeMarker.createMoveToStart(rangeIdStart, moveName, author, date);
|
|
6094
|
+
const moveToRangeEnd = RangeMarker_js_1.RangeMarker.createMoveToEnd(rangeIdStart);
|
|
5954
6095
|
const moveFrom = this.createMoveFrom(author, content, moveId, date);
|
|
5955
6096
|
const moveTo = this.createMoveTo(author, content, moveId, date);
|
|
5956
6097
|
return {
|
|
@@ -5964,19 +6105,19 @@ class Document {
|
|
|
5964
6105
|
};
|
|
5965
6106
|
}
|
|
5966
6107
|
createTableCellInsert(author, content, date) {
|
|
5967
|
-
const revision =
|
|
6108
|
+
const revision = Revision_js_1.Revision.createTableCellInsert(author, content, date);
|
|
5968
6109
|
return this.revisionManager.register(revision);
|
|
5969
6110
|
}
|
|
5970
6111
|
createTableCellDelete(author, content, date) {
|
|
5971
|
-
const revision =
|
|
6112
|
+
const revision = Revision_js_1.Revision.createTableCellDelete(author, content, date);
|
|
5972
6113
|
return this.revisionManager.register(revision);
|
|
5973
6114
|
}
|
|
5974
6115
|
createTableCellMerge(author, content, date) {
|
|
5975
|
-
const revision =
|
|
6116
|
+
const revision = Revision_js_1.Revision.createTableCellMerge(author, content, date);
|
|
5976
6117
|
return this.revisionManager.register(revision);
|
|
5977
6118
|
}
|
|
5978
6119
|
createNumberingChange(author, content, previousProperties, date) {
|
|
5979
|
-
const revision =
|
|
6120
|
+
const revision = Revision_js_1.Revision.createNumberingChange(author, content, previousProperties, date);
|
|
5980
6121
|
return this.revisionManager.register(revision);
|
|
5981
6122
|
}
|
|
5982
6123
|
getCommentManager() {
|
|
@@ -6102,7 +6243,7 @@ class Document {
|
|
|
6102
6243
|
const updates = [];
|
|
6103
6244
|
for (const para of this.getAllParagraphs()) {
|
|
6104
6245
|
for (const content of para.getContent()) {
|
|
6105
|
-
if (content instanceof
|
|
6246
|
+
if (content instanceof Hyperlink_js_1.Hyperlink && content.isExternal()) {
|
|
6106
6247
|
const currentUrl = content.getUrl();
|
|
6107
6248
|
if (currentUrl && urlMap.has(currentUrl)) {
|
|
6108
6249
|
const newUrl = urlMap.get(currentUrl);
|
|
@@ -6130,8 +6271,8 @@ class Document {
|
|
|
6130
6271
|
return this.acceptAllRevisions();
|
|
6131
6272
|
}
|
|
6132
6273
|
async acceptAllRevisions() {
|
|
6133
|
-
const result = (0,
|
|
6134
|
-
(0,
|
|
6274
|
+
const result = (0, InMemoryRevisionAcceptor_js_1.acceptRevisionsInMemory)(this);
|
|
6275
|
+
(0, acceptRevisions_js_1.cleanupRevisionMetadata)(this.zipHandler);
|
|
6135
6276
|
this.logger.info('Accepted all revisions using in-memory transformation', {
|
|
6136
6277
|
insertions: result.insertionsAccepted,
|
|
6137
6278
|
deletions: result.deletionsAccepted,
|
|
@@ -6160,7 +6301,7 @@ class Document {
|
|
|
6160
6301
|
}
|
|
6161
6302
|
for (const headerEntry of this.headerFooterManager.getAllHeaders()) {
|
|
6162
6303
|
for (const element of headerEntry.header.getElements()) {
|
|
6163
|
-
if (element instanceof
|
|
6304
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
6164
6305
|
paragraphsProcessed++;
|
|
6165
6306
|
totalConsolidated += element.consolidateRevisions(timeWindowMs);
|
|
6166
6307
|
}
|
|
@@ -6168,7 +6309,7 @@ class Document {
|
|
|
6168
6309
|
}
|
|
6169
6310
|
for (const footerEntry of this.headerFooterManager.getAllFooters()) {
|
|
6170
6311
|
for (const element of footerEntry.footer.getElements()) {
|
|
6171
|
-
if (element instanceof
|
|
6312
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
6172
6313
|
paragraphsProcessed++;
|
|
6173
6314
|
totalConsolidated += element.consolidateRevisions(timeWindowMs);
|
|
6174
6315
|
}
|
|
@@ -6181,7 +6322,7 @@ class Document {
|
|
|
6181
6322
|
return { paragraphsProcessed, revisionsConsolidated: totalConsolidated };
|
|
6182
6323
|
}
|
|
6183
6324
|
async acceptAllRevisionsRawXml() {
|
|
6184
|
-
await (0,
|
|
6325
|
+
await (0, acceptRevisions_js_1.acceptAllRevisions)(this.zipHandler);
|
|
6185
6326
|
this.clearRevisionsFromAllParagraphs();
|
|
6186
6327
|
this.skipDocumentXmlRegeneration = true;
|
|
6187
6328
|
return this;
|
|
@@ -6197,16 +6338,16 @@ class Document {
|
|
|
6197
6338
|
const revisions = para.getRevisions();
|
|
6198
6339
|
if (revisions.length > 0) {
|
|
6199
6340
|
const content = para.getContent();
|
|
6200
|
-
const nonRevisionContent = content.filter((item) => !(item instanceof
|
|
6341
|
+
const nonRevisionContent = content.filter((item) => !(item instanceof Revision_js_1.Revision));
|
|
6201
6342
|
para.clearContent();
|
|
6202
6343
|
for (const item of nonRevisionContent) {
|
|
6203
|
-
if (item instanceof
|
|
6344
|
+
if (item instanceof Run_js_1.Run || item instanceof ImageRun_js_1.ImageRun) {
|
|
6204
6345
|
para.addRun(item);
|
|
6205
6346
|
}
|
|
6206
|
-
else if (item instanceof
|
|
6347
|
+
else if (item instanceof Hyperlink_js_1.Hyperlink) {
|
|
6207
6348
|
para.addHyperlink(item);
|
|
6208
6349
|
}
|
|
6209
|
-
else if (item instanceof
|
|
6350
|
+
else if (item instanceof Field_js_1.Field) {
|
|
6210
6351
|
para.addField(item);
|
|
6211
6352
|
}
|
|
6212
6353
|
}
|
|
@@ -6272,7 +6413,59 @@ class Document {
|
|
|
6272
6413
|
this.bodyElements = [];
|
|
6273
6414
|
return this;
|
|
6274
6415
|
}
|
|
6416
|
+
on(event, listener) {
|
|
6417
|
+
return this._events.on(event, listener);
|
|
6418
|
+
}
|
|
6419
|
+
off(event, listener) {
|
|
6420
|
+
this._events.off(event, listener);
|
|
6421
|
+
}
|
|
6422
|
+
listenerCount(event) {
|
|
6423
|
+
return this._events.listenerCount(event);
|
|
6424
|
+
}
|
|
6425
|
+
_emitElementAdded(element, index) {
|
|
6426
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
6427
|
+
this._events.emit('paragraphAdded', { paragraph: element, index });
|
|
6428
|
+
}
|
|
6429
|
+
else if (element instanceof Table_js_1.Table) {
|
|
6430
|
+
this._events.emit('tableAdded', { table: element });
|
|
6431
|
+
}
|
|
6432
|
+
}
|
|
6433
|
+
_emitElementRemoved(element) {
|
|
6434
|
+
if (!element)
|
|
6435
|
+
return;
|
|
6436
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
6437
|
+
this._events.emit('paragraphRemoved', { paragraph: element });
|
|
6438
|
+
}
|
|
6439
|
+
else if (element instanceof Table_js_1.Table) {
|
|
6440
|
+
this._events.emit('tableRemoved', { table: element });
|
|
6441
|
+
}
|
|
6442
|
+
}
|
|
6443
|
+
static globalDefaults = {};
|
|
6444
|
+
static setDefaults(defaults) {
|
|
6445
|
+
Document.globalDefaults = { ...defaults };
|
|
6446
|
+
}
|
|
6447
|
+
static getDefaults() {
|
|
6448
|
+
return { ...Document.globalDefaults };
|
|
6449
|
+
}
|
|
6450
|
+
static resetDefaults() {
|
|
6451
|
+
Document.globalDefaults = {};
|
|
6452
|
+
}
|
|
6453
|
+
static applyGlobalDefaultsToParagraph(para) {
|
|
6454
|
+
const d = Document.globalDefaults;
|
|
6455
|
+
if (!d.font && d.fontSize === undefined && !d.fontColor)
|
|
6456
|
+
return;
|
|
6457
|
+
for (const run of para.getRuns()) {
|
|
6458
|
+
const fmt = run.getFormatting();
|
|
6459
|
+
if (d.font && !fmt.font)
|
|
6460
|
+
run.setFont(d.font);
|
|
6461
|
+
if (d.fontSize !== undefined && fmt.size === undefined)
|
|
6462
|
+
run.setSize(d.fontSize);
|
|
6463
|
+
if (d.fontColor && !fmt.color)
|
|
6464
|
+
run.setColor(d.fontColor);
|
|
6465
|
+
}
|
|
6466
|
+
}
|
|
6275
6467
|
dispose() {
|
|
6468
|
+
this._events.removeAllListeners();
|
|
6276
6469
|
this.bodyElements = [];
|
|
6277
6470
|
this.parser.clearParseErrors();
|
|
6278
6471
|
this.stylesManager.clear();
|
|
@@ -6345,7 +6538,7 @@ class Document {
|
|
|
6345
6538
|
this.rsids = new Set();
|
|
6346
6539
|
this.documentProtection = undefined;
|
|
6347
6540
|
this.properties = {};
|
|
6348
|
-
this.section =
|
|
6541
|
+
this.section = Section_js_1.Section.create();
|
|
6349
6542
|
this.namespaces = {};
|
|
6350
6543
|
}
|
|
6351
6544
|
getSizeStats() {
|
|
@@ -6519,13 +6712,13 @@ class Document {
|
|
|
6519
6712
|
const relsContent = this.zipHandler.getFileAsString(relsPath);
|
|
6520
6713
|
if (relsContent) {
|
|
6521
6714
|
const rels = [];
|
|
6522
|
-
const relationshipElements =
|
|
6715
|
+
const relationshipElements = XMLParser_js_1.XMLParser.extractElements(relsContent, 'Relationship');
|
|
6523
6716
|
for (const relElement of relationshipElements) {
|
|
6524
6717
|
const rel = {};
|
|
6525
|
-
const id =
|
|
6526
|
-
const type =
|
|
6527
|
-
const target =
|
|
6528
|
-
const targetMode =
|
|
6718
|
+
const id = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'Id');
|
|
6719
|
+
const type = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'Type');
|
|
6720
|
+
const target = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'Target');
|
|
6721
|
+
const targetMode = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'TargetMode');
|
|
6529
6722
|
if (id)
|
|
6530
6723
|
rel.id = id;
|
|
6531
6724
|
if (type)
|
|
@@ -6555,13 +6748,13 @@ class Document {
|
|
|
6555
6748
|
return [];
|
|
6556
6749
|
}
|
|
6557
6750
|
const relationships = [];
|
|
6558
|
-
const relationshipElements =
|
|
6751
|
+
const relationshipElements = XMLParser_js_1.XMLParser.extractElements(relsContent, 'Relationship');
|
|
6559
6752
|
for (const relElement of relationshipElements) {
|
|
6560
6753
|
const rel = {};
|
|
6561
|
-
const id =
|
|
6562
|
-
const type =
|
|
6563
|
-
const target =
|
|
6564
|
-
const targetMode =
|
|
6754
|
+
const id = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'Id');
|
|
6755
|
+
const type = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'Type');
|
|
6756
|
+
const target = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'Target');
|
|
6757
|
+
const targetMode = XMLParser_js_1.XMLParser.extractAttribute(relElement, 'TargetMode');
|
|
6565
6758
|
if (id)
|
|
6566
6759
|
rel.id = id;
|
|
6567
6760
|
if (type)
|
|
@@ -6654,7 +6847,7 @@ class Document {
|
|
|
6654
6847
|
for (const table of this.getTables()) {
|
|
6655
6848
|
for (const row of table.getRows()) {
|
|
6656
6849
|
for (const cell of row.getCells()) {
|
|
6657
|
-
if (cell instanceof
|
|
6850
|
+
if (cell instanceof TableCell_js_1.TableCell) {
|
|
6658
6851
|
const cellParagraphs = cell.getParagraphs();
|
|
6659
6852
|
for (let pIndex = 0; pIndex < cellParagraphs.length; pIndex++) {
|
|
6660
6853
|
const paragraph = cellParagraphs[pIndex];
|
|
@@ -6899,24 +7092,24 @@ class Document {
|
|
|
6899
7092
|
if (trackChanges && !this.trackChangesEnabled) {
|
|
6900
7093
|
const parentParagraph = run._getParentParagraph();
|
|
6901
7094
|
if (parentParagraph) {
|
|
6902
|
-
const segments = (0,
|
|
6903
|
-
const useGranular = (0,
|
|
7095
|
+
const segments = (0, textDiff_js_1.diffText)(originalText, newText);
|
|
7096
|
+
const useGranular = (0, textDiff_js_1.diffHasUnchangedParts)(segments);
|
|
6904
7097
|
const now = new Date();
|
|
6905
7098
|
const formatting = run.getFormatting();
|
|
6906
7099
|
const newContent = [];
|
|
6907
7100
|
if (useGranular) {
|
|
6908
7101
|
for (const seg of segments) {
|
|
6909
7102
|
if (seg.type === 'equal') {
|
|
6910
|
-
newContent.push(new
|
|
7103
|
+
newContent.push(new Run_js_1.Run(seg.text, formatting));
|
|
6911
7104
|
}
|
|
6912
7105
|
else if (seg.type === 'delete') {
|
|
6913
|
-
const delRev =
|
|
7106
|
+
const delRev = Revision_js_1.Revision.createDeletion(author, new Run_js_1.Run(seg.text, formatting), now);
|
|
6914
7107
|
this.revisionManager.register(delRev);
|
|
6915
7108
|
revisions.push(delRev);
|
|
6916
7109
|
newContent.push(delRev);
|
|
6917
7110
|
}
|
|
6918
7111
|
else if (seg.type === 'insert') {
|
|
6919
|
-
const insRev =
|
|
7112
|
+
const insRev = Revision_js_1.Revision.createInsertion(author, new Run_js_1.Run(seg.text, formatting), now);
|
|
6920
7113
|
this.revisionManager.register(insRev);
|
|
6921
7114
|
revisions.push(insRev);
|
|
6922
7115
|
newContent.push(insRev);
|
|
@@ -6924,11 +7117,11 @@ class Document {
|
|
|
6924
7117
|
}
|
|
6925
7118
|
}
|
|
6926
7119
|
else {
|
|
6927
|
-
const deletion =
|
|
7120
|
+
const deletion = Revision_js_1.Revision.createDeletion(author, new Run_js_1.Run(originalText, formatting), now);
|
|
6928
7121
|
this.revisionManager.register(deletion);
|
|
6929
7122
|
revisions.push(deletion);
|
|
6930
7123
|
newContent.push(deletion);
|
|
6931
|
-
const insertion =
|
|
7124
|
+
const insertion = Revision_js_1.Revision.createInsertion(author, new Run_js_1.Run(newText, formatting), now);
|
|
6932
7125
|
this.revisionManager.register(insertion);
|
|
6933
7126
|
revisions.push(insertion);
|
|
6934
7127
|
newContent.push(insertion);
|
|
@@ -7119,7 +7312,7 @@ class Document {
|
|
|
7119
7312
|
let count = 0;
|
|
7120
7313
|
let paraIndex = 0;
|
|
7121
7314
|
for (const element of this.bodyElements) {
|
|
7122
|
-
if (element instanceof
|
|
7315
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7123
7316
|
const result = callback(element, paraIndex);
|
|
7124
7317
|
count++;
|
|
7125
7318
|
paraIndex++;
|
|
@@ -7133,7 +7326,7 @@ class Document {
|
|
|
7133
7326
|
let count = 0;
|
|
7134
7327
|
let tableIndex = 0;
|
|
7135
7328
|
for (const element of this.bodyElements) {
|
|
7136
|
-
if (element instanceof
|
|
7329
|
+
if (element instanceof Table_js_1.Table) {
|
|
7137
7330
|
const result = callback(element, tableIndex);
|
|
7138
7331
|
count++;
|
|
7139
7332
|
tableIndex++;
|
|
@@ -7150,14 +7343,14 @@ class Document {
|
|
|
7150
7343
|
toMarkdown() {
|
|
7151
7344
|
const lines = [];
|
|
7152
7345
|
for (const element of this.bodyElements) {
|
|
7153
|
-
if (element instanceof
|
|
7346
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7154
7347
|
const mdLine = this.paragraphToMarkdown(element);
|
|
7155
7348
|
if (mdLine !== null) {
|
|
7156
7349
|
lines.push(mdLine);
|
|
7157
7350
|
lines.push('');
|
|
7158
7351
|
}
|
|
7159
7352
|
}
|
|
7160
|
-
else if (element instanceof
|
|
7353
|
+
else if (element instanceof Table_js_1.Table) {
|
|
7161
7354
|
lines.push(...this.tableToMarkdown(element));
|
|
7162
7355
|
lines.push('');
|
|
7163
7356
|
}
|
|
@@ -7185,7 +7378,7 @@ class Document {
|
|
|
7185
7378
|
paragraphContentToMarkdown(para) {
|
|
7186
7379
|
const parts = [];
|
|
7187
7380
|
for (const item of para.getContent()) {
|
|
7188
|
-
if (item instanceof
|
|
7381
|
+
if (item instanceof Run_js_1.Run) {
|
|
7189
7382
|
const runText = item.getText();
|
|
7190
7383
|
if (!runText)
|
|
7191
7384
|
continue;
|
|
@@ -7209,7 +7402,7 @@ class Document {
|
|
|
7209
7402
|
}
|
|
7210
7403
|
parts.push(md);
|
|
7211
7404
|
}
|
|
7212
|
-
else if (item instanceof
|
|
7405
|
+
else if (item instanceof Hyperlink_js_1.Hyperlink) {
|
|
7213
7406
|
const url = item.getUrl() || '';
|
|
7214
7407
|
const linkText = item.getText() || url;
|
|
7215
7408
|
parts.push(`[${linkText}](${url})`);
|
|
@@ -7248,7 +7441,7 @@ class Document {
|
|
|
7248
7441
|
}
|
|
7249
7442
|
};
|
|
7250
7443
|
for (const element of this.bodyElements) {
|
|
7251
|
-
if (element instanceof
|
|
7444
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7252
7445
|
const headingLevel = element.detectHeadingLevel();
|
|
7253
7446
|
const style = element.getStyle();
|
|
7254
7447
|
const isBullet = style?.toLowerCase().includes('bullet') || style === 'ListBullet';
|
|
@@ -7276,7 +7469,7 @@ class Document {
|
|
|
7276
7469
|
}
|
|
7277
7470
|
}
|
|
7278
7471
|
}
|
|
7279
|
-
else if (element instanceof
|
|
7472
|
+
else if (element instanceof Table_js_1.Table) {
|
|
7280
7473
|
closeList();
|
|
7281
7474
|
parts.push(this.tableToHTML(element));
|
|
7282
7475
|
}
|
|
@@ -7303,7 +7496,7 @@ class Document {
|
|
|
7303
7496
|
paragraphContentToHTML(para) {
|
|
7304
7497
|
const parts = [];
|
|
7305
7498
|
for (const item of para.getContent()) {
|
|
7306
|
-
if (item instanceof
|
|
7499
|
+
if (item instanceof Run_js_1.Run) {
|
|
7307
7500
|
const text = item.getText();
|
|
7308
7501
|
if (!text)
|
|
7309
7502
|
continue;
|
|
@@ -7327,7 +7520,7 @@ class Document {
|
|
|
7327
7520
|
}
|
|
7328
7521
|
parts.push(html);
|
|
7329
7522
|
}
|
|
7330
|
-
else if (item instanceof
|
|
7523
|
+
else if (item instanceof Hyperlink_js_1.Hyperlink) {
|
|
7331
7524
|
const url = this.escapeHTML(item.getUrl() || '');
|
|
7332
7525
|
const linkText = this.escapeHTML(item.getText() || url);
|
|
7333
7526
|
parts.push(`<a href="${url}">${linkText}</a>`);
|
|
@@ -7380,18 +7573,18 @@ class Document {
|
|
|
7380
7573
|
tables: tables.length,
|
|
7381
7574
|
images: this.imageManager.getImageCount(),
|
|
7382
7575
|
headings: headings.length,
|
|
7383
|
-
sections: this.bodyElements.filter((el) => el instanceof
|
|
7576
|
+
sections: this.bodyElements.filter((el) => el instanceof Section_js_1.Section).length || 1,
|
|
7384
7577
|
},
|
|
7385
7578
|
headings: headings.map((h) => ({ level: h.level, text: h.text })),
|
|
7386
7579
|
body: this.bodyElements.map((el) => {
|
|
7387
|
-
if (el instanceof
|
|
7580
|
+
if (el instanceof Paragraph_js_1.Paragraph) {
|
|
7388
7581
|
return {
|
|
7389
7582
|
type: 'paragraph',
|
|
7390
7583
|
text: el.getText(),
|
|
7391
7584
|
style: el.getStyle(),
|
|
7392
7585
|
};
|
|
7393
7586
|
}
|
|
7394
|
-
if (el instanceof
|
|
7587
|
+
if (el instanceof Table_js_1.Table) {
|
|
7395
7588
|
return {
|
|
7396
7589
|
type: 'table',
|
|
7397
7590
|
text: `${el.getRows().length} rows x ${el.getRows()[0]?.getCells().length ?? 0} cols`,
|
|
@@ -7405,16 +7598,16 @@ class Document {
|
|
|
7405
7598
|
const results = [];
|
|
7406
7599
|
for (const para of this.getAllParagraphs()) {
|
|
7407
7600
|
for (const item of para.getContent()) {
|
|
7408
|
-
if (item instanceof
|
|
7601
|
+
if (item instanceof ImageRun_js_1.ImageRun) {
|
|
7409
7602
|
const image = item.getImageElement();
|
|
7410
7603
|
const altText = image.getAltText();
|
|
7411
7604
|
if (!altText || altText === 'Image') {
|
|
7412
7605
|
results.push(image);
|
|
7413
7606
|
}
|
|
7414
7607
|
}
|
|
7415
|
-
if (item instanceof
|
|
7608
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
7416
7609
|
for (const revContent of item.getContent()) {
|
|
7417
|
-
if (revContent instanceof
|
|
7610
|
+
if (revContent instanceof ImageRun_js_1.ImageRun) {
|
|
7418
7611
|
const image = revContent.getImageElement();
|
|
7419
7612
|
const altText = image.getAltText();
|
|
7420
7613
|
if (!altText || altText === 'Image') {
|
|
@@ -7449,7 +7642,7 @@ class Document {
|
|
|
7449
7642
|
content: [],
|
|
7450
7643
|
};
|
|
7451
7644
|
for (const element of this.bodyElements) {
|
|
7452
|
-
if (element instanceof
|
|
7645
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7453
7646
|
const headingLevel = element.detectHeadingLevel();
|
|
7454
7647
|
if (headingLevel !== null && headingLevel <= maxLevel) {
|
|
7455
7648
|
if (current.heading || current.content.length > 0) {
|
|
@@ -7484,18 +7677,19 @@ class Document {
|
|
|
7484
7677
|
}
|
|
7485
7678
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
7486
7679
|
const element = this.bodyElements[index];
|
|
7487
|
-
if (element instanceof
|
|
7680
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7488
7681
|
if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {
|
|
7489
7682
|
const runs = element.getRuns();
|
|
7490
7683
|
if (runs.length > 0) {
|
|
7491
7684
|
const author = this.trackingContext.getAuthor();
|
|
7492
|
-
const deletion =
|
|
7685
|
+
const deletion = Revision_js_1.Revision.createDeletion(author, runs);
|
|
7493
7686
|
this.trackingContext.getRevisionManager().register(deletion);
|
|
7494
7687
|
element.addRevision(deletion);
|
|
7495
7688
|
}
|
|
7496
7689
|
return true;
|
|
7497
7690
|
}
|
|
7498
7691
|
this.bodyElements.splice(index, 1);
|
|
7692
|
+
this._emitElementRemoved(element);
|
|
7499
7693
|
return true;
|
|
7500
7694
|
}
|
|
7501
7695
|
}
|
|
@@ -7520,21 +7714,22 @@ class Document {
|
|
|
7520
7714
|
}
|
|
7521
7715
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
7522
7716
|
const element = this.bodyElements[index];
|
|
7523
|
-
if (element instanceof
|
|
7717
|
+
if (element instanceof Table_js_1.Table) {
|
|
7524
7718
|
this.bodyElements.splice(index, 1);
|
|
7719
|
+
this._emitElementRemoved(element);
|
|
7525
7720
|
return true;
|
|
7526
7721
|
}
|
|
7527
7722
|
}
|
|
7528
7723
|
return false;
|
|
7529
7724
|
}
|
|
7530
7725
|
validateParagraph(paragraph) {
|
|
7531
|
-
if (!(paragraph instanceof
|
|
7726
|
+
if (!(paragraph instanceof Paragraph_js_1.Paragraph)) {
|
|
7532
7727
|
throw new Error('insertParagraphAt: parameter must be a Paragraph instance');
|
|
7533
7728
|
}
|
|
7534
7729
|
const paraId = paragraph.getFormatting().paraId;
|
|
7535
7730
|
if (paraId) {
|
|
7536
7731
|
const existingIds = this.bodyElements
|
|
7537
|
-
.filter((el) => el instanceof
|
|
7732
|
+
.filter((el) => el instanceof Paragraph_js_1.Paragraph)
|
|
7538
7733
|
.map((p) => p.getFormatting().paraId)
|
|
7539
7734
|
.filter((id) => id === paraId);
|
|
7540
7735
|
if (existingIds.length > 0) {
|
|
@@ -7543,15 +7738,15 @@ class Document {
|
|
|
7543
7738
|
}
|
|
7544
7739
|
const style = paragraph.getFormatting().style;
|
|
7545
7740
|
if (style && !this.stylesManager.hasStyle(style)) {
|
|
7546
|
-
|
|
7741
|
+
logger_js_1.defaultLogger.warn(`Style "${style}" not found in document. Paragraph will fall back to Normal style.`);
|
|
7547
7742
|
}
|
|
7548
7743
|
const numbering = paragraph.getFormatting().numbering;
|
|
7549
7744
|
if (numbering && !this.numberingManager.hasInstance(numbering.numId)) {
|
|
7550
|
-
|
|
7745
|
+
logger_js_1.defaultLogger.warn(`Numbering ID ${numbering.numId} not found in document. List formatting will not display.`);
|
|
7551
7746
|
}
|
|
7552
7747
|
}
|
|
7553
7748
|
validateTable(table) {
|
|
7554
|
-
if (!(table instanceof
|
|
7749
|
+
if (!(table instanceof Table_js_1.Table)) {
|
|
7555
7750
|
throw new Error('insertTableAt: parameter must be a Table instance');
|
|
7556
7751
|
}
|
|
7557
7752
|
const rows = table.getRows();
|
|
@@ -7564,11 +7759,11 @@ class Document {
|
|
|
7564
7759
|
}
|
|
7565
7760
|
const tableStyle = table.getFormatting().style;
|
|
7566
7761
|
if (tableStyle && !this.stylesManager.hasStyle(tableStyle)) {
|
|
7567
|
-
|
|
7762
|
+
logger_js_1.defaultLogger.warn(`Table style "${tableStyle}" not found in document. Table will use default formatting.`);
|
|
7568
7763
|
}
|
|
7569
7764
|
}
|
|
7570
7765
|
validateToc(toc) {
|
|
7571
|
-
if (!(toc instanceof
|
|
7766
|
+
if (!(toc instanceof TableOfContentsElement_js_1.TableOfContentsElement)) {
|
|
7572
7767
|
throw new Error('insertTocAt: parameter must be a TableOfContentsElement instance');
|
|
7573
7768
|
}
|
|
7574
7769
|
const hasHeadings = [
|
|
@@ -7583,7 +7778,7 @@ class Document {
|
|
|
7583
7778
|
'Heading9',
|
|
7584
7779
|
].some((style) => this.stylesManager.hasStyle(style));
|
|
7585
7780
|
if (!hasHeadings) {
|
|
7586
|
-
|
|
7781
|
+
logger_js_1.defaultLogger.warn('No heading styles found in document. Table of Contents may not display entries correctly.');
|
|
7587
7782
|
}
|
|
7588
7783
|
}
|
|
7589
7784
|
normalizeIndex(index) {
|
|
@@ -7599,12 +7794,14 @@ class Document {
|
|
|
7599
7794
|
this.validateParagraph(paragraph);
|
|
7600
7795
|
index = this.normalizeIndex(index);
|
|
7601
7796
|
this.bodyElements.splice(index, 0, paragraph);
|
|
7797
|
+
this._emitElementAdded(paragraph, index);
|
|
7602
7798
|
return this;
|
|
7603
7799
|
}
|
|
7604
7800
|
insertTableAt(index, table) {
|
|
7605
7801
|
this.validateTable(table);
|
|
7606
7802
|
index = this.normalizeIndex(index);
|
|
7607
7803
|
this.bodyElements.splice(index, 0, table);
|
|
7804
|
+
this._emitElementAdded(table, index);
|
|
7608
7805
|
return this;
|
|
7609
7806
|
}
|
|
7610
7807
|
insertTocAt(index, toc) {
|
|
@@ -7616,7 +7813,7 @@ class Document {
|
|
|
7616
7813
|
replaceParagraphAt(index, paragraph) {
|
|
7617
7814
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
7618
7815
|
const element = this.bodyElements[index];
|
|
7619
|
-
if (element instanceof
|
|
7816
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7620
7817
|
this.validateParagraph(paragraph);
|
|
7621
7818
|
this.bodyElements[index] = paragraph;
|
|
7622
7819
|
return true;
|
|
@@ -7627,7 +7824,7 @@ class Document {
|
|
|
7627
7824
|
replaceTableAt(index, table) {
|
|
7628
7825
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
7629
7826
|
const element = this.bodyElements[index];
|
|
7630
|
-
if (element instanceof
|
|
7827
|
+
if (element instanceof Table_js_1.Table) {
|
|
7631
7828
|
this.validateTable(table);
|
|
7632
7829
|
this.bodyElements[index] = table;
|
|
7633
7830
|
return true;
|
|
@@ -7661,7 +7858,7 @@ class Document {
|
|
|
7661
7858
|
removeTocAt(index) {
|
|
7662
7859
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
7663
7860
|
const element = this.bodyElements[index];
|
|
7664
|
-
if (element instanceof
|
|
7861
|
+
if (element instanceof TableOfContentsElement_js_1.TableOfContentsElement) {
|
|
7665
7862
|
this.bodyElements.splice(index, 1);
|
|
7666
7863
|
return true;
|
|
7667
7864
|
}
|
|
@@ -7676,7 +7873,8 @@ class Document {
|
|
|
7676
7873
|
}
|
|
7677
7874
|
removeBodyElementAt(index) {
|
|
7678
7875
|
if (index >= 0 && index < this.bodyElements.length) {
|
|
7679
|
-
this.bodyElements.splice(index, 1);
|
|
7876
|
+
const [removed] = this.bodyElements.splice(index, 1);
|
|
7877
|
+
this._emitElementRemoved(removed);
|
|
7680
7878
|
return true;
|
|
7681
7879
|
}
|
|
7682
7880
|
return false;
|
|
@@ -7686,6 +7884,7 @@ class Document {
|
|
|
7686
7884
|
if (index === -1)
|
|
7687
7885
|
return false;
|
|
7688
7886
|
this.bodyElements.splice(index, 1);
|
|
7887
|
+
this._emitElementRemoved(element);
|
|
7689
7888
|
return true;
|
|
7690
7889
|
}
|
|
7691
7890
|
insertAfter(reference, element) {
|
|
@@ -7693,6 +7892,7 @@ class Document {
|
|
|
7693
7892
|
if (index === -1)
|
|
7694
7893
|
return false;
|
|
7695
7894
|
this.bodyElements.splice(index + 1, 0, element);
|
|
7895
|
+
this._emitElementAdded(element, index + 1);
|
|
7696
7896
|
return true;
|
|
7697
7897
|
}
|
|
7698
7898
|
insertBefore(reference, element) {
|
|
@@ -7700,6 +7900,7 @@ class Document {
|
|
|
7700
7900
|
if (index === -1)
|
|
7701
7901
|
return false;
|
|
7702
7902
|
this.bodyElements.splice(index, 0, element);
|
|
7903
|
+
this._emitElementAdded(element, index);
|
|
7703
7904
|
return true;
|
|
7704
7905
|
}
|
|
7705
7906
|
replaceElement(oldElement, newElement) {
|
|
@@ -7707,11 +7908,14 @@ class Document {
|
|
|
7707
7908
|
if (index === -1)
|
|
7708
7909
|
return false;
|
|
7709
7910
|
this.bodyElements[index] = newElement;
|
|
7911
|
+
this._emitElementRemoved(oldElement);
|
|
7912
|
+
this._emitElementAdded(newElement, index);
|
|
7710
7913
|
return true;
|
|
7711
7914
|
}
|
|
7712
7915
|
insertBodyElementAt(index, element) {
|
|
7713
7916
|
const clampedIndex = Math.max(0, Math.min(index, this.bodyElements.length));
|
|
7714
7917
|
this.bodyElements.splice(clampedIndex, 0, element);
|
|
7918
|
+
this._emitElementAdded(element, clampedIndex);
|
|
7715
7919
|
}
|
|
7716
7920
|
setBodyElements(elements) {
|
|
7717
7921
|
this.bodyElements = elements;
|
|
@@ -7720,12 +7924,12 @@ class Document {
|
|
|
7720
7924
|
const hyperlinks = [];
|
|
7721
7925
|
const extractHyperlinksFromParagraph = (para) => {
|
|
7722
7926
|
for (const content of para.getContent()) {
|
|
7723
|
-
if (content instanceof
|
|
7927
|
+
if (content instanceof Hyperlink_js_1.Hyperlink) {
|
|
7724
7928
|
hyperlinks.push({ hyperlink: content, paragraph: para });
|
|
7725
7929
|
}
|
|
7726
|
-
else if (content instanceof
|
|
7930
|
+
else if (content instanceof Revision_js_1.Revision) {
|
|
7727
7931
|
for (const revContent of content.getContent()) {
|
|
7728
|
-
if (revContent instanceof
|
|
7932
|
+
if (revContent instanceof Hyperlink_js_1.Hyperlink) {
|
|
7729
7933
|
hyperlinks.push({ hyperlink: revContent, paragraph: para });
|
|
7730
7934
|
}
|
|
7731
7935
|
}
|
|
@@ -7738,7 +7942,7 @@ class Document {
|
|
|
7738
7942
|
for (const table of this.getTables()) {
|
|
7739
7943
|
for (const row of table.getRows()) {
|
|
7740
7944
|
for (const cell of row.getCells()) {
|
|
7741
|
-
const cellParagraphs = cell instanceof
|
|
7945
|
+
const cellParagraphs = cell instanceof TableCell_js_1.TableCell ? cell.getParagraphs() : [];
|
|
7742
7946
|
for (const para of cellParagraphs) {
|
|
7743
7947
|
extractHyperlinksFromParagraph(para);
|
|
7744
7948
|
}
|
|
@@ -7751,14 +7955,14 @@ class Document {
|
|
|
7751
7955
|
const ids = new Set();
|
|
7752
7956
|
const scanParagraph = (para) => {
|
|
7753
7957
|
for (const item of para.getContent()) {
|
|
7754
|
-
if (item instanceof
|
|
7958
|
+
if (item instanceof Hyperlink_js_1.Hyperlink) {
|
|
7755
7959
|
const relId = item.getRelationshipId();
|
|
7756
7960
|
if (relId)
|
|
7757
7961
|
ids.add(relId);
|
|
7758
7962
|
}
|
|
7759
|
-
if (item instanceof
|
|
7963
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
7760
7964
|
for (const revContent of item.getContent()) {
|
|
7761
|
-
if (revContent instanceof
|
|
7965
|
+
if (revContent instanceof Hyperlink_js_1.Hyperlink) {
|
|
7762
7966
|
const relId = revContent.getRelationshipId();
|
|
7763
7967
|
if (relId)
|
|
7764
7968
|
ids.add(relId);
|
|
@@ -7768,10 +7972,10 @@ class Document {
|
|
|
7768
7972
|
}
|
|
7769
7973
|
};
|
|
7770
7974
|
const scanElement = (element) => {
|
|
7771
|
-
if (element instanceof
|
|
7975
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
7772
7976
|
scanParagraph(element);
|
|
7773
7977
|
}
|
|
7774
|
-
else if (element instanceof
|
|
7978
|
+
else if (element instanceof Table_js_1.Table) {
|
|
7775
7979
|
for (let row = 0; row < element.getRowCount(); row++) {
|
|
7776
7980
|
for (let col = 0; col < element.getColumnCount(); col++) {
|
|
7777
7981
|
const cell = element.getCell(row, col);
|
|
@@ -7790,7 +7994,7 @@ class Document {
|
|
|
7790
7994
|
}
|
|
7791
7995
|
}
|
|
7792
7996
|
}
|
|
7793
|
-
else if (element instanceof
|
|
7997
|
+
else if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
7794
7998
|
for (const item of element.getContent()) {
|
|
7795
7999
|
scanElement(item);
|
|
7796
8000
|
}
|
|
@@ -7824,12 +8028,12 @@ class Document {
|
|
|
7824
8028
|
defragmentHyperlinks(options) {
|
|
7825
8029
|
const { resetFormatting = false, cleanupRelationships = false } = options || {};
|
|
7826
8030
|
if (this.trackChangesEnabled) {
|
|
7827
|
-
|
|
8031
|
+
logger_js_1.defaultLogger.warn('defragmentHyperlinks skipped: track changes is enabled. ' +
|
|
7828
8032
|
'Call defragmentHyperlinks before enableTrackChanges() to avoid field corruption.');
|
|
7829
8033
|
return 0;
|
|
7830
8034
|
}
|
|
7831
8035
|
let mergedCount = 0;
|
|
7832
|
-
const parser = new
|
|
8036
|
+
const parser = new DocumentParser_js_1.DocumentParser();
|
|
7833
8037
|
for (const paragraph of this.getAllParagraphs()) {
|
|
7834
8038
|
const originalContent = paragraph.getContent();
|
|
7835
8039
|
parser.mergeConsecutiveHyperlinks(paragraph, resetFormatting);
|
|
@@ -7841,7 +8045,7 @@ class Document {
|
|
|
7841
8045
|
for (const table of this.getTables()) {
|
|
7842
8046
|
for (const row of table.getRows()) {
|
|
7843
8047
|
for (const cell of row.getCells()) {
|
|
7844
|
-
const cellParagraphs = cell instanceof
|
|
8048
|
+
const cellParagraphs = cell instanceof TableCell_js_1.TableCell ? cell.getParagraphs() : [];
|
|
7845
8049
|
for (const para of cellParagraphs) {
|
|
7846
8050
|
const originalContent = para.getContent();
|
|
7847
8051
|
parser.mergeConsecutiveHyperlinks(para, resetFormatting);
|
|
@@ -7857,7 +8061,7 @@ class Document {
|
|
|
7857
8061
|
const referencedIds = this.collectAllReferencedHyperlinkIds();
|
|
7858
8062
|
const removedCount = this.relationshipManager.removeOrphanedHyperlinks(referencedIds);
|
|
7859
8063
|
if (removedCount > 0) {
|
|
7860
|
-
|
|
8064
|
+
logger_js_1.defaultLogger.info(`Cleaned up ${removedCount} orphaned hyperlink relationship(s)`);
|
|
7861
8065
|
}
|
|
7862
8066
|
}
|
|
7863
8067
|
return mergedCount;
|
|
@@ -7892,7 +8096,7 @@ class Document {
|
|
|
7892
8096
|
for (const table of this.getTables()) {
|
|
7893
8097
|
for (const row of table.getRows()) {
|
|
7894
8098
|
for (const cell of row.getCells()) {
|
|
7895
|
-
const cellParagraphs = cell instanceof
|
|
8099
|
+
const cellParagraphs = cell instanceof TableCell_js_1.TableCell ? cell.getParagraphs() : [];
|
|
7896
8100
|
for (const para of cellParagraphs) {
|
|
7897
8101
|
for (const field of para.getFields()) {
|
|
7898
8102
|
results.push({ field, paragraph: para, table });
|
|
@@ -7929,7 +8133,7 @@ class Document {
|
|
|
7929
8133
|
continue;
|
|
7930
8134
|
}
|
|
7931
8135
|
const extension = image.getExtension();
|
|
7932
|
-
const result = (0,
|
|
8136
|
+
const result = (0, ImageOptimizer_js_1.optimizeImage)(originalData, extension);
|
|
7933
8137
|
if (!result)
|
|
7934
8138
|
continue;
|
|
7935
8139
|
const saved = originalData.length - result.data.length;
|
|
@@ -7980,7 +8184,7 @@ class Document {
|
|
|
7980
8184
|
for (const table of this.getTables()) {
|
|
7981
8185
|
for (const row of table.getRows()) {
|
|
7982
8186
|
for (const cell of row.getCells()) {
|
|
7983
|
-
const cellParagraphs = cell instanceof
|
|
8187
|
+
const cellParagraphs = cell instanceof TableCell_js_1.TableCell ? cell.getParagraphs() : [];
|
|
7984
8188
|
for (const para of cellParagraphs) {
|
|
7985
8189
|
runs.push(...para.getRuns());
|
|
7986
8190
|
}
|
|
@@ -8006,7 +8210,7 @@ class Document {
|
|
|
8006
8210
|
let modified = false;
|
|
8007
8211
|
const content = [...para.getContent()];
|
|
8008
8212
|
for (const item of content) {
|
|
8009
|
-
if (item instanceof
|
|
8213
|
+
if (item instanceof Run_js_1.Run) {
|
|
8010
8214
|
const text = item.getText();
|
|
8011
8215
|
const matches = [...text.matchAll(emailRegex)];
|
|
8012
8216
|
if (matches.length > 0) {
|
|
@@ -8032,15 +8236,15 @@ class Document {
|
|
|
8032
8236
|
const startIndex = match.index;
|
|
8033
8237
|
if (startIndex > lastIndex) {
|
|
8034
8238
|
const beforeText = text.slice(lastIndex, startIndex);
|
|
8035
|
-
result.push(new
|
|
8239
|
+
result.push(new Run_js_1.Run(beforeText, originalFormatting));
|
|
8036
8240
|
}
|
|
8037
|
-
const hyperlink =
|
|
8241
|
+
const hyperlink = Hyperlink_js_1.Hyperlink.createEmail(email, email, formatting);
|
|
8038
8242
|
result.push(hyperlink);
|
|
8039
8243
|
lastIndex = startIndex + email.length;
|
|
8040
8244
|
}
|
|
8041
8245
|
if (lastIndex < text.length) {
|
|
8042
8246
|
const afterText = text.slice(lastIndex);
|
|
8043
|
-
result.push(new
|
|
8247
|
+
result.push(new Run_js_1.Run(afterText, originalFormatting));
|
|
8044
8248
|
}
|
|
8045
8249
|
return result;
|
|
8046
8250
|
}
|
|
@@ -8072,7 +8276,7 @@ class Document {
|
|
|
8072
8276
|
let lastWasEmpty = false;
|
|
8073
8277
|
const toRemove = [];
|
|
8074
8278
|
this.bodyElements.forEach((element, index) => {
|
|
8075
|
-
if (element instanceof
|
|
8279
|
+
if (element instanceof Paragraph_js_1.Paragraph) {
|
|
8076
8280
|
const isEmpty = element.getText().trim() === '';
|
|
8077
8281
|
if (isEmpty && lastWasEmpty) {
|
|
8078
8282
|
toRemove.push(index);
|
|
@@ -8121,7 +8325,7 @@ class Document {
|
|
|
8121
8325
|
for (const table of this.getTables()) {
|
|
8122
8326
|
for (const row of table.getRows()) {
|
|
8123
8327
|
for (const cell of row.getCells()) {
|
|
8124
|
-
const cellParagraphs = cell instanceof
|
|
8328
|
+
const cellParagraphs = cell instanceof TableCell_js_1.TableCell ? cell.getParagraphs() : [];
|
|
8125
8329
|
for (const para of cellParagraphs) {
|
|
8126
8330
|
if (standardParagraphSpacing) {
|
|
8127
8331
|
if (standardParagraphSpacing.before !== undefined) {
|
|
@@ -8171,16 +8375,16 @@ class Document {
|
|
|
8171
8375
|
const unwrappedBody = [];
|
|
8172
8376
|
const unwrapSDT = (sdt, target) => {
|
|
8173
8377
|
for (const item of sdt.getContent()) {
|
|
8174
|
-
if (item instanceof
|
|
8378
|
+
if (item instanceof Paragraph_js_1.Paragraph || item instanceof Table_js_1.Table) {
|
|
8175
8379
|
target.push(item);
|
|
8176
8380
|
}
|
|
8177
|
-
else if (item instanceof
|
|
8381
|
+
else if (item instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
8178
8382
|
unwrapSDT(item, target);
|
|
8179
8383
|
}
|
|
8180
8384
|
}
|
|
8181
8385
|
};
|
|
8182
8386
|
for (const element of this.bodyElements) {
|
|
8183
|
-
if (element instanceof
|
|
8387
|
+
if (element instanceof StructuredDocumentTag_js_1.StructuredDocumentTag) {
|
|
8184
8388
|
unwrapSDT(element, unwrappedBody);
|
|
8185
8389
|
}
|
|
8186
8390
|
else {
|