docxmlater 10.1.3 → 10.1.5
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 +759 -754
- package/dist/constants/legacyCompatFlags.js +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +50 -50
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +483 -471
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +9 -9
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +251 -251
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.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 +2123 -2155
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +2 -5
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +3 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +3 -1
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +9 -6
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +18 -17
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +21 -21
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +56 -56
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js +6 -6
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +6 -7
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +82 -25
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js +2 -2
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +6 -6
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +6 -7
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js +2 -2
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -3
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +134 -76
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +238 -106
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +1 -1
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +24 -24
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +181 -188
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js +6 -6
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +4 -5
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +40 -48
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -16
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +256 -238
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +36 -11
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +6 -6
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +99 -104
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +11 -11
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +102 -107
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +10 -10
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +105 -106
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +4 -4
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +13 -6
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +3 -5
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +4 -4
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +54 -49
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +1 -3
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +5 -5
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +119 -125
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +9 -9
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +11 -11
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +219 -247
- 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 +96 -102
- 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 +6 -6
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js +7 -7
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +23 -7
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/compatibility-types.js.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/list-types.d.ts +6 -6
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.d.ts +2 -2
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js +97 -101
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +1 -1
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
- package/dist/utils/MoveOperationHelper.js +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js +2 -4
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.d.ts.map +1 -1
- package/dist/utils/RevisionWalker.js +4 -12
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.d.ts.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +23 -12
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +40 -40
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.js +1 -1
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +10 -2
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js +21 -23
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +3 -3
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.d.ts +1 -1
- package/dist/utils/textDiff.js +8 -8
- package/dist/utils/textDiff.js.map +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +24 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +3 -3
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +5 -5
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +7 -9
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js +3 -3
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +98 -100
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +61 -66
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +1 -3
- 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 +28 -36
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/types.js +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/helper-methods.test.ts +512 -512
- package/src/constants/legacyCompatFlags.ts +138 -138
- package/src/constants/limits.ts +50 -50
- package/src/core/Document.ts +985 -1145
- package/src/core/DocumentContent.ts +461 -467
- package/src/core/DocumentGenerator.ts +1133 -1104
- package/src/core/DocumentIdManager.ts +158 -158
- package/src/core/DocumentParser.ts +2347 -2716
- package/src/core/DocumentValidator.ts +363 -372
- package/src/core/Relationship.ts +367 -367
- package/src/core/RelationshipManager.ts +429 -428
- package/src/elements/AlternateContent.ts +42 -42
- package/src/elements/Bookmark.ts +212 -210
- package/src/elements/BookmarkManager.ts +247 -250
- package/src/elements/Comment.ts +356 -359
- package/src/elements/CommentManager.ts +499 -502
- package/src/elements/CommonTypes.ts +524 -549
- package/src/elements/CustomXml.ts +36 -36
- package/src/elements/Endnote.ts +221 -217
- package/src/elements/EndnoteManager.ts +246 -249
- package/src/elements/Field.ts +1292 -1233
- package/src/elements/FieldHelpers.ts +329 -333
- package/src/elements/FontManager.ts +336 -339
- package/src/elements/Footer.ts +269 -269
- package/src/elements/Footnote.ts +221 -217
- package/src/elements/FootnoteManager.ts +246 -249
- package/src/elements/Header.ts +269 -269
- package/src/elements/HeaderFooterManager.ts +219 -219
- package/src/elements/Hyperlink.ts +1288 -1193
- package/src/elements/Image.ts +1982 -1756
- package/src/elements/ImageManager.ts +437 -432
- package/src/elements/ImageRun.ts +59 -59
- package/src/elements/MathElement.ts +65 -65
- package/src/elements/Paragraph.ts +4347 -4287
- package/src/elements/PreservedElement.ts +53 -53
- package/src/elements/PropertyChangeTypes.ts +458 -442
- package/src/elements/RangeMarker.ts +382 -400
- package/src/elements/Revision.ts +1198 -1217
- package/src/elements/RevisionContent.ts +73 -73
- package/src/elements/RevisionManager.ts +1070 -1070
- package/src/elements/Run.ts +3103 -3073
- package/src/elements/Section.ts +1521 -1421
- package/src/elements/Shape.ts +884 -873
- package/src/elements/StructuredDocumentTag.ts +1176 -1207
- package/src/elements/Table.ts +2468 -2524
- package/src/elements/TableCell.ts +1617 -1621
- package/src/elements/TableGridChange.ts +149 -151
- package/src/elements/TableOfContents.ts +701 -691
- package/src/elements/TableOfContentsElement.ts +89 -89
- package/src/elements/TableRow.ts +960 -929
- package/src/elements/TextBox.ts +766 -768
- package/src/formatting/AbstractNumbering.ts +580 -579
- package/src/formatting/NumberingInstance.ts +295 -299
- package/src/formatting/NumberingLevel.ts +981 -1040
- package/src/formatting/NumberingManager.ts +833 -827
- package/src/formatting/Style.ts +1785 -1879
- package/src/formatting/StylesManager.ts +1090 -1130
- package/src/helpers/CleanupHelper.ts +524 -524
- package/src/images/ImageOptimizer.ts +274 -274
- package/src/index.ts +559 -554
- package/src/managers/DrawingManager.ts +319 -319
- package/src/tracking/DocumentTrackingContext.ts +687 -674
- package/src/tracking/TrackingContext.ts +175 -173
- package/src/types/compatibility-types.ts +49 -49
- package/src/types/formatting.ts +210 -210
- package/src/types/list-types.ts +14 -14
- package/src/types/settings-types.ts +59 -59
- package/src/types/styleConfig.ts +189 -189
- package/src/utils/ChangelogGenerator.ts +1583 -1581
- package/src/utils/CompatibilityUpgrader.ts +235 -237
- package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
- package/src/utils/MoveOperationHelper.ts +233 -238
- package/src/utils/RevisionAwareProcessor.ts +518 -526
- package/src/utils/RevisionWalker.ts +427 -457
- package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
- package/src/utils/ShadingResolver.ts +105 -107
- package/src/utils/acceptRevisions.ts +723 -714
- package/src/utils/cnfStyleDecoder.ts +212 -217
- package/src/utils/corruptionDetection.ts +346 -345
- package/src/utils/dateFormatting.ts +20 -20
- package/src/utils/deepClone.ts +77 -78
- package/src/utils/diagnostics.ts +125 -129
- package/src/utils/errorHandling.ts +80 -80
- package/src/utils/formatting.ts +220 -213
- package/src/utils/list-detection.ts +32 -42
- package/src/utils/logger.ts +412 -404
- package/src/utils/parsingHelpers.ts +190 -190
- package/src/utils/stripTrackedChanges.ts +356 -353
- package/src/utils/textDiff.ts +100 -100
- package/src/utils/units.ts +421 -421
- package/src/utils/validation.ts +553 -542
- package/src/utils/xmlSanitization.ts +179 -182
- package/src/validation/RevisionAutoFixer.ts +541 -542
- package/src/validation/RevisionValidator.ts +470 -460
- package/src/validation/ValidationRules.ts +338 -338
- package/src/validation/index.ts +30 -30
- package/src/xml/XMLBuilder.ts +857 -871
- package/src/xml/XMLParser.ts +877 -919
- package/src/zip/ZipHandler.ts +629 -637
- package/src/zip/ZipReader.ts +295 -299
- package/src/zip/ZipWriter.ts +374 -390
- package/src/zip/types.ts +116 -116
|
@@ -1,190 +1,190 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parsing Helper Functions
|
|
3
|
-
*
|
|
4
|
-
* Utility functions for safely parsing OOXML values from XML attributes.
|
|
5
|
-
* These helpers address common parsing issues:
|
|
6
|
-
* - Zero-value handling (0 should not be treated as falsy)
|
|
7
|
-
* - NaN validation (malformed values should fall back to defaults)
|
|
8
|
-
* - ECMA-376 boolean parsing (self-closing tags, val="1", val="true")
|
|
9
|
-
*
|
|
10
|
-
* @see https://ecma-international.org/publications-and-standards/standards/ecma-376/
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Safely parse an integer value with NaN handling.
|
|
15
|
-
*
|
|
16
|
-
* Addresses the issue where parseInt() can return NaN for malformed input,
|
|
17
|
-
* which then propagates through the document model causing issues.
|
|
18
|
-
*
|
|
19
|
-
* @param value - The value to parse (string, number, or any)
|
|
20
|
-
* @param defaultValue - Default value if parsing fails (default: 0)
|
|
21
|
-
* @returns Parsed integer or default value
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* safeParseInt("42") // 42
|
|
25
|
-
* safeParseInt("invalid") // 0
|
|
26
|
-
* safeParseInt(undefined) // 0
|
|
27
|
-
* safeParseInt("", 100) // 100
|
|
28
|
-
*/
|
|
29
|
-
export function safeParseInt(value: unknown, defaultValue = 0): number {
|
|
30
|
-
if (value === undefined || value === null) {
|
|
31
|
-
return defaultValue;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// If already a number, return it (handle NaN case)
|
|
35
|
-
if (typeof value === 'number') {
|
|
36
|
-
return isNaN(value) ? defaultValue : Math.floor(value);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const parsed = parseInt(String(value), 10);
|
|
40
|
-
return isNaN(parsed) ? defaultValue : parsed;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Parse OOXML boolean value per ECMA-376 specification.
|
|
45
|
-
*
|
|
46
|
-
* OOXML boolean properties follow these rules:
|
|
47
|
-
* - Self-closing tag `<w:bold/>` (no w:val attribute) = true
|
|
48
|
-
* - `<w:bold w:val="1"/>` = true
|
|
49
|
-
* - `<w:bold w:val="true"/>` = true
|
|
50
|
-
* - `<w:bold w:val="on"/>` = true
|
|
51
|
-
* - `<w:bold w:val="0"/>` = false
|
|
52
|
-
* - `<w:bold w:val="false"/>` = false
|
|
53
|
-
* - `<w:bold w:val="off"/>` = false
|
|
54
|
-
* - Absent element = false (handled by caller checking for property existence)
|
|
55
|
-
*
|
|
56
|
-
* @param prop - The parsed XML property object (e.g., pPrObj["w:bold"])
|
|
57
|
-
* @returns Boolean value
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* // For XML: <w:bold/>
|
|
61
|
-
* parseOoxmlBoolean({}) // true (self-closing, no @_w:val)
|
|
62
|
-
*
|
|
63
|
-
* // For XML: <w:bold w:val="1"/>
|
|
64
|
-
* parseOoxmlBoolean({ "@_w:val": "1" }) // true
|
|
65
|
-
*
|
|
66
|
-
* // For XML: <w:bold w:val="0"/>
|
|
67
|
-
* parseOoxmlBoolean({ "@_w:val": "0" }) // false
|
|
68
|
-
*
|
|
69
|
-
* // For absent element
|
|
70
|
-
* parseOoxmlBoolean(undefined) // false
|
|
71
|
-
*/
|
|
72
|
-
export function parseOoxmlBoolean(prop: unknown): boolean {
|
|
73
|
-
// Absent element = false
|
|
74
|
-
if (!prop) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Get the w:val attribute value
|
|
79
|
-
const val = (prop as Record<string, unknown>)['@_w:val'];
|
|
80
|
-
|
|
81
|
-
// Self-closing tag without w:val attribute = true
|
|
82
|
-
// Per ECMA-376, presence of element without val means "on"
|
|
83
|
-
if (val === undefined) {
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Handle string values
|
|
88
|
-
if (typeof val === 'string') {
|
|
89
|
-
const lowerVal = val.toLowerCase();
|
|
90
|
-
return lowerVal === '1' || lowerVal === 'true' || lowerVal === 'on';
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Handle numeric values
|
|
94
|
-
if (typeof val === 'number') {
|
|
95
|
-
return val === 1;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Handle boolean values (already parsed by XML parser)
|
|
99
|
-
if (typeof val === 'boolean') {
|
|
100
|
-
return val;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Unknown type - default to false
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Check if a value is explicitly set (not undefined or null).
|
|
109
|
-
*
|
|
110
|
-
* This helper addresses the zero-value handling bug where truthy checks
|
|
111
|
-
* incorrectly treat 0 as falsy:
|
|
112
|
-
*
|
|
113
|
-
* ```typescript
|
|
114
|
-
* // WRONG - treats 0 as falsy
|
|
115
|
-
* const width = val ? parseInt(val) : defaultWidth;
|
|
116
|
-
*
|
|
117
|
-
* // CORRECT - only checks for undefined/null
|
|
118
|
-
* const width = isExplicitlySet(val) ? parseInt(val) : defaultWidth;
|
|
119
|
-
* ```
|
|
120
|
-
*
|
|
121
|
-
* @param value - The value to check
|
|
122
|
-
* @returns true if value is not undefined and not null
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* isExplicitlySet(0) // true
|
|
126
|
-
* isExplicitlySet("") // true
|
|
127
|
-
* isExplicitlySet(false) // true
|
|
128
|
-
* isExplicitlySet(undefined) // false
|
|
129
|
-
* isExplicitlySet(null) // false
|
|
130
|
-
*/
|
|
131
|
-
export function isExplicitlySet(value: unknown): boolean {
|
|
132
|
-
return value !== undefined && value !== null;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Parse an OOXML numeric attribute with proper handling of zero values.
|
|
137
|
-
*
|
|
138
|
-
* Combines isExplicitlySet() and safeParseInt() for common use case
|
|
139
|
-
* of parsing numeric attributes from XML.
|
|
140
|
-
*
|
|
141
|
-
* @param value - The attribute value to parse
|
|
142
|
-
* @param defaultValue - Default value if attribute is not set
|
|
143
|
-
* @returns Parsed integer or default value
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* parseNumericAttribute("100", 50) // 100
|
|
147
|
-
* parseNumericAttribute("0", 50) // 0 (not 50!)
|
|
148
|
-
* parseNumericAttribute(undefined, 50) // 50
|
|
149
|
-
* parseNumericAttribute("invalid", 50) // 50
|
|
150
|
-
*/
|
|
151
|
-
export function parseNumericAttribute(value: unknown, defaultValue: number): number {
|
|
152
|
-
if (!isExplicitlySet(value)) {
|
|
153
|
-
return defaultValue;
|
|
154
|
-
}
|
|
155
|
-
return safeParseInt(value, defaultValue);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Parse OOXML "on/off" attribute (ST_OnOff type).
|
|
160
|
-
*
|
|
161
|
-
* Some OOXML attributes use the ST_OnOff simple type which can be:
|
|
162
|
-
* - "on", "1", "true" = true
|
|
163
|
-
* - "off", "0", "false" = false
|
|
164
|
-
*
|
|
165
|
-
* This is similar to parseOoxmlBoolean but works on attribute values directly.
|
|
166
|
-
*
|
|
167
|
-
* @param value - The attribute value
|
|
168
|
-
* @param defaultValue - Default if value is not set
|
|
169
|
-
* @returns Boolean value
|
|
170
|
-
*/
|
|
171
|
-
export function parseOnOffAttribute(value: unknown, defaultValue = false): boolean {
|
|
172
|
-
if (!isExplicitlySet(value)) {
|
|
173
|
-
return defaultValue;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (typeof value === 'string') {
|
|
177
|
-
const lowerVal = value.toLowerCase();
|
|
178
|
-
return lowerVal === '1' || lowerVal === 'true' || lowerVal === 'on';
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (typeof value === 'number') {
|
|
182
|
-
return value === 1;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (typeof value === 'boolean') {
|
|
186
|
-
return value;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return defaultValue;
|
|
190
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Parsing Helper Functions
|
|
3
|
+
*
|
|
4
|
+
* Utility functions for safely parsing OOXML values from XML attributes.
|
|
5
|
+
* These helpers address common parsing issues:
|
|
6
|
+
* - Zero-value handling (0 should not be treated as falsy)
|
|
7
|
+
* - NaN validation (malformed values should fall back to defaults)
|
|
8
|
+
* - ECMA-376 boolean parsing (self-closing tags, val="1", val="true")
|
|
9
|
+
*
|
|
10
|
+
* @see https://ecma-international.org/publications-and-standards/standards/ecma-376/
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Safely parse an integer value with NaN handling.
|
|
15
|
+
*
|
|
16
|
+
* Addresses the issue where parseInt() can return NaN for malformed input,
|
|
17
|
+
* which then propagates through the document model causing issues.
|
|
18
|
+
*
|
|
19
|
+
* @param value - The value to parse (string, number, or any)
|
|
20
|
+
* @param defaultValue - Default value if parsing fails (default: 0)
|
|
21
|
+
* @returns Parsed integer or default value
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* safeParseInt("42") // 42
|
|
25
|
+
* safeParseInt("invalid") // 0
|
|
26
|
+
* safeParseInt(undefined) // 0
|
|
27
|
+
* safeParseInt("", 100) // 100
|
|
28
|
+
*/
|
|
29
|
+
export function safeParseInt(value: unknown, defaultValue = 0): number {
|
|
30
|
+
if (value === undefined || value === null) {
|
|
31
|
+
return defaultValue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// If already a number, return it (handle NaN case)
|
|
35
|
+
if (typeof value === 'number') {
|
|
36
|
+
return isNaN(value) ? defaultValue : Math.floor(value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const parsed = parseInt(String(value), 10);
|
|
40
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parse OOXML boolean value per ECMA-376 specification.
|
|
45
|
+
*
|
|
46
|
+
* OOXML boolean properties follow these rules:
|
|
47
|
+
* - Self-closing tag `<w:bold/>` (no w:val attribute) = true
|
|
48
|
+
* - `<w:bold w:val="1"/>` = true
|
|
49
|
+
* - `<w:bold w:val="true"/>` = true
|
|
50
|
+
* - `<w:bold w:val="on"/>` = true
|
|
51
|
+
* - `<w:bold w:val="0"/>` = false
|
|
52
|
+
* - `<w:bold w:val="false"/>` = false
|
|
53
|
+
* - `<w:bold w:val="off"/>` = false
|
|
54
|
+
* - Absent element = false (handled by caller checking for property existence)
|
|
55
|
+
*
|
|
56
|
+
* @param prop - The parsed XML property object (e.g., pPrObj["w:bold"])
|
|
57
|
+
* @returns Boolean value
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* // For XML: <w:bold/>
|
|
61
|
+
* parseOoxmlBoolean({}) // true (self-closing, no @_w:val)
|
|
62
|
+
*
|
|
63
|
+
* // For XML: <w:bold w:val="1"/>
|
|
64
|
+
* parseOoxmlBoolean({ "@_w:val": "1" }) // true
|
|
65
|
+
*
|
|
66
|
+
* // For XML: <w:bold w:val="0"/>
|
|
67
|
+
* parseOoxmlBoolean({ "@_w:val": "0" }) // false
|
|
68
|
+
*
|
|
69
|
+
* // For absent element
|
|
70
|
+
* parseOoxmlBoolean(undefined) // false
|
|
71
|
+
*/
|
|
72
|
+
export function parseOoxmlBoolean(prop: unknown): boolean {
|
|
73
|
+
// Absent element = false
|
|
74
|
+
if (!prop) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Get the w:val attribute value
|
|
79
|
+
const val = (prop as Record<string, unknown>)['@_w:val'];
|
|
80
|
+
|
|
81
|
+
// Self-closing tag without w:val attribute = true
|
|
82
|
+
// Per ECMA-376, presence of element without val means "on"
|
|
83
|
+
if (val === undefined) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Handle string values
|
|
88
|
+
if (typeof val === 'string') {
|
|
89
|
+
const lowerVal = val.toLowerCase();
|
|
90
|
+
return lowerVal === '1' || lowerVal === 'true' || lowerVal === 'on';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Handle numeric values
|
|
94
|
+
if (typeof val === 'number') {
|
|
95
|
+
return val === 1;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Handle boolean values (already parsed by XML parser)
|
|
99
|
+
if (typeof val === 'boolean') {
|
|
100
|
+
return val;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Unknown type - default to false
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Check if a value is explicitly set (not undefined or null).
|
|
109
|
+
*
|
|
110
|
+
* This helper addresses the zero-value handling bug where truthy checks
|
|
111
|
+
* incorrectly treat 0 as falsy:
|
|
112
|
+
*
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // WRONG - treats 0 as falsy
|
|
115
|
+
* const width = val ? parseInt(val) : defaultWidth;
|
|
116
|
+
*
|
|
117
|
+
* // CORRECT - only checks for undefined/null
|
|
118
|
+
* const width = isExplicitlySet(val) ? parseInt(val) : defaultWidth;
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @param value - The value to check
|
|
122
|
+
* @returns true if value is not undefined and not null
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* isExplicitlySet(0) // true
|
|
126
|
+
* isExplicitlySet("") // true
|
|
127
|
+
* isExplicitlySet(false) // true
|
|
128
|
+
* isExplicitlySet(undefined) // false
|
|
129
|
+
* isExplicitlySet(null) // false
|
|
130
|
+
*/
|
|
131
|
+
export function isExplicitlySet(value: unknown): boolean {
|
|
132
|
+
return value !== undefined && value !== null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Parse an OOXML numeric attribute with proper handling of zero values.
|
|
137
|
+
*
|
|
138
|
+
* Combines isExplicitlySet() and safeParseInt() for common use case
|
|
139
|
+
* of parsing numeric attributes from XML.
|
|
140
|
+
*
|
|
141
|
+
* @param value - The attribute value to parse
|
|
142
|
+
* @param defaultValue - Default value if attribute is not set
|
|
143
|
+
* @returns Parsed integer or default value
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* parseNumericAttribute("100", 50) // 100
|
|
147
|
+
* parseNumericAttribute("0", 50) // 0 (not 50!)
|
|
148
|
+
* parseNumericAttribute(undefined, 50) // 50
|
|
149
|
+
* parseNumericAttribute("invalid", 50) // 50
|
|
150
|
+
*/
|
|
151
|
+
export function parseNumericAttribute(value: unknown, defaultValue: number): number {
|
|
152
|
+
if (!isExplicitlySet(value)) {
|
|
153
|
+
return defaultValue;
|
|
154
|
+
}
|
|
155
|
+
return safeParseInt(value, defaultValue);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Parse OOXML "on/off" attribute (ST_OnOff type).
|
|
160
|
+
*
|
|
161
|
+
* Some OOXML attributes use the ST_OnOff simple type which can be:
|
|
162
|
+
* - "on", "1", "true" = true
|
|
163
|
+
* - "off", "0", "false" = false
|
|
164
|
+
*
|
|
165
|
+
* This is similar to parseOoxmlBoolean but works on attribute values directly.
|
|
166
|
+
*
|
|
167
|
+
* @param value - The attribute value
|
|
168
|
+
* @param defaultValue - Default if value is not set
|
|
169
|
+
* @returns Boolean value
|
|
170
|
+
*/
|
|
171
|
+
export function parseOnOffAttribute(value: unknown, defaultValue = false): boolean {
|
|
172
|
+
if (!isExplicitlySet(value)) {
|
|
173
|
+
return defaultValue;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (typeof value === 'string') {
|
|
177
|
+
const lowerVal = value.toLowerCase();
|
|
178
|
+
return lowerVal === '1' || lowerVal === 'true' || lowerVal === 'on';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (typeof value === 'number') {
|
|
182
|
+
return value === 1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (typeof value === 'boolean') {
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return defaultValue;
|
|
190
|
+
}
|