docxmlater 10.0.1 → 10.0.3
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 -2
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.d.ts +0 -27
- package/dist/constants/limits.d.ts.map +1 -1
- package/dist/constants/limits.js +13 -13
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +24 -19
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +272 -71
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +59 -24
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.d.ts.map +1 -1
- package/dist/core/DocumentIdManager.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +6 -6
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +60 -54
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.d.ts.map +1 -1
- package/dist/core/Relationship.js +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.js +3 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.js +1 -1
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +8 -2
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -2
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +31 -28
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +6 -6
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +5 -5
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +2 -2
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +21 -5
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +2 -2
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +128 -117
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts +1 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +44 -5
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +1 -3
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +127 -118
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +21 -0
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +20 -8
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -2
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +29 -35
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +2 -2
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +63 -67
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +6 -6
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +65 -47
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +1 -1
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +11 -11
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +4 -4
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +26 -26
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +87 -95
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +3 -3
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +1 -7
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/compatibility-types.js.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/list-types.d.ts +4 -4
- package/dist/types/list-types.d.ts.map +1 -1
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +7 -7
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts +0 -28
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +5 -7
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +1 -1
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.d.ts +0 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +0 -7
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +2 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js +3 -3
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -4
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -19
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +0 -2
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.js.map +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +10 -0
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +4 -5
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +34 -4
- package/src/__tests__/helper-methods.test.ts +512 -0
- package/src/constants/legacyCompatFlags.ts +138 -0
- package/src/constants/limits.ts +50 -0
- package/src/core/CLAUDE.md +109 -0
- package/src/core/Document.ts +15569 -0
- package/src/core/DocumentContent.ts +467 -0
- package/src/core/DocumentGenerator.ts +1104 -0
- package/src/core/DocumentIdManager.ts +158 -0
- package/src/core/DocumentParser.ts +10107 -0
- package/src/core/DocumentValidator.ts +372 -0
- package/src/core/Relationship.ts +367 -0
- package/src/core/RelationshipManager.ts +428 -0
- package/src/elements/AlternateContent.ts +42 -0
- package/src/elements/Bookmark.ts +210 -0
- package/src/elements/BookmarkManager.ts +250 -0
- package/src/elements/CLAUDE.md +126 -0
- package/src/elements/Comment.ts +359 -0
- package/src/elements/CommentManager.ts +502 -0
- package/src/elements/CommonTypes.ts +549 -0
- package/src/elements/CustomXml.ts +36 -0
- package/src/elements/Endnote.ts +217 -0
- package/src/elements/EndnoteManager.ts +249 -0
- package/src/elements/Field.ts +1233 -0
- package/src/elements/FieldHelpers.ts +333 -0
- package/src/elements/FontManager.ts +339 -0
- package/src/elements/Footer.ts +269 -0
- package/src/elements/Footnote.ts +217 -0
- package/src/elements/FootnoteManager.ts +249 -0
- package/src/elements/Header.ts +269 -0
- package/src/elements/HeaderFooterManager.ts +219 -0
- package/src/elements/Hyperlink.ts +1146 -0
- package/src/elements/Image.ts +1756 -0
- package/src/elements/ImageManager.ts +432 -0
- package/src/elements/ImageRun.ts +59 -0
- package/src/elements/MathElement.ts +65 -0
- package/src/elements/Paragraph.ts +4227 -0
- package/src/elements/PreservedElement.ts +53 -0
- package/src/elements/PropertyChangeTypes.ts +442 -0
- package/src/elements/RangeMarker.ts +400 -0
- package/src/elements/Revision.ts +1217 -0
- package/src/elements/RevisionContent.ts +73 -0
- package/src/elements/RevisionManager.ts +1070 -0
- package/src/elements/Run.ts +3068 -0
- package/src/elements/Section.ts +1421 -0
- package/src/elements/Shape.ts +873 -0
- package/src/elements/StructuredDocumentTag.ts +978 -0
- package/src/elements/Table.ts +2524 -0
- package/src/elements/TableCell.ts +1586 -0
- package/src/elements/TableGridChange.ts +151 -0
- package/src/elements/TableOfContents.ts +691 -0
- package/src/elements/TableOfContentsElement.ts +89 -0
- package/src/elements/TableRow.ts +906 -0
- package/src/elements/TextBox.ts +768 -0
- package/src/formatting/AbstractNumbering.ts +548 -0
- package/src/formatting/CLAUDE.md +74 -0
- package/src/formatting/NumberingInstance.ts +212 -0
- package/src/formatting/NumberingLevel.ts +1006 -0
- package/src/formatting/NumberingManager.ts +827 -0
- package/src/formatting/Style.ts +1833 -0
- package/src/formatting/StylesManager.ts +1005 -0
- package/src/helpers/CleanupHelper.ts +524 -0
- package/src/images/ImageOptimizer.ts +274 -0
- package/src/index.ts +554 -0
- package/src/managers/CLAUDE.md +47 -0
- package/src/managers/DrawingManager.ts +319 -0
- package/src/tracking/DocumentTrackingContext.ts +643 -0
- package/src/tracking/TrackingContext.ts +173 -0
- package/src/types/compatibility-types.ts +49 -0
- package/src/types/formatting.ts +210 -0
- package/src/types/list-types.ts +152 -0
- package/src/types/settings-types.ts +59 -0
- package/src/types/styleConfig.ts +189 -0
- package/src/utils/CLAUDE.md +153 -0
- package/src/utils/ChangelogGenerator.ts +1581 -0
- package/src/utils/CompatibilityUpgrader.ts +237 -0
- package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
- package/src/utils/MoveOperationHelper.ts +238 -0
- package/src/utils/RevisionAwareProcessor.ts +526 -0
- package/src/utils/RevisionWalker.ts +457 -0
- package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
- package/src/utils/ShadingResolver.ts +107 -0
- package/src/utils/acceptRevisions.ts +714 -0
- package/src/utils/cnfStyleDecoder.ts +217 -0
- package/src/utils/corruptionDetection.ts +345 -0
- package/src/utils/dateFormatting.ts +20 -0
- package/src/utils/deepClone.ts +78 -0
- package/src/utils/diagnostics.ts +129 -0
- package/src/utils/errorHandling.ts +80 -0
- package/src/utils/formatting.ts +213 -0
- package/src/utils/list-detection.ts +274 -0
- package/src/utils/logger.ts +404 -0
- package/src/utils/parsingHelpers.ts +190 -0
- package/src/utils/stripTrackedChanges.ts +353 -0
- package/src/utils/textDiff.ts +100 -0
- package/src/utils/units.ts +421 -0
- package/src/utils/validation.ts +542 -0
- package/src/utils/xmlSanitization.ts +182 -0
- package/src/validation/RevisionAutoFixer.ts +542 -0
- package/src/validation/RevisionValidator.ts +460 -0
- package/src/validation/ValidationRules.ts +338 -0
- package/src/validation/index.ts +30 -0
- package/src/xml/CLAUDE.md +65 -0
- package/src/xml/XMLBuilder.ts +871 -0
- package/src/xml/XMLParser.ts +919 -0
- package/src/zip/CLAUDE.md +55 -0
- package/src/zip/ZipHandler.ts +637 -0
- package/src/zip/ZipReader.ts +299 -0
- package/src/zip/ZipWriter.ts +390 -0
- package/src/zip/errors.ts +69 -0
- package/src/zip/types.ts +116 -0
- package/dist/core/ListNormalizer.d.ts +0 -23
- package/dist/core/ListNormalizer.d.ts.map +0 -1
- package/dist/core/ListNormalizer.js +0 -624
- package/dist/core/ListNormalizer.js.map +0 -1
- package/dist/images/index.d.ts +0 -2
- package/dist/images/index.d.ts.map +0 -1
- package/dist/images/index.js +0 -8
- package/dist/images/index.js.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
- package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.js +0 -360
- package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
- package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
- package/dist/ms-doc/fib/FIB.d.ts +0 -18
- package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
- package/dist/ms-doc/fib/FIB.js +0 -342
- package/dist/ms-doc/fib/FIB.js.map +0 -1
- package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
- package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
- package/dist/ms-doc/fields/FieldParser.js +0 -266
- package/dist/ms-doc/fields/FieldParser.js.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
- package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.js +0 -233
- package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
- package/dist/ms-doc/index.d.ts +0 -20
- package/dist/ms-doc/index.d.ts.map +0 -1
- package/dist/ms-doc/index.js +0 -59
- package/dist/ms-doc/index.js.map +0 -1
- package/dist/ms-doc/properties/SPRM.d.ts +0 -210
- package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
- package/dist/ms-doc/properties/SPRM.js +0 -633
- package/dist/ms-doc/properties/SPRM.js.map +0 -1
- package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
- package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
- package/dist/ms-doc/sections/SectionParser.js +0 -214
- package/dist/ms-doc/sections/SectionParser.js.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
- package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.js +0 -268
- package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
- package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
- package/dist/ms-doc/tables/TableParser.d.ts +0 -29
- package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
- package/dist/ms-doc/tables/TableParser.js +0 -176
- package/dist/ms-doc/tables/TableParser.js.map +0 -1
- package/dist/ms-doc/text/PieceTable.d.ts +0 -21
- package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
- package/dist/ms-doc/text/PieceTable.js +0 -171
- package/dist/ms-doc/text/PieceTable.js.map +0 -1
- package/dist/ms-doc/types/Constants.d.ts +0 -99
- package/dist/ms-doc/types/Constants.d.ts.map +0 -1
- package/dist/ms-doc/types/Constants.js +0 -102
- package/dist/ms-doc/types/Constants.js.map +0 -1
- package/dist/ms-doc/types/DocTypes.d.ts +0 -368
- package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
- package/dist/ms-doc/types/DocTypes.js +0 -3
- package/dist/ms-doc/types/DocTypes.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -3
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -6
- package/dist/tracking/index.js.map +0 -1
package/dist/core/Document.js
CHANGED
|
@@ -49,6 +49,8 @@ const RangeMarker_1 = require("../elements/RangeMarker");
|
|
|
49
49
|
const Revision_1 = require("../elements/Revision");
|
|
50
50
|
const RevisionManager_1 = require("../elements/RevisionManager");
|
|
51
51
|
const Run_1 = require("../elements/Run");
|
|
52
|
+
const Shape_1 = require("../elements/Shape");
|
|
53
|
+
const TextBox_1 = require("../elements/TextBox");
|
|
52
54
|
const validation_1 = require("../validation");
|
|
53
55
|
const Section_1 = require("../elements/Section");
|
|
54
56
|
const StructuredDocumentTag_1 = require("../elements/StructuredDocumentTag");
|
|
@@ -93,7 +95,7 @@ class Document {
|
|
|
93
95
|
this.numberingManager = NumberingManager_1.NumberingManager.create();
|
|
94
96
|
this.section = new Section_1.Section();
|
|
95
97
|
this.imageManager = ImageManager_1.ImageManager.create();
|
|
96
|
-
this.relationshipManager = RelationshipManager_1.RelationshipManager.createForDocument();
|
|
98
|
+
this.relationshipManager = initDefaults ? RelationshipManager_1.RelationshipManager.createForDocument() : RelationshipManager_1.RelationshipManager.create();
|
|
97
99
|
this.headerFooterManager = HeaderFooterManager_1.HeaderFooterManager.create();
|
|
98
100
|
this.bookmarkManager = BookmarkManager_1.BookmarkManager.create();
|
|
99
101
|
this.revisionManager = RevisionManager_1.RevisionManager.create();
|
|
@@ -164,6 +166,7 @@ class Document {
|
|
|
164
166
|
_originalCommentsXml;
|
|
165
167
|
_commentsModified = false;
|
|
166
168
|
_originalCommentCompanionFiles = new Map();
|
|
169
|
+
_removedParts = new Set();
|
|
167
170
|
_appPropsModified = false;
|
|
168
171
|
_footnotesModified = false;
|
|
169
172
|
_endnotesModified = false;
|
|
@@ -308,11 +311,11 @@ class Document {
|
|
|
308
311
|
return doc;
|
|
309
312
|
}
|
|
310
313
|
parseSettingsFromXml(settingsXml) {
|
|
311
|
-
const trackRevisionsMatch =
|
|
314
|
+
const trackRevisionsMatch = /<w:trackRevisions\b([^>]*)\/?>/.exec(settingsXml);
|
|
312
315
|
if (trackRevisionsMatch) {
|
|
313
316
|
const attrs = trackRevisionsMatch[1] ?? '';
|
|
314
|
-
const valMatch =
|
|
315
|
-
if (valMatch
|
|
317
|
+
const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
|
|
318
|
+
if (valMatch?.[1] !== undefined) {
|
|
316
319
|
const val = valMatch[1].toLowerCase();
|
|
317
320
|
this.trackChangesEnabled = val !== 'false' && val !== '0' && val !== 'off';
|
|
318
321
|
}
|
|
@@ -328,12 +331,12 @@ class Document {
|
|
|
328
331
|
if (hasTrackFormatting) {
|
|
329
332
|
this.trackFormatting = true;
|
|
330
333
|
}
|
|
331
|
-
const revisionViewMatch =
|
|
334
|
+
const revisionViewMatch = /<w:revisionView\b([^>]*)\/?>/.exec(settingsXml);
|
|
332
335
|
if (revisionViewMatch) {
|
|
333
336
|
const attrs = revisionViewMatch[1] || '';
|
|
334
|
-
const insDelMatch =
|
|
335
|
-
const formattingMatch =
|
|
336
|
-
const inkMatch =
|
|
337
|
+
const insDelMatch = /w:insDel\s*=\s*"([^"]*)"/.exec(attrs);
|
|
338
|
+
const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
|
|
339
|
+
const inkMatch = /w:inkAnnotations\s*=\s*"([^"]*)"/.exec(attrs);
|
|
337
340
|
if (insDelMatch?.[1] !== undefined) {
|
|
338
341
|
this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1] !== '0';
|
|
339
342
|
}
|
|
@@ -344,22 +347,22 @@ class Document {
|
|
|
344
347
|
this.revisionViewSettings.showInkAnnotations = inkMatch[1] !== '0';
|
|
345
348
|
}
|
|
346
349
|
}
|
|
347
|
-
const protMatch =
|
|
350
|
+
const protMatch = /<w:documentProtection\b([^>]*)\/?>/.exec(settingsXml);
|
|
348
351
|
if (protMatch) {
|
|
349
352
|
const attrs = protMatch[1] || '';
|
|
350
|
-
const editMatch =
|
|
351
|
-
const enforcementMatch =
|
|
353
|
+
const editMatch = /w:edit\s*=\s*"([^"]*)"/.exec(attrs);
|
|
354
|
+
const enforcementMatch = /w:enforcement\s*=\s*"([^"]*)"/.exec(attrs);
|
|
352
355
|
if (editMatch?.[1]) {
|
|
353
356
|
const edit = editMatch[1];
|
|
354
357
|
const enforcement = enforcementMatch?.[1] ? enforcementMatch[1] !== '0' : true;
|
|
355
358
|
this.documentProtection = { edit, enforcement };
|
|
356
|
-
const cryptProviderMatch =
|
|
357
|
-
const cryptAlgClassMatch =
|
|
358
|
-
const cryptAlgTypeMatch =
|
|
359
|
-
const cryptAlgSidMatch =
|
|
360
|
-
const cryptSpinMatch =
|
|
361
|
-
const hashMatch =
|
|
362
|
-
const saltMatch =
|
|
359
|
+
const cryptProviderMatch = /w:cryptProviderType\s*=\s*"([^"]*)"/.exec(attrs);
|
|
360
|
+
const cryptAlgClassMatch = /w:cryptAlgorithmClass\s*=\s*"([^"]*)"/.exec(attrs);
|
|
361
|
+
const cryptAlgTypeMatch = /w:cryptAlgorithmType\s*=\s*"([^"]*)"/.exec(attrs);
|
|
362
|
+
const cryptAlgSidMatch = /w:cryptAlgorithmSid\s*=\s*"([^"]*)"/.exec(attrs);
|
|
363
|
+
const cryptSpinMatch = /w:cryptSpinCount\s*=\s*"([^"]*)"/.exec(attrs);
|
|
364
|
+
const hashMatch = /w:hash\s*=\s*"([^"]*)"/.exec(attrs);
|
|
365
|
+
const saltMatch = /w:salt\s*=\s*"([^"]*)"/.exec(attrs);
|
|
363
366
|
if (cryptProviderMatch?.[1])
|
|
364
367
|
this.documentProtection.cryptProviderType = cryptProviderMatch[1];
|
|
365
368
|
if (cryptAlgClassMatch?.[1])
|
|
@@ -376,10 +379,10 @@ class Document {
|
|
|
376
379
|
this.documentProtection.salt = saltMatch[1];
|
|
377
380
|
}
|
|
378
381
|
}
|
|
379
|
-
const rsidsBlockMatch =
|
|
382
|
+
const rsidsBlockMatch = /<w:rsids>([\s\S]*?)<\/w:rsids>/.exec(settingsXml);
|
|
380
383
|
if (rsidsBlockMatch?.[1]) {
|
|
381
384
|
const rsidsBlock = rsidsBlockMatch[1];
|
|
382
|
-
const rsidRootMatch =
|
|
385
|
+
const rsidRootMatch = /<w:rsidRoot\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(rsidsBlock);
|
|
383
386
|
if (rsidRootMatch?.[1]) {
|
|
384
387
|
this.rsidRoot = rsidRootMatch[1].toUpperCase();
|
|
385
388
|
}
|
|
@@ -402,11 +405,11 @@ class Document {
|
|
|
402
405
|
if (/<w:autoHyphenation\b[^>]*\/?>/.test(settingsXml)) {
|
|
403
406
|
this._autoHyphenation = true;
|
|
404
407
|
}
|
|
405
|
-
const decimalMatch =
|
|
408
|
+
const decimalMatch = /<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
|
|
406
409
|
if (decimalMatch?.[1]) {
|
|
407
410
|
this._decimalSymbol = decimalMatch[1];
|
|
408
411
|
}
|
|
409
|
-
const listSepMatch =
|
|
412
|
+
const listSepMatch = /<w:listSeparator\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
|
|
410
413
|
if (listSepMatch?.[1]) {
|
|
411
414
|
this._listSeparator = listSepMatch[1];
|
|
412
415
|
}
|
|
@@ -416,16 +419,16 @@ class Document {
|
|
|
416
419
|
const compatSettings = [];
|
|
417
420
|
const legacyFlags = [];
|
|
418
421
|
let mode = compatibility_types_1.CompatibilityMode.Word2007;
|
|
419
|
-
const compatBlockMatch =
|
|
422
|
+
const compatBlockMatch = /<w:compat>([\s\S]*?)<\/w:compat>/.exec(settingsXml);
|
|
420
423
|
if (compatBlockMatch?.[1]) {
|
|
421
424
|
const compatBlock = compatBlockMatch[1];
|
|
422
425
|
const settingRegex = /<w:compatSetting\s+([^>]*)\/?\s*>/g;
|
|
423
426
|
let settingMatch;
|
|
424
427
|
while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {
|
|
425
428
|
const attrs = settingMatch[1] ?? '';
|
|
426
|
-
const nameMatch =
|
|
427
|
-
const uriMatch =
|
|
428
|
-
const valMatch =
|
|
429
|
+
const nameMatch = /w:name\s*=\s*"([^"]*)"/.exec(attrs);
|
|
430
|
+
const uriMatch = /w:uri\s*=\s*"([^"]*)"/.exec(attrs);
|
|
431
|
+
const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
|
|
429
432
|
if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {
|
|
430
433
|
const setting = {
|
|
431
434
|
name: nameMatch[1],
|
|
@@ -795,7 +798,7 @@ class Document {
|
|
|
795
798
|
return { ...this.properties };
|
|
796
799
|
}
|
|
797
800
|
setProperty(key, value) {
|
|
798
|
-
this.properties[key] = value;
|
|
801
|
+
(this.properties[key]) = value;
|
|
799
802
|
return this;
|
|
800
803
|
}
|
|
801
804
|
setTitle(title) {
|
|
@@ -895,6 +898,7 @@ class Document {
|
|
|
895
898
|
}
|
|
896
899
|
this.validateNumberingReferences();
|
|
897
900
|
this.validateBookmarkPairs();
|
|
901
|
+
this.assignUniqueIds();
|
|
898
902
|
if (this.skipDocumentXmlRegeneration) {
|
|
899
903
|
this.logger.warn('skipDocumentXmlRegeneration is set: in-memory content modifications will NOT be saved. ' +
|
|
900
904
|
'Use acceptAllRevisions() instead of acceptAllRevisionsRawXml() if you need to modify the document after accepting revisions.');
|
|
@@ -1025,7 +1029,7 @@ class Document {
|
|
|
1025
1029
|
if (runEnd === -1)
|
|
1026
1030
|
continue;
|
|
1027
1031
|
const runContent = xml.substring(runStart, runEnd);
|
|
1028
|
-
const fldCharMatch =
|
|
1032
|
+
const fldCharMatch = /<w:fldChar\s+w:fldCharType\s*=\s*"(begin|separate|end)"/.exec(runContent);
|
|
1029
1033
|
if (fldCharMatch) {
|
|
1030
1034
|
fieldTokens.push({
|
|
1031
1035
|
type: fldCharMatch[1],
|
|
@@ -1033,7 +1037,7 @@ class Document {
|
|
|
1033
1037
|
runEnd,
|
|
1034
1038
|
});
|
|
1035
1039
|
}
|
|
1036
|
-
const instrMatch =
|
|
1040
|
+
const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(runContent);
|
|
1037
1041
|
if (instrMatch) {
|
|
1038
1042
|
instrTokens.push({
|
|
1039
1043
|
text: instrMatch[1].trim(),
|
|
@@ -1179,7 +1183,7 @@ class Document {
|
|
|
1179
1183
|
protectedBlocks.push(block);
|
|
1180
1184
|
return `\x00PROTECTED_${protectedBlocks.length - 1}\x00`;
|
|
1181
1185
|
});
|
|
1182
|
-
const styleMatch =
|
|
1186
|
+
const styleMatch = /<w:pStyle\s+w:val="([^"]+)"/.exec(safeInner);
|
|
1183
1187
|
if (styleMatch && styleSet.has(styleMatch[1])) {
|
|
1184
1188
|
let cleaned = safeInner.replace(/<w:spacing\b[^/]*\/>\s*/g, '');
|
|
1185
1189
|
if (cleaned !== safeInner) {
|
|
@@ -1234,10 +1238,14 @@ class Document {
|
|
|
1234
1238
|
}
|
|
1235
1239
|
}
|
|
1236
1240
|
updateCoreProps() {
|
|
1241
|
+
if (this._removedParts.has(types_1.DOCX_PATHS.CORE_PROPS) || this._removedParts.has('docProps/core.xml'))
|
|
1242
|
+
return;
|
|
1237
1243
|
const xml = this.generator.generateCoreProps(this.properties);
|
|
1238
1244
|
this.zipHandler.updateFile(types_1.DOCX_PATHS.CORE_PROPS, xml);
|
|
1239
1245
|
}
|
|
1240
1246
|
updateAppProps() {
|
|
1247
|
+
if (this._removedParts.has(types_1.DOCX_PATHS.APP_PROPS) || this._removedParts.has('docProps/app.xml'))
|
|
1248
|
+
return;
|
|
1241
1249
|
if (this._originalAppPropsXml && !this._appPropsModified) {
|
|
1242
1250
|
return;
|
|
1243
1251
|
}
|
|
@@ -1292,11 +1300,11 @@ class Document {
|
|
|
1292
1300
|
this._webSettings.doNotSaveAsSingleFile = /<w:doNotSaveAsSingleFile\b/.test(xml);
|
|
1293
1301
|
this._webSettings.doNotOrganizeInFolder = /<w:doNotOrganizeInFolder\b/.test(xml);
|
|
1294
1302
|
this._webSettings.doNotUseLongFileNames = /<w:doNotUseLongFileNames\b/.test(xml);
|
|
1295
|
-
const pixelsMatch =
|
|
1303
|
+
const pixelsMatch = /<w:pixelsPerInch\b[^>]*w:val\s*=\s*"(\d+)"/.exec(xml);
|
|
1296
1304
|
this._webSettings.pixelsPerInch = pixelsMatch?.[1] ? parseInt(pixelsMatch[1], 10) : undefined;
|
|
1297
|
-
const screenMatch =
|
|
1305
|
+
const screenMatch = /<w:targetScreenSz\b[^>]*w:val\s*=\s*"([^"]*)"/.exec(xml);
|
|
1298
1306
|
this._webSettings.targetScreenSz = screenMatch?.[1] ?? undefined;
|
|
1299
|
-
const encodingMatch =
|
|
1307
|
+
const encodingMatch = /<w:encoding\b[^>]*w:val\s*=\s*"([^"]*)"/.exec(xml);
|
|
1300
1308
|
this._webSettings.encoding = encodingMatch?.[1] ?? undefined;
|
|
1301
1309
|
}
|
|
1302
1310
|
updateWebSettingsXml() {
|
|
@@ -1429,7 +1437,7 @@ class Document {
|
|
|
1429
1437
|
if (!relsXml)
|
|
1430
1438
|
return;
|
|
1431
1439
|
const usedRIds = new Set();
|
|
1432
|
-
const rIdPattern = /r:(?:embed|link)="(rId\d+)"/g;
|
|
1440
|
+
const rIdPattern = /r:(?:embed|link|id)="(rId\d+)"/g;
|
|
1433
1441
|
let match;
|
|
1434
1442
|
while ((match = rIdPattern.exec(mergedXml)) !== null) {
|
|
1435
1443
|
if (match[1])
|
|
@@ -1660,7 +1668,7 @@ class Document {
|
|
|
1660
1668
|
rsidsXml += `\n <w:rsid w:val="${esc(rsid)}"/>`;
|
|
1661
1669
|
}
|
|
1662
1670
|
rsidsXml += '\n </w:rsids>';
|
|
1663
|
-
if (
|
|
1671
|
+
if (xml.includes('</w:compat>')) {
|
|
1664
1672
|
xml = xml.replace(/<\/w:compat>/, '</w:compat>' + rsidsXml);
|
|
1665
1673
|
}
|
|
1666
1674
|
else if (/<m:mathPr\b/.test(xml)) {
|
|
@@ -2450,6 +2458,50 @@ class Document {
|
|
|
2450
2458
|
}
|
|
2451
2459
|
return repairs;
|
|
2452
2460
|
}
|
|
2461
|
+
assignUniqueIds() {
|
|
2462
|
+
const existingRevisions = this.revisionManager.getAllRevisions();
|
|
2463
|
+
let maxRevId = 0;
|
|
2464
|
+
for (const rev of existingRevisions) {
|
|
2465
|
+
if (rev.getId() > maxRevId)
|
|
2466
|
+
maxRevId = rev.getId();
|
|
2467
|
+
}
|
|
2468
|
+
const registeredSet = new Set(existingRevisions);
|
|
2469
|
+
let docPrId = 1;
|
|
2470
|
+
const processParagraph = (para) => {
|
|
2471
|
+
for (const rev of para.getRevisions()) {
|
|
2472
|
+
if (!registeredSet.has(rev)) {
|
|
2473
|
+
maxRevId++;
|
|
2474
|
+
rev.setId(maxRevId);
|
|
2475
|
+
registeredSet.add(rev);
|
|
2476
|
+
}
|
|
2477
|
+
}
|
|
2478
|
+
for (const item of para.getContent()) {
|
|
2479
|
+
if (item instanceof Shape_1.Shape) {
|
|
2480
|
+
item.setDocPrId(docPrId++);
|
|
2481
|
+
}
|
|
2482
|
+
else if (item instanceof TextBox_1.TextBox) {
|
|
2483
|
+
item.setDocPrId(docPrId++);
|
|
2484
|
+
}
|
|
2485
|
+
else if (item instanceof ImageRun_1.ImageRun) {
|
|
2486
|
+
item.getImageElement().setDocPrId(docPrId++);
|
|
2487
|
+
}
|
|
2488
|
+
}
|
|
2489
|
+
};
|
|
2490
|
+
for (const element of this.bodyElements) {
|
|
2491
|
+
if (element instanceof Paragraph_1.Paragraph) {
|
|
2492
|
+
processParagraph(element);
|
|
2493
|
+
}
|
|
2494
|
+
else if (element instanceof Table_1.Table) {
|
|
2495
|
+
for (const row of element.getRows()) {
|
|
2496
|
+
for (const cell of row.getCells()) {
|
|
2497
|
+
for (const para of cell.getParagraphs()) {
|
|
2498
|
+
processParagraph(para);
|
|
2499
|
+
}
|
|
2500
|
+
}
|
|
2501
|
+
}
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
}
|
|
2453
2505
|
getLastParagraph() {
|
|
2454
2506
|
for (let i = this.bodyElements.length - 1; i >= 0; i--) {
|
|
2455
2507
|
const element = this.bodyElements[i];
|
|
@@ -2559,8 +2611,7 @@ class Document {
|
|
|
2559
2611
|
const nextElement = this.bodyElements[i + 1];
|
|
2560
2612
|
const isListEnd = !nextElement ||
|
|
2561
2613
|
!(nextElement instanceof Paragraph_1.Paragraph) ||
|
|
2562
|
-
|
|
2563
|
-
nextElement.getNumbering().numId !== numbering.numId;
|
|
2614
|
+
nextElement.getNumbering()?.numId !== numbering.numId;
|
|
2564
2615
|
if (isListEnd) {
|
|
2565
2616
|
const alreadyHasBlank = nextElement instanceof Paragraph_1.Paragraph &&
|
|
2566
2617
|
nextElement.getText().trim() === '' &&
|
|
@@ -2587,7 +2638,7 @@ class Document {
|
|
|
2587
2638
|
totalCount++;
|
|
2588
2639
|
}
|
|
2589
2640
|
const allFiles = this.zipHandler.getFilePaths();
|
|
2590
|
-
const headerFooterFiles = allFiles.filter((path) =>
|
|
2641
|
+
const headerFooterFiles = allFiles.filter((path) => /^word\/(header|footer)\d+\.xml$/i.exec(path));
|
|
2591
2642
|
for (const filePath of headerFooterFiles) {
|
|
2592
2643
|
this.zipHandler.removeFile(filePath);
|
|
2593
2644
|
}
|
|
@@ -2671,7 +2722,7 @@ class Document {
|
|
|
2671
2722
|
if (!abstractNum)
|
|
2672
2723
|
continue;
|
|
2673
2724
|
const level0 = abstractNum.getLevel(0);
|
|
2674
|
-
if (
|
|
2725
|
+
if (level0?.getFormat() !== "bullet")
|
|
2675
2726
|
continue;
|
|
2676
2727
|
for (let levelIndex = 0; levelIndex < 9; levelIndex++) {
|
|
2677
2728
|
const numLevel = abstractNum.getLevel(levelIndex);
|
|
@@ -3688,7 +3739,7 @@ class Document {
|
|
|
3688
3739
|
if (!abstractNum)
|
|
3689
3740
|
continue;
|
|
3690
3741
|
const level0 = abstractNum.getLevel(0);
|
|
3691
|
-
if (
|
|
3742
|
+
if (level0?.getFormat() !== "bullet")
|
|
3692
3743
|
continue;
|
|
3693
3744
|
for (let levelIndex = 0; levelIndex < 9; levelIndex++) {
|
|
3694
3745
|
const numLevel = abstractNum.getLevel(levelIndex);
|
|
@@ -3969,7 +4020,7 @@ class Document {
|
|
|
3969
4020
|
let hasOutlineSwitch = false;
|
|
3970
4021
|
let hasTableSwitch = false;
|
|
3971
4022
|
const normalizedText = instrText.trim().replace(/"/g, '"');
|
|
3972
|
-
const outlineMatch =
|
|
4023
|
+
const outlineMatch = /\\o\s+(?:"(\d+)-(\d+)"|'(\d+)-(\d+)'|(\d+)-(\d+))/.exec(normalizedText);
|
|
3973
4024
|
if (outlineMatch) {
|
|
3974
4025
|
const start = parseInt(outlineMatch[1] || outlineMatch[3] || outlineMatch[5], 10);
|
|
3975
4026
|
const end = parseInt(outlineMatch[2] || outlineMatch[4] || outlineMatch[6], 10);
|
|
@@ -3995,7 +4046,7 @@ class Document {
|
|
|
3995
4046
|
const content = (match[1] || "").trim();
|
|
3996
4047
|
if (!content)
|
|
3997
4048
|
continue;
|
|
3998
|
-
const rangeMatch =
|
|
4049
|
+
const rangeMatch = /^(\d+)-(\d+)$/.exec(content);
|
|
3999
4050
|
if (rangeMatch?.[1] && rangeMatch?.[2]) {
|
|
4000
4051
|
const start = parseInt(rangeMatch[1], 10);
|
|
4001
4052
|
const end = parseInt(rangeMatch[2], 10);
|
|
@@ -4041,9 +4092,9 @@ class Document {
|
|
|
4041
4092
|
const instrRegex = /<w:instrText[^>]*>([^<]*TOC[^<]*)<\/w:instrText>/g;
|
|
4042
4093
|
const instrMatches = Array.from(modifiedXml.matchAll(instrRegex));
|
|
4043
4094
|
for (const match of instrMatches) {
|
|
4044
|
-
if (!match
|
|
4095
|
+
if (!match?.[1])
|
|
4045
4096
|
continue;
|
|
4046
|
-
|
|
4097
|
+
const fieldInstruction = match[1]
|
|
4047
4098
|
.replace(/&/g, "&")
|
|
4048
4099
|
.replace(/</g, "<")
|
|
4049
4100
|
.replace(/>/g, ">")
|
|
@@ -4079,11 +4130,11 @@ class Document {
|
|
|
4079
4130
|
}
|
|
4080
4131
|
}
|
|
4081
4132
|
syncTOCInstructionInXml(xml) {
|
|
4082
|
-
const instrMatch =
|
|
4133
|
+
const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(xml);
|
|
4083
4134
|
if (!instrMatch?.[1]) {
|
|
4084
4135
|
return { xml, changed: false };
|
|
4085
4136
|
}
|
|
4086
|
-
|
|
4137
|
+
const fieldInstruction = instrMatch[1]
|
|
4087
4138
|
.replace(/&/g, "&")
|
|
4088
4139
|
.replace(/</g, "<")
|
|
4089
4140
|
.replace(/>/g, ">")
|
|
@@ -4149,8 +4200,8 @@ class Document {
|
|
|
4149
4200
|
return updatedInstruction;
|
|
4150
4201
|
}
|
|
4151
4202
|
resolveStyleNameForTOC(tocStyleName) {
|
|
4152
|
-
const headingLevelMatch =
|
|
4153
|
-
if (headingLevelMatch
|
|
4203
|
+
const headingLevelMatch = /^Heading\s*(\d+)$/i.exec(tocStyleName);
|
|
4204
|
+
if (headingLevelMatch?.[1]) {
|
|
4154
4205
|
const level = parseInt(headingLevelMatch[1]);
|
|
4155
4206
|
const usedStyles = this.findHeadingStylesUsedByParagraphs();
|
|
4156
4207
|
const actualStyleName = usedStyles.get(level);
|
|
@@ -4231,7 +4282,7 @@ class Document {
|
|
|
4231
4282
|
}
|
|
4232
4283
|
const extractHeading = (para) => {
|
|
4233
4284
|
const pPr = para["w:pPr"];
|
|
4234
|
-
if (!pPr
|
|
4285
|
+
if (!pPr?.["w:pStyle"]) {
|
|
4235
4286
|
return;
|
|
4236
4287
|
}
|
|
4237
4288
|
const styleVal = pPr["w:pStyle"]["@_w:val"];
|
|
@@ -4239,7 +4290,7 @@ class Document {
|
|
|
4239
4290
|
return;
|
|
4240
4291
|
}
|
|
4241
4292
|
const headingMatch = styleVal.match(/^Heading(\d+)$/i);
|
|
4242
|
-
if (!headingMatch
|
|
4293
|
+
if (!headingMatch?.[1]) {
|
|
4243
4294
|
return;
|
|
4244
4295
|
}
|
|
4245
4296
|
const headingLevel = parseInt(headingMatch[1], 10);
|
|
@@ -4346,8 +4397,8 @@ class Document {
|
|
|
4346
4397
|
const para = element;
|
|
4347
4398
|
const formatting = para.getFormatting();
|
|
4348
4399
|
if (formatting.style) {
|
|
4349
|
-
const styleMatch =
|
|
4350
|
-
if (styleMatch
|
|
4400
|
+
const styleMatch = /Heading\s*(\d+)/i.exec(formatting.style);
|
|
4401
|
+
if (styleMatch?.[1]) {
|
|
4351
4402
|
const headingLevel = parseInt(styleMatch[1], 10);
|
|
4352
4403
|
if (levelSet.has(headingLevel)) {
|
|
4353
4404
|
const text = para.getText().trim();
|
|
@@ -4476,10 +4527,10 @@ class Document {
|
|
|
4476
4527
|
for (const match of sdtMatches) {
|
|
4477
4528
|
try {
|
|
4478
4529
|
const tocXml = match[0];
|
|
4479
|
-
const instrMatch =
|
|
4530
|
+
const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(tocXml);
|
|
4480
4531
|
if (!instrMatch?.[1])
|
|
4481
4532
|
continue;
|
|
4482
|
-
|
|
4533
|
+
const fieldInstruction = instrMatch[1]
|
|
4483
4534
|
.replace(/&/g, "&")
|
|
4484
4535
|
.replace(/</g, "<")
|
|
4485
4536
|
.replace(/>/g, ">")
|
|
@@ -4509,7 +4560,7 @@ class Document {
|
|
|
4509
4560
|
const instrText = match[1];
|
|
4510
4561
|
if (!instrText)
|
|
4511
4562
|
continue;
|
|
4512
|
-
|
|
4563
|
+
const fieldInstruction = instrText
|
|
4513
4564
|
.replace(/&/g, "&")
|
|
4514
4565
|
.replace(/</g, "<")
|
|
4515
4566
|
.replace(/>/g, ">")
|
|
@@ -4740,6 +4791,8 @@ class Document {
|
|
|
4740
4791
|
const xml = entry.header.toXML();
|
|
4741
4792
|
const path = `word/${entry.filename}`;
|
|
4742
4793
|
this.zipHandler.addFile(path, xml);
|
|
4794
|
+
const paragraphs = this.extractParagraphsFromElements(entry.header.getElements());
|
|
4795
|
+
this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);
|
|
4743
4796
|
}
|
|
4744
4797
|
}
|
|
4745
4798
|
saveFooters() {
|
|
@@ -4748,6 +4801,8 @@ class Document {
|
|
|
4748
4801
|
const xml = entry.footer.toXML();
|
|
4749
4802
|
const path = `word/${entry.filename}`;
|
|
4750
4803
|
this.zipHandler.addFile(path, xml);
|
|
4804
|
+
const paragraphs = this.extractParagraphsFromElements(entry.footer.getElements());
|
|
4805
|
+
this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);
|
|
4751
4806
|
}
|
|
4752
4807
|
}
|
|
4753
4808
|
updateRelationships() {
|
|
@@ -4812,6 +4867,7 @@ class Document {
|
|
|
4812
4867
|
if (existingRels.length === 0) {
|
|
4813
4868
|
this.relationshipManager.addFootnotes();
|
|
4814
4869
|
}
|
|
4870
|
+
this.generatePartLevelHyperlinkRels(this.footnoteManager.getAllFootnotes().flatMap(fn => fn.getParagraphs()), 'word/_rels/footnotes.xml.rels');
|
|
4815
4871
|
}
|
|
4816
4872
|
else if (this._originalFootnotesXml) {
|
|
4817
4873
|
this.zipHandler.addFile(types_1.DOCX_PATHS.FOOTNOTES, this._originalFootnotesXml);
|
|
@@ -4829,6 +4885,7 @@ class Document {
|
|
|
4829
4885
|
if (existingRels.length === 0) {
|
|
4830
4886
|
this.relationshipManager.addEndnotes();
|
|
4831
4887
|
}
|
|
4888
|
+
this.generatePartLevelHyperlinkRels(this.endnoteManager.getAllEndnotes().flatMap(en => en.getParagraphs()), 'word/_rels/endnotes.xml.rels');
|
|
4832
4889
|
}
|
|
4833
4890
|
else if (this._originalEndnotesXml) {
|
|
4834
4891
|
this.zipHandler.addFile(types_1.DOCX_PATHS.ENDNOTES, this._originalEndnotesXml);
|
|
@@ -4838,6 +4895,61 @@ class Document {
|
|
|
4838
4895
|
}
|
|
4839
4896
|
}
|
|
4840
4897
|
}
|
|
4898
|
+
extractParagraphsFromElements(elements) {
|
|
4899
|
+
const result = [];
|
|
4900
|
+
for (const el of elements) {
|
|
4901
|
+
if (el instanceof Paragraph_1.Paragraph) {
|
|
4902
|
+
result.push(el);
|
|
4903
|
+
}
|
|
4904
|
+
else if (el instanceof Table_1.Table) {
|
|
4905
|
+
for (const row of el.getRows()) {
|
|
4906
|
+
for (const cell of row.getCells()) {
|
|
4907
|
+
result.push(...cell.getParagraphs());
|
|
4908
|
+
}
|
|
4909
|
+
}
|
|
4910
|
+
}
|
|
4911
|
+
}
|
|
4912
|
+
return result;
|
|
4913
|
+
}
|
|
4914
|
+
generatePartLevelHyperlinkRels(paragraphs, relsPath) {
|
|
4915
|
+
const hyperlinkRels = [];
|
|
4916
|
+
for (const para of paragraphs) {
|
|
4917
|
+
for (const item of para.getContent()) {
|
|
4918
|
+
if (item instanceof Hyperlink_1.Hyperlink && item.isExternal()) {
|
|
4919
|
+
const relId = item.getRelationshipId();
|
|
4920
|
+
const url = item.getUrl();
|
|
4921
|
+
if (relId && url) {
|
|
4922
|
+
hyperlinkRels.push({ id: relId, url });
|
|
4923
|
+
}
|
|
4924
|
+
}
|
|
4925
|
+
if (item instanceof Revision_1.Revision) {
|
|
4926
|
+
for (const revContent of item.getContent()) {
|
|
4927
|
+
if (revContent instanceof Hyperlink_1.Hyperlink && revContent.isExternal()) {
|
|
4928
|
+
const relId = revContent.getRelationshipId();
|
|
4929
|
+
const url = revContent.getUrl();
|
|
4930
|
+
if (relId && url) {
|
|
4931
|
+
hyperlinkRels.push({ id: relId, url });
|
|
4932
|
+
}
|
|
4933
|
+
}
|
|
4934
|
+
}
|
|
4935
|
+
}
|
|
4936
|
+
}
|
|
4937
|
+
}
|
|
4938
|
+
if (hyperlinkRels.length > 0) {
|
|
4939
|
+
let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
|
|
4940
|
+
xml += '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n';
|
|
4941
|
+
for (const rel of hyperlinkRels) {
|
|
4942
|
+
const escapedId = XMLBuilder_1.XMLBuilder.escapeXmlAttribute(rel.id);
|
|
4943
|
+
const escapedUrl = XMLBuilder_1.XMLBuilder.escapeXmlAttribute(rel.url);
|
|
4944
|
+
xml += ` <Relationship Id="${escapedId}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="${escapedUrl}" TargetMode="External"/>\n`;
|
|
4945
|
+
}
|
|
4946
|
+
xml += '</Relationships>';
|
|
4947
|
+
this.zipHandler.addFile(relsPath, xml);
|
|
4948
|
+
for (const rel of hyperlinkRels) {
|
|
4949
|
+
this.relationshipManager.removeRelationship(rel.id);
|
|
4950
|
+
}
|
|
4951
|
+
}
|
|
4952
|
+
}
|
|
4841
4953
|
updatePeopleXml() {
|
|
4842
4954
|
const authors = new Set();
|
|
4843
4955
|
for (const para of this.getAllParagraphs()) {
|
|
@@ -5814,7 +5926,29 @@ class Document {
|
|
|
5814
5926
|
this.zipHandler.addFile(partName, content, { binary: isBinary });
|
|
5815
5927
|
}
|
|
5816
5928
|
async removePart(partName) {
|
|
5817
|
-
|
|
5929
|
+
const removed = this.zipHandler.removeFile(partName);
|
|
5930
|
+
if (removed) {
|
|
5931
|
+
if (this._originalContentTypes?.overrides) {
|
|
5932
|
+
const partKey = partName.startsWith('/') ? partName : `/${partName}`;
|
|
5933
|
+
for (const entry of this._originalContentTypes.overrides) {
|
|
5934
|
+
if (entry.startsWith(`${partKey}|`)) {
|
|
5935
|
+
this._originalContentTypes.overrides.delete(entry);
|
|
5936
|
+
break;
|
|
5937
|
+
}
|
|
5938
|
+
}
|
|
5939
|
+
}
|
|
5940
|
+
const relsXml = this.zipHandler.getFileAsString("_rels/.rels");
|
|
5941
|
+
if (relsXml) {
|
|
5942
|
+
const target = partName.replace(/^\//, '');
|
|
5943
|
+
const relPattern = new RegExp(`\\s*<Relationship[^>]*Target="${target.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"[^>]*/?>`, 'g');
|
|
5944
|
+
const cleaned = relsXml.replace(relPattern, '');
|
|
5945
|
+
if (cleaned !== relsXml) {
|
|
5946
|
+
this.zipHandler.updateFile("_rels/.rels", cleaned);
|
|
5947
|
+
}
|
|
5948
|
+
}
|
|
5949
|
+
this._removedParts.add(partName);
|
|
5950
|
+
}
|
|
5951
|
+
return removed;
|
|
5818
5952
|
}
|
|
5819
5953
|
async listParts() {
|
|
5820
5954
|
return this.zipHandler.getFilePaths();
|
|
@@ -5870,7 +6004,7 @@ class Document {
|
|
|
5870
6004
|
try {
|
|
5871
6005
|
const parts = await this.listParts();
|
|
5872
6006
|
for (const partName of parts) {
|
|
5873
|
-
if (
|
|
6007
|
+
if (/\.(png|jpg|jpeg|gif|woff|woff2|ttf|otf|bin)$/i.exec(partName)) {
|
|
5874
6008
|
continue;
|
|
5875
6009
|
}
|
|
5876
6010
|
const xml = await this.getRawXml(partName);
|
|
@@ -6143,7 +6277,7 @@ class Document {
|
|
|
6143
6277
|
for (const paragraph of this.getAllParagraphs()) {
|
|
6144
6278
|
for (const run of paragraph.getRuns()) {
|
|
6145
6279
|
const formatting = run.getFormatting();
|
|
6146
|
-
if (formatting.font
|
|
6280
|
+
if (formatting.font?.toLowerCase() === lowerFontName) {
|
|
6147
6281
|
results.push(run);
|
|
6148
6282
|
}
|
|
6149
6283
|
}
|
|
@@ -6533,7 +6667,7 @@ class Document {
|
|
|
6533
6667
|
throw new Error("insertTableAt: table must have at least one row");
|
|
6534
6668
|
}
|
|
6535
6669
|
const firstRow = rows[0];
|
|
6536
|
-
if (firstRow
|
|
6670
|
+
if (firstRow?.getCells().length === 0) {
|
|
6537
6671
|
throw new Error("insertTableAt: table rows must have at least one cell");
|
|
6538
6672
|
}
|
|
6539
6673
|
const tableStyle = table.getFormatting().style;
|
|
@@ -6693,6 +6827,80 @@ class Document {
|
|
|
6693
6827
|
}
|
|
6694
6828
|
return hyperlinks;
|
|
6695
6829
|
}
|
|
6830
|
+
collectAllReferencedHyperlinkIds() {
|
|
6831
|
+
const ids = new Set();
|
|
6832
|
+
const scanParagraph = (para) => {
|
|
6833
|
+
for (const item of para.getContent()) {
|
|
6834
|
+
if (item instanceof Hyperlink_1.Hyperlink) {
|
|
6835
|
+
const relId = item.getRelationshipId();
|
|
6836
|
+
if (relId)
|
|
6837
|
+
ids.add(relId);
|
|
6838
|
+
}
|
|
6839
|
+
if (item instanceof Revision_1.Revision) {
|
|
6840
|
+
for (const revContent of item.getContent()) {
|
|
6841
|
+
if (revContent instanceof Hyperlink_1.Hyperlink) {
|
|
6842
|
+
const relId = revContent.getRelationshipId();
|
|
6843
|
+
if (relId)
|
|
6844
|
+
ids.add(relId);
|
|
6845
|
+
}
|
|
6846
|
+
}
|
|
6847
|
+
}
|
|
6848
|
+
}
|
|
6849
|
+
};
|
|
6850
|
+
const scanElement = (element) => {
|
|
6851
|
+
if (element instanceof Paragraph_1.Paragraph) {
|
|
6852
|
+
scanParagraph(element);
|
|
6853
|
+
}
|
|
6854
|
+
else if (element instanceof Table_1.Table) {
|
|
6855
|
+
for (let row = 0; row < element.getRowCount(); row++) {
|
|
6856
|
+
for (let col = 0; col < element.getColumnCount(); col++) {
|
|
6857
|
+
const cell = element.getCell(row, col);
|
|
6858
|
+
if (cell) {
|
|
6859
|
+
for (const para of cell.getParagraphs()) {
|
|
6860
|
+
scanParagraph(para);
|
|
6861
|
+
}
|
|
6862
|
+
for (const nested of cell.getRawNestedContent()) {
|
|
6863
|
+
const rIdPattern = /r:id="(rId\d+)"/g;
|
|
6864
|
+
let rIdMatch;
|
|
6865
|
+
while ((rIdMatch = rIdPattern.exec(nested.xml)) !== null) {
|
|
6866
|
+
ids.add(rIdMatch[1]);
|
|
6867
|
+
}
|
|
6868
|
+
}
|
|
6869
|
+
}
|
|
6870
|
+
}
|
|
6871
|
+
}
|
|
6872
|
+
}
|
|
6873
|
+
else if (element instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
|
|
6874
|
+
for (const item of element.getContent()) {
|
|
6875
|
+
scanElement(item);
|
|
6876
|
+
}
|
|
6877
|
+
}
|
|
6878
|
+
};
|
|
6879
|
+
for (const element of this.bodyElements) {
|
|
6880
|
+
scanElement(element);
|
|
6881
|
+
}
|
|
6882
|
+
for (const header of this.headerFooterManager.getAllHeaders()) {
|
|
6883
|
+
for (const el of header.header.getElements()) {
|
|
6884
|
+
scanElement(el);
|
|
6885
|
+
}
|
|
6886
|
+
}
|
|
6887
|
+
for (const footer of this.headerFooterManager.getAllFooters()) {
|
|
6888
|
+
for (const el of footer.footer.getElements()) {
|
|
6889
|
+
scanElement(el);
|
|
6890
|
+
}
|
|
6891
|
+
}
|
|
6892
|
+
for (const fn of this.footnoteManager.getAllFootnotes()) {
|
|
6893
|
+
for (const para of fn.getParagraphs()) {
|
|
6894
|
+
scanParagraph(para);
|
|
6895
|
+
}
|
|
6896
|
+
}
|
|
6897
|
+
for (const en of this.endnoteManager.getAllEndnotes()) {
|
|
6898
|
+
for (const para of en.getParagraphs()) {
|
|
6899
|
+
scanParagraph(para);
|
|
6900
|
+
}
|
|
6901
|
+
}
|
|
6902
|
+
return ids;
|
|
6903
|
+
}
|
|
6696
6904
|
defragmentHyperlinks(options) {
|
|
6697
6905
|
const { resetFormatting = false, cleanupRelationships = false } = options || {};
|
|
6698
6906
|
if (this.trackChangesEnabled) {
|
|
@@ -6726,14 +6934,7 @@ class Document {
|
|
|
6726
6934
|
}
|
|
6727
6935
|
}
|
|
6728
6936
|
if (cleanupRelationships && mergedCount > 0) {
|
|
6729
|
-
const referencedIds =
|
|
6730
|
-
const allHyperlinks = this.getHyperlinks();
|
|
6731
|
-
for (const { hyperlink } of allHyperlinks) {
|
|
6732
|
-
const relId = hyperlink.getRelationshipId();
|
|
6733
|
-
if (relId) {
|
|
6734
|
-
referencedIds.add(relId);
|
|
6735
|
-
}
|
|
6736
|
-
}
|
|
6937
|
+
const referencedIds = this.collectAllReferencedHyperlinkIds();
|
|
6737
6938
|
const removedCount = this.relationshipManager.removeOrphanedHyperlinks(referencedIds);
|
|
6738
6939
|
if (removedCount > 0) {
|
|
6739
6940
|
logger_1.defaultLogger.info(`Cleaned up ${removedCount} orphaned hyperlink relationship(s)`);
|
|
@@ -6845,7 +7046,7 @@ class Document {
|
|
|
6845
7046
|
if (!path.endsWith('.rels') || path === 'word/_rels/document.xml.rels')
|
|
6846
7047
|
continue;
|
|
6847
7048
|
const content = this.zipHandler.getFileAsString(path);
|
|
6848
|
-
if (content
|
|
7049
|
+
if (content?.includes(oldTarget)) {
|
|
6849
7050
|
const updated = content.replace(new RegExp(escapedOldTarget, 'g'), newTarget);
|
|
6850
7051
|
this.zipHandler.updateFile(path, updated);
|
|
6851
7052
|
}
|
|
@@ -7072,7 +7273,7 @@ class Document {
|
|
|
7072
7273
|
const results = [];
|
|
7073
7274
|
this.clearCustom();
|
|
7074
7275
|
this.addTopBookmark();
|
|
7075
|
-
|
|
7276
|
+
const docXml = this.zipHandler.getFileAsString('word/document.xml');
|
|
7076
7277
|
if (!docXml) {
|
|
7077
7278
|
return results;
|
|
7078
7279
|
}
|
|
@@ -7084,12 +7285,12 @@ class Document {
|
|
|
7084
7285
|
for (const match of tocMatches) {
|
|
7085
7286
|
try {
|
|
7086
7287
|
const tocXml = match[0];
|
|
7087
|
-
const instrMatch =
|
|
7288
|
+
const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(tocXml);
|
|
7088
7289
|
if (!instrMatch?.[1]) {
|
|
7089
7290
|
continue;
|
|
7090
7291
|
}
|
|
7091
7292
|
const instrText = instrMatch[1];
|
|
7092
|
-
|
|
7293
|
+
const fieldInstruction = instrText
|
|
7093
7294
|
.replace(/&/g, '&')
|
|
7094
7295
|
.replace(/</g, '<')
|
|
7095
7296
|
.replace(/>/g, '>')
|