docxmlater 11.0.10 → 12.1.0
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 +53 -13
- package/dist/core/Document.d.ts +29 -3
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +733 -170
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +1 -0
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +77 -25
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +7 -3
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +427 -81
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +2 -2
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/Comment.d.ts +15 -1
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +67 -12
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts +4 -0
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +74 -16
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts +10 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +76 -34
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts +1 -0
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +8 -4
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/Footer.d.ts +3 -1
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +39 -53
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.d.ts +3 -1
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +39 -53
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.d.ts +4 -2
- package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
- package/dist/elements/HeaderFooterManager.js +36 -6
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +6 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +69 -44
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +33 -6
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts +1 -0
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +11 -0
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +3 -0
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +91 -26
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/Revision.d.ts +4 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +369 -29
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/Run.d.ts +1 -0
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +24 -4
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +17 -7
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +50 -42
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +9 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +46 -6
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -0
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +90 -42
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +1 -0
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +32 -13
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +5 -7
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableRow.d.ts +1 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +16 -1
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +55 -42
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/esm/core/Document.js +735 -172
- package/dist/esm/core/Document.js.map +1 -1
- package/dist/esm/core/DocumentGenerator.js +77 -25
- package/dist/esm/core/DocumentGenerator.js.map +1 -1
- package/dist/esm/core/DocumentParser.js +427 -81
- package/dist/esm/core/DocumentParser.js.map +1 -1
- package/dist/esm/core/RelationshipManager.js +2 -2
- package/dist/esm/core/RelationshipManager.js.map +1 -1
- package/dist/esm/elements/Comment.js +67 -12
- package/dist/esm/elements/Comment.js.map +1 -1
- package/dist/esm/elements/CommentManager.js +74 -16
- package/dist/esm/elements/CommentManager.js.map +1 -1
- package/dist/esm/elements/EndnoteManager.js.map +1 -1
- package/dist/esm/elements/Field.js +77 -35
- package/dist/esm/elements/Field.js.map +1 -1
- package/dist/esm/elements/FieldHelpers.js +7 -4
- package/dist/esm/elements/FieldHelpers.js.map +1 -1
- package/dist/esm/elements/Footer.js +39 -53
- package/dist/esm/elements/Footer.js.map +1 -1
- package/dist/esm/elements/FootnoteManager.js.map +1 -1
- package/dist/esm/elements/Header.js +39 -53
- package/dist/esm/elements/Header.js.map +1 -1
- package/dist/esm/elements/HeaderFooterManager.js +36 -6
- package/dist/esm/elements/HeaderFooterManager.js.map +1 -1
- package/dist/esm/elements/Hyperlink.js +69 -44
- package/dist/esm/elements/Hyperlink.js.map +1 -1
- package/dist/esm/elements/Image.js +33 -6
- package/dist/esm/elements/Image.js.map +1 -1
- package/dist/esm/elements/ImageManager.js +11 -0
- package/dist/esm/elements/ImageManager.js.map +1 -1
- package/dist/esm/elements/Paragraph.js +91 -26
- package/dist/esm/elements/Paragraph.js.map +1 -1
- package/dist/esm/elements/Revision.js +369 -29
- package/dist/esm/elements/Revision.js.map +1 -1
- package/dist/esm/elements/Run.js +24 -4
- package/dist/esm/elements/Run.js.map +1 -1
- package/dist/esm/elements/Section.js +17 -7
- package/dist/esm/elements/Section.js.map +1 -1
- package/dist/esm/elements/Shape.js +50 -42
- package/dist/esm/elements/Shape.js.map +1 -1
- package/dist/esm/elements/StructuredDocumentTag.js +46 -6
- package/dist/esm/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/esm/elements/Table.js +90 -42
- package/dist/esm/elements/Table.js.map +1 -1
- package/dist/esm/elements/TableCell.js +32 -13
- package/dist/esm/elements/TableCell.js.map +1 -1
- package/dist/esm/elements/TableOfContents.js +5 -7
- package/dist/esm/elements/TableOfContents.js.map +1 -1
- package/dist/esm/elements/TableRow.js +16 -1
- package/dist/esm/elements/TableRow.js.map +1 -1
- package/dist/esm/elements/TextBox.js +55 -42
- package/dist/esm/elements/TextBox.js.map +1 -1
- package/dist/esm/formatting/AbstractNumbering.js +1 -1
- package/dist/esm/formatting/AbstractNumbering.js.map +1 -1
- package/dist/esm/formatting/NumberingLevel.js +8 -6
- package/dist/esm/formatting/NumberingLevel.js.map +1 -1
- package/dist/esm/formatting/NumberingManager.js +16 -1
- package/dist/esm/formatting/NumberingManager.js.map +1 -1
- package/dist/esm/formatting/Style.js +14 -0
- package/dist/esm/formatting/Style.js.map +1 -1
- package/dist/esm/formatting/StylesManager.js +14 -2
- package/dist/esm/formatting/StylesManager.js.map +1 -1
- package/dist/esm/helpers/CleanupHelper.js +103 -26
- package/dist/esm/helpers/CleanupHelper.js.map +1 -1
- package/dist/esm/images/ImageOptimizer.js +52 -4
- package/dist/esm/images/ImageOptimizer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal.js +1 -1
- package/dist/esm/internal.js.map +1 -1
- package/dist/esm/processors/CompatibilityUpgrader.js +7 -1
- package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -1
- package/dist/esm/processors/InMemoryRevisionAcceptor.js +134 -13
- package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/esm/processors/RevisionWalker.js +223 -39
- package/dist/esm/processors/RevisionWalker.js.map +1 -1
- package/dist/esm/processors/SelectiveRevisionAcceptor.js +116 -17
- package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/esm/processors/acceptRevisions.js +20 -11
- package/dist/esm/processors/acceptRevisions.js.map +1 -1
- package/dist/esm/processors/cnfStyleDecoder.js +7 -7
- package/dist/esm/processors/cnfStyleDecoder.js.map +1 -1
- package/dist/esm/processors/stripTrackedChanges.js +16 -5
- package/dist/esm/processors/stripTrackedChanges.js.map +1 -1
- package/dist/esm/utils/deepClone.js +24 -11
- package/dist/esm/utils/deepClone.js.map +1 -1
- package/dist/esm/utils/units.js +1 -1
- package/dist/esm/utils/units.js.map +1 -1
- package/dist/esm/utils/validation.js +11 -23
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/esm/utils/xmlSanitization.js +131 -7
- package/dist/esm/utils/xmlSanitization.js.map +1 -1
- package/dist/esm/validation/RevisionAutoFixer.js +69 -55
- package/dist/esm/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/esm/validation/RevisionValidator.js +24 -20
- package/dist/esm/validation/RevisionValidator.js.map +1 -1
- package/dist/esm/xml/XMLBuilder.js +52 -20
- package/dist/esm/xml/XMLBuilder.js.map +1 -1
- package/dist/esm/xml/XMLParser.js +55 -13
- package/dist/esm/xml/XMLParser.js.map +1 -1
- package/dist/esm/zip/ZipHandler.js +37 -13
- package/dist/esm/zip/ZipHandler.js.map +1 -1
- package/dist/esm/zip/ZipReader.js +53 -6
- package/dist/esm/zip/ZipReader.js.map +1 -1
- package/dist/esm/zip/errors.js +7 -0
- package/dist/esm/zip/errors.js.map +1 -1
- package/dist/esm/zip/types.js +4 -0
- package/dist/esm/zip/types.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +1 -1
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +8 -6
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +16 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +14 -0
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +14 -2
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +103 -26
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.d.ts.map +1 -1
- package/dist/images/ImageOptimizer.js +52 -4
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -1
- package/dist/internal.js.map +1 -1
- package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/processors/CompatibilityUpgrader.js +7 -1
- package/dist/processors/CompatibilityUpgrader.js.map +1 -1
- package/dist/processors/InMemoryRevisionAcceptor.d.ts +1 -0
- package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/processors/InMemoryRevisionAcceptor.js +135 -13
- package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/processors/RevisionWalker.d.ts +9 -3
- package/dist/processors/RevisionWalker.d.ts.map +1 -1
- package/dist/processors/RevisionWalker.js +223 -39
- package/dist/processors/RevisionWalker.js.map +1 -1
- package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/processors/SelectiveRevisionAcceptor.js +116 -17
- package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/processors/acceptRevisions.d.ts +1 -0
- package/dist/processors/acceptRevisions.d.ts.map +1 -1
- package/dist/processors/acceptRevisions.js +21 -11
- package/dist/processors/acceptRevisions.js.map +1 -1
- package/dist/processors/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/processors/cnfStyleDecoder.js +7 -7
- package/dist/processors/cnfStyleDecoder.js.map +1 -1
- package/dist/processors/stripTrackedChanges.d.ts.map +1 -1
- package/dist/processors/stripTrackedChanges.js +16 -5
- package/dist/processors/stripTrackedChanges.js.map +1 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +24 -11
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/units.d.ts.map +1 -1
- package/dist/utils/units.js +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +11 -23
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts +2 -0
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +133 -7
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +6 -2
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +68 -54
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts +2 -0
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +26 -21
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -0
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +52 -20
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts +1 -0
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +55 -13
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js +37 -13
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +52 -5
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/errors.d.ts +3 -0
- package/dist/zip/errors.d.ts.map +1 -1
- package/dist/zip/errors.js +9 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.d.ts +4 -0
- package/dist/zip/types.d.ts.map +1 -1
- package/dist/zip/types.js +4 -0
- package/dist/zip/types.js.map +1 -1
- package/package.json +2 -2
- package/src/core/Document.ts +1184 -242
- package/src/core/DocumentGenerator.ts +106 -26
- package/src/core/DocumentParser.ts +681 -114
- package/src/core/RelationshipManager.ts +446 -442
- package/src/elements/Comment.ts +123 -18
- package/src/elements/CommentManager.ts +121 -22
- package/src/elements/EndnoteManager.ts +4 -1
- package/src/elements/Field.ts +134 -43
- package/src/elements/FieldHelpers.ts +20 -4
- package/src/elements/Footer.ts +62 -67
- package/src/elements/FootnoteManager.ts +4 -1
- package/src/elements/Header.ts +62 -67
- package/src/elements/HeaderFooterManager.ts +56 -8
- package/src/elements/Hyperlink.ts +150 -55
- package/src/elements/Image.ts +51 -7
- package/src/elements/ImageManager.ts +24 -0
- package/src/elements/Paragraph.ts +161 -40
- package/src/elements/Revision.ts +446 -47
- package/src/elements/Run.ts +44 -6
- package/src/elements/Section.ts +25 -9
- package/src/elements/Shape.ts +52 -44
- package/src/elements/StructuredDocumentTag.ts +83 -8
- package/src/elements/Table.ts +151 -50
- package/src/elements/TableCell.ts +57 -17
- package/src/elements/TableOfContents.ts +10 -9
- package/src/elements/TableRow.ts +35 -3
- package/src/elements/TextBox.ts +58 -43
- package/src/formatting/AbstractNumbering.ts +4 -2
- package/src/formatting/NumberingLevel.ts +50 -12
- package/src/formatting/NumberingManager.ts +32 -3
- package/src/formatting/Style.ts +14 -0
- package/src/formatting/StylesManager.ts +29 -2
- package/src/helpers/CleanupHelper.ts +122 -30
- package/src/images/ImageOptimizer.ts +64 -5
- package/src/index.ts +7 -0
- package/src/internal.ts +1 -0
- package/src/processors/CompatibilityUpgrader.ts +15 -2
- package/src/processors/InMemoryRevisionAcceptor.ts +276 -17
- package/src/processors/RevisionWalker.ts +390 -46
- package/src/processors/SelectiveRevisionAcceptor.ts +164 -28
- package/src/processors/acceptRevisions.ts +67 -17
- package/src/processors/cnfStyleDecoder.ts +18 -12
- package/src/processors/stripTrackedChanges.ts +47 -10
- package/src/utils/deepClone.ts +48 -14
- package/src/utils/units.ts +3 -1
- package/src/utils/validation.ts +30 -32
- package/src/utils/xmlSanitization.ts +218 -22
- package/src/validation/RevisionAutoFixer.ts +109 -65
- package/src/validation/RevisionValidator.ts +48 -23
- package/src/xml/XMLBuilder.ts +82 -22
- package/src/xml/XMLParser.ts +87 -20
- package/src/zip/ZipHandler.ts +61 -21
- package/src/zip/ZipReader.ts +135 -13
- package/src/zip/errors.ts +15 -0
- package/src/zip/types.ts +44 -2
|
@@ -3,14 +3,19 @@
|
|
|
3
3
|
* Converts structured data to OpenXML format
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { AlternateContent } from '../elements/AlternateContent.js';
|
|
6
7
|
import { CommentManager } from '../elements/CommentManager.js';
|
|
8
|
+
import { CustomXmlBlock } from '../elements/CustomXml.js';
|
|
7
9
|
import { EndnoteManager } from '../elements/EndnoteManager.js';
|
|
8
10
|
import { FontManager } from '../elements/FontManager.js';
|
|
9
11
|
import { FootnoteManager } from '../elements/FootnoteManager.js';
|
|
10
12
|
import { HeaderFooterManager } from '../elements/HeaderFooterManager.js';
|
|
11
13
|
import { Hyperlink } from '../elements/Hyperlink.js';
|
|
12
14
|
import { ImageManager } from '../elements/ImageManager.js';
|
|
15
|
+
import { ImageRun } from '../elements/ImageRun.js';
|
|
16
|
+
import { MathParagraph } from '../elements/MathElement.js';
|
|
13
17
|
import { Paragraph } from '../elements/Paragraph.js';
|
|
18
|
+
import { RegisteredBodyElement } from '../elements/RegisteredBodyElement.js';
|
|
14
19
|
import { Revision } from '../elements/Revision.js';
|
|
15
20
|
import { isHyperlinkContent } from '../elements/RevisionContent.js';
|
|
16
21
|
import { Section } from '../elements/Section.js';
|
|
@@ -102,6 +107,7 @@ export class DocumentGenerator {
|
|
|
102
107
|
themeColor?: string;
|
|
103
108
|
themeTint?: string;
|
|
104
109
|
themeShade?: string;
|
|
110
|
+
rawInnerXml?: string;
|
|
105
111
|
}
|
|
106
112
|
): string {
|
|
107
113
|
const logger = getLogger();
|
|
@@ -127,7 +133,21 @@ export class DocumentGenerator {
|
|
|
127
133
|
if (documentBackground.themeColor) bgAttrs['w:themeColor'] = documentBackground.themeColor;
|
|
128
134
|
if (documentBackground.themeTint) bgAttrs['w:themeTint'] = documentBackground.themeTint;
|
|
129
135
|
if (documentBackground.themeShade) bgAttrs['w:themeShade'] = documentBackground.themeShade;
|
|
130
|
-
|
|
136
|
+
// Picture/gradient/texture page backgrounds carry a v:background child
|
|
137
|
+
// (ECMA-376 §17.2.1) preserved verbatim from parse; emit the expanded
|
|
138
|
+
// element form so the fill survives the round-trip. Flat-color
|
|
139
|
+
// backgrounds stay self-closing.
|
|
140
|
+
if (documentBackground.rawInnerXml) {
|
|
141
|
+
preBodyContent = [
|
|
142
|
+
{
|
|
143
|
+
name: 'w:background',
|
|
144
|
+
attributes: bgAttrs,
|
|
145
|
+
rawXml: documentBackground.rawInnerXml,
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
} else {
|
|
149
|
+
preBodyContent = [XMLBuilder.wSelf('background', bgAttrs)];
|
|
150
|
+
}
|
|
131
151
|
}
|
|
132
152
|
|
|
133
153
|
const result = XMLBuilder.createDocument(bodyXmls, namespaces, preBodyContent);
|
|
@@ -468,8 +488,9 @@ ${properties}
|
|
|
468
488
|
}
|
|
469
489
|
|
|
470
490
|
// CustomXML entries — enumerate dynamically to handle multiple parts (item1, item2, etc.)
|
|
491
|
+
// Case-insensitive match: Word writes 'customXml/' but other producers vary casing
|
|
471
492
|
for (const file of zipHandler.getFilePaths?.() || []) {
|
|
472
|
-
if (file.startsWith('
|
|
493
|
+
if (file.toLowerCase().startsWith('customxml/item') && file.endsWith('.xml')) {
|
|
473
494
|
if (file.includes('Props')) {
|
|
474
495
|
generatedOverrides.add(
|
|
475
496
|
`/${file}|application/vnd.openxmlformats-officedocument.customXmlProperties+xml`
|
|
@@ -483,7 +504,19 @@ ${properties}
|
|
|
483
504
|
// Merge with original entries, but ONLY keep overrides for files that actually exist
|
|
484
505
|
// This prevents corruption when headers/footers are removed but their Content_Types entries
|
|
485
506
|
// from the original document would otherwise be preserved
|
|
486
|
-
|
|
507
|
+
|
|
508
|
+
// OPC allows at most one Default per extension (compared case-insensitively),
|
|
509
|
+
// so dedupe by extension rather than the full "ext|mimetype" string — a producer
|
|
510
|
+
// that declared a different-but-valid MIME (e.g. image/emf vs image/x-emf) must
|
|
511
|
+
// not yield duplicate <Default> elements. The original document's declared
|
|
512
|
+
// content type wins to preserve round-trip fidelity.
|
|
513
|
+
const allDefaults = new Map<string, string>();
|
|
514
|
+
for (const entry of [...(originalContentTypes?.defaults || []), ...generatedDefaults]) {
|
|
515
|
+
const ext = (entry.split('|')[0] || '').toLowerCase();
|
|
516
|
+
if (!allDefaults.has(ext)) {
|
|
517
|
+
allDefaults.set(ext, entry);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
487
520
|
|
|
488
521
|
// filesInArchive was created earlier (line 318) for header/footer validation
|
|
489
522
|
// Reuse it here to filter original overrides as well
|
|
@@ -500,14 +533,23 @@ ${properties}
|
|
|
500
533
|
}
|
|
501
534
|
}
|
|
502
535
|
|
|
503
|
-
|
|
536
|
+
// Same OPC constraint for Overrides: at most one per part name. The original
|
|
537
|
+
// document's declared content type wins (e.g. a macro-enabled main part must
|
|
538
|
+
// not be downgraded to the standard wordprocessingml content type).
|
|
539
|
+
const allOverrides = new Map<string, string>();
|
|
540
|
+
for (const entry of [...filteredOriginalOverrides, ...generatedOverrides]) {
|
|
541
|
+
const partName = (entry.split('|')[0] || '').toLowerCase();
|
|
542
|
+
if (!allOverrides.has(partName)) {
|
|
543
|
+
allOverrides.set(partName, entry);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
504
546
|
|
|
505
547
|
// Build XML from merged sets
|
|
506
548
|
let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
|
|
507
549
|
xml += '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">\n';
|
|
508
550
|
|
|
509
551
|
// Add all default entries (escape attribute values for security)
|
|
510
|
-
for (const entry of allDefaults) {
|
|
552
|
+
for (const entry of allDefaults.values()) {
|
|
511
553
|
const parts = entry.split('|');
|
|
512
554
|
const ext = parts[0] || '';
|
|
513
555
|
const contentType = parts[1] || '';
|
|
@@ -517,7 +559,7 @@ ${properties}
|
|
|
517
559
|
}
|
|
518
560
|
|
|
519
561
|
// Add all override entries (escape attribute values for security)
|
|
520
|
-
for (const entry of allOverrides) {
|
|
562
|
+
for (const entry of allOverrides.values()) {
|
|
521
563
|
const parts = entry.split('|');
|
|
522
564
|
const partName = parts[0] || '';
|
|
523
565
|
const contentType = parts[1] || '';
|
|
@@ -549,6 +591,33 @@ ${properties}
|
|
|
549
591
|
// Step 1: Collect all relationship IDs currently used by hyperlinks
|
|
550
592
|
const usedRelIds = new Set<string>();
|
|
551
593
|
|
|
594
|
+
// Helper to extract r:id references from raw XML passthrough strings
|
|
595
|
+
const collectRelIds = (rawXml: string): void => {
|
|
596
|
+
const rIdPattern = /r:id="(rId\d+)"/g;
|
|
597
|
+
let rIdMatch: RegExpExecArray | null;
|
|
598
|
+
while ((rIdMatch = rIdPattern.exec(rawXml)) !== null) {
|
|
599
|
+
usedRelIds.add(rIdMatch[1]!);
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
// Helper to scan an image run's raw passthrough for r:id references.
|
|
604
|
+
// Clickable images carry <a:hlinkClick r:id=".."/> only in these slots
|
|
605
|
+
// (captured run XML, wp:docPr / pic:cNvPr extras) — never as a Hyperlink
|
|
606
|
+
// instance — so they must be scanned to keep the relationship alive.
|
|
607
|
+
const scanImageRun = (imageRun: ImageRun): void => {
|
|
608
|
+
const rawRunXml = imageRun.getRawRunXml();
|
|
609
|
+
if (rawRunXml) {
|
|
610
|
+
collectRelIds(rawRunXml);
|
|
611
|
+
}
|
|
612
|
+
const image = imageRun.getImageElement();
|
|
613
|
+
for (const slot of ['docPr-extra', 'cNvPr-extra']) {
|
|
614
|
+
const slotXml = image._getRawPassthrough(slot);
|
|
615
|
+
if (slotXml) {
|
|
616
|
+
collectRelIds(slotXml);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
|
|
552
621
|
// Helper to scan paragraphs for hyperlink relationship IDs
|
|
553
622
|
const scanParagraph = (para: Paragraph) => {
|
|
554
623
|
for (const item of para.getContent()) {
|
|
@@ -571,16 +640,19 @@ ${properties}
|
|
|
571
640
|
}
|
|
572
641
|
}
|
|
573
642
|
}
|
|
643
|
+
// Image runs inside tracked insertions can be clickable too
|
|
644
|
+
if (revContent instanceof ImageRun) {
|
|
645
|
+
scanImageRun(revContent);
|
|
646
|
+
}
|
|
574
647
|
}
|
|
575
648
|
}
|
|
649
|
+
// Image runs may reference hyperlink relationships via hlinkClick
|
|
650
|
+
if (item instanceof ImageRun) {
|
|
651
|
+
scanImageRun(item);
|
|
652
|
+
}
|
|
576
653
|
// PreservedElements (raw XML passthrough) may contain r:id references
|
|
577
654
|
if (item instanceof PreservedElement) {
|
|
578
|
-
|
|
579
|
-
const rIdPattern = /r:id="(rId\d+)"/g;
|
|
580
|
-
let rIdMatch: RegExpExecArray | null;
|
|
581
|
-
while ((rIdMatch = rIdPattern.exec(rawXml)) !== null) {
|
|
582
|
-
usedRelIds.add(rIdMatch[1]!);
|
|
583
|
-
}
|
|
655
|
+
collectRelIds(item.getRawXml());
|
|
584
656
|
}
|
|
585
657
|
}
|
|
586
658
|
};
|
|
@@ -606,11 +678,7 @@ ${properties}
|
|
|
606
678
|
// Scan raw nested content (nested tables, SDTs stored as raw XML)
|
|
607
679
|
// Extract any relationship IDs referenced in the raw XML to prevent orphan removal
|
|
608
680
|
for (const nested of cell.getRawNestedContent()) {
|
|
609
|
-
|
|
610
|
-
let rIdMatch: RegExpExecArray | null;
|
|
611
|
-
while ((rIdMatch = rIdPattern.exec(nested.xml)) !== null) {
|
|
612
|
-
usedRelIds.add(rIdMatch[1]!);
|
|
613
|
-
}
|
|
681
|
+
collectRelIds(nested.xml);
|
|
614
682
|
}
|
|
615
683
|
}
|
|
616
684
|
}
|
|
@@ -621,6 +689,17 @@ ${properties}
|
|
|
621
689
|
for (const item of content) {
|
|
622
690
|
scanElement(item); // Recursive call handles nested structures
|
|
623
691
|
}
|
|
692
|
+
} else if (
|
|
693
|
+
element instanceof AlternateContent ||
|
|
694
|
+
element instanceof MathParagraph ||
|
|
695
|
+
element instanceof CustomXmlBlock ||
|
|
696
|
+
element instanceof PreservedElement ||
|
|
697
|
+
element instanceof RegisteredBodyElement
|
|
698
|
+
) {
|
|
699
|
+
// Raw-XML body blocks (mc:AlternateContent drawings, math, custom XML,
|
|
700
|
+
// altChunk, registry-handled elements) are re-emitted verbatim and may
|
|
701
|
+
// reference hyperlink relationships via r:id — keep those rIds alive.
|
|
702
|
+
collectRelIds(element.getRawXml());
|
|
624
703
|
}
|
|
625
704
|
// TableOfContentsElement is for programmatic TOCs - real TOCs come as SDTs
|
|
626
705
|
};
|
|
@@ -1043,9 +1122,17 @@ ${properties}
|
|
|
1043
1122
|
xml += `
|
|
1044
1123
|
<w:defaultTabStop w:val="720"/>
|
|
1045
1124
|
<w:characterSpacingControl w:val="doNotCompress"/>
|
|
1046
|
-
<w:updateFields w:val="true"
|
|
1125
|
+
<w:updateFields w:val="true"/>
|
|
1126
|
+
<w:compat>
|
|
1127
|
+
<w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="15"/>
|
|
1128
|
+
<w:compatSetting w:name="overrideTableStyleFontSizeAndJustification" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1129
|
+
<w:compatSetting w:name="enableOpenTypeFeatures" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1130
|
+
<w:compatSetting w:name="doNotFlipMirrorIndents" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1131
|
+
<w:compatSetting w:name="differentiateMultirowTableHeaders" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1132
|
+
</w:compat>`;
|
|
1047
1133
|
|
|
1048
|
-
// RSIDs (Revision Save IDs)
|
|
1134
|
+
// RSIDs (Revision Save IDs) — CT_Settings sequence places w:rsids (#83)
|
|
1135
|
+
// after w:compat (#81), matching the loaded-document merge path
|
|
1049
1136
|
if (trackChangesSettings?.rsids && trackChangesSettings.rsids.length > 0) {
|
|
1050
1137
|
xml += '\n <w:rsids>';
|
|
1051
1138
|
if (trackChangesSettings.rsidRoot) {
|
|
@@ -1058,13 +1145,6 @@ ${properties}
|
|
|
1058
1145
|
}
|
|
1059
1146
|
|
|
1060
1147
|
xml += `
|
|
1061
|
-
<w:compat>
|
|
1062
|
-
<w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="15"/>
|
|
1063
|
-
<w:compatSetting w:name="overrideTableStyleFontSizeAndJustification" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1064
|
-
<w:compatSetting w:name="enableOpenTypeFeatures" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1065
|
-
<w:compatSetting w:name="doNotFlipMirrorIndents" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1066
|
-
<w:compatSetting w:name="differentiateMultirowTableHeaders" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
|
|
1067
|
-
</w:compat>
|
|
1068
1148
|
<w:themeFontLang w:val="en-US"/>
|
|
1069
1149
|
<w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/>
|
|
1070
1150
|
</w:settings>`;
|