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,237 +1,235 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CompatibilityUpgrader — Upgrades w:compat block in settings.xml to modern format.
|
|
3
|
-
*
|
|
4
|
-
* Equivalent to Word's File > Info > Convert operation for the compatibility
|
|
5
|
-
* settings portion. Removes legacy boolean compat flags, updates compatSetting
|
|
6
|
-
* entries, and manages modern namespaces.
|
|
7
|
-
*
|
|
8
|
-
* @module
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
LEGACY_COMPAT_ELEMENT_NAMES,
|
|
13
|
-
MODERN_COMPAT_SETTINGS,
|
|
14
|
-
MS_WORD_COMPAT_URI,
|
|
15
|
-
} from '../constants/legacyCompatFlags';
|
|
16
|
-
import type { CompatSetting } from '../types/compatibility-types';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Report of what changed during an upgrade operation.
|
|
20
|
-
*/
|
|
21
|
-
export interface UpgradeReport {
|
|
22
|
-
/** Previous compatibility mode value (11, 12, 14, or 15) */
|
|
23
|
-
previousMode: number;
|
|
24
|
-
|
|
25
|
-
/** New compatibility mode (always 15 after upgrade) */
|
|
26
|
-
newMode: number;
|
|
27
|
-
|
|
28
|
-
/** Legacy compat flags that were removed (without w: prefix) */
|
|
29
|
-
removedFlags: string[];
|
|
30
|
-
|
|
31
|
-
/** Modern settings that were added (setting names) */
|
|
32
|
-
addedSettings: string[];
|
|
33
|
-
|
|
34
|
-
/** Whether namespaces were expanded */
|
|
35
|
-
namespacesExpanded: boolean;
|
|
36
|
-
|
|
37
|
-
/** Whether any changes were actually made (false if already mode 15 with no legacy flags) */
|
|
38
|
-
changed: boolean;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Upgrades w:compat blocks in settings.xml to modern Word 2013+ format.
|
|
43
|
-
*/
|
|
44
|
-
export class CompatibilityUpgrader {
|
|
45
|
-
/**
|
|
46
|
-
* Upgrades the w:compat block in settings.xml to mode 15.
|
|
47
|
-
*
|
|
48
|
-
* Operations performed:
|
|
49
|
-
* 1. Remove all legacy boolean compat elements
|
|
50
|
-
* 2. Remove existing Microsoft-URI w:compatSetting entries
|
|
51
|
-
* 3. Insert modern w:compatSetting entries
|
|
52
|
-
* 4. Preserve non-Microsoft w:compatSetting entries (custom URIs)
|
|
53
|
-
*
|
|
54
|
-
* @param settingsXml - The raw settings.xml content
|
|
55
|
-
* @param previousMode - The current compatibility mode value (for the report)
|
|
56
|
-
* @returns Object with upgraded XML and an UpgradeReport
|
|
57
|
-
*/
|
|
58
|
-
static upgradeCompatBlock(
|
|
59
|
-
settingsXml: string,
|
|
60
|
-
previousMode = 12
|
|
61
|
-
): { xml: string; report: UpgradeReport } {
|
|
62
|
-
const removedFlags: string[] = [];
|
|
63
|
-
const addedSettings: string[] = [];
|
|
64
|
-
|
|
65
|
-
// Check if already mode 15 with no legacy flags
|
|
66
|
-
const compatBlockMatch = /<w:compat>([\s\S]*?)<\/w:compat>/.exec(settingsXml);
|
|
67
|
-
const selfClosingCompat = /<w:compat\s*\/>/.exec(settingsXml);
|
|
68
|
-
|
|
69
|
-
if (!compatBlockMatch && !selfClosingCompat) {
|
|
70
|
-
// No w:compat block — insert a full modern block before </w:settings>
|
|
71
|
-
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);
|
|
72
|
-
const xml = settingsXml.replace(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
//
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
namespaces
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
'xmlns:
|
|
212
|
-
'xmlns:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* CompatibilityUpgrader — Upgrades w:compat block in settings.xml to modern format.
|
|
3
|
+
*
|
|
4
|
+
* Equivalent to Word's File > Info > Convert operation for the compatibility
|
|
5
|
+
* settings portion. Removes legacy boolean compat flags, updates compatSetting
|
|
6
|
+
* entries, and manages modern namespaces.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
LEGACY_COMPAT_ELEMENT_NAMES,
|
|
13
|
+
MODERN_COMPAT_SETTINGS,
|
|
14
|
+
MS_WORD_COMPAT_URI,
|
|
15
|
+
} from '../constants/legacyCompatFlags';
|
|
16
|
+
import type { CompatSetting } from '../types/compatibility-types';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Report of what changed during an upgrade operation.
|
|
20
|
+
*/
|
|
21
|
+
export interface UpgradeReport {
|
|
22
|
+
/** Previous compatibility mode value (11, 12, 14, or 15) */
|
|
23
|
+
previousMode: number;
|
|
24
|
+
|
|
25
|
+
/** New compatibility mode (always 15 after upgrade) */
|
|
26
|
+
newMode: number;
|
|
27
|
+
|
|
28
|
+
/** Legacy compat flags that were removed (without w: prefix) */
|
|
29
|
+
removedFlags: string[];
|
|
30
|
+
|
|
31
|
+
/** Modern settings that were added (setting names) */
|
|
32
|
+
addedSettings: string[];
|
|
33
|
+
|
|
34
|
+
/** Whether namespaces were expanded */
|
|
35
|
+
namespacesExpanded: boolean;
|
|
36
|
+
|
|
37
|
+
/** Whether any changes were actually made (false if already mode 15 with no legacy flags) */
|
|
38
|
+
changed: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Upgrades w:compat blocks in settings.xml to modern Word 2013+ format.
|
|
43
|
+
*/
|
|
44
|
+
export class CompatibilityUpgrader {
|
|
45
|
+
/**
|
|
46
|
+
* Upgrades the w:compat block in settings.xml to mode 15.
|
|
47
|
+
*
|
|
48
|
+
* Operations performed:
|
|
49
|
+
* 1. Remove all legacy boolean compat elements
|
|
50
|
+
* 2. Remove existing Microsoft-URI w:compatSetting entries
|
|
51
|
+
* 3. Insert modern w:compatSetting entries
|
|
52
|
+
* 4. Preserve non-Microsoft w:compatSetting entries (custom URIs)
|
|
53
|
+
*
|
|
54
|
+
* @param settingsXml - The raw settings.xml content
|
|
55
|
+
* @param previousMode - The current compatibility mode value (for the report)
|
|
56
|
+
* @returns Object with upgraded XML and an UpgradeReport
|
|
57
|
+
*/
|
|
58
|
+
static upgradeCompatBlock(
|
|
59
|
+
settingsXml: string,
|
|
60
|
+
previousMode = 12
|
|
61
|
+
): { xml: string; report: UpgradeReport } {
|
|
62
|
+
const removedFlags: string[] = [];
|
|
63
|
+
const addedSettings: string[] = [];
|
|
64
|
+
|
|
65
|
+
// Check if already mode 15 with no legacy flags
|
|
66
|
+
const compatBlockMatch = /<w:compat>([\s\S]*?)<\/w:compat>/.exec(settingsXml);
|
|
67
|
+
const selfClosingCompat = /<w:compat\s*\/>/.exec(settingsXml);
|
|
68
|
+
|
|
69
|
+
if (!compatBlockMatch && !selfClosingCompat) {
|
|
70
|
+
// No w:compat block — insert a full modern block before </w:settings>
|
|
71
|
+
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);
|
|
72
|
+
const xml = settingsXml.replace(/<\/w:settings>/, modernBlock + '\n</w:settings>');
|
|
73
|
+
|
|
74
|
+
for (const s of MODERN_COMPAT_SETTINGS) {
|
|
75
|
+
addedSettings.push(s.name);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
xml,
|
|
80
|
+
report: {
|
|
81
|
+
previousMode,
|
|
82
|
+
newMode: 15,
|
|
83
|
+
removedFlags,
|
|
84
|
+
addedSettings,
|
|
85
|
+
namespacesExpanded: false,
|
|
86
|
+
changed: true,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Handle self-closing <w:compat/>
|
|
92
|
+
if (selfClosingCompat) {
|
|
93
|
+
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);
|
|
94
|
+
const xml = settingsXml.replace(/<w:compat\s*\/>/, modernBlock);
|
|
95
|
+
|
|
96
|
+
for (const s of MODERN_COMPAT_SETTINGS) {
|
|
97
|
+
addedSettings.push(s.name);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
xml,
|
|
102
|
+
report: {
|
|
103
|
+
previousMode,
|
|
104
|
+
newMode: 15,
|
|
105
|
+
removedFlags,
|
|
106
|
+
addedSettings,
|
|
107
|
+
namespacesExpanded: false,
|
|
108
|
+
changed: true,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Process existing w:compat block
|
|
114
|
+
const compatBlock = compatBlockMatch![1] ?? '';
|
|
115
|
+
|
|
116
|
+
// 1. Find and record legacy flags that will be removed
|
|
117
|
+
const legacyFlagRegex = /<w:(\w+)(?:\s[^>]*)?\/?>/g;
|
|
118
|
+
let flagMatch;
|
|
119
|
+
while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {
|
|
120
|
+
const tagName = flagMatch[1];
|
|
121
|
+
if (tagName && tagName !== 'compatSetting' && LEGACY_COMPAT_ELEMENT_NAMES.has(tagName)) {
|
|
122
|
+
removedFlags.push(tagName);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 2. Collect non-Microsoft compatSetting entries to preserve
|
|
127
|
+
const preservedSettings: CompatSetting[] = [];
|
|
128
|
+
const settingRegex = /<w:compatSetting\s+([^>]*)\/?\s*>/g;
|
|
129
|
+
let settingMatch;
|
|
130
|
+
while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {
|
|
131
|
+
const attrs = settingMatch[1] ?? '';
|
|
132
|
+
const nameMatch = /w:name\s*=\s*"([^"]*)"/.exec(attrs);
|
|
133
|
+
const uriMatch = /w:uri\s*=\s*"([^"]*)"/.exec(attrs);
|
|
134
|
+
const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
|
|
135
|
+
|
|
136
|
+
if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {
|
|
137
|
+
// Preserve settings with non-Microsoft URIs
|
|
138
|
+
if (uriMatch[1] !== MS_WORD_COMPAT_URI) {
|
|
139
|
+
preservedSettings.push({
|
|
140
|
+
name: nameMatch[1],
|
|
141
|
+
uri: uriMatch[1],
|
|
142
|
+
val: valMatch[1],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// 3. Determine which modern settings are actually new
|
|
149
|
+
const existingMsSettings = new Set<string>();
|
|
150
|
+
const existingSettingRegex = /<w:compatSetting\s+([^>]*)\/?\s*>/g;
|
|
151
|
+
let existingMatch;
|
|
152
|
+
while ((existingMatch = existingSettingRegex.exec(compatBlock)) !== null) {
|
|
153
|
+
const attrs = existingMatch[1] ?? '';
|
|
154
|
+
const nameMatch = /w:name\s*=\s*"([^"]*)"/.exec(attrs);
|
|
155
|
+
const uriMatch = /w:uri\s*=\s*"([^"]*)"/.exec(attrs);
|
|
156
|
+
if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] === MS_WORD_COMPAT_URI) {
|
|
157
|
+
existingMsSettings.add(nameMatch[1]);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
for (const s of MODERN_COMPAT_SETTINGS) {
|
|
162
|
+
if (!existingMsSettings.has(s.name)) {
|
|
163
|
+
addedSettings.push(s.name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// compatibilityMode value change counts as "added" if it existed but with different val
|
|
167
|
+
if (existingMsSettings.has('compatibilityMode') && previousMode !== 15) {
|
|
168
|
+
if (!addedSettings.includes('compatibilityMode')) {
|
|
169
|
+
addedSettings.push('compatibilityMode');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// 4. Build the new compat block
|
|
174
|
+
const allSettings = [...MODERN_COMPAT_SETTINGS, ...preservedSettings];
|
|
175
|
+
const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(allSettings);
|
|
176
|
+
|
|
177
|
+
// 5. Replace the old block
|
|
178
|
+
const changed = removedFlags.length > 0 || addedSettings.length > 0 || previousMode !== 15;
|
|
179
|
+
const xml = settingsXml.replace(/<w:compat>[\s\S]*?<\/w:compat>/, modernBlock);
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
xml,
|
|
183
|
+
report: {
|
|
184
|
+
previousMode,
|
|
185
|
+
newMode: 15,
|
|
186
|
+
removedFlags,
|
|
187
|
+
addedSettings,
|
|
188
|
+
namespacesExpanded: false,
|
|
189
|
+
changed,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Ensures namespace declarations include all modern extended namespaces
|
|
196
|
+
* (w14, w15, w16se, w16cid, etc.) and returns the expanded set.
|
|
197
|
+
*
|
|
198
|
+
* @param namespaces - Current namespace record from document
|
|
199
|
+
* @returns Updated namespace record with modern namespaces added
|
|
200
|
+
*/
|
|
201
|
+
static ensureModernNamespaces(namespaces: Record<string, string>): {
|
|
202
|
+
namespaces: Record<string, string>;
|
|
203
|
+
expanded: boolean;
|
|
204
|
+
} {
|
|
205
|
+
const result = { ...namespaces };
|
|
206
|
+
let expanded = false;
|
|
207
|
+
|
|
208
|
+
const modernNamespaces: Record<string, string> = {
|
|
209
|
+
'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',
|
|
210
|
+
'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',
|
|
211
|
+
'xmlns:w16se': 'http://schemas.microsoft.com/office/word/2015/wordml/symex',
|
|
212
|
+
'xmlns:w16cid': 'http://schemas.microsoft.com/office/word/2016/wordml/cid',
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
for (const [key, value] of Object.entries(modernNamespaces)) {
|
|
216
|
+
if (!result[key]) {
|
|
217
|
+
result[key] = value;
|
|
218
|
+
expanded = true;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return { namespaces: result, expanded };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Builds a <w:compat> block XML string from an array of compat settings.
|
|
227
|
+
* Does not include legacy boolean flags (they are stripped during upgrade).
|
|
228
|
+
*/
|
|
229
|
+
private static buildModernCompatBlock(settings: CompatSetting[]): string {
|
|
230
|
+
const entries = settings.map(
|
|
231
|
+
(s) => ` <w:compatSetting w:name="${s.name}" w:uri="${s.uri}" w:val="${s.val}"/>`
|
|
232
|
+
);
|
|
233
|
+
return `<w:compat>\n${entries.join('\n')}\n </w:compat>`;
|
|
234
|
+
}
|
|
235
|
+
}
|