@yinyoudexing/xml2word 0.1.4 → 0.1.6
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/dist/{createDocxZip-BWHSZ7VQ.js → createDocxZip-BVX7SQOB.js} +85 -12
- package/dist/{createDocxZip-BWHSZ7VQ.js.map → createDocxZip-BVX7SQOB.js.map} +1 -1
- package/dist/{htmlToWordBodyXml-SIVUZ7K7.js → htmlToWordBodyXml-VH5U3L5J.js} +261 -62
- package/dist/htmlToWordBodyXml-VH5U3L5J.js.map +1 -0
- package/dist/index.cjs +392 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.js +51 -7
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/htmlToWordBodyXml-SIVUZ7K7.js.map +0 -1
|
@@ -11,7 +11,38 @@ function ensureXmlDeclaration(xml) {
|
|
|
11
11
|
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
12
12
|
${xml}`;
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
function resolvePageSetupTwips(page) {
|
|
15
|
+
const size = page?.size;
|
|
16
|
+
const defaultSize = { widthTwips: 11906, heightTwips: 16838 };
|
|
17
|
+
const resolvedSize = typeof size === "object" && size && "widthTwips" in size && "heightTwips" in size ? { widthTwips: Math.round(size.widthTwips), heightTwips: Math.round(size.heightTwips) } : size === "Letter" ? { widthTwips: 12240, heightTwips: 15840 } : size === "Letter_Landscape" ? { widthTwips: 15840, heightTwips: 12240 } : size === "A4_Landscape" ? { widthTwips: 16838, heightTwips: 11906 } : defaultSize;
|
|
18
|
+
const defaultMargins = {
|
|
19
|
+
top: 1440,
|
|
20
|
+
right: 1440,
|
|
21
|
+
bottom: 1440,
|
|
22
|
+
left: 1440,
|
|
23
|
+
header: 708,
|
|
24
|
+
footer: 708,
|
|
25
|
+
gutter: 0
|
|
26
|
+
};
|
|
27
|
+
const m = page?.marginTwips;
|
|
28
|
+
const margins = typeof m === "number" ? { ...defaultMargins, top: m, right: m, bottom: m, left: m } : m ? {
|
|
29
|
+
...defaultMargins,
|
|
30
|
+
top: m.top ?? defaultMargins.top,
|
|
31
|
+
right: m.right ?? defaultMargins.right,
|
|
32
|
+
bottom: m.bottom ?? defaultMargins.bottom,
|
|
33
|
+
left: m.left ?? defaultMargins.left,
|
|
34
|
+
header: m.header ?? defaultMargins.header,
|
|
35
|
+
footer: m.footer ?? defaultMargins.footer,
|
|
36
|
+
gutter: m.gutter ?? defaultMargins.gutter
|
|
37
|
+
} : defaultMargins;
|
|
38
|
+
return {
|
|
39
|
+
pageWidthTwips: Math.max(1, Math.round(resolvedSize.widthTwips)),
|
|
40
|
+
pageHeightTwips: Math.max(1, Math.round(resolvedSize.heightTwips)),
|
|
41
|
+
margins
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function wrapBodyXml(bodyXml, page) {
|
|
45
|
+
const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);
|
|
15
46
|
const xml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
16
47
|
<w:document
|
|
17
48
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
@@ -22,10 +53,9 @@ ${bodyXml}
|
|
|
22
53
|
<w:sectPr>
|
|
23
54
|
<w:headerReference w:type="default" r:id="rId6"/>
|
|
24
55
|
<w:footerReference w:type="default" r:id="rId7"/>
|
|
25
|
-
<w:pgSz w:w="
|
|
26
|
-
<w:pgMar w:top="
|
|
56
|
+
<w:pgSz w:w="${pageWidthTwips}" w:h="${pageHeightTwips}"/>
|
|
57
|
+
<w:pgMar w:top="${margins.top}" w:right="${margins.right}" w:bottom="${margins.bottom}" w:left="${margins.left}" w:header="${margins.header}" w:footer="${margins.footer}" w:gutter="${margins.gutter}"/>
|
|
27
58
|
<w:cols w:space="708"/>
|
|
28
|
-
<w:docGrid w:linePitch="360"/>
|
|
29
59
|
</w:sectPr>
|
|
30
60
|
</w:body>
|
|
31
61
|
</w:document>
|
|
@@ -42,7 +72,50 @@ function ensureWordNamespace(xml) {
|
|
|
42
72
|
`<w:document xmlns:w="${WORD_MAIN_NS}"`
|
|
43
73
|
);
|
|
44
74
|
}
|
|
45
|
-
function
|
|
75
|
+
function applyPageSetupToDocumentXml(xml, page) {
|
|
76
|
+
if (!page) return xml;
|
|
77
|
+
const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);
|
|
78
|
+
const pgSzTag = `<w:pgSz w:w="${pageWidthTwips}" w:h="${pageHeightTwips}"/>`;
|
|
79
|
+
const pgMarTag = `<w:pgMar w:top="${margins.top}" w:right="${margins.right}" w:bottom="${margins.bottom}" w:left="${margins.left}" w:header="${margins.header}" w:footer="${margins.footer}" w:gutter="${margins.gutter}"/>`;
|
|
80
|
+
const sectPrRegex = /<w:sectPr\b[^>]*>[\s\S]*?<\/w:sectPr>/g;
|
|
81
|
+
const hasSectPr = sectPrRegex.test(xml);
|
|
82
|
+
if (!hasSectPr) {
|
|
83
|
+
const insertAt = xml.lastIndexOf("</w:body>");
|
|
84
|
+
if (insertAt < 0) return xml;
|
|
85
|
+
const sectPr = `
|
|
86
|
+
<w:sectPr>
|
|
87
|
+
${pgSzTag}
|
|
88
|
+
${pgMarTag}
|
|
89
|
+
<w:cols w:space="708"/>
|
|
90
|
+
</w:sectPr>
|
|
91
|
+
`;
|
|
92
|
+
return xml.slice(0, insertAt) + sectPr + xml.slice(insertAt);
|
|
93
|
+
}
|
|
94
|
+
return xml.replace(sectPrRegex, (sect) => {
|
|
95
|
+
let out = sect;
|
|
96
|
+
const insertTag = (tag) => {
|
|
97
|
+
const headerFooterRegex = /<w:(?:headerReference|footerReference)\b[^>]*\/>/g;
|
|
98
|
+
let last = null;
|
|
99
|
+
let m;
|
|
100
|
+
while (m = headerFooterRegex.exec(out)) last = m;
|
|
101
|
+
const open = out.match(/<w:sectPr\b[^>]*>/);
|
|
102
|
+
const insertPos = last ? last.index + last[0].length : open ? open[0].length : 0;
|
|
103
|
+
out = out.slice(0, insertPos) + tag + out.slice(insertPos);
|
|
104
|
+
};
|
|
105
|
+
if (/<w:pgSz\b[^>]*\/>/.test(out)) {
|
|
106
|
+
out = out.replace(/<w:pgSz\b[^>]*\/>/g, pgSzTag);
|
|
107
|
+
} else {
|
|
108
|
+
insertTag(pgSzTag);
|
|
109
|
+
}
|
|
110
|
+
if (/<w:pgMar\b[^>]*\/>/.test(out)) {
|
|
111
|
+
out = out.replace(/<w:pgMar\b[^>]*\/>/g, pgMarTag);
|
|
112
|
+
} else {
|
|
113
|
+
insertTag(pgMarTag);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function normalizeDocumentXml(xml, inputKind, page) {
|
|
46
119
|
const trimmed = xml.trim();
|
|
47
120
|
if (!trimmed) {
|
|
48
121
|
throw new Error("XML is empty.");
|
|
@@ -53,16 +126,16 @@ function normalizeDocumentXml(xml, inputKind) {
|
|
|
53
126
|
if (!hasWordDocumentRoot(withNs)) {
|
|
54
127
|
throw new Error('inputKind="document" requires a <w:document> root.');
|
|
55
128
|
}
|
|
56
|
-
return withNs;
|
|
129
|
+
return applyPageSetupToDocumentXml(withNs, page);
|
|
57
130
|
}
|
|
58
131
|
if (inputKind === "body") {
|
|
59
|
-
return wrapBodyXml(trimmed);
|
|
132
|
+
return wrapBodyXml(trimmed, page);
|
|
60
133
|
}
|
|
61
134
|
if (hasWordDocumentRoot(trimmed)) {
|
|
62
135
|
const withDecl = ensureXmlDeclaration(trimmed);
|
|
63
|
-
return ensureWordNamespace(withDecl);
|
|
136
|
+
return applyPageSetupToDocumentXml(ensureWordNamespace(withDecl), page);
|
|
64
137
|
}
|
|
65
|
-
return wrapBodyXml(trimmed);
|
|
138
|
+
return wrapBodyXml(trimmed, page);
|
|
66
139
|
}
|
|
67
140
|
|
|
68
141
|
// src/lib/validateXml.ts
|
|
@@ -447,7 +520,7 @@ ${relLines}
|
|
|
447
520
|
`;
|
|
448
521
|
}
|
|
449
522
|
async function createDocxZipUint8Array(xml, options = {}) {
|
|
450
|
-
const documentXml = normalizeDocumentXml(xml, options.inputKind ?? "auto");
|
|
523
|
+
const documentXml = normalizeDocumentXml(xml, options.inputKind ?? "auto", options.page);
|
|
451
524
|
validateXmlIfNeeded(documentXml, options.validateXml ?? true);
|
|
452
525
|
const zip = new JSZip();
|
|
453
526
|
zip.file("[Content_Types].xml", buildContentTypesXml([]));
|
|
@@ -467,7 +540,7 @@ async function createDocxZipUint8Array(xml, options = {}) {
|
|
|
467
540
|
return zip.generateAsync({ type: "uint8array" });
|
|
468
541
|
}
|
|
469
542
|
async function createDocxZipWithAssetsUint8Array(xml, options, assets) {
|
|
470
|
-
const documentXml = normalizeDocumentXml(xml, options.inputKind ?? "auto");
|
|
543
|
+
const documentXml = normalizeDocumentXml(xml, options.inputKind ?? "auto", options.page);
|
|
471
544
|
validateXmlIfNeeded(documentXml, options.validateXml ?? true);
|
|
472
545
|
const zip = new JSZip();
|
|
473
546
|
zip.file("[Content_Types].xml", buildContentTypesXml(assets));
|
|
@@ -497,4 +570,4 @@ export {
|
|
|
497
570
|
createDocxZipUint8Array,
|
|
498
571
|
createDocxZipWithAssetsUint8Array
|
|
499
572
|
};
|
|
500
|
-
//# sourceMappingURL=createDocxZip-
|
|
573
|
+
//# sourceMappingURL=createDocxZip-BVX7SQOB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/createDocxZip.ts","../src/lib/normalizeDocumentXml.ts","../src/lib/validateXml.ts"],"sourcesContent":["import JSZip from \"jszip\";\nimport type { XmlToDocxOptions } from \"../index.js\";\nimport { normalizeDocumentXml } from \"./normalizeDocumentXml.js\";\nimport { validateXmlIfNeeded } from \"./validateXml.js\";\n\nexport type DocxAsset = {\n relationshipId: string;\n relationshipType: string;\n target: string;\n data: Uint8Array;\n contentType?: string;\n};\n\nconst STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\">\n <w:name w:val=\"Normal\"/>\n <w:qFormat/>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\n <w:name w:val=\"heading 1\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"0\"/>\n <w:spacing w:before=\"240\" w:after=\"120\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"44\"/>\n <w:szCs w:val=\"44\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\n <w:name w:val=\"heading 2\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"1\"/>\n <w:spacing w:before=\"200\" w:after=\"100\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"32\"/>\n <w:szCs w:val=\"32\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\n <w:name w:val=\"heading 3\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"2\"/>\n <w:spacing w:before=\"180\" w:after=\"90\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\n <w:name w:val=\"heading 4\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"3\"/>\n <w:spacing w:before=\"160\" w:after=\"80\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"24\"/>\n <w:szCs w:val=\"24\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\n <w:name w:val=\"heading 5\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"4\"/>\n <w:spacing w:before=\"140\" w:after=\"70\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\n <w:name w:val=\"heading 6\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"5\"/>\n <w:spacing w:before=\"120\" w:after=\"60\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n</w:styles>\n`;\n\nconst SETTINGS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:settings xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:themeFontLang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n <w:defaultTabStop w:val=\"720\"/>\n <w:compat/>\n</w:settings>\n`;\n\nconst NUMBERING_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:abstractNum w:abstractNumId=\"1\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"•\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"○\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"■\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:abstractNum w:abstractNumId=\"2\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.%3.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"1\"/></w:num>\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"2\"/></w:num>\n</w:numbering>\n`;\n\nconst HEADER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:hdr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"center\"/></w:pPr>\n <w:r><w:t></w:t></w:r>\n </w:p>\n</w:hdr>\n`;\n\nconst FOOTER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:ftr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"right\"/></w:pPr>\n <w:r><w:t>第 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> PAGE </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页 / 共 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> NUMPAGES </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页</w:t></w:r>\n </w:p>\n</w:ftr>\n`;\n\nconst THEME_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\">\n <a:themeElements>\n <a:clrScheme name=\"Office\">\n <a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n <a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n <a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2>\n <a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2>\n <a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1>\n <a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2>\n <a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3>\n <a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4>\n <a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5>\n <a:accent6><a:srgbClr val=\"F79646\"/></a:accent6>\n <a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink>\n <a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink>\n </a:clrScheme>\n <a:fontScheme name=\"Office\">\n <a:majorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:majorFont>\n <a:minorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:minorFont>\n </a:fontScheme>\n <a:fmtScheme name=\"Office\">\n <a:fillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n </a:fillStyleLst>\n <a:lnStyleLst>\n <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n </a:lnStyleLst>\n <a:effectStyleLst>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n </a:effectStyleLst>\n <a:bgFillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n </a:bgFillStyleLst>\n </a:fmtScheme>\n </a:themeElements>\n <a:objectDefaults/>\n <a:extraClrSchemeLst/>\n</a:theme>\n`;\n\nconst FONT_TABLE_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:fonts xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:font w:name=\"Times New Roman\">\n <w:charset w:val=\"00\"/>\n <w:family w:val=\"roman\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n <w:font w:name=\"FangSong_GB2312\">\n <w:charset w:val=\"86\"/>\n <w:family w:val=\"auto\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n</w:fonts>\n`;\n\nfunction buildContentTypesXml(assets: DocxAsset[]): string {\n const defaults = new Map<string, string>();\n defaults.set(\"rels\", \"application/vnd.openxmlformats-package.relationships+xml\");\n defaults.set(\"xml\", \"application/xml\");\n\n for (const asset of assets) {\n if (!asset.contentType) continue;\n const extMatch = asset.target.match(/\\.([a-zA-Z0-9]+)$/);\n if (!extMatch) continue;\n const ext = extMatch[1].toLowerCase();\n defaults.set(ext, asset.contentType);\n }\n\n const defaultLines = [...defaults.entries()]\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([ext, ct]) => ` <Default Extension=\"${ext}\" ContentType=\"${ct}\"/>`)\n .join(\"\\n\");\n\n const overrides = [\n ' <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>',\n ' <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>',\n ' <Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/>',\n ' <Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>',\n ' <Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/>',\n ' <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>',\n ' <Override PartName=\"/word/header1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\"/>',\n ' <Override PartName=\"/word/footer1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\"/>',\n ].join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\\n${defaultLines}\\n${overrides}\\n</Types>\\n`;\n}\n\nconst ROOT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\"\n Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n Target=\"word/document.xml\"/>\n</Relationships>\n`;\n\nfunction buildDocumentRelsXml(assets: DocxAsset[]): string {\n const relLines = [\n ' <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>',\n ' <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/>',\n ' <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>',\n ' <Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\"/>',\n ' <Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>',\n ' <Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\" Target=\"header1.xml\"/>',\n ' <Relationship Id=\"rId7\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\" Target=\"footer1.xml\"/>',\n ...assets.map(\n (a) =>\n ` <Relationship Id=\"${a.relationshipId}\" Type=\"${a.relationshipType}\" Target=\"${a.target}\"/>`,\n ),\n ].join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n${relLines}\\n</Relationships>\\n`;\n}\n\nexport async function createDocxZipUint8Array(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\");\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml([]));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml([]));\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n\nexport async function createDocxZipWithAssetsUint8Array(\n xml: string,\n options: XmlToDocxOptions,\n assets: DocxAsset[],\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\");\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml(assets));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml(assets));\n\n if (assets.length) {\n for (const asset of assets) {\n const targetPath = asset.target.replace(/^\\.\\//, \"\");\n const normalized = targetPath.startsWith(\"word/\") ? targetPath.slice(\"word/\".length) : targetPath;\n wordFolder?.file(normalized, asset.data);\n }\n }\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n","import type { XmlToDocxInputKind } from \"../index.js\";\n\nconst WORD_MAIN_NS = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\";\n\nfunction hasWordDocumentRoot(xml: string): boolean {\n return /<w:document[\\s>]/.test(xml);\n}\n\nfunction ensureXmlDeclaration(xml: string): string {\n if (/^\\s*<\\?xml\\b/.test(xml)) return xml;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${xml}`;\n}\n\nfunction wrapBodyXml(bodyXml: string): string {\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n>\n <w:body>\n${bodyXml}\n <w:sectPr>\n <w:headerReference w:type=\"default\" r:id=\"rId6\"/>\n <w:footerReference w:type=\"default\" r:id=\"rId7\"/>\n <w:pgSz w:w=\"12240\" w:h=\"15840\"/>\n <w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\" w:header=\"708\" w:footer=\"708\" w:gutter=\"0\"/>\n <w:cols w:space=\"708\"/>\n <w:docGrid w:linePitch=\"360\"/>\n </w:sectPr>\n </w:body>\n</w:document>\n`;\n return xml;\n}\n\nfunction ensureWordNamespace(xml: string): string {\n const hasWNamespace =\n /xmlns:w\\s*=\\s*[\"']http:\\/\\/schemas\\.openxmlformats\\.org\\/wordprocessingml\\/2006\\/main[\"']/.test(\n xml,\n );\n if (hasWNamespace) return xml;\n\n return xml.replace(\n /<w:document\\b/,\n `<w:document xmlns:w=\"${WORD_MAIN_NS}\"`,\n );\n}\n\nexport function normalizeDocumentXml(xml: string, inputKind: XmlToDocxInputKind): string {\n const trimmed = xml.trim();\n if (!trimmed) {\n throw new Error(\"XML is empty.\");\n }\n\n if (inputKind === \"document\") {\n const withDecl = ensureXmlDeclaration(trimmed);\n const withNs = ensureWordNamespace(withDecl);\n if (!hasWordDocumentRoot(withNs)) {\n throw new Error('inputKind=\"document\" requires a <w:document> root.');\n }\n return withNs;\n }\n\n if (inputKind === \"body\") {\n return wrapBodyXml(trimmed);\n }\n\n if (hasWordDocumentRoot(trimmed)) {\n const withDecl = ensureXmlDeclaration(trimmed);\n return ensureWordNamespace(withDecl);\n }\n\n return wrapBodyXml(trimmed);\n}\n","import { XMLValidator } from \"fast-xml-parser\";\n\nexport function validateXmlIfNeeded(xml: string, validateXml: boolean): void {\n if (!validateXml) return;\n\n const result = XMLValidator.validate(xml);\n if (result === true) return;\n\n const err = (result as { err?: { msg?: string; line?: number; col?: number } }).err;\n const msg = err?.msg ?? \"Invalid XML.\";\n const line = err?.line;\n const col = err?.col;\n\n const location =\n typeof line === \"number\" && typeof col === \"number\" ? ` (line ${line}, col ${col})` : \"\";\n throw new Error(`${msg}${location}`);\n}\n\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/createDocxZip.ts","../src/lib/normalizeDocumentXml.ts","../src/lib/validateXml.ts"],"sourcesContent":["import JSZip from \"jszip\";\nimport type { XmlToDocxOptions } from \"../index.js\";\nimport { normalizeDocumentXml } from \"./normalizeDocumentXml.js\";\nimport { validateXmlIfNeeded } from \"./validateXml.js\";\n\nexport type DocxAsset = {\n relationshipId: string;\n relationshipType: string;\n target: string;\n data: Uint8Array;\n contentType?: string;\n};\n\nconst STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\">\n <w:name w:val=\"Normal\"/>\n <w:qFormat/>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\n <w:name w:val=\"heading 1\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"0\"/>\n <w:spacing w:before=\"240\" w:after=\"120\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"44\"/>\n <w:szCs w:val=\"44\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\n <w:name w:val=\"heading 2\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"1\"/>\n <w:spacing w:before=\"200\" w:after=\"100\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"32\"/>\n <w:szCs w:val=\"32\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\n <w:name w:val=\"heading 3\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"2\"/>\n <w:spacing w:before=\"180\" w:after=\"90\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\n <w:name w:val=\"heading 4\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"3\"/>\n <w:spacing w:before=\"160\" w:after=\"80\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"24\"/>\n <w:szCs w:val=\"24\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\n <w:name w:val=\"heading 5\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"4\"/>\n <w:spacing w:before=\"140\" w:after=\"70\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\n <w:name w:val=\"heading 6\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"5\"/>\n <w:spacing w:before=\"120\" w:after=\"60\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n</w:styles>\n`;\n\nconst SETTINGS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:settings xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:themeFontLang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n <w:defaultTabStop w:val=\"720\"/>\n <w:compat/>\n</w:settings>\n`;\n\nconst NUMBERING_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:abstractNum w:abstractNumId=\"1\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"•\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"○\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"■\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:abstractNum w:abstractNumId=\"2\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.%3.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"1\"/></w:num>\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"2\"/></w:num>\n</w:numbering>\n`;\n\nconst HEADER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:hdr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"center\"/></w:pPr>\n <w:r><w:t></w:t></w:r>\n </w:p>\n</w:hdr>\n`;\n\nconst FOOTER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:ftr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"right\"/></w:pPr>\n <w:r><w:t>第 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> PAGE </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页 / 共 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> NUMPAGES </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页</w:t></w:r>\n </w:p>\n</w:ftr>\n`;\n\nconst THEME_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\">\n <a:themeElements>\n <a:clrScheme name=\"Office\">\n <a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n <a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n <a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2>\n <a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2>\n <a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1>\n <a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2>\n <a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3>\n <a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4>\n <a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5>\n <a:accent6><a:srgbClr val=\"F79646\"/></a:accent6>\n <a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink>\n <a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink>\n </a:clrScheme>\n <a:fontScheme name=\"Office\">\n <a:majorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:majorFont>\n <a:minorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:minorFont>\n </a:fontScheme>\n <a:fmtScheme name=\"Office\">\n <a:fillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n </a:fillStyleLst>\n <a:lnStyleLst>\n <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n </a:lnStyleLst>\n <a:effectStyleLst>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n </a:effectStyleLst>\n <a:bgFillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n </a:bgFillStyleLst>\n </a:fmtScheme>\n </a:themeElements>\n <a:objectDefaults/>\n <a:extraClrSchemeLst/>\n</a:theme>\n`;\n\nconst FONT_TABLE_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:fonts xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:font w:name=\"Times New Roman\">\n <w:charset w:val=\"00\"/>\n <w:family w:val=\"roman\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n <w:font w:name=\"FangSong_GB2312\">\n <w:charset w:val=\"86\"/>\n <w:family w:val=\"auto\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n</w:fonts>\n`;\n\nfunction buildContentTypesXml(assets: DocxAsset[]): string {\n const defaults = new Map<string, string>();\n defaults.set(\"rels\", \"application/vnd.openxmlformats-package.relationships+xml\");\n defaults.set(\"xml\", \"application/xml\");\n\n for (const asset of assets) {\n if (!asset.contentType) continue;\n const extMatch = asset.target.match(/\\.([a-zA-Z0-9]+)$/);\n if (!extMatch) continue;\n const ext = extMatch[1].toLowerCase();\n defaults.set(ext, asset.contentType);\n }\n\n const defaultLines = [...defaults.entries()]\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([ext, ct]) => ` <Default Extension=\"${ext}\" ContentType=\"${ct}\"/>`)\n .join(\"\\n\");\n\n const overrides = [\n ' <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>',\n ' <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>',\n ' <Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/>',\n ' <Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>',\n ' <Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/>',\n ' <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>',\n ' <Override PartName=\"/word/header1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\"/>',\n ' <Override PartName=\"/word/footer1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\"/>',\n ].join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\\n${defaultLines}\\n${overrides}\\n</Types>\\n`;\n}\n\nconst ROOT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\"\n Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n Target=\"word/document.xml\"/>\n</Relationships>\n`;\n\nfunction buildDocumentRelsXml(assets: DocxAsset[]): string {\n const relLines = [\n ' <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>',\n ' <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/>',\n ' <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>',\n ' <Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\"/>',\n ' <Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>',\n ' <Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\" Target=\"header1.xml\"/>',\n ' <Relationship Id=\"rId7\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\" Target=\"footer1.xml\"/>',\n ...assets.map(\n (a) =>\n ` <Relationship Id=\"${a.relationshipId}\" Type=\"${a.relationshipType}\" Target=\"${a.target}\"/>`,\n ),\n ].join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n${relLines}\\n</Relationships>\\n`;\n}\n\nexport async function createDocxZipUint8Array(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\", options.page);\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml([]));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml([]));\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n\nexport async function createDocxZipWithAssetsUint8Array(\n xml: string,\n options: XmlToDocxOptions,\n assets: DocxAsset[],\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\", options.page);\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml(assets));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml(assets));\n\n if (assets.length) {\n for (const asset of assets) {\n const targetPath = asset.target.replace(/^\\.\\//, \"\");\n const normalized = targetPath.startsWith(\"word/\") ? targetPath.slice(\"word/\".length) : targetPath;\n wordFolder?.file(normalized, asset.data);\n }\n }\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n","import type { DocxPageSetupOptions, XmlToDocxInputKind } from \"../index.js\";\n\nconst WORD_MAIN_NS = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\";\n\nfunction hasWordDocumentRoot(xml: string): boolean {\n return /<w:document[\\s>]/.test(xml);\n}\n\nfunction ensureXmlDeclaration(xml: string): string {\n if (/^\\s*<\\?xml\\b/.test(xml)) return xml;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${xml}`;\n}\n\nfunction resolvePageSetupTwips(page: DocxPageSetupOptions | undefined): {\n pageWidthTwips: number;\n pageHeightTwips: number;\n margins: { top: number; right: number; bottom: number; left: number; header: number; footer: number; gutter: number };\n} {\n const size = page?.size;\n const defaultSize = { widthTwips: 11906, heightTwips: 16838 };\n const resolvedSize =\n typeof size === \"object\" && size && \"widthTwips\" in size && \"heightTwips\" in size\n ? { widthTwips: Math.round(size.widthTwips), heightTwips: Math.round(size.heightTwips) }\n : size === \"Letter\"\n ? { widthTwips: 12240, heightTwips: 15840 }\n : size === \"Letter_Landscape\"\n ? { widthTwips: 15840, heightTwips: 12240 }\n : size === \"A4_Landscape\"\n ? { widthTwips: 16838, heightTwips: 11906 }\n : defaultSize;\n\n const defaultMargins = {\n top: 1440,\n right: 1440,\n bottom: 1440,\n left: 1440,\n header: 708,\n footer: 708,\n gutter: 0,\n };\n const m = page?.marginTwips;\n const margins =\n typeof m === \"number\"\n ? { ...defaultMargins, top: m, right: m, bottom: m, left: m }\n : m\n ? {\n ...defaultMargins,\n top: m.top ?? defaultMargins.top,\n right: m.right ?? defaultMargins.right,\n bottom: m.bottom ?? defaultMargins.bottom,\n left: m.left ?? defaultMargins.left,\n header: m.header ?? defaultMargins.header,\n footer: m.footer ?? defaultMargins.footer,\n gutter: m.gutter ?? defaultMargins.gutter,\n }\n : defaultMargins;\n\n return {\n pageWidthTwips: Math.max(1, Math.round(resolvedSize.widthTwips)),\n pageHeightTwips: Math.max(1, Math.round(resolvedSize.heightTwips)),\n margins,\n };\n}\n\nfunction wrapBodyXml(bodyXml: string, page: DocxPageSetupOptions | undefined): string {\n const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n>\n <w:body>\n${bodyXml}\n <w:sectPr>\n <w:headerReference w:type=\"default\" r:id=\"rId6\"/>\n <w:footerReference w:type=\"default\" r:id=\"rId7\"/>\n <w:pgSz w:w=\"${pageWidthTwips}\" w:h=\"${pageHeightTwips}\"/>\n <w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"${margins.header}\" w:footer=\"${margins.footer}\" w:gutter=\"${margins.gutter}\"/>\n <w:cols w:space=\"708\"/>\n </w:sectPr>\n </w:body>\n</w:document>\n`;\n return xml;\n}\n\nfunction ensureWordNamespace(xml: string): string {\n const hasWNamespace =\n /xmlns:w\\s*=\\s*[\"']http:\\/\\/schemas\\.openxmlformats\\.org\\/wordprocessingml\\/2006\\/main[\"']/.test(\n xml,\n );\n if (hasWNamespace) return xml;\n\n return xml.replace(\n /<w:document\\b/,\n `<w:document xmlns:w=\"${WORD_MAIN_NS}\"`,\n );\n}\n\nfunction applyPageSetupToDocumentXml(xml: string, page: DocxPageSetupOptions | undefined): string {\n if (!page) return xml;\n const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);\n const pgSzTag = `<w:pgSz w:w=\"${pageWidthTwips}\" w:h=\"${pageHeightTwips}\"/>`;\n const pgMarTag = `<w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"${margins.header}\" w:footer=\"${margins.footer}\" w:gutter=\"${margins.gutter}\"/>`;\n\n const sectPrRegex = /<w:sectPr\\b[^>]*>[\\s\\S]*?<\\/w:sectPr>/g;\n const hasSectPr = sectPrRegex.test(xml);\n if (!hasSectPr) {\n const insertAt = xml.lastIndexOf(\"</w:body>\");\n if (insertAt < 0) return xml;\n const sectPr =\n `\\n <w:sectPr>` +\n `\\n ${pgSzTag}` +\n `\\n ${pgMarTag}` +\n `\\n <w:cols w:space=\"708\"/>` +\n `\\n </w:sectPr>\\n`;\n return xml.slice(0, insertAt) + sectPr + xml.slice(insertAt);\n }\n\n return xml.replace(sectPrRegex, (sect) => {\n let out = sect;\n\n const insertTag = (tag: string) => {\n const headerFooterRegex = /<w:(?:headerReference|footerReference)\\b[^>]*\\/>/g;\n let last: RegExpExecArray | null = null;\n let m: RegExpExecArray | null;\n while ((m = headerFooterRegex.exec(out))) last = m;\n const open = out.match(/<w:sectPr\\b[^>]*>/);\n const insertPos = last ? last.index + last[0].length : open ? open[0].length : 0;\n out = out.slice(0, insertPos) + tag + out.slice(insertPos);\n };\n\n if (/<w:pgSz\\b[^>]*\\/>/.test(out)) {\n out = out.replace(/<w:pgSz\\b[^>]*\\/>/g, pgSzTag);\n } else {\n insertTag(pgSzTag);\n }\n\n if (/<w:pgMar\\b[^>]*\\/>/.test(out)) {\n out = out.replace(/<w:pgMar\\b[^>]*\\/>/g, pgMarTag);\n } else {\n insertTag(pgMarTag);\n }\n\n return out;\n });\n}\n\nexport function normalizeDocumentXml(\n xml: string,\n inputKind: XmlToDocxInputKind,\n page: DocxPageSetupOptions | undefined,\n): string {\n const trimmed = xml.trim();\n if (!trimmed) {\n throw new Error(\"XML is empty.\");\n }\n\n if (inputKind === \"document\") {\n const withDecl = ensureXmlDeclaration(trimmed);\n const withNs = ensureWordNamespace(withDecl);\n if (!hasWordDocumentRoot(withNs)) {\n throw new Error('inputKind=\"document\" requires a <w:document> root.');\n }\n return applyPageSetupToDocumentXml(withNs, page);\n }\n\n if (inputKind === \"body\") {\n return wrapBodyXml(trimmed, page);\n }\n\n if (hasWordDocumentRoot(trimmed)) {\n const withDecl = ensureXmlDeclaration(trimmed);\n return applyPageSetupToDocumentXml(ensureWordNamespace(withDecl), page);\n }\n\n return wrapBodyXml(trimmed, page);\n}\n","import { XMLValidator } from \"fast-xml-parser\";\n\nexport function validateXmlIfNeeded(xml: string, validateXml: boolean): void {\n if (!validateXml) return;\n\n const result = XMLValidator.validate(xml);\n if (result === true) return;\n\n const err = (result as { err?: { msg?: string; line?: number; col?: number } }).err;\n const msg = err?.msg ?? \"Invalid XML.\";\n const line = err?.line;\n const col = err?.col;\n\n const location =\n typeof line === \"number\" && typeof col === \"number\" ? ` (line ${line}, col ${col})` : \"\";\n throw new Error(`${msg}${location}`);\n}\n\n"],"mappings":"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","names":[]}
|