docxmlater 10.4.0 → 11.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/constants/legacyCompatFlags.d.ts +1 -1
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/core/Document.d.ts +75 -67
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +618 -414
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +11 -10
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +19 -19
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentEvents.d.ts +39 -0
- package/dist/core/DocumentEvents.d.ts.map +1 -0
- package/dist/core/DocumentEvents.js +51 -0
- package/dist/core/DocumentEvents.js.map +1 -0
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +72 -52
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +15 -15
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +2100 -1076
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts +3 -3
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +31 -31
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/ElementRegistry.d.ts +22 -0
- package/dist/core/ElementRegistry.d.ts.map +1 -0
- package/dist/core/ElementRegistry.js +27 -0
- package/dist/core/ElementRegistry.js.map +1 -0
- package/dist/core/Relationship.js +4 -4
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +32 -32
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.d.ts +1 -1
- package/dist/elements/AlternateContent.d.ts.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts +6 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +19 -3
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js +7 -7
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.d.ts +2 -2
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +4 -4
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts +2 -2
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +9 -9
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +9 -4
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -0
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.d.ts +1 -1
- package/dist/elements/CustomXml.d.ts.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts +2 -2
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js +9 -9
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +11 -11
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts +9 -5
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +21 -9
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +10 -10
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/Footer.d.ts +3 -3
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +5 -5
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts +2 -2
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +9 -9
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +11 -11
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.d.ts +3 -3
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +5 -5
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.d.ts +2 -2
- package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -5
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +29 -29
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +67 -67
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +4 -4
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.d.ts +3 -3
- package/dist/elements/ImageRun.d.ts.map +1 -1
- package/dist/elements/ImageRun.js +2 -2
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.d.ts +1 -1
- package/dist/elements/MathElement.d.ts.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +34 -19
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +286 -231
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.d.ts +1 -1
- package/dist/elements/PreservedElement.d.ts.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts +2 -2
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts +14 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js +46 -8
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/RegisteredBodyElement.d.ts +15 -0
- package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
- package/dist/elements/RegisteredBodyElement.js +44 -0
- package/dist/elements/RegisteredBodyElement.js.map +1 -0
- package/dist/elements/Revision.d.ts +8 -8
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +12 -12
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.d.ts +3 -3
- package/dist/elements/RevisionContent.d.ts.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts +2 -2
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +2 -2
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -10
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +199 -173
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts +4 -2
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +152 -145
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts +3 -3
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +12 -12
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +3 -3
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +39 -39
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +16 -10
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +118 -89
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +11 -11
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +108 -78
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js +3 -3
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +2 -2
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.d.ts +2 -2
- package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
- package/dist/elements/TableOfContentsElement.js +5 -5
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts +18 -7
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +127 -74
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts +4 -4
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +6 -6
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/esm/constants/legacyCompatFlags.js +97 -0
- package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
- package/dist/esm/constants/limits.js +36 -0
- package/dist/esm/constants/limits.js.map +1 -0
- package/dist/esm/core/Document.js +8498 -0
- package/dist/esm/core/Document.js.map +1 -0
- package/dist/esm/core/DocumentContent.js +190 -0
- package/dist/esm/core/DocumentContent.js.map +1 -0
- package/dist/esm/core/DocumentEvents.js +47 -0
- package/dist/esm/core/DocumentEvents.js.map +1 -0
- package/dist/esm/core/DocumentGenerator.js +764 -0
- package/dist/esm/core/DocumentGenerator.js.map +1 -0
- package/dist/esm/core/DocumentIdManager.js +67 -0
- package/dist/esm/core/DocumentIdManager.js.map +1 -0
- package/dist/esm/core/DocumentParser.js +8760 -0
- package/dist/esm/core/DocumentParser.js.map +1 -0
- package/dist/esm/core/DocumentValidator.js +222 -0
- package/dist/esm/core/DocumentValidator.js.map +1 -0
- package/dist/esm/core/ElementRegistry.js +24 -0
- package/dist/esm/core/ElementRegistry.js.map +1 -0
- package/dist/esm/core/Relationship.js +177 -0
- package/dist/esm/core/Relationship.js.map +1 -0
- package/dist/esm/core/RelationshipManager.js +202 -0
- package/dist/esm/core/RelationshipManager.js.map +1 -0
- package/dist/esm/elements/AlternateContent.js +19 -0
- package/dist/esm/elements/AlternateContent.js.map +1 -0
- package/dist/esm/elements/Bookmark.js +115 -0
- package/dist/esm/elements/Bookmark.js.map +1 -0
- package/dist/esm/elements/BookmarkManager.js +99 -0
- package/dist/esm/elements/BookmarkManager.js.map +1 -0
- package/dist/esm/elements/Comment.js +181 -0
- package/dist/esm/elements/Comment.js.map +1 -0
- package/dist/esm/elements/CommentManager.js +233 -0
- package/dist/esm/elements/CommentManager.js.map +1 -0
- package/dist/esm/elements/CommonTypes.js +106 -0
- package/dist/esm/elements/CommonTypes.js.map +1 -0
- package/dist/esm/elements/CustomXml.js +19 -0
- package/dist/esm/elements/CustomXml.js.map +1 -0
- package/dist/esm/elements/Endnote.js +107 -0
- package/dist/esm/elements/Endnote.js.map +1 -0
- package/dist/esm/elements/EndnoteManager.js +119 -0
- package/dist/esm/elements/EndnoteManager.js.map +1 -0
- package/dist/esm/elements/Field.js +856 -0
- package/dist/esm/elements/Field.js.map +1 -0
- package/dist/esm/elements/FieldHelpers.js +134 -0
- package/dist/esm/elements/FieldHelpers.js.map +1 -0
- package/dist/esm/elements/FontManager.js +158 -0
- package/dist/esm/elements/FontManager.js.map +1 -0
- package/dist/esm/elements/Footer.js +141 -0
- package/dist/esm/elements/Footer.js.map +1 -0
- package/dist/esm/elements/Footnote.js +107 -0
- package/dist/esm/elements/Footnote.js.map +1 -0
- package/dist/esm/elements/FootnoteManager.js +119 -0
- package/dist/esm/elements/FootnoteManager.js.map +1 -0
- package/dist/esm/elements/Header.js +141 -0
- package/dist/esm/elements/Header.js.map +1 -0
- package/dist/esm/elements/HeaderFooterManager.js +87 -0
- package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
- package/dist/esm/elements/Hyperlink.js +586 -0
- package/dist/esm/elements/Hyperlink.js.map +1 -0
- package/dist/esm/elements/Image.js +1288 -0
- package/dist/esm/elements/Image.js.map +1 -0
- package/dist/esm/elements/ImageManager.js +223 -0
- package/dist/esm/elements/ImageManager.js.map +1 -0
- package/dist/esm/elements/ImageRun.js +29 -0
- package/dist/esm/elements/ImageRun.js.map +1 -0
- package/dist/esm/elements/MathElement.js +37 -0
- package/dist/esm/elements/MathElement.js.map +1 -0
- package/dist/esm/elements/Paragraph.js +2308 -0
- package/dist/esm/elements/Paragraph.js.map +1 -0
- package/dist/esm/elements/PreservedElement.js +29 -0
- package/dist/esm/elements/PreservedElement.js.map +1 -0
- package/dist/esm/elements/PropertyChangeTypes.js +53 -0
- package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
- package/dist/esm/elements/RangeMarker.js +219 -0
- package/dist/esm/elements/RangeMarker.js.map +1 -0
- package/dist/esm/elements/RegisteredBodyElement.js +40 -0
- package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
- package/dist/esm/elements/Revision.js +498 -0
- package/dist/esm/elements/Revision.js.map +1 -0
- package/dist/esm/elements/RevisionContent.js +18 -0
- package/dist/esm/elements/RevisionContent.js.map +1 -0
- package/dist/esm/elements/RevisionManager.js +486 -0
- package/dist/esm/elements/RevisionManager.js.map +1 -0
- package/dist/esm/elements/Run.js +1465 -0
- package/dist/esm/elements/Run.js.map +1 -0
- package/dist/esm/elements/Section.js +978 -0
- package/dist/esm/elements/Section.js.map +1 -0
- package/dist/esm/elements/Shape.js +493 -0
- package/dist/esm/elements/Shape.js.map +1 -0
- package/dist/esm/elements/StructuredDocumentTag.js +471 -0
- package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
- package/dist/esm/elements/Table.js +1456 -0
- package/dist/esm/elements/Table.js.map +1 -0
- package/dist/esm/elements/TableCell.js +835 -0
- package/dist/esm/elements/TableCell.js.map +1 -0
- package/dist/esm/elements/TableGridChange.js +52 -0
- package/dist/esm/elements/TableGridChange.js.map +1 -0
- package/dist/esm/elements/TableOfContents.js +389 -0
- package/dist/esm/elements/TableOfContents.js.map +1 -0
- package/dist/esm/elements/TableOfContentsElement.js +29 -0
- package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
- package/dist/esm/elements/TableRow.js +555 -0
- package/dist/esm/elements/TableRow.js.map +1 -0
- package/dist/esm/elements/TextBox.js +459 -0
- package/dist/esm/elements/TextBox.js.map +1 -0
- package/dist/esm/formatting/AbstractNumbering.js +325 -0
- package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
- package/dist/esm/formatting/NumberingInstance.js +150 -0
- package/dist/esm/formatting/NumberingInstance.js.map +1 -0
- package/dist/esm/formatting/NumberingLevel.js +608 -0
- package/dist/esm/formatting/NumberingLevel.js.map +1 -0
- package/dist/esm/formatting/NumberingManager.js +423 -0
- package/dist/esm/formatting/NumberingManager.js.map +1 -0
- package/dist/esm/formatting/Style.js +1151 -0
- package/dist/esm/formatting/Style.js.map +1 -0
- package/dist/esm/formatting/StylesManager.js +557 -0
- package/dist/esm/formatting/StylesManager.js.map +1 -0
- package/dist/esm/helpers/CleanupHelper.js +350 -0
- package/dist/esm/helpers/CleanupHelper.js.map +1 -0
- package/dist/esm/images/ImageOptimizer.js +161 -0
- package/dist/esm/images/ImageOptimizer.js.map +1 -0
- package/dist/esm/index.js +75 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal.js +16 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/managers/DrawingManager.js +163 -0
- package/dist/esm/managers/DrawingManager.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/processors/ChangelogGenerator.js +970 -0
- package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
- package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
- package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
- package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
- package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
- package/dist/esm/processors/MoveOperationHelper.js +57 -0
- package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
- package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
- package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
- package/dist/esm/processors/RevisionWalker.js +278 -0
- package/dist/esm/processors/RevisionWalker.js.map +1 -0
- package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
- package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
- package/dist/esm/processors/ShadingResolver.js +66 -0
- package/dist/esm/processors/ShadingResolver.js.map +1 -0
- package/dist/esm/processors/acceptRevisions.js +416 -0
- package/dist/esm/processors/acceptRevisions.js.map +1 -0
- package/dist/esm/processors/cnfStyleDecoder.js +89 -0
- package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
- package/dist/esm/processors/stripTrackedChanges.js +201 -0
- package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
- package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
- package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
- package/dist/esm/tracking/TrackingContext.js +2 -0
- package/dist/esm/tracking/TrackingContext.js.map +1 -0
- package/dist/esm/types/compatibility-types.js +8 -0
- package/dist/esm/types/compatibility-types.js.map +1 -0
- package/dist/esm/types/document-types.js +2 -0
- package/dist/esm/types/document-types.js.map +1 -0
- package/dist/esm/types/formatting.js +2 -0
- package/dist/esm/types/formatting.js.map +1 -0
- package/dist/esm/types/list-types.js +2 -0
- package/dist/esm/types/list-types.js.map +1 -0
- package/dist/esm/types/settings-types.js +2 -0
- package/dist/esm/types/settings-types.js.map +1 -0
- package/dist/esm/types/styleConfig.js +2 -0
- package/dist/esm/types/styleConfig.js.map +1 -0
- package/dist/esm/utils/KeyedRegistry.js +32 -0
- package/dist/esm/utils/KeyedRegistry.js.map +1 -0
- package/dist/esm/utils/corruptionDetection.js +155 -0
- package/dist/esm/utils/corruptionDetection.js.map +1 -0
- package/dist/esm/utils/dateFormatting.js +4 -0
- package/dist/esm/utils/dateFormatting.js.map +1 -0
- package/dist/esm/utils/deepClone.js +40 -0
- package/dist/esm/utils/deepClone.js.map +1 -0
- package/dist/esm/utils/deepEqual.js +47 -0
- package/dist/esm/utils/deepEqual.js.map +1 -0
- package/dist/esm/utils/diagnostics.js +69 -0
- package/dist/esm/utils/diagnostics.js.map +1 -0
- package/dist/esm/utils/errorHandling.js +36 -0
- package/dist/esm/utils/errorHandling.js.map +1 -0
- package/dist/esm/utils/formatting.js +93 -0
- package/dist/esm/utils/formatting.js.map +1 -0
- package/dist/esm/utils/list-detection.js +148 -0
- package/dist/esm/utils/list-detection.js.map +1 -0
- package/dist/esm/utils/logger.js +205 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/parsingHelpers.js +56 -0
- package/dist/esm/utils/parsingHelpers.js.map +1 -0
- package/dist/esm/utils/textDiff.js +42 -0
- package/dist/esm/utils/textDiff.js.map +1 -0
- package/dist/esm/utils/units.js +152 -0
- package/dist/esm/utils/units.js.map +1 -0
- package/dist/esm/utils/validation.js +285 -0
- package/dist/esm/utils/validation.js.map +1 -0
- package/dist/esm/utils/xmlSanitization.js +54 -0
- package/dist/esm/utils/xmlSanitization.js.map +1 -0
- package/dist/esm/validation/RevisionAutoFixer.js +340 -0
- package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
- package/dist/esm/validation/RevisionValidator.js +240 -0
- package/dist/esm/validation/RevisionValidator.js.map +1 -0
- package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
- package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
- package/dist/esm/validation/ValidationRules.js +92 -0
- package/dist/esm/validation/ValidationRules.js.map +1 -0
- package/dist/esm/validation/index.js +4 -0
- package/dist/esm/validation/index.js.map +1 -0
- package/dist/esm/xml/XMLBuilder.js +434 -0
- package/dist/esm/xml/XMLBuilder.js.map +1 -0
- package/dist/esm/xml/XMLParser.js +486 -0
- package/dist/esm/xml/XMLParser.js.map +1 -0
- package/dist/esm/zip/ZipHandler.js +298 -0
- package/dist/esm/zip/ZipHandler.js.map +1 -0
- package/dist/esm/zip/ZipReader.js +147 -0
- package/dist/esm/zip/ZipReader.js.map +1 -0
- package/dist/esm/zip/ZipWriter.js +199 -0
- package/dist/esm/zip/ZipWriter.js.map +1 -0
- package/dist/esm/zip/errors.js +43 -0
- package/dist/esm/zip/errors.js.map +1 -0
- package/dist/esm/zip/types.js +31 -0
- package/dist/esm/zip/types.js.map +1 -0
- package/dist/formatting/AbstractNumbering.d.ts +2 -2
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +33 -33
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts +2 -2
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +7 -7
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +11 -2
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +111 -25
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +4 -4
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +28 -28
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +14 -7
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +309 -112
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -2
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +52 -52
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +15 -15
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/index.d.ts +81 -90
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +286 -317
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +16 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +42 -0
- package/dist/internal.js.map +1 -0
- package/dist/managers/DrawingManager.d.ts +3 -3
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js +12 -12
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
- package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
- package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
- package/dist/processors/ChangelogGenerator.js.map +1 -0
- package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
- package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
- package/dist/processors/CompatibilityUpgrader.js.map +1 -0
- package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
- package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
- package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
- package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
- package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
- package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
- package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
- package/dist/processors/MoveOperationHelper.js.map +1 -0
- package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
- package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
- package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
- package/dist/processors/RevisionAwareProcessor.js.map +1 -0
- package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
- package/dist/processors/RevisionWalker.d.ts.map +1 -0
- package/dist/{utils → processors}/RevisionWalker.js +28 -0
- package/dist/processors/RevisionWalker.js.map +1 -0
- package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
- package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
- package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
- package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
- package/dist/processors/ShadingResolver.d.ts +6 -0
- package/dist/processors/ShadingResolver.d.ts.map +1 -0
- package/dist/{utils → processors}/ShadingResolver.js +2 -2
- package/dist/processors/ShadingResolver.js.map +1 -0
- package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
- package/dist/processors/acceptRevisions.d.ts.map +1 -0
- package/dist/{utils → processors}/acceptRevisions.js +24 -4
- package/dist/processors/acceptRevisions.js.map +1 -0
- package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
- package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
- package/dist/processors/cnfStyleDecoder.js.map +1 -0
- package/dist/processors/stripTrackedChanges.d.ts +3 -0
- package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
- package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
- package/dist/processors/stripTrackedChanges.js.map +1 -0
- package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +38 -43
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts +8 -8
- package/dist/tracking/TrackingContext.d.ts.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/document-types.d.ts +28 -0
- package/dist/types/document-types.d.ts.map +1 -0
- package/dist/types/document-types.js +3 -0
- package/dist/types/document-types.js.map +1 -0
- package/dist/types/formatting.d.ts +4 -4
- package/dist/types/formatting.d.ts.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/settings-types.d.ts +6 -0
- package/dist/types/settings-types.d.ts.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/utils/KeyedRegistry.d.ts +13 -0
- package/dist/utils/KeyedRegistry.d.ts.map +1 -0
- package/dist/utils/KeyedRegistry.js +36 -0
- package/dist/utils/KeyedRegistry.js.map +1 -0
- package/dist/utils/corruptionDetection.d.ts +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js +4 -4
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/deepEqual.d.ts +2 -0
- package/dist/utils/deepEqual.d.ts.map +1 -0
- package/dist/utils/deepEqual.js +50 -0
- package/dist/utils/deepEqual.js.map +1 -0
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/parsingHelpers.d.ts +1 -1
- package/dist/utils/parsingHelpers.d.ts.map +1 -1
- package/dist/utils/parsingHelpers.js +2 -2
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/validation.js +7 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.js +2 -2
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +4 -4
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +11 -11
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts +5 -4
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +29 -30
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
- package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
- package/dist/validation/ValidationRuleRegistry.js +43 -0
- package/dist/validation/ValidationRuleRegistry.js.map +1 -0
- package/dist/validation/index.d.ts +3 -3
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +10 -10
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +6 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +11 -6
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.js +6 -6
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js +8 -8
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +14 -14
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.d.ts +1 -1
- package/dist/zip/ZipWriter.d.ts.map +1 -1
- package/dist/zip/ZipWriter.js +10 -10
- package/dist/zip/ZipWriter.js.map +1 -1
- package/package.json +20 -4
- package/src/constants/legacyCompatFlags.ts +1 -1
- package/src/core/Document.ts +478 -167
- package/src/core/DocumentContent.ts +14 -11
- package/src/core/DocumentEvents.ts +90 -0
- package/src/core/DocumentGenerator.ts +49 -22
- package/src/core/DocumentParser.ts +2235 -620
- package/src/core/DocumentValidator.ts +7 -7
- package/src/core/ElementRegistry.ts +69 -0
- package/src/core/Relationship.ts +1 -1
- package/src/core/RelationshipManager.ts +4 -4
- package/src/elements/AlternateContent.ts +1 -1
- package/src/elements/Bookmark.ts +52 -4
- package/src/elements/BookmarkManager.ts +2 -2
- package/src/elements/Comment.ts +3 -3
- package/src/elements/CommentManager.ts +4 -4
- package/src/elements/CommonTypes.ts +45 -7
- package/src/elements/CustomXml.ts +1 -1
- package/src/elements/Endnote.ts +2 -2
- package/src/elements/EndnoteManager.ts +3 -3
- package/src/elements/Field.ts +44 -10
- package/src/elements/FieldHelpers.ts +2 -2
- package/src/elements/Footer.ts +4 -4
- package/src/elements/Footnote.ts +2 -2
- package/src/elements/FootnoteManager.ts +3 -3
- package/src/elements/Header.ts +4 -4
- package/src/elements/HeaderFooterManager.ts +2 -2
- package/src/elements/Hyperlink.ts +16 -12
- package/src/elements/Image.ts +3 -3
- package/src/elements/ImageManager.ts +2 -2
- package/src/elements/ImageRun.ts +3 -3
- package/src/elements/MathElement.ts +1 -1
- package/src/elements/Paragraph.ts +221 -88
- package/src/elements/PreservedElement.ts +1 -1
- package/src/elements/PropertyChangeTypes.ts +2 -2
- package/src/elements/RangeMarker.ts +153 -12
- package/src/elements/RegisteredBodyElement.ts +52 -0
- package/src/elements/Revision.ts +14 -14
- package/src/elements/RevisionContent.ts +3 -3
- package/src/elements/RevisionManager.ts +3 -3
- package/src/elements/Run.ts +221 -94
- package/src/elements/Section.ts +136 -69
- package/src/elements/Shape.ts +4 -4
- package/src/elements/StructuredDocumentTag.ts +3 -3
- package/src/elements/Table.ts +91 -27
- package/src/elements/TableCell.ts +62 -34
- package/src/elements/TableGridChange.ts +1 -1
- package/src/elements/TableOfContents.ts +1 -1
- package/src/elements/TableOfContentsElement.ts +2 -2
- package/src/elements/TableRow.ts +192 -48
- package/src/elements/TextBox.ts +5 -5
- package/src/formatting/AbstractNumbering.ts +3 -3
- package/src/formatting/NumberingInstance.ts +2 -2
- package/src/formatting/NumberingLevel.ts +201 -10
- package/src/formatting/NumberingManager.ts +5 -5
- package/src/formatting/Style.ts +382 -86
- package/src/formatting/StylesManager.ts +4 -4
- package/src/helpers/CleanupHelper.ts +6 -6
- package/src/index.ts +118 -127
- package/src/internal.ts +79 -0
- package/src/managers/DrawingManager.ts +3 -3
- package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
- package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
- package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
- package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
- package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
- package/src/{utils → processors}/RevisionWalker.ts +42 -1
- package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
- package/src/{utils → processors}/ShadingResolver.ts +5 -5
- package/src/{utils → processors}/acceptRevisions.ts +77 -9
- package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
- package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
- package/src/tracking/DocumentTrackingContext.ts +12 -14
- package/src/tracking/TrackingContext.ts +8 -8
- package/src/types/document-types.ts +53 -0
- package/src/types/formatting.ts +4 -4
- package/src/types/settings-types.ts +32 -0
- package/src/utils/KeyedRegistry.ts +41 -0
- package/src/utils/corruptionDetection.ts +2 -2
- package/src/utils/deepEqual.ts +58 -0
- package/src/utils/list-detection.ts +2 -2
- package/src/utils/parsingHelpers.ts +11 -3
- package/src/utils/validation.ts +3 -3
- package/src/utils/xmlSanitization.ts +1 -1
- package/src/validation/RevisionAutoFixer.ts +5 -5
- package/src/validation/RevisionValidator.ts +39 -28
- package/src/validation/ValidationRuleRegistry.ts +86 -0
- package/src/validation/index.ts +3 -3
- package/src/xml/XMLBuilder.ts +13 -3
- package/src/xml/XMLParser.ts +2 -2
- package/src/zip/ZipHandler.ts +4 -4
- package/src/zip/ZipReader.ts +3 -3
- package/src/zip/ZipWriter.ts +3 -3
- package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
- package/dist/utils/ChangelogGenerator.js.map +0 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
- package/dist/utils/CompatibilityUpgrader.js.map +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
- package/dist/utils/MoveOperationHelper.js.map +0 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
- package/dist/utils/RevisionAwareProcessor.js.map +0 -1
- package/dist/utils/RevisionWalker.d.ts.map +0 -1
- package/dist/utils/RevisionWalker.js.map +0 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
- package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
- package/dist/utils/ShadingResolver.d.ts +0 -6
- package/dist/utils/ShadingResolver.d.ts.map +0 -1
- package/dist/utils/ShadingResolver.js.map +0 -1
- package/dist/utils/acceptRevisions.d.ts.map +0 -1
- package/dist/utils/acceptRevisions.js.map +0 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
- package/dist/utils/cnfStyleDecoder.js.map +0 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -3
- package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
- package/dist/utils/stripTrackedChanges.js.map +0 -1
- package/src/__tests__/helper-methods.test.ts +0 -512
- package/src/constants/CLAUDE.md +0 -28
- package/src/core/CLAUDE.md +0 -113
- package/src/elements/CLAUDE.md +0 -142
- package/src/formatting/CLAUDE.md +0 -78
- package/src/managers/CLAUDE.md +0 -47
- package/src/tracking/CLAUDE.md +0 -30
- package/src/types/CLAUDE.md +0 -39
- package/src/utils/CLAUDE.md +0 -168
- package/src/validation/CLAUDE.md +0 -40
- package/src/xml/CLAUDE.md +0 -65
- package/src/zip/CLAUDE.md +0 -55
- /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
- /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-types.js","sourceRoot":"","sources":["../../../src/types/document-types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Document-shaped types extracted out of `src/core/Document.ts` so that\n * `DocumentParser`, `DocumentGenerator`, and `DocumentValidator` can\n * import them without re-introducing a circular dependency back to the\n * Document class.\n *\n * `Document.ts` re-exports these for backward compatibility — existing\n * `import { DocumentProperties } from 'docxmlater'` continues to work.\n */\n\n/** Document properties (core and extended). */\nexport interface DocumentProperties {\n // Core Properties (docProps/core.xml)\n title?: string;\n subject?: string;\n creator?: string;\n keywords?: string;\n description?: string;\n lastModifiedBy?: string;\n revision?: number;\n created?: Date;\n modified?: Date;\n language?: string;\n category?: string;\n contentStatus?: string;\n\n // Extended Properties (docProps/app.xml)\n application?: string;\n appVersion?: string;\n company?: string;\n manager?: string;\n version?: string;\n\n // Custom Properties (docProps/custom.xml)\n customProperties?: Record<string, string | number | boolean | Date>;\n}\n\n/**\n * Document part representation. Any part inside the DOCX package\n * (XML, binary).\n */\nexport interface DocumentPart {\n /** Part name/path within the package */\n name: string;\n /** Part content (string for XML/text, Buffer for binary) */\n content: string | Buffer;\n /** MIME content type */\n contentType?: string;\n /** Whether the part is binary */\n isBinary?: boolean;\n /** Part size in bytes */\n size?: number;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../src/types/formatting.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Additional formatting types for enhanced document manipulation\n */\n\n// Forward references to avoid circular dependencies\nimport type { Paragraph } from '../elements/Paragraph.js';\nimport type { Run } from '../elements/Run.js';\n\n/**\n * Border style options\n */\nexport type BorderStyleType = 'single' | 'double' | 'dashed' | 'dotted' | 'triple' | 'none';\n\n/**\n * Individual border configuration\n */\nexport interface BorderStyle {\n /** Border style */\n style: BorderStyleType;\n /** Border width in eighths of a point */\n width: number;\n /** Border color in hex format */\n color: string;\n /** Space between border and text in points */\n space?: number;\n}\n\n/**\n * Paragraph border configuration\n */\nexport interface ParagraphBorder {\n /** Top border */\n top?: BorderStyle;\n /** Bottom border */\n bottom?: BorderStyle;\n /** Left border */\n left?: BorderStyle;\n /** Right border */\n right?: BorderStyle;\n /** Apply border between paragraphs */\n between?: boolean;\n}\n\n/**\n * Shading patterns — re-exported from CommonTypes for backward compatibility.\n * @see CommonTypes.ShadingPattern for the canonical definition\n */\nexport type { ShadingPattern } from '../elements/CommonTypes.js';\n\n/**\n * Paragraph shading configuration — re-exported from CommonTypes for backward compatibility.\n * @see CommonTypes.ShadingConfig for the canonical definition (includes theme attributes)\n */\nexport type { ShadingConfig as ParagraphShading } from '../elements/CommonTypes.js';\n\n/**\n * Tab stop alignment\n */\nexport type TabAlignment = 'left' | 'center' | 'right' | 'decimal' | 'bar' | 'clear' | 'num';\n\n/**\n * Tab leader character\n */\nexport type TabLeader = 'none' | 'dot' | 'hyphen' | 'underscore' | 'heavy' | 'middleDot';\n\n/**\n * Tab stop configuration\n */\nexport interface TabStop {\n /** Position in twips from left margin */\n position: number;\n /** Tab alignment type */\n type: TabAlignment;\n /** Leader character */\n leader?: TabLeader;\n}\n\n/**\n * Text search options\n */\nexport interface FindOptions {\n /** Case sensitive search */\n caseSensitive?: boolean;\n /** Match whole words only */\n wholeWord?: boolean;\n /** Use regular expressions */\n useRegex?: boolean;\n /** Include headers and footers */\n includeHeadersFooters?: boolean;\n /** Include footnotes and endnotes */\n includeNotes?: boolean;\n}\n\n/**\n * Text replacement options\n */\nexport interface ReplaceOptions extends FindOptions {\n /** Maximum number of replacements (0 = unlimited) */\n maxReplacements?: number;\n /** Track changes for replacements */\n trackChanges?: boolean;\n /** Author for track changes */\n author?: string;\n}\n\n/**\n * Search result\n */\nexport interface SearchResult {\n /** The paragraph containing the match */\n paragraph: Paragraph;\n /** The run containing the match */\n run?: Run;\n /** Match start position in paragraph */\n startIndex: number;\n /** Match end position in paragraph */\n endIndex: number;\n /** The matched text */\n match: string;\n}\n\n/**\n * Text emphasis options\n */\nexport type EmphasisType = 'bold' | 'italic' | 'underline';\n\n/**\n * List prefix configuration\n */\nexport interface ListPrefix {\n /** List format type */\n format: 'bullet' | 'number';\n /** Custom style string (e.g., '•', '1.', 'a)') */\n style: string;\n}\n\n/**\n * Format options for style application\n */\nexport interface FormatOptions {\n // Text formatting\n /** Font family name (e.g., 'Arial', 'Verdana') */\n font?: string;\n /** Font size in points */\n size?: number;\n /** Text color as 6-digit hex (e.g., 'FF0000' for red) */\n color?: string;\n /** Text emphasis (bold, italic, underline) */\n emphasis?: EmphasisType[];\n\n // Alignment\n /** Paragraph alignment */\n alignment?: 'left' | 'right' | 'center' | 'justify';\n\n // Spacing (in points)\n /** Space before paragraph in points */\n spaceAbove?: number;\n /** Space after paragraph in points */\n spaceBelow?: number;\n /** Line spacing in points or multiplier */\n lineSpacing?: number;\n\n // Indentation (in inches)\n /** Left indentation in inches */\n indentLeft?: number;\n /** Right indentation in inches */\n indentRight?: number;\n /** First line indentation in inches */\n indentFirst?: number;\n /** Hanging indentation in inches */\n indentHanging?: number;\n\n // Padding (in points) - for table cells\n /** Top padding in points */\n paddingTop?: number;\n /** Bottom padding in points */\n paddingBottom?: number;\n /** Left padding in points */\n paddingLeft?: number;\n /** Right padding in points */\n paddingRight?: number;\n\n // List formatting\n /** List prefix style */\n prefixList?: string | ListPrefix;\n\n // Advanced options\n /** Border color as 6-digit hex */\n borderColor?: string;\n /** Border width in points */\n borderWidth?: number;\n /** Background shading color as 6-digit hex */\n shading?: string;\n /** Keep with next paragraph */\n keepWithNext?: boolean;\n /** Keep lines together */\n keepLines?: boolean;\n}\n\n/**\n * Options for applying styles to paragraphs\n */\nexport interface StyleApplyOptions {\n /** Specific paragraphs to apply style to (default: auto-detect) */\n paragraphs?: Paragraph[];\n /** Properties to preserve from existing formatting */\n keepProperties?: string[];\n /** Custom formatting to apply */\n format?: FormatOptions;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-types.js","sourceRoot":"","sources":["../../../src/types/list-types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * List Normalization Types for docxmlater\n *\n * These types support detection and normalization of typed list prefixes\n * to proper Word list formatting.\n */\n\n/** High-level list category */\nexport type ListCategory = 'numbered' | 'bullet' | 'none';\n\n/** Specific number format patterns */\nexport type NumberFormat =\n | 'decimal' // 1. 2. 3.\n | 'lowerLetter' // a. b. c.\n | 'upperLetter' // A. B. C.\n | 'lowerRoman' // i. ii. iii.\n | 'upperRoman'; // I. II. III.\n\n/** Specific bullet format patterns */\nexport type BulletFormat =\n | 'bullet' // • ● ○\n | 'dash' // - – —\n | 'arrow'; // ► ▸\n\n/**\n * Result of detecting list type for a single paragraph\n */\nexport interface ListDetectionResult {\n /** High-level category */\n category: ListCategory;\n\n /** True if paragraph has <w:numPr> (real Word list) */\n isWordList: boolean;\n\n /** The typed prefix found, e.g., \"1. \", \"a) \", \"• \" */\n typedPrefix: string | null;\n\n /** Inferred nesting level based on indentation */\n inferredLevel: number;\n\n /** Specific format detected */\n format: NumberFormat | BulletFormat | null;\n\n /** If Word list, the numId from <w:numPr> */\n numId: number | null;\n\n /** If Word list, the ilvl from <w:numPr> */\n ilvl: number | null;\n\n /** Raw indentation in twips for debugging */\n indentationTwips: number;\n}\n\n/**\n * Analysis of all lists within a scope (cell, table, document)\n */\nexport interface ListAnalysis {\n /** All analyzed paragraphs with their detection results */\n paragraphs: {\n paragraph: unknown; // Paragraph instance - using unknown to avoid circular dep\n text: string;\n detection: ListDetectionResult;\n }[];\n\n /** True if any typed (non-Word) lists found */\n hasTypedLists: boolean;\n\n /** True if any real Word lists found */\n hasWordLists: boolean;\n\n /** True if both numbered AND bullet lists present */\n hasMixedCategories: boolean;\n\n /** The dominant list type in this scope */\n majorityCategory: ListCategory;\n\n /** Count by category */\n counts: {\n numbered: number;\n bullet: number;\n none: number;\n };\n\n /** Recommended action */\n recommendedAction: 'normalize' | 'none';\n}\n\n/**\n * User-defined indentation level configuration for list normalization\n */\nexport interface IndentationLevel {\n level: number;\n textIndent: number; // in inches\n symbolIndent: number; // in inches\n bulletChar?: string;\n numberedFormat?: NumberFormat | string;\n}\n\n/**\n * Options for list normalization\n */\nexport interface ListNormalizationOptions {\n /** numId to use for numbered lists (from numbering.xml) */\n numberedStyleNumId?: number;\n\n /** numId to use for bullet lists (from numbering.xml) */\n bulletStyleNumId?: number;\n\n /** Processing scope */\n scope?: 'cell' | 'table' | 'document';\n\n /**\n * If true, convert ALL list items to majority type.\n * If false, only convert typed lists (preserve existing Word lists).\n */\n forceMajority?: boolean;\n\n /**\n * If true, preserve original indentation instead of using level defaults.\n */\n preserveIndentation?: boolean;\n\n /**\n * User-defined indentation settings per list level.\n * Used to configure symbol indent, text indent, and bullet characters.\n */\n indentationLevels?: IndentationLevel[];\n}\n\n/**\n * Report returned after normalization\n */\nexport interface ListNormalizationReport {\n /** Number of paragraphs successfully normalized */\n normalized: number;\n\n /** Number of paragraphs skipped (already correct or non-list) */\n skipped: number;\n\n /** Any errors encountered */\n errors: string[];\n\n /** The majority category that was applied */\n appliedCategory: ListCategory;\n\n /** Detailed per-paragraph results */\n details: {\n originalText: string;\n action: 'normalized' | 'skipped' | 'error';\n reason?: string;\n }[];\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-types.js","sourceRoot":"","sources":["../../../src/types/settings-types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Shared type definitions for document settings (settings.xml)\n *\n * These types are used by both Document.ts (in-memory state) and\n * DocumentGenerator.ts (XML generation) to ensure consistency.\n */\n\n/**\n * Document protection settings per ECMA-376 CT_DocProtect\n */\nexport interface DocumentProtection {\n edit: 'readOnly' | 'comments' | 'trackedChanges' | 'forms';\n enforcement: boolean;\n /**\n * `w:formatting` per CT_DocProtect §17.15.1.29 — when true, formatting\n * changes are still allowed even when edit protection is enforced.\n * Directly relevant to the tracked-changes workflow: combined with\n * `edit: 'trackedChanges'`, this forces all content edits to be tracked\n * while still permitting formatting adjustments.\n */\n formatting?: boolean;\n cryptProviderType?: string;\n cryptAlgorithmClass?: string;\n cryptAlgorithmType?: string;\n cryptAlgorithmSid?: number;\n cryptSpinCount?: number;\n hash?: string;\n salt?: string;\n /**\n * Modern crypto attributes per ISO/IEC 29500-4 §13 (Word 2013+):\n * - `algorithmName` names the strong hash algorithm (e.g. \"SHA-512\"),\n * replacing the legacy `cryptAlgorithmSid` lookup-table reference.\n * - `hashValue` is the base64-encoded password hash.\n * - `saltValue` is the base64-encoded salt.\n *\n * These are emitted alongside / instead of the legacy `hash` / `salt`\n * / `cryptAlgorithmSid` attributes. Previously dropped on round-trip.\n */\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n}\n\n/**\n * Revision view settings per ECMA-376 CT_TrackChangesView\n */\nexport interface RevisionViewSettings {\n showInsertionsAndDeletions: boolean;\n showFormatting: boolean;\n showInkAnnotations: boolean;\n /**\n * `w:markup` per CT_TrackChangesView §17.15.1.77 — when false, all\n * revision markup is hidden in the reviewer pane (no balloons, no\n * strikethrough/inserted styling). Defaults to true when absent.\n */\n showMarkup?: boolean;\n /**\n * `w:comments` per CT_TrackChangesView §17.15.1.77 — when false,\n * comment balloons are hidden. Defaults to true when absent.\n */\n showComments?: boolean;\n}\n\n/**\n * Track changes and related settings passed to DocumentGenerator.generateSettings()\n */\nexport interface TrackChangesSettings {\n trackChangesEnabled?: boolean;\n trackFormatting?: boolean;\n revisionView?: RevisionViewSettings;\n rsidRoot?: string;\n rsids?: string[];\n documentProtection?: DocumentProtection;\n}\n\n/**\n * Information about webSettings.xml per ECMA-376 CT_WebSettings\n */\nexport interface WebSettingsInfo {\n divCount: number;\n optimizeForBrowser: boolean;\n allowPNG: boolean;\n relyOnVML: boolean;\n doNotRelyOnCSS: boolean;\n doNotSaveAsSingleFile: boolean;\n doNotOrganizeInFolder: boolean;\n doNotUseLongFileNames: boolean;\n pixelsPerInch?: number;\n targetScreenSz?: string;\n encoding?: string;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleConfig.js","sourceRoot":"","sources":["../../../src/types/styleConfig.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Configuration interfaces for customizable style formatting\n * Used by Document.applyCustomFormattingToExistingStyles()\n */\n\n/**\n * Run (character) formatting configuration for styles\n */\nexport interface StyleRunFormatting {\n /** Font family name (e.g., 'Verdana', 'Arial', 'Times New Roman') */\n font?: string;\n\n /** Font size in points (e.g., 12, 14, 18) */\n size?: number;\n\n /** Whether text should be bold */\n bold?: boolean;\n\n /** Whether text should be italic */\n italic?: boolean;\n\n /** Whether text should be underlined */\n underline?: boolean;\n\n /** Text color as hex without # (e.g., '000000', 'FF0000') */\n color?: string;\n\n /** If true, preserve existing bold formatting (don't apply bold property) */\n preserveBold?: boolean;\n\n /** If true, preserve existing italic formatting (don't apply italic property) */\n preserveItalic?: boolean;\n\n /** If true, preserve existing underline formatting (don't apply underline property) */\n preserveUnderline?: boolean;\n}\n\n/**\n * Paragraph formatting configuration for styles\n */\nexport interface StyleParagraphFormatting {\n /** Text alignment */\n alignment?: 'left' | 'center' | 'right' | 'justify';\n\n /** Spacing configuration */\n spacing?: {\n /** Spacing before paragraph in twips (20 twips = 1 point) */\n before?: number;\n\n /** Spacing after paragraph in twips (20 twips = 1 point) */\n after?: number;\n\n /** Line spacing in twips (240 = single spacing when lineRule is 'auto') */\n line?: number;\n\n /** How to interpret the line spacing value */\n lineRule?: 'auto' | 'exact' | 'atLeast';\n };\n\n /** Indentation configuration */\n indentation?: {\n /** Left indent in twips (1440 twips = 1 inch) */\n left?: number;\n\n /** Right indent in twips */\n right?: number;\n\n /** First line indent in twips (positive = indent, negative = outdent) */\n firstLine?: number;\n\n /** Hanging indent in twips (typically used for lists) */\n hanging?: number;\n };\n\n /**\n * Whether to remove spacing between consecutive paragraphs of the same style\n * Per ECMA-376 Part 1 §17.3.1.8\n */\n contextualSpacing?: boolean;\n}\n\n/**\n * Table appearance options for Heading2 wrapping\n * Heading2 paragraphs are always wrapped in 1x1 tables with these settings\n */\nexport interface Heading2TableOptions {\n /** Cell background color as hex without # (e.g., 'BFBFBF' for gray) */\n shading?: string;\n\n /** Top cell margin in twips */\n marginTop?: number;\n\n /** Bottom cell margin in twips */\n marginBottom?: number;\n\n /** Left cell margin in twips (115 twips = 0.08 inches) */\n marginLeft?: number;\n\n /** Right cell margin in twips (115 twips = 0.08 inches) */\n marginRight?: number;\n\n /** Table width as percentage (5000 = 100%) */\n tableWidthPercent?: number;\n}\n\n/**\n * Base style configuration combining run and paragraph formatting\n */\nexport interface StyleConfig {\n /** Character formatting for the style */\n run?: StyleRunFormatting;\n\n /** Paragraph formatting for the style */\n paragraph?: StyleParagraphFormatting;\n}\n\n/**\n * Extended configuration for Heading2 style including table options\n * Heading2 paragraphs are always wrapped in tables\n */\nexport interface Heading2Config extends StyleConfig {\n /** Table appearance options for wrapping Heading2 paragraphs */\n tableOptions?: Heading2TableOptions;\n}\n\n/**\n * Extended configuration for Normal style with alignment preservation options\n */\nexport interface NormalConfig extends StyleConfig {\n /**\n * Whether to preserve center alignment during style application.\n * When true, paragraphs that are center-aligned will retain their center alignment\n * instead of being changed to the Normal style's alignment (typically 'left').\n * This is useful for preserving intentional centering like image captions or table headers.\n * @default false\n */\n preserveCenterAlignment?: boolean;\n}\n\n/**\n * Complete configuration for applyStyles()\n * All properties are optional - defaults will be used if not provided\n */\nexport interface ApplyStylesOptions {\n /** Heading1 style configuration */\n heading1?: StyleConfig;\n\n /** Heading2 style configuration with table options */\n heading2?: Heading2Config;\n\n /** Heading3 style configuration */\n heading3?: StyleConfig;\n\n /** Normal style configuration with alignment preservation options */\n normal?: NormalConfig;\n\n /** List Paragraph style configuration */\n listParagraph?: StyleConfig;\n\n /**\n * Whether to preserve blank lines added after 1x1 Heading 2 tables.\n * When true, blank paragraphs added after Heading 2 tables are marked as preserved\n * to prevent accidental removal by document processing operations (e.g., removing extra blank lines).\n * @default true\n */\n preserveBlankLinesAfterHeading2Tables?: boolean;\n\n /**\n * Whether to preserve white font (FFFFFF) color during style application.\n * When true, runs with white color will not have their color changed.\n * This is useful for preserving hidden text like ID tags or overlay text.\n * @default false\n */\n preserveWhiteFont?: boolean;\n\n /**\n * Whether to apply Normal style changes to NormalWeb (Normal (Web)) style as well.\n * When true (default), if NormalWeb style exists in the document,\n * it will receive the same formatting changes applied to Normal.\n * This ensures consistency between Normal and Normal (Web) styles.\n * @default true\n */\n linkNormalWebToNormal?: boolean;\n}\n\n/**\n * @deprecated Use {@link ApplyStylesOptions} instead (renamed in v4.0.0)\n */\nexport type ApplyCustomFormattingOptions = ApplyStylesOptions;\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class KeyedRegistry {
|
|
2
|
+
label;
|
|
3
|
+
entries = new Map();
|
|
4
|
+
constructor(label) {
|
|
5
|
+
this.label = label;
|
|
6
|
+
}
|
|
7
|
+
register(key, value) {
|
|
8
|
+
if (this.entries.has(key)) {
|
|
9
|
+
throw new Error(`${this.label}: "${key}" is already registered`);
|
|
10
|
+
}
|
|
11
|
+
this.entries.set(key, value);
|
|
12
|
+
}
|
|
13
|
+
unregister(key) {
|
|
14
|
+
return this.entries.delete(key);
|
|
15
|
+
}
|
|
16
|
+
has(key) {
|
|
17
|
+
return this.entries.has(key);
|
|
18
|
+
}
|
|
19
|
+
get(key) {
|
|
20
|
+
return this.entries.get(key);
|
|
21
|
+
}
|
|
22
|
+
keys() {
|
|
23
|
+
return [...this.entries.keys()];
|
|
24
|
+
}
|
|
25
|
+
values() {
|
|
26
|
+
return [...this.entries.values()];
|
|
27
|
+
}
|
|
28
|
+
clear() {
|
|
29
|
+
this.entries.clear();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=KeyedRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyedRegistry.js","sourceRoot":"","sources":["../../../src/utils/KeyedRegistry.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,aAAa;IAGK;IAFZ,OAAO,GAAG,IAAI,GAAG,EAAa,CAAC;IAEhD,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAE9C,QAAQ,CAAC,GAAW,EAAE,KAAQ;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,GAAG,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF","sourcesContent":["/**\n * Map-backed keyed registry shared by ElementRegistry and ValidationRuleRegistry.\n * Throws on duplicate `register()` so callers cannot silently overwrite a\n * pre-existing entry.\n */\nexport class KeyedRegistry<V> {\n private readonly entries = new Map<string, V>();\n\n constructor(private readonly label: string) {}\n\n register(key: string, value: V): void {\n if (this.entries.has(key)) {\n throw new Error(`${this.label}: \"${key}\" is already registered`);\n }\n this.entries.set(key, value);\n }\n\n unregister(key: string): boolean {\n return this.entries.delete(key);\n }\n\n has(key: string): boolean {\n return this.entries.has(key);\n }\n\n get(key: string): V | undefined {\n return this.entries.get(key);\n }\n\n keys(): string[] {\n return [...this.entries.keys()];\n }\n\n values(): V[] {\n return [...this.entries.values()];\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Paragraph } from '../elements/Paragraph.js';
|
|
2
|
+
import { Run } from '../elements/Run.js';
|
|
3
|
+
export function detectCorruptionInDocument(doc) {
|
|
4
|
+
const locations = [];
|
|
5
|
+
const stats = {
|
|
6
|
+
escapedXml: 0,
|
|
7
|
+
xmlTags: 0,
|
|
8
|
+
entities: 0,
|
|
9
|
+
mixed: 0,
|
|
10
|
+
};
|
|
11
|
+
const paragraphs = doc.getAllParagraphs ? doc.getAllParagraphs() : [];
|
|
12
|
+
for (let pIdx = 0; pIdx < paragraphs.length; pIdx++) {
|
|
13
|
+
const paragraph = paragraphs[pIdx];
|
|
14
|
+
if (!paragraph || !(paragraph instanceof Paragraph)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const runs = paragraph.getRuns();
|
|
18
|
+
for (let rIdx = 0; rIdx < runs.length; rIdx++) {
|
|
19
|
+
const run = runs[rIdx];
|
|
20
|
+
if (!run || !(run instanceof Run)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const text = run.getText();
|
|
24
|
+
if (!text || text.length === 0) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const corruption = detectCorruptionInText(text);
|
|
28
|
+
if (corruption.isCorrupted) {
|
|
29
|
+
locations.push({
|
|
30
|
+
paragraphIndex: pIdx,
|
|
31
|
+
runIndex: rIdx,
|
|
32
|
+
text: text,
|
|
33
|
+
corruptionType: corruption.type,
|
|
34
|
+
suggestedFix: corruption.suggestedFix,
|
|
35
|
+
length: text.length,
|
|
36
|
+
});
|
|
37
|
+
if (corruption.type === 'escaped-xml')
|
|
38
|
+
stats.escapedXml++;
|
|
39
|
+
else if (corruption.type === 'xml-tags')
|
|
40
|
+
stats.xmlTags++;
|
|
41
|
+
else if (corruption.type === 'entities')
|
|
42
|
+
stats.entities++;
|
|
43
|
+
else if (corruption.type === 'mixed')
|
|
44
|
+
stats.mixed++;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const summary = generateSummary(locations, stats);
|
|
49
|
+
return {
|
|
50
|
+
isCorrupted: locations.length > 0,
|
|
51
|
+
totalLocations: locations.length,
|
|
52
|
+
locations,
|
|
53
|
+
summary,
|
|
54
|
+
statistics: stats,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function detectCorruptionInText(text) {
|
|
58
|
+
if (!text || typeof text !== 'string') {
|
|
59
|
+
return { isCorrupted: false, type: 'mixed', suggestedFix: String(text || '') };
|
|
60
|
+
}
|
|
61
|
+
let hasEscapedXml = false;
|
|
62
|
+
let hasXmlTags = false;
|
|
63
|
+
let hasEntities = false;
|
|
64
|
+
const escapedXmlPattern = /<\/?w:[a-z]+[^&]*>/i;
|
|
65
|
+
if (escapedXmlPattern.test(text)) {
|
|
66
|
+
hasEscapedXml = true;
|
|
67
|
+
}
|
|
68
|
+
const xmlTagPattern = /<\/?w:[a-z]+[^>]*>/i;
|
|
69
|
+
if (xmlTagPattern.test(text)) {
|
|
70
|
+
hasXmlTags = true;
|
|
71
|
+
}
|
|
72
|
+
const wordXmlAttributePattern = /(<(?:w|a|r|pic|wp|m|mc|wpc|wps|wpg|c|dgm|o|v):|xml:space="preserve")/i;
|
|
73
|
+
if (wordXmlAttributePattern.test(text)) {
|
|
74
|
+
hasEntities = true;
|
|
75
|
+
}
|
|
76
|
+
const corruptionCount = [hasEscapedXml, hasXmlTags, hasEntities].filter(Boolean).length;
|
|
77
|
+
if (corruptionCount === 0) {
|
|
78
|
+
return { isCorrupted: false, type: 'mixed', suggestedFix: text };
|
|
79
|
+
}
|
|
80
|
+
let type;
|
|
81
|
+
if (hasEscapedXml && (hasEntities || hasXmlTags)) {
|
|
82
|
+
type = 'escaped-xml';
|
|
83
|
+
}
|
|
84
|
+
else if (hasXmlTags && hasEntities) {
|
|
85
|
+
type = 'xml-tags';
|
|
86
|
+
}
|
|
87
|
+
else if (corruptionCount > 1) {
|
|
88
|
+
type = 'mixed';
|
|
89
|
+
}
|
|
90
|
+
else if (hasEscapedXml) {
|
|
91
|
+
type = 'escaped-xml';
|
|
92
|
+
}
|
|
93
|
+
else if (hasXmlTags) {
|
|
94
|
+
type = 'xml-tags';
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
type = 'entities';
|
|
98
|
+
}
|
|
99
|
+
const suggestedFix = suggestFix(text);
|
|
100
|
+
return { isCorrupted: true, type, suggestedFix };
|
|
101
|
+
}
|
|
102
|
+
export function suggestFix(corruptedText) {
|
|
103
|
+
if (!corruptedText || typeof corruptedText !== 'string') {
|
|
104
|
+
return corruptedText;
|
|
105
|
+
}
|
|
106
|
+
let cleaned = corruptedText;
|
|
107
|
+
cleaned = cleaned
|
|
108
|
+
.replace(/</g, '<')
|
|
109
|
+
.replace(/>/g, '>')
|
|
110
|
+
.replace(/"/g, '"')
|
|
111
|
+
.replace(/'/g, "'")
|
|
112
|
+
.replace(/&/g, '&');
|
|
113
|
+
cleaned = cleaned.replace(/<w:[^>]+>/g, '');
|
|
114
|
+
cleaned = cleaned.replace(/<\/w:[^>]+>/g, '');
|
|
115
|
+
cleaned = cleaned.replace(/<[^>]+>/g, '');
|
|
116
|
+
cleaned = cleaned.replace(/\s+/g, ' ').trim();
|
|
117
|
+
return cleaned;
|
|
118
|
+
}
|
|
119
|
+
function generateSummary(locations, stats) {
|
|
120
|
+
if (locations.length === 0) {
|
|
121
|
+
return 'No corruption detected. Document is clean.';
|
|
122
|
+
}
|
|
123
|
+
const lines = [];
|
|
124
|
+
lines.push(`Found ${locations.length} corrupted text location(s) in the document.`);
|
|
125
|
+
lines.push('');
|
|
126
|
+
lines.push('Corruption breakdown:');
|
|
127
|
+
if (stats.escapedXml > 0) {
|
|
128
|
+
lines.push(` - Escaped XML: ${stats.escapedXml} location(s)`);
|
|
129
|
+
}
|
|
130
|
+
if (stats.xmlTags > 0) {
|
|
131
|
+
lines.push(` - XML Tags: ${stats.xmlTags} location(s)`);
|
|
132
|
+
}
|
|
133
|
+
if (stats.entities > 0) {
|
|
134
|
+
lines.push(` - XML Entities: ${stats.entities} location(s)`);
|
|
135
|
+
}
|
|
136
|
+
if (stats.mixed > 0) {
|
|
137
|
+
lines.push(` - Mixed: ${stats.mixed} location(s)`);
|
|
138
|
+
}
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push('This corruption typically occurs when XML strings are passed to text methods.');
|
|
141
|
+
lines.push('Instead of: paragraph.addText("Text<w:t>1</w:t>")');
|
|
142
|
+
lines.push('Use: paragraph.addText("Text"); paragraph.addText("1");');
|
|
143
|
+
lines.push('');
|
|
144
|
+
lines.push('To automatically clean text, use: new Run(text, { cleanXmlFromText: true })');
|
|
145
|
+
return lines.join('\n');
|
|
146
|
+
}
|
|
147
|
+
export function looksCorrupted(text) {
|
|
148
|
+
if (!text || typeof text !== 'string') {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return (/<\/?(w|r|p):[a-z]+/i.test(text) ||
|
|
152
|
+
/<\/?(w|r|p):[a-z]+/i.test(text) ||
|
|
153
|
+
/xml:space="/i.test(text));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=corruptionDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corruptionDetection.js","sourceRoot":"","sources":["../../../src/utils/corruptionDetection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Corruption Detection - Utilities to detect and diagnose XML corruption in documents\n *\n * This module helps users identify when they've accidentally passed XML-like strings\n * to text methods instead of using the proper API. This is a common mistake that\n * results in escaped XML tags being displayed as literal text in Word.\n */\n\nimport { Paragraph } from '../elements/Paragraph.js';\nimport { Run } from '../elements/Run.js';\n\n/** Minimal interface for document corruption scanning (avoids circular import) */\ninterface DocumentLike {\n getAllParagraphs?(): Paragraph[];\n}\n\n/**\n * Types of corruption that can be detected\n */\nexport type CorruptionType =\n | 'escaped-xml' // <w:t> style escaping\n | 'xml-tags' // <w:t> tags in text\n | 'entities' // " ' etc.\n | 'mixed'; // Multiple types\n\n/**\n * Location of corruption within a document\n */\nexport interface CorruptionLocation {\n /** Index of the paragraph containing corruption */\n paragraphIndex: number;\n /** Index of the run within the paragraph */\n runIndex: number;\n /** The corrupted text content */\n text: string;\n /** Type of corruption detected */\n corruptionType: CorruptionType;\n /** Suggested fix for the corruption */\n suggestedFix: string;\n /** Length of corrupted text */\n length: number;\n}\n\n/**\n * Comprehensive corruption report for a document\n */\nexport interface CorruptionReport {\n /** Whether any corruption was found */\n isCorrupted: boolean;\n /** Total number of corrupted locations */\n totalLocations: number;\n /** Detailed list of corruption locations */\n locations: CorruptionLocation[];\n /** Human-readable summary */\n summary: string;\n /** Statistics about corruption types */\n statistics: {\n escapedXml: number;\n xmlTags: number;\n entities: number;\n mixed: number;\n };\n}\n\n/**\n * Detects XML corruption in a document\n *\n * Scans all paragraphs and runs to find text that contains escaped XML\n * or XML-like patterns that suggest the user passed XML strings to text methods.\n *\n * @param doc - The document to scan\n * @returns Corruption report with locations and suggested fixes\n *\n * @example\n * ```typescript\n * const doc = await Document.load('corrupted.docx');\n * const report = detectCorruptionInDocument(doc);\n *\n * if (report.isCorrupted) {\n * console.log(report.summary);\n * report.locations.forEach(loc => {\n * console.log(`Paragraph ${loc.paragraphIndex}, Run ${loc.runIndex}: ${loc.suggestedFix}`);\n * });\n * }\n * ```\n */\nexport function detectCorruptionInDocument(doc: DocumentLike): CorruptionReport {\n const locations: CorruptionLocation[] = [];\n const stats = {\n escapedXml: 0,\n xmlTags: 0,\n entities: 0,\n mixed: 0,\n };\n\n // Get all paragraphs from the document\n const paragraphs = doc.getAllParagraphs ? doc.getAllParagraphs() : [];\n\n // Scan each paragraph\n for (let pIdx = 0; pIdx < paragraphs.length; pIdx++) {\n const paragraph = paragraphs[pIdx];\n if (!paragraph || !(paragraph instanceof Paragraph)) {\n continue;\n }\n\n // Get runs from paragraph\n const runs = paragraph.getRuns();\n\n // Scan each run\n for (let rIdx = 0; rIdx < runs.length; rIdx++) {\n const run = runs[rIdx];\n if (!run || !(run instanceof Run)) {\n continue;\n }\n\n const text = run.getText();\n if (!text || text.length === 0) {\n continue;\n }\n\n // Check for corruption in this text\n const corruption = detectCorruptionInText(text);\n\n if (corruption.isCorrupted) {\n locations.push({\n paragraphIndex: pIdx,\n runIndex: rIdx,\n text: text,\n corruptionType: corruption.type,\n suggestedFix: corruption.suggestedFix,\n length: text.length,\n });\n\n // Update statistics\n if (corruption.type === 'escaped-xml') stats.escapedXml++;\n else if (corruption.type === 'xml-tags') stats.xmlTags++;\n else if (corruption.type === 'entities') stats.entities++;\n else if (corruption.type === 'mixed') stats.mixed++;\n }\n }\n }\n\n // Generate summary\n const summary = generateSummary(locations, stats);\n\n return {\n isCorrupted: locations.length > 0,\n totalLocations: locations.length,\n locations,\n summary,\n statistics: stats,\n };\n}\n\n/**\n * Internal result from text corruption detection\n */\ninterface TextCorruptionResult {\n isCorrupted: boolean;\n type: CorruptionType;\n suggestedFix: string;\n}\n\n/**\n * Detects XML corruption in a single text string\n *\n * Checks for common patterns that indicate the user passed XML strings\n * instead of plain text.\n *\n * @param text - Text to check\n * @returns True if corruption detected\n *\n * @example\n * ```typescript\n * const corrupted = detectCorruptionInText('Hello <w:t>World');\n * // Returns: true\n *\n * const clean = detectCorruptionInText('Hello World');\n * // Returns: false\n * ```\n */\nexport function detectCorruptionInText(text: string): TextCorruptionResult {\n if (!text || typeof text !== 'string') {\n return { isCorrupted: false, type: 'mixed', suggestedFix: String(text || '') };\n }\n\n let hasEscapedXml = false;\n let hasXmlTags = false;\n let hasEntities = false;\n\n // Pattern 1: Escaped XML tags (most common corruption)\n // Matches: <w:t>, </w:t>, <w:r>, etc.\n const escapedXmlPattern = /<\\/?w:[a-z]+[^&]*>/i;\n if (escapedXmlPattern.test(text)) {\n hasEscapedXml = true;\n }\n\n // Pattern 2: Raw XML tags (less common, but possible)\n // Matches: <w:t>, </w:t>, <w:r>, etc.\n const xmlTagPattern = /<\\/?w:[a-z]+[^>]*>/i;\n if (xmlTagPattern.test(text)) {\n hasXmlTags = true;\n }\n\n // Pattern 3: Escaped entities combined with Word XML attributes\n // ONLY flag if we see Word-specific patterns, not just any entities\n // This avoids false positives from legitimate escaped characters\n // Matches all OOXML namespaces: w: (word), a: (drawingML), pic: (picture), r: (relationships), wp: (word drawing)\n const wordXmlAttributePattern =\n /(<(?:w|a|r|pic|wp|m|mc|wpc|wps|wpg|c|dgm|o|v):|xml:space="preserve")/i;\n if (wordXmlAttributePattern.test(text)) {\n hasEntities = true;\n }\n\n // Determine corruption type\n const corruptionCount = [hasEscapedXml, hasXmlTags, hasEntities].filter(Boolean).length;\n\n if (corruptionCount === 0) {\n return { isCorrupted: false, type: 'mixed', suggestedFix: text };\n }\n\n // More precise type detection - check primary indicator first\n let type: CorruptionType;\n if (hasEscapedXml && (hasEntities || hasXmlTags)) {\n // Escaped XML combined with other patterns - this is the classic corruption case\n type = 'escaped-xml';\n } else if (hasXmlTags && hasEntities) {\n type = 'xml-tags';\n } else if (corruptionCount > 1) {\n type = 'mixed';\n } else if (hasEscapedXml) {\n type = 'escaped-xml';\n } else if (hasXmlTags) {\n type = 'xml-tags';\n } else {\n type = 'entities';\n }\n\n const suggestedFix = suggestFix(text);\n\n return { isCorrupted: true, type, suggestedFix };\n}\n\n/**\n * Suggests a fix for corrupted text\n *\n * Attempts to clean XML patterns from text to restore the intended content.\n * Uses the same cleaning logic as cleanXmlFromText() from validation.ts.\n *\n * @param corruptedText - Text containing XML corruption\n * @returns Cleaned text with XML patterns removed\n *\n * @example\n * ```typescript\n * const fixed = suggestFix('Hello <w:t>World</w:t>');\n * // Returns: 'Hello World'\n * ```\n */\nexport function suggestFix(corruptedText: string): string {\n if (!corruptedText || typeof corruptedText !== 'string') {\n return corruptedText;\n }\n\n let cleaned = corruptedText;\n\n // Step 1: Unescape XML entities first\n cleaned = cleaned\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, '&');\n\n // Step 2: Remove Word XML tags\n // Matches: <w:t xml:space=\"preserve\">, </w:t>, <w:r>, etc.\n cleaned = cleaned.replace(/<w:[^>]+>/g, '');\n cleaned = cleaned.replace(/<\\/w:[^>]+>/g, '');\n\n // Step 3: Remove any remaining XML-like tags\n cleaned = cleaned.replace(/<[^>]+>/g, '');\n\n // Step 4: Clean up whitespace\n cleaned = cleaned.replace(/\\s+/g, ' ').trim();\n\n return cleaned;\n}\n\n/**\n * Generates a human-readable summary of corruption\n */\nfunction generateSummary(\n locations: CorruptionLocation[],\n stats: { escapedXml: number; xmlTags: number; entities: number; mixed: number }\n): string {\n if (locations.length === 0) {\n return 'No corruption detected. Document is clean.';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${locations.length} corrupted text location(s) in the document.`);\n lines.push('');\n lines.push('Corruption breakdown:');\n\n if (stats.escapedXml > 0) {\n lines.push(` - Escaped XML: ${stats.escapedXml} location(s)`);\n }\n if (stats.xmlTags > 0) {\n lines.push(` - XML Tags: ${stats.xmlTags} location(s)`);\n }\n if (stats.entities > 0) {\n lines.push(` - XML Entities: ${stats.entities} location(s)`);\n }\n if (stats.mixed > 0) {\n lines.push(` - Mixed: ${stats.mixed} location(s)`);\n }\n\n lines.push('');\n lines.push('This corruption typically occurs when XML strings are passed to text methods.');\n lines.push('Instead of: paragraph.addText(\"Text<w:t>1</w:t>\")');\n lines.push('Use: paragraph.addText(\"Text\"); paragraph.addText(\"1\");');\n lines.push('');\n lines.push('To automatically clean text, use: new Run(text, { cleanXmlFromText: true })');\n\n return lines.join('\\n');\n}\n\n/**\n * Checks if text looks like it might be corrupted (less strict check)\n *\n * This is a quick check that can be used for warnings without full analysis.\n *\n * @param text - Text to check\n * @returns True if text might be corrupted\n */\nexport function looksCorrupted(text: string): boolean {\n if (!text || typeof text !== 'string') {\n return false;\n }\n\n // Quick regex checks for common corruption patterns\n return (\n /<\\/?(w|r|p):[a-z]+/i.test(text) ||\n /<\\/?(w|r|p):[a-z]+/i.test(text) ||\n /xml:space="/i.test(text)\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateFormatting.js","sourceRoot":"","sources":["../../../src/utils/dateFormatting.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC","sourcesContent":["/**\n * Date formatting utilities for OOXML XML generation\n *\n * ECMA-376 requires dates in ISO 8601 format WITHOUT milliseconds:\n * Valid: \"2024-01-01T12:00:00Z\"\n * Invalid: \"2024-01-01T12:00:00.000Z\" (Word rejects milliseconds in w:date attributes)\n *\n * JavaScript's Date.toISOString() always includes milliseconds (YYYY-MM-DDTHH:mm:ss.sssZ),\n * so we must strip the .sss portion for all w:date attributes in tracked changes.\n */\n\n/**\n * Formats a Date to ISO 8601 without milliseconds for OOXML w:date attributes.\n *\n * @param date - Date to format\n * @returns ISO 8601 date string without milliseconds (e.g., \"2024-01-01T12:00:00Z\")\n */\nexport function formatDateForXml(date: Date): string {\n return date.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function deepClone(obj) {
|
|
2
|
+
if (obj === null || typeof obj !== 'object') {
|
|
3
|
+
return obj;
|
|
4
|
+
}
|
|
5
|
+
if (obj instanceof Date) {
|
|
6
|
+
return new Date(obj.getTime());
|
|
7
|
+
}
|
|
8
|
+
if (Array.isArray(obj)) {
|
|
9
|
+
const arrCopy = [];
|
|
10
|
+
for (let i = 0; i < obj.length; i++) {
|
|
11
|
+
arrCopy[i] = deepClone(obj[i]);
|
|
12
|
+
}
|
|
13
|
+
return arrCopy;
|
|
14
|
+
}
|
|
15
|
+
if (obj instanceof Map) {
|
|
16
|
+
const mapCopy = new Map();
|
|
17
|
+
obj.forEach((value, key) => {
|
|
18
|
+
mapCopy.set(deepClone(key), deepClone(value));
|
|
19
|
+
});
|
|
20
|
+
return mapCopy;
|
|
21
|
+
}
|
|
22
|
+
if (obj instanceof Set) {
|
|
23
|
+
const setCopy = new Set();
|
|
24
|
+
obj.forEach((value) => {
|
|
25
|
+
setCopy.add(deepClone(value));
|
|
26
|
+
});
|
|
27
|
+
return setCopy;
|
|
28
|
+
}
|
|
29
|
+
if (obj instanceof RegExp) {
|
|
30
|
+
return new RegExp(obj.source, obj.flags);
|
|
31
|
+
}
|
|
32
|
+
const objCopy = Object.create(Object.getPrototypeOf(obj));
|
|
33
|
+
for (const key in obj) {
|
|
34
|
+
if (obj.hasOwnProperty(key)) {
|
|
35
|
+
objCopy[key] = deepClone(obj[key]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return objCopy;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=deepClone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepClone.js","sourceRoot":"","sources":["../../../src/utils/deepClone.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,SAAS,CAAI,GAAM;IAEjC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAGD,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAM,CAAC;IACtC,CAAC;IAGD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,OAAY,CAAC;IACtB,CAAC;IAGD,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,OAAO,OAAY,CAAC;IACtB,CAAC;IAGD,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO,OAAY,CAAC;IACtB,CAAC;IAGD,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;QAC1B,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAM,CAAC;IAChD,CAAC;IAGD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAA4B,CAAC;IACrF,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,OAAY,CAAC;AACtB,CAAC","sourcesContent":["/**\n * Deep clone utility for safely cloning objects\n * More efficient and type-safe than JSON.parse(JSON.stringify())\n */\n\n/**\n * Deep clone an object using structured cloning\n * Preserves most object types including Date, RegExp, Map, Set, etc.\n *\n * For simple objects (like formatting options), this is more efficient\n * than JSON.parse(JSON.stringify()) and doesn't lose non-serializable values.\n *\n * @param obj - Object to clone\n * @returns Deep cloned copy of the object\n *\n * @example\n * ```typescript\n * const original = { bold: true, color: \"FF0000\", date: new Date() };\n * const cloned = deepClone(original);\n * cloned.bold = false;\n * console.log(original.bold); // true (unchanged)\n * console.log(cloned.date instanceof Date); // true (preserved)\n * ```\n */\nexport function deepClone<T>(obj: T): T {\n // Handle primitive types and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle Date\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n\n // Handle Array\n if (Array.isArray(obj)) {\n const arrCopy: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n arrCopy[i] = deepClone(obj[i]);\n }\n return arrCopy as T;\n }\n\n // Handle Map\n if (obj instanceof Map) {\n const mapCopy = new Map();\n obj.forEach((value, key) => {\n mapCopy.set(deepClone(key), deepClone(value));\n });\n return mapCopy as T;\n }\n\n // Handle Set\n if (obj instanceof Set) {\n const setCopy = new Set();\n obj.forEach((value) => {\n setCopy.add(deepClone(value));\n });\n return setCopy as T;\n }\n\n // Handle RegExp\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags) as T;\n }\n\n // Handle plain objects\n const objCopy = Object.create(Object.getPrototypeOf(obj)) as Record<string, unknown>;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n objCopy[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n\n return objCopy as T;\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function deepEqual(a, b) {
|
|
2
|
+
if (a === b)
|
|
3
|
+
return true;
|
|
4
|
+
if (typeof a === 'number' && typeof b === 'number' && Number.isNaN(a) && Number.isNaN(b)) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
if (a == null || b == null)
|
|
8
|
+
return a === b;
|
|
9
|
+
const typeA = typeof a;
|
|
10
|
+
const typeB = typeof b;
|
|
11
|
+
if (typeA !== typeB)
|
|
12
|
+
return false;
|
|
13
|
+
if (typeA !== 'object')
|
|
14
|
+
return false;
|
|
15
|
+
if (a instanceof Date || b instanceof Date) {
|
|
16
|
+
return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();
|
|
17
|
+
}
|
|
18
|
+
const aIsArr = Array.isArray(a);
|
|
19
|
+
const bIsArr = Array.isArray(b);
|
|
20
|
+
if (aIsArr !== bIsArr)
|
|
21
|
+
return false;
|
|
22
|
+
if (aIsArr && bIsArr) {
|
|
23
|
+
const arrA = a;
|
|
24
|
+
const arrB = b;
|
|
25
|
+
if (arrA.length !== arrB.length)
|
|
26
|
+
return false;
|
|
27
|
+
for (let i = 0; i < arrA.length; i++) {
|
|
28
|
+
if (!deepEqual(arrA[i], arrB[i]))
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
const objA = a;
|
|
34
|
+
const objB = b;
|
|
35
|
+
const keysA = Object.keys(objA);
|
|
36
|
+
const keysB = Object.keys(objB);
|
|
37
|
+
if (keysA.length !== keysB.length)
|
|
38
|
+
return false;
|
|
39
|
+
for (const k of keysA) {
|
|
40
|
+
if (!Object.prototype.hasOwnProperty.call(objB, k))
|
|
41
|
+
return false;
|
|
42
|
+
if (!deepEqual(objA[k], objB[k]))
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=deepEqual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepEqual.js","sourceRoot":"","sources":["../../../src/utils/deepEqual.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,SAAS,CAAC,CAAU,EAAE,CAAU;IAC9C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAIzB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC;IACvB,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAGrC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC3C,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/E,CAAC;IAGD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,MAAM,IAAI,GAAG,CAA4B,CAAC;IAC1C,MAAM,IAAI,GAAG,CAA4B,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * Structural equality check for OOXML formatting objects.\n *\n * Replaces `JSON.stringify(a) === JSON.stringify(b)` in hot equality paths\n * (paragraph property merging, tracking-context consolidation). Avoids\n * allocating two large strings per comparison and short-circuits on the\n * first inequality.\n *\n * Handles the value shapes seen in formatting objects: primitives, plain\n * objects, arrays, Date, null/undefined. Symbols and class instances are\n * not part of the formatting model and are compared by reference.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // NaN === NaN is false in JS; treat structurally as equal so a parse\n // failure that produced two NaNs in equivalent slots doesn't dirty the\n // tracking-context consolidation pass.\n if (typeof a === 'number' && typeof b === 'number' && Number.isNaN(a) && Number.isNaN(b)) {\n return true;\n }\n if (a == null || b == null) return a === b;\n\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB) return false;\n if (typeA !== 'object') return false;\n\n // Date values\n if (a instanceof Date || b instanceof Date) {\n return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n }\n\n // Arrays: same length, element-wise equality.\n const aIsArr = Array.isArray(a);\n const bIsArr = Array.isArray(b);\n if (aIsArr !== bIsArr) return false;\n if (aIsArr && bIsArr) {\n const arrA = a;\n const arrB = b;\n if (arrA.length !== arrB.length) return false;\n for (let i = 0; i < arrA.length; i++) {\n if (!deepEqual(arrA[i], arrB[i])) return false;\n }\n return true;\n }\n\n // Plain objects: same key set, deep-equal values.\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (!Object.prototype.hasOwnProperty.call(objB, k)) return false;\n if (!deepEqual(objA[k], objB[k])) return false;\n }\n return true;\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const defaultConfig = {
|
|
2
|
+
enabled: false,
|
|
3
|
+
logParsing: false,
|
|
4
|
+
logSerialization: false,
|
|
5
|
+
logTextDirection: false,
|
|
6
|
+
verbose: false,
|
|
7
|
+
};
|
|
8
|
+
let config = { ...defaultConfig };
|
|
9
|
+
export function enableDiagnostics(options = {}) {
|
|
10
|
+
config = {
|
|
11
|
+
...defaultConfig,
|
|
12
|
+
enabled: true,
|
|
13
|
+
...options,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function disableDiagnostics() {
|
|
17
|
+
config = { ...defaultConfig };
|
|
18
|
+
}
|
|
19
|
+
export function getDiagnosticConfig() {
|
|
20
|
+
return { ...config };
|
|
21
|
+
}
|
|
22
|
+
export function logParsing(message, data) {
|
|
23
|
+
if (config.enabled && config.logParsing) {
|
|
24
|
+
console.log(`[PARSE] ${message}`, data !== undefined ? data : '');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function logSerialization(message, data) {
|
|
28
|
+
if (config.enabled && config.logSerialization) {
|
|
29
|
+
console.log(`[SERIALIZE] ${message}`, data !== undefined ? data : '');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function logTextDirection(message, data) {
|
|
33
|
+
if (config.enabled && config.logTextDirection) {
|
|
34
|
+
console.log(`[TEXT-DIR] ${message}`, data !== undefined ? data : '');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function logVerbose(message, data) {
|
|
38
|
+
if (config.enabled && config.verbose) {
|
|
39
|
+
console.log(`[VERBOSE] ${message}`, data !== undefined ? data : '');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function logParagraphContent(source, paraIndex, runs, bidi) {
|
|
43
|
+
if (!config.enabled)
|
|
44
|
+
return;
|
|
45
|
+
const logger = source === 'parsing' ? logParsing : logSerialization;
|
|
46
|
+
logger(`Paragraph ${paraIndex}:`);
|
|
47
|
+
logger(` BiDi: ${bidi !== undefined ? bidi : 'not set'}`);
|
|
48
|
+
logger(` Runs (${runs.length}):`);
|
|
49
|
+
runs.forEach((run, idx) => {
|
|
50
|
+
const rtlStatus = run.rtl ? ' [RTL]' : '';
|
|
51
|
+
logger(` ${idx + 1}. "${run.text}"${rtlStatus}`);
|
|
52
|
+
});
|
|
53
|
+
const fullText = runs.map((r) => r.text).join('');
|
|
54
|
+
logger(` Combined text: "${fullText}"`);
|
|
55
|
+
}
|
|
56
|
+
export function logTextComparison(label, before, after) {
|
|
57
|
+
if (!config.enabled)
|
|
58
|
+
return;
|
|
59
|
+
if (before !== after) {
|
|
60
|
+
console.log(`[TEXT-CHANGE] ${label}:`);
|
|
61
|
+
console.log(` Before: "${before}"`);
|
|
62
|
+
console.log(` After: "${after}"`);
|
|
63
|
+
console.log(` MISMATCH DETECTED!`);
|
|
64
|
+
}
|
|
65
|
+
else if (config.verbose) {
|
|
66
|
+
logVerbose(`${label}: Text preserved correctly`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/utils/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Diagnostic logging utilities for debugging document processing\n * @module diagnostics\n */\n\nexport interface DiagnosticConfig {\n enabled: boolean;\n logParsing: boolean;\n logSerialization: boolean;\n logTextDirection: boolean;\n verbose: boolean;\n}\n\nconst defaultConfig: DiagnosticConfig = {\n enabled: false,\n logParsing: false,\n logSerialization: false,\n logTextDirection: false,\n verbose: false,\n};\n\nlet config: DiagnosticConfig = { ...defaultConfig };\n\n/**\n * Enable diagnostic logging\n */\nexport function enableDiagnostics(options: Partial<DiagnosticConfig> = {}): void {\n config = {\n ...defaultConfig,\n enabled: true,\n ...options,\n };\n}\n\n/**\n * Disable diagnostic logging\n */\nexport function disableDiagnostics(): void {\n config = { ...defaultConfig };\n}\n\n/**\n * Get current diagnostic configuration\n */\nexport function getDiagnosticConfig(): DiagnosticConfig {\n return { ...config };\n}\n\n/**\n * Log parsing activity\n */\nexport function logParsing(message: string, data?: unknown): void {\n if (config.enabled && config.logParsing) {\n console.log(`[PARSE] ${message}`, data !== undefined ? data : '');\n }\n}\n\n/**\n * Log serialization activity\n */\nexport function logSerialization(message: string, data?: unknown): void {\n if (config.enabled && config.logSerialization) {\n console.log(`[SERIALIZE] ${message}`, data !== undefined ? data : '');\n }\n}\n\n/**\n * Log text direction properties\n */\nexport function logTextDirection(message: string, data?: unknown): void {\n if (config.enabled && config.logTextDirection) {\n console.log(`[TEXT-DIR] ${message}`, data !== undefined ? data : '');\n }\n}\n\n/**\n * Log verbose details\n */\nexport function logVerbose(message: string, data?: unknown): void {\n if (config.enabled && config.verbose) {\n console.log(`[VERBOSE] ${message}`, data !== undefined ? data : '');\n }\n}\n\n/**\n * Log paragraph content summary\n */\nexport function logParagraphContent(\n source: 'parsing' | 'serialization',\n paraIndex: number,\n runs: { text: string; rtl?: boolean }[],\n bidi?: boolean\n): void {\n if (!config.enabled) return;\n\n const logger = source === 'parsing' ? logParsing : logSerialization;\n\n logger(`Paragraph ${paraIndex}:`);\n logger(` BiDi: ${bidi !== undefined ? bidi : 'not set'}`);\n logger(` Runs (${runs.length}):`);\n\n runs.forEach((run, idx) => {\n const rtlStatus = run.rtl ? ' [RTL]' : '';\n logger(` ${idx + 1}. \"${run.text}\"${rtlStatus}`);\n });\n\n const fullText = runs.map((r) => r.text).join('');\n logger(` Combined text: \"${fullText}\"`);\n}\n\n/**\n * Compare text before and after processing\n */\nexport function logTextComparison(label: string, before: string, after: string): void {\n if (!config.enabled) return;\n\n if (before !== after) {\n console.log(`[TEXT-CHANGE] ${label}:`);\n console.log(` Before: \"${before}\"`);\n console.log(` After: \"${after}\"`);\n console.log(` MISMATCH DETECTED!`);\n } else if (config.verbose) {\n logVerbose(`${label}: Text preserved correctly`);\n }\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function isError(error) {
|
|
2
|
+
return error instanceof Error;
|
|
3
|
+
}
|
|
4
|
+
export function toError(error) {
|
|
5
|
+
if (isError(error)) {
|
|
6
|
+
return error;
|
|
7
|
+
}
|
|
8
|
+
if (typeof error === 'string') {
|
|
9
|
+
return new Error(error);
|
|
10
|
+
}
|
|
11
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
12
|
+
return new Error(String(error.message));
|
|
13
|
+
}
|
|
14
|
+
return new Error(String(error));
|
|
15
|
+
}
|
|
16
|
+
export function wrapError(error, context) {
|
|
17
|
+
const originalError = toError(error);
|
|
18
|
+
const wrappedError = new Error(`${context}: ${originalError.message}`);
|
|
19
|
+
if (originalError.stack) {
|
|
20
|
+
wrappedError.stack = `${wrappedError.message}\nCaused by: ${originalError.stack}`;
|
|
21
|
+
}
|
|
22
|
+
return wrappedError;
|
|
23
|
+
}
|
|
24
|
+
export function getErrorMessage(error, fallback = 'Unknown error occurred') {
|
|
25
|
+
if (isError(error)) {
|
|
26
|
+
return error.message;
|
|
27
|
+
}
|
|
28
|
+
if (typeof error === 'string') {
|
|
29
|
+
return error;
|
|
30
|
+
}
|
|
31
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
32
|
+
return String(error.message);
|
|
33
|
+
}
|
|
34
|
+
return fallback;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=errorHandling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandling.js","sourceRoot":"","sources":["../../../src/utils/errorHandling.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC;AAChC,CAAC;AAQD,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAGD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QAC7D,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,CAAC;IAGD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AASD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,OAAe;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAGvE,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;QACxB,YAAY,CAAC,KAAK,GAAG,GAAG,YAAY,CAAC,OAAO,gBAAgB,aAAa,CAAC,KAAK,EAAE,CAAC;IACpF,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAQ,GAAG,wBAAwB;IACjF,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * Error handling utilities for consistent error processing\n * Ensures all caught errors are properly typed and handled\n */\n\n/**\n * Type guard to check if a value is an Error object\n * @param error - The value to check\n * @returns True if the value is an Error instance\n */\nexport function isError(error: unknown): error is Error {\n return error instanceof Error;\n}\n\n/**\n * Converts unknown error to Error object\n * Ensures we always have a proper Error with message property\n * @param error - The error to normalize (can be anything)\n * @returns Normalized Error object\n */\nexport function toError(error: unknown): Error {\n if (isError(error)) {\n return error;\n }\n\n // Handle string errors\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n // Handle objects with message property\n if (error && typeof error === 'object' && 'message' in error) {\n return new Error(String(error.message));\n }\n\n // Fallback for any other type\n return new Error(String(error));\n}\n\n/**\n * Wraps an error with additional context\n * Useful for adding file paths, operation names, etc.\n * @param error - The original error\n * @param context - Additional context to prepend to error message\n * @returns New Error with combined message and original stack\n */\nexport function wrapError(error: unknown, context: string): Error {\n const originalError = toError(error);\n const wrappedError = new Error(`${context}: ${originalError.message}`);\n\n // Preserve original stack trace if available\n if (originalError.stack) {\n wrappedError.stack = `${wrappedError.message}\\nCaused by: ${originalError.stack}`;\n }\n\n return wrappedError;\n}\n\n/**\n * Safe error message extraction\n * Returns error message or generic fallback\n * @param error - The error to extract message from\n * @param fallback - Fallback message if extraction fails\n * @returns Error message string\n */\nexport function getErrorMessage(error: unknown, fallback = 'Unknown error occurred'): string {\n if (isError(error)) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n\n return fallback;\n}\n"]}
|