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
package/src/utils/formatting.ts
CHANGED
|
@@ -1,213 +1,220 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Formatting utilities for deep merging and cloning formatting objects
|
|
3
|
-
* Used for style inheritance and applying formatting
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Deep merges two formatting objects, with override taking precedence
|
|
8
|
-
* Used for style inheritance and applying formatting
|
|
9
|
-
*
|
|
10
|
-
* @param base - Base formatting object
|
|
11
|
-
* @param override - Override formatting object (takes precedence)
|
|
12
|
-
* @returns Merged formatting object
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const baseFormat = { bold: true, fontSize: 24 };
|
|
17
|
-
* const overrideFormat = { fontSize: 28, italic: true };
|
|
18
|
-
* const result = mergeFormatting(baseFormat, overrideFormat);
|
|
19
|
-
* // Result: { bold: true, fontSize: 28, italic: true }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export function mergeFormatting<T extends Record<string, any>>(
|
|
23
|
-
base
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
result[key as keyof T] =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* ```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
format2
|
|
140
|
-
|
|
141
|
-
//
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* @
|
|
186
|
-
*
|
|
187
|
-
* @
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
* const
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Formatting utilities for deep merging and cloning formatting objects
|
|
3
|
+
* Used for style inheritance and applying formatting
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Deep merges two formatting objects, with override taking precedence
|
|
8
|
+
* Used for style inheritance and applying formatting
|
|
9
|
+
*
|
|
10
|
+
* @param base - Base formatting object
|
|
11
|
+
* @param override - Override formatting object (takes precedence)
|
|
12
|
+
* @returns Merged formatting object
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const baseFormat = { bold: true, fontSize: 24 };
|
|
17
|
+
* const overrideFormat = { fontSize: 28, italic: true };
|
|
18
|
+
* const result = mergeFormatting(baseFormat, overrideFormat);
|
|
19
|
+
* // Result: { bold: true, fontSize: 28, italic: true }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function mergeFormatting<T extends Record<string, any>>(base: T, override: Partial<T>): T {
|
|
23
|
+
const result = { ...base };
|
|
24
|
+
|
|
25
|
+
for (const [key, value] of Object.entries(override)) {
|
|
26
|
+
if (value === undefined) continue;
|
|
27
|
+
|
|
28
|
+
if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
|
|
29
|
+
// Deep merge nested objects
|
|
30
|
+
result[key as keyof T] = mergeFormatting(result[key as keyof T] || ({} as any), value);
|
|
31
|
+
} else {
|
|
32
|
+
// Direct assignment for primitives
|
|
33
|
+
result[key as keyof T] = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Deep clones a formatting object
|
|
42
|
+
* Creates a completely independent copy with no shared references
|
|
43
|
+
*
|
|
44
|
+
* @param formatting - Formatting object to clone
|
|
45
|
+
* @returns Cloned formatting object
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const original = { bold: true, indentation: { left: 100 } };
|
|
50
|
+
* const cloned = cloneFormatting(original);
|
|
51
|
+
* cloned.indentation.left = 200; // Doesn't affect original
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function cloneFormatting<T>(formatting: T): T {
|
|
55
|
+
return JSON.parse(JSON.stringify(formatting));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Checks if a formatting object has any defined properties
|
|
60
|
+
*
|
|
61
|
+
* @param formatting - Formatting object to check
|
|
62
|
+
* @returns True if the object has at least one defined property
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* hasFormatting({}) // false
|
|
67
|
+
* hasFormatting({ bold: true }) // true
|
|
68
|
+
* hasFormatting({ bold: undefined }) // false
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function hasFormatting(formatting: Record<string, unknown>): boolean {
|
|
72
|
+
for (const value of Object.values(formatting)) {
|
|
73
|
+
if (value !== undefined && value !== null) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Removes undefined and null properties from a formatting object
|
|
82
|
+
* Useful for cleaning up formatting before comparison or serialization
|
|
83
|
+
*
|
|
84
|
+
* @param formatting - Formatting object to clean
|
|
85
|
+
* @returns Cleaned formatting object with no undefined/null values
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const dirty = { bold: true, italic: undefined, fontSize: null, underline: false };
|
|
90
|
+
* const clean = cleanFormatting(dirty);
|
|
91
|
+
* // Result: { bold: true, underline: false }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function cleanFormatting<T extends Record<string, any>>(formatting: T): Partial<T> {
|
|
95
|
+
const cleaned: Partial<T> = {};
|
|
96
|
+
|
|
97
|
+
for (const [key, value] of Object.entries(formatting)) {
|
|
98
|
+
if (value !== undefined && value !== null) {
|
|
99
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
100
|
+
// Recursively clean nested objects
|
|
101
|
+
const cleanedNested = cleanFormatting(value);
|
|
102
|
+
if (Object.keys(cleanedNested).length > 0) {
|
|
103
|
+
cleaned[key as keyof T] = cleanedNested as any;
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
cleaned[key as keyof T] = value;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return cleaned;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Compares two formatting objects for equality
|
|
116
|
+
* Performs deep comparison of all properties
|
|
117
|
+
*
|
|
118
|
+
* @param format1 - First formatting object
|
|
119
|
+
* @param format2 - Second formatting object
|
|
120
|
+
* @returns True if the formatting objects are equal
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const a = { bold: true, fontSize: 24 };
|
|
125
|
+
* const b = { bold: true, fontSize: 24 };
|
|
126
|
+
* const c = { bold: true, fontSize: 28 };
|
|
127
|
+
* isEqualFormatting(a, b) // true
|
|
128
|
+
* isEqualFormatting(a, c) // false
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export function isEqualFormatting(
|
|
132
|
+
format1: Record<string, unknown>,
|
|
133
|
+
format2: Record<string, unknown>
|
|
134
|
+
): boolean {
|
|
135
|
+
// Quick reference check
|
|
136
|
+
if (format1 === format2) return true;
|
|
137
|
+
|
|
138
|
+
// Null/undefined checks
|
|
139
|
+
if (!format1 || !format2) return false;
|
|
140
|
+
|
|
141
|
+
// Get all keys from both objects
|
|
142
|
+
const keys1 = Object.keys(format1);
|
|
143
|
+
const keys2 = Object.keys(format2);
|
|
144
|
+
|
|
145
|
+
// Check if they have the same number of properties
|
|
146
|
+
if (keys1.length !== keys2.length) return false;
|
|
147
|
+
|
|
148
|
+
// Check all properties
|
|
149
|
+
for (const key of keys1) {
|
|
150
|
+
const val1 = format1[key];
|
|
151
|
+
const val2 = format2[key];
|
|
152
|
+
|
|
153
|
+
// Both undefined/null - considered equal
|
|
154
|
+
if ((val1 === undefined || val1 === null) && (val2 === undefined || val2 === null)) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// One is undefined/null and the other isn't
|
|
159
|
+
if ((val1 === undefined || val1 === null) !== (val2 === undefined || val2 === null)) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Check nested objects
|
|
164
|
+
if (
|
|
165
|
+
typeof val1 === 'object' &&
|
|
166
|
+
val1 !== null &&
|
|
167
|
+
typeof val2 === 'object' &&
|
|
168
|
+
val2 !== null &&
|
|
169
|
+
!Array.isArray(val1) &&
|
|
170
|
+
!Array.isArray(val2)
|
|
171
|
+
) {
|
|
172
|
+
if (!isEqualFormatting(val1 as Record<string, unknown>, val2 as Record<string, unknown>))
|
|
173
|
+
return false;
|
|
174
|
+
} else if (val1 !== val2) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Applies default values to a formatting object for any undefined properties
|
|
184
|
+
*
|
|
185
|
+
* @param formatting - Formatting object to apply defaults to
|
|
186
|
+
* @param defaults - Default values
|
|
187
|
+
* @returns Formatting object with defaults applied
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const format = { bold: true };
|
|
192
|
+
* const defaults = { bold: false, italic: false, fontSize: 24 };
|
|
193
|
+
* const result = applyDefaults(format, defaults);
|
|
194
|
+
* // Result: { bold: true, italic: false, fontSize: 24 }
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
export function applyDefaults<T extends Record<string, any>>(
|
|
198
|
+
formatting: Partial<T>,
|
|
199
|
+
defaults: T
|
|
200
|
+
): T {
|
|
201
|
+
const result = { ...defaults };
|
|
202
|
+
|
|
203
|
+
for (const [key, value] of Object.entries(formatting)) {
|
|
204
|
+
if (value !== undefined) {
|
|
205
|
+
if (
|
|
206
|
+
typeof value === 'object' &&
|
|
207
|
+
!Array.isArray(value) &&
|
|
208
|
+
value !== null &&
|
|
209
|
+
typeof defaults[key] === 'object'
|
|
210
|
+
) {
|
|
211
|
+
// Deep merge nested objects
|
|
212
|
+
result[key as keyof T] = applyDefaults(value, defaults[key]);
|
|
213
|
+
} else {
|
|
214
|
+
result[key as keyof T] = value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* paragraph list properties.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { Paragraph } from
|
|
8
|
+
import type { Paragraph } from '../elements/Paragraph';
|
|
9
9
|
import type {
|
|
10
10
|
ListCategory,
|
|
11
11
|
ListDetectionResult,
|
|
12
12
|
NumberFormat,
|
|
13
13
|
BulletFormat,
|
|
14
|
-
} from
|
|
14
|
+
} from '../types/list-types';
|
|
15
15
|
|
|
16
16
|
// =============================================================================
|
|
17
17
|
// CONSTANTS
|
|
@@ -36,13 +36,13 @@ export const TYPED_LIST_PATTERNS: Record<string, RegExp> = {
|
|
|
36
36
|
|
|
37
37
|
/** Map pattern names to categories */
|
|
38
38
|
export const PATTERN_TO_CATEGORY: Record<string, ListCategory> = {
|
|
39
|
-
decimal:
|
|
40
|
-
lowerLetter:
|
|
41
|
-
upperLetter:
|
|
42
|
-
lowerRoman:
|
|
43
|
-
bullet:
|
|
44
|
-
dash:
|
|
45
|
-
arrow:
|
|
39
|
+
decimal: 'numbered',
|
|
40
|
+
lowerLetter: 'numbered',
|
|
41
|
+
upperLetter: 'numbered',
|
|
42
|
+
lowerRoman: 'numbered',
|
|
43
|
+
bullet: 'bullet',
|
|
44
|
+
dash: 'bullet',
|
|
45
|
+
arrow: 'bullet',
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
/**
|
|
@@ -53,14 +53,14 @@ export const PATTERN_TO_CATEGORY: Record<string, ListCategory> = {
|
|
|
53
53
|
* Level 2: i., ii., iii. (lowerRoman)
|
|
54
54
|
*/
|
|
55
55
|
export const FORMAT_TO_LEVEL: Record<string, number> = {
|
|
56
|
-
decimal: 0,
|
|
57
|
-
lowerLetter: 1,
|
|
58
|
-
upperLetter: 1,
|
|
59
|
-
lowerRoman: 2,
|
|
60
|
-
upperRoman: 2,
|
|
61
|
-
bullet: 0,
|
|
62
|
-
dash: 0,
|
|
63
|
-
arrow: 0,
|
|
56
|
+
decimal: 0, // 1., 2., 3.
|
|
57
|
+
lowerLetter: 1, // a., b., c.
|
|
58
|
+
upperLetter: 1, // A., B., C.
|
|
59
|
+
lowerRoman: 2, // i., ii., iii.
|
|
60
|
+
upperRoman: 2, // I., II., III.
|
|
61
|
+
bullet: 0, // Top-level bullet (filled circle)
|
|
62
|
+
dash: 0, // Top-level dash marker
|
|
63
|
+
arrow: 0, // Top-level arrow marker
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
/**
|
|
@@ -124,7 +124,7 @@ export function detectTypedPrefix(text: string): {
|
|
|
124
124
|
if (match) {
|
|
125
125
|
// Special check for single-letter patterns (lowerLetter, upperLetter)
|
|
126
126
|
// to avoid false positives on abbreviations like "P.O. Box", "U.S.", "A.M."
|
|
127
|
-
if (format ===
|
|
127
|
+
if (format === 'lowerLetter' || format === 'upperLetter') {
|
|
128
128
|
const remaining = text.substring(match[0].length);
|
|
129
129
|
// If remaining text starts with another letter followed by period,
|
|
130
130
|
// this is likely an abbreviation, not a list marker
|
|
@@ -136,12 +136,12 @@ export function detectTypedPrefix(text: string): {
|
|
|
136
136
|
return {
|
|
137
137
|
prefix: match[0],
|
|
138
138
|
format: format as NumberFormat | BulletFormat,
|
|
139
|
-
category: PATTERN_TO_CATEGORY[format] ??
|
|
139
|
+
category: PATTERN_TO_CATEGORY[format] ?? 'none',
|
|
140
140
|
};
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
return { prefix: null, format: null, category:
|
|
144
|
+
return { prefix: null, format: null, category: 'none' };
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
/**
|
|
@@ -163,7 +163,7 @@ export function detectListType(paragraph: Paragraph): ListDetectionResult {
|
|
|
163
163
|
// Priority 1: Real Word list with <w:numPr>
|
|
164
164
|
if (numbering?.numId !== undefined && numbering.numId !== 0) {
|
|
165
165
|
return {
|
|
166
|
-
category:
|
|
166
|
+
category: 'numbered', // Default, caller can refine with NumberingManager lookup
|
|
167
167
|
isWordList: true,
|
|
168
168
|
typedPrefix: null,
|
|
169
169
|
inferredLevel: numbering.level ?? 0,
|
|
@@ -193,7 +193,7 @@ export function detectListType(paragraph: Paragraph): ListDetectionResult {
|
|
|
193
193
|
|
|
194
194
|
// Priority 3: Not a list
|
|
195
195
|
return {
|
|
196
|
-
category:
|
|
196
|
+
category: 'none',
|
|
197
197
|
isWordList: false,
|
|
198
198
|
typedPrefix: null,
|
|
199
199
|
inferredLevel: 0,
|
|
@@ -213,10 +213,10 @@ export function validateListSequence(
|
|
|
213
213
|
): { valid: boolean; warnings: string[] } {
|
|
214
214
|
const warnings: string[] = [];
|
|
215
215
|
let lastDecimal = 0;
|
|
216
|
-
let lastLetter =
|
|
216
|
+
let lastLetter = '';
|
|
217
217
|
|
|
218
218
|
for (const { detection } of paragraphs) {
|
|
219
|
-
if (!detection.typedPrefix || detection.category !==
|
|
219
|
+
if (!detection.typedPrefix || detection.category !== 'numbered') continue;
|
|
220
220
|
|
|
221
221
|
const match = /^(\d+|[a-zA-Z]+)/.exec(detection.typedPrefix);
|
|
222
222
|
if (!match?.[1]) continue;
|
|
@@ -235,11 +235,7 @@ export function validateListSequence(
|
|
|
235
235
|
// Check letter sequence
|
|
236
236
|
if (/^[a-z]$/i.test(marker)) {
|
|
237
237
|
const letter = marker.toLowerCase();
|
|
238
|
-
if (
|
|
239
|
-
lastLetter &&
|
|
240
|
-
letter.charCodeAt(0) !== lastLetter.charCodeAt(0) + 1 &&
|
|
241
|
-
letter !== "a"
|
|
242
|
-
) {
|
|
238
|
+
if (lastLetter && letter.charCodeAt(0) !== lastLetter.charCodeAt(0) + 1 && letter !== 'a') {
|
|
243
239
|
warnings.push(`Unexpected letter sequence: ${lastLetter} → ${letter}`);
|
|
244
240
|
}
|
|
245
241
|
lastLetter = letter;
|
|
@@ -253,22 +249,16 @@ export function validateListSequence(
|
|
|
253
249
|
* Determine the list category for a given numId by checking the abstractNum.
|
|
254
250
|
* This requires access to the NumberingManager.
|
|
255
251
|
*/
|
|
256
|
-
export function getListCategoryFromFormat(
|
|
257
|
-
format
|
|
258
|
-
): ListCategory {
|
|
259
|
-
if (!format) return "none";
|
|
252
|
+
export function getListCategoryFromFormat(format: string | undefined): ListCategory {
|
|
253
|
+
if (!format) return 'none';
|
|
260
254
|
|
|
261
|
-
if ([
|
|
262
|
-
return
|
|
255
|
+
if (['bullet', 'dash', 'arrow'].includes(format)) {
|
|
256
|
+
return 'bullet';
|
|
263
257
|
}
|
|
264
258
|
|
|
265
|
-
if (
|
|
266
|
-
|
|
267
|
-
format
|
|
268
|
-
)
|
|
269
|
-
) {
|
|
270
|
-
return "numbered";
|
|
259
|
+
if (['decimal', 'lowerLetter', 'upperLetter', 'lowerRoman', 'upperRoman'].includes(format)) {
|
|
260
|
+
return 'numbered';
|
|
271
261
|
}
|
|
272
262
|
|
|
273
|
-
return
|
|
263
|
+
return 'none';
|
|
274
264
|
}
|