@yinyoudexing/xml2word 0.1.1 → 0.1.2

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.
@@ -0,0 +1,500 @@
1
+ // src/lib/createDocxZip.ts
2
+ import JSZip from "jszip";
3
+
4
+ // src/lib/normalizeDocumentXml.ts
5
+ var WORD_MAIN_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
6
+ function hasWordDocumentRoot(xml) {
7
+ return /<w:document[\s>]/.test(xml);
8
+ }
9
+ function ensureXmlDeclaration(xml) {
10
+ if (/^\s*<\?xml\b/.test(xml)) return xml;
11
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
12
+ ${xml}`;
13
+ }
14
+ function wrapBodyXml(bodyXml) {
15
+ const xml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
16
+ <w:document
17
+ xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
18
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
19
+ >
20
+ <w:body>
21
+ ${bodyXml}
22
+ <w:sectPr>
23
+ <w:headerReference w:type="default" r:id="rId6"/>
24
+ <w:footerReference w:type="default" r:id="rId7"/>
25
+ <w:pgSz w:w="12240" w:h="15840"/>
26
+ <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
27
+ <w:cols w:space="708"/>
28
+ <w:docGrid w:linePitch="360"/>
29
+ </w:sectPr>
30
+ </w:body>
31
+ </w:document>
32
+ `;
33
+ return xml;
34
+ }
35
+ function ensureWordNamespace(xml) {
36
+ const hasWNamespace = /xmlns:w\s*=\s*["']http:\/\/schemas\.openxmlformats\.org\/wordprocessingml\/2006\/main["']/.test(
37
+ xml
38
+ );
39
+ if (hasWNamespace) return xml;
40
+ return xml.replace(
41
+ /<w:document\b/,
42
+ `<w:document xmlns:w="${WORD_MAIN_NS}"`
43
+ );
44
+ }
45
+ function normalizeDocumentXml(xml, inputKind) {
46
+ const trimmed = xml.trim();
47
+ if (!trimmed) {
48
+ throw new Error("XML is empty.");
49
+ }
50
+ if (inputKind === "document") {
51
+ const withDecl = ensureXmlDeclaration(trimmed);
52
+ const withNs = ensureWordNamespace(withDecl);
53
+ if (!hasWordDocumentRoot(withNs)) {
54
+ throw new Error('inputKind="document" requires a <w:document> root.');
55
+ }
56
+ return withNs;
57
+ }
58
+ if (inputKind === "body") {
59
+ return wrapBodyXml(trimmed);
60
+ }
61
+ if (hasWordDocumentRoot(trimmed)) {
62
+ const withDecl = ensureXmlDeclaration(trimmed);
63
+ return ensureWordNamespace(withDecl);
64
+ }
65
+ return wrapBodyXml(trimmed);
66
+ }
67
+
68
+ // src/lib/validateXml.ts
69
+ import { XMLValidator } from "fast-xml-parser";
70
+ function validateXmlIfNeeded(xml, validateXml) {
71
+ if (!validateXml) return;
72
+ const result = XMLValidator.validate(xml);
73
+ if (result === true) return;
74
+ const err = result.err;
75
+ const msg = err?.msg ?? "Invalid XML.";
76
+ const line = err?.line;
77
+ const col = err?.col;
78
+ const location = typeof line === "number" && typeof col === "number" ? ` (line ${line}, col ${col})` : "";
79
+ throw new Error(`${msg}${location}`);
80
+ }
81
+
82
+ // src/lib/createDocxZip.ts
83
+ var STYLES_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
84
+ <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
85
+ <w:docDefaults>
86
+ <w:rPrDefault>
87
+ <w:rPr>
88
+ <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="FangSong_GB2312" w:cs="Times New Roman"/>
89
+ <w:sz w:val="28"/>
90
+ <w:szCs w:val="28"/>
91
+ <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
92
+ </w:rPr>
93
+ </w:rPrDefault>
94
+ <w:pPrDefault>
95
+ <w:pPr>
96
+ <w:spacing w:before="0" w:after="160" w:line="360" w:lineRule="auto"/>
97
+ </w:pPr>
98
+ </w:pPrDefault>
99
+ </w:docDefaults>
100
+
101
+ <w:style w:type="paragraph" w:default="1" w:styleId="Normal">
102
+ <w:name w:val="Normal"/>
103
+ <w:qFormat/>
104
+ <w:pPr>
105
+ <w:spacing w:before="0" w:after="160" w:line="360" w:lineRule="auto"/>
106
+ </w:pPr>
107
+ <w:rPr>
108
+ <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="FangSong_GB2312" w:cs="Times New Roman"/>
109
+ <w:sz w:val="28"/>
110
+ <w:szCs w:val="28"/>
111
+ </w:rPr>
112
+ </w:style>
113
+
114
+ <w:style w:type="paragraph" w:styleId="Heading1">
115
+ <w:name w:val="heading 1"/>
116
+ <w:basedOn w:val="Normal"/>
117
+ <w:next w:val="Normal"/>
118
+ <w:uiPriority w:val="9"/>
119
+ <w:qFormat/>
120
+ <w:pPr>
121
+ <w:keepNext/>
122
+ <w:keepLines/>
123
+ <w:outlineLvl w:val="0"/>
124
+ <w:spacing w:before="240" w:after="120" w:line="360" w:lineRule="auto"/>
125
+ </w:pPr>
126
+ <w:rPr>
127
+ <w:b/>
128
+ <w:sz w:val="44"/>
129
+ <w:szCs w:val="44"/>
130
+ </w:rPr>
131
+ </w:style>
132
+
133
+ <w:style w:type="paragraph" w:styleId="Heading2">
134
+ <w:name w:val="heading 2"/>
135
+ <w:basedOn w:val="Normal"/>
136
+ <w:next w:val="Normal"/>
137
+ <w:uiPriority w:val="9"/>
138
+ <w:qFormat/>
139
+ <w:pPr>
140
+ <w:keepNext/>
141
+ <w:keepLines/>
142
+ <w:outlineLvl w:val="1"/>
143
+ <w:spacing w:before="200" w:after="100" w:line="360" w:lineRule="auto"/>
144
+ </w:pPr>
145
+ <w:rPr>
146
+ <w:b/>
147
+ <w:sz w:val="32"/>
148
+ <w:szCs w:val="32"/>
149
+ </w:rPr>
150
+ </w:style>
151
+
152
+ <w:style w:type="paragraph" w:styleId="Heading3">
153
+ <w:name w:val="heading 3"/>
154
+ <w:basedOn w:val="Normal"/>
155
+ <w:next w:val="Normal"/>
156
+ <w:uiPriority w:val="9"/>
157
+ <w:qFormat/>
158
+ <w:pPr>
159
+ <w:keepNext/>
160
+ <w:keepLines/>
161
+ <w:outlineLvl w:val="2"/>
162
+ <w:spacing w:before="180" w:after="90" w:line="360" w:lineRule="auto"/>
163
+ </w:pPr>
164
+ <w:rPr>
165
+ <w:b/>
166
+ <w:sz w:val="28"/>
167
+ <w:szCs w:val="28"/>
168
+ </w:rPr>
169
+ </w:style>
170
+
171
+ <w:style w:type="paragraph" w:styleId="Heading4">
172
+ <w:name w:val="heading 4"/>
173
+ <w:basedOn w:val="Normal"/>
174
+ <w:next w:val="Normal"/>
175
+ <w:uiPriority w:val="9"/>
176
+ <w:qFormat/>
177
+ <w:pPr>
178
+ <w:keepNext/>
179
+ <w:keepLines/>
180
+ <w:outlineLvl w:val="3"/>
181
+ <w:spacing w:before="160" w:after="80" w:line="360" w:lineRule="auto"/>
182
+ </w:pPr>
183
+ <w:rPr>
184
+ <w:b/>
185
+ <w:sz w:val="24"/>
186
+ <w:szCs w:val="24"/>
187
+ </w:rPr>
188
+ </w:style>
189
+
190
+ <w:style w:type="paragraph" w:styleId="Heading5">
191
+ <w:name w:val="heading 5"/>
192
+ <w:basedOn w:val="Normal"/>
193
+ <w:next w:val="Normal"/>
194
+ <w:uiPriority w:val="9"/>
195
+ <w:qFormat/>
196
+ <w:pPr>
197
+ <w:keepNext/>
198
+ <w:keepLines/>
199
+ <w:outlineLvl w:val="4"/>
200
+ <w:spacing w:before="140" w:after="70" w:line="360" w:lineRule="auto"/>
201
+ </w:pPr>
202
+ <w:rPr>
203
+ <w:b/>
204
+ <w:sz w:val="22"/>
205
+ <w:szCs w:val="22"/>
206
+ </w:rPr>
207
+ </w:style>
208
+
209
+ <w:style w:type="paragraph" w:styleId="Heading6">
210
+ <w:name w:val="heading 6"/>
211
+ <w:basedOn w:val="Normal"/>
212
+ <w:next w:val="Normal"/>
213
+ <w:uiPriority w:val="9"/>
214
+ <w:qFormat/>
215
+ <w:pPr>
216
+ <w:keepNext/>
217
+ <w:keepLines/>
218
+ <w:outlineLvl w:val="5"/>
219
+ <w:spacing w:before="120" w:after="60" w:line="360" w:lineRule="auto"/>
220
+ </w:pPr>
221
+ <w:rPr>
222
+ <w:b/>
223
+ <w:sz w:val="22"/>
224
+ <w:szCs w:val="22"/>
225
+ </w:rPr>
226
+ </w:style>
227
+ </w:styles>
228
+ `;
229
+ var SETTINGS_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
230
+ <w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
231
+ <w:themeFontLang w:val="en-US" w:eastAsia="zh-CN"/>
232
+ <w:defaultTabStop w:val="720"/>
233
+ <w:compat/>
234
+ </w:settings>
235
+ `;
236
+ var NUMBERING_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
237
+ <w:numbering xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
238
+ <w:abstractNum w:abstractNumId="1">
239
+ <w:multiLevelType w:val="hybridMultilevel"/>
240
+ <w:lvl w:ilvl="0">
241
+ <w:start w:val="1"/>
242
+ <w:numFmt w:val="bullet"/>
243
+ <w:lvlText w:val="\u2022"/>
244
+ <w:lvlJc w:val="left"/>
245
+ <w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr>
246
+ <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>
247
+ </w:lvl>
248
+ <w:lvl w:ilvl="1">
249
+ <w:start w:val="1"/>
250
+ <w:numFmt w:val="bullet"/>
251
+ <w:lvlText w:val="\u25CB"/>
252
+ <w:lvlJc w:val="left"/>
253
+ <w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr>
254
+ <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>
255
+ </w:lvl>
256
+ <w:lvl w:ilvl="2">
257
+ <w:start w:val="1"/>
258
+ <w:numFmt w:val="bullet"/>
259
+ <w:lvlText w:val="\u25A0"/>
260
+ <w:lvlJc w:val="left"/>
261
+ <w:pPr><w:ind w:left="2160" w:hanging="360"/></w:pPr>
262
+ <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>
263
+ </w:lvl>
264
+ </w:abstractNum>
265
+ <w:abstractNum w:abstractNumId="2">
266
+ <w:multiLevelType w:val="hybridMultilevel"/>
267
+ <w:lvl w:ilvl="0">
268
+ <w:start w:val="1"/>
269
+ <w:numFmt w:val="decimal"/>
270
+ <w:lvlText w:val="%1."/>
271
+ <w:lvlJc w:val="left"/>
272
+ <w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr>
273
+ <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>
274
+ </w:lvl>
275
+ <w:lvl w:ilvl="1">
276
+ <w:start w:val="1"/>
277
+ <w:numFmt w:val="decimal"/>
278
+ <w:lvlText w:val="%1.%2."/>
279
+ <w:lvlJc w:val="left"/>
280
+ <w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr>
281
+ <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>
282
+ </w:lvl>
283
+ <w:lvl w:ilvl="2">
284
+ <w:start w:val="1"/>
285
+ <w:numFmt w:val="decimal"/>
286
+ <w:lvlText w:val="%1.%2.%3."/>
287
+ <w:lvlJc w:val="left"/>
288
+ <w:pPr><w:ind w:left="2160" w:hanging="360"/></w:pPr>
289
+ <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>
290
+ </w:lvl>
291
+ </w:abstractNum>
292
+ <w:num w:numId="1"><w:abstractNumId w:val="1"/></w:num>
293
+ <w:num w:numId="2"><w:abstractNumId w:val="2"/></w:num>
294
+ </w:numbering>
295
+ `;
296
+ var HEADER1_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
297
+ <w:hdr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
298
+ <w:p>
299
+ <w:pPr><w:jc w:val="center"/></w:pPr>
300
+ <w:r><w:t></w:t></w:r>
301
+ </w:p>
302
+ </w:hdr>
303
+ `;
304
+ var FOOTER1_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
305
+ <w:ftr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
306
+ <w:p>
307
+ <w:pPr><w:jc w:val="right"/></w:pPr>
308
+ <w:r><w:t>\u7B2C </w:t></w:r>
309
+ <w:r><w:fldChar w:fldCharType="begin"/></w:r>
310
+ <w:r><w:instrText xml:space="preserve"> PAGE </w:instrText></w:r>
311
+ <w:r><w:fldChar w:fldCharType="separate"/></w:r>
312
+ <w:r><w:t>1</w:t></w:r>
313
+ <w:r><w:fldChar w:fldCharType="end"/></w:r>
314
+ <w:r><w:t> \u9875 / \u5171 </w:t></w:r>
315
+ <w:r><w:fldChar w:fldCharType="begin"/></w:r>
316
+ <w:r><w:instrText xml:space="preserve"> NUMPAGES </w:instrText></w:r>
317
+ <w:r><w:fldChar w:fldCharType="separate"/></w:r>
318
+ <w:r><w:t>1</w:t></w:r>
319
+ <w:r><w:fldChar w:fldCharType="end"/></w:r>
320
+ <w:r><w:t> \u9875</w:t></w:r>
321
+ </w:p>
322
+ </w:ftr>
323
+ `;
324
+ var THEME_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
325
+ <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">
326
+ <a:themeElements>
327
+ <a:clrScheme name="Office">
328
+ <a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>
329
+ <a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>
330
+ <a:dk2><a:srgbClr val="1F497D"/></a:dk2>
331
+ <a:lt2><a:srgbClr val="EEECE1"/></a:lt2>
332
+ <a:accent1><a:srgbClr val="4F81BD"/></a:accent1>
333
+ <a:accent2><a:srgbClr val="C0504D"/></a:accent2>
334
+ <a:accent3><a:srgbClr val="9BBB59"/></a:accent3>
335
+ <a:accent4><a:srgbClr val="8064A2"/></a:accent4>
336
+ <a:accent5><a:srgbClr val="4BACC6"/></a:accent5>
337
+ <a:accent6><a:srgbClr val="F79646"/></a:accent6>
338
+ <a:hlink><a:srgbClr val="0000FF"/></a:hlink>
339
+ <a:folHlink><a:srgbClr val="800080"/></a:folHlink>
340
+ </a:clrScheme>
341
+ <a:fontScheme name="Office">
342
+ <a:majorFont>
343
+ <a:latin typeface="Times New Roman"/>
344
+ <a:ea typeface="FangSong_GB2312"/>
345
+ <a:cs typeface="Times New Roman"/>
346
+ </a:majorFont>
347
+ <a:minorFont>
348
+ <a:latin typeface="Times New Roman"/>
349
+ <a:ea typeface="FangSong_GB2312"/>
350
+ <a:cs typeface="Times New Roman"/>
351
+ </a:minorFont>
352
+ </a:fontScheme>
353
+ <a:fmtScheme name="Office">
354
+ <a:fillStyleLst>
355
+ <a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
356
+ <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>
357
+ <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>
358
+ </a:fillStyleLst>
359
+ <a:lnStyleLst>
360
+ <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>
361
+ <a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>
362
+ <a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>
363
+ </a:lnStyleLst>
364
+ <a:effectStyleLst>
365
+ <a:effectStyle><a:effectLst/></a:effectStyle>
366
+ <a:effectStyle><a:effectLst/></a:effectStyle>
367
+ <a:effectStyle><a:effectLst/></a:effectStyle>
368
+ </a:effectStyleLst>
369
+ <a:bgFillStyleLst>
370
+ <a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
371
+ <a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
372
+ <a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
373
+ </a:bgFillStyleLst>
374
+ </a:fmtScheme>
375
+ </a:themeElements>
376
+ <a:objectDefaults/>
377
+ <a:extraClrSchemeLst/>
378
+ </a:theme>
379
+ `;
380
+ var FONT_TABLE_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
381
+ <w:fonts xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
382
+ <w:font w:name="Times New Roman">
383
+ <w:charset w:val="00"/>
384
+ <w:family w:val="roman"/>
385
+ <w:pitch w:val="variable"/>
386
+ </w:font>
387
+ <w:font w:name="FangSong_GB2312">
388
+ <w:charset w:val="86"/>
389
+ <w:family w:val="auto"/>
390
+ <w:pitch w:val="variable"/>
391
+ </w:font>
392
+ </w:fonts>
393
+ `;
394
+ function buildContentTypesXml(assets) {
395
+ const defaults = /* @__PURE__ */ new Map();
396
+ defaults.set("rels", "application/vnd.openxmlformats-package.relationships+xml");
397
+ defaults.set("xml", "application/xml");
398
+ for (const asset of assets) {
399
+ if (!asset.contentType) continue;
400
+ const extMatch = asset.target.match(/\.([a-zA-Z0-9]+)$/);
401
+ if (!extMatch) continue;
402
+ const ext = extMatch[1].toLowerCase();
403
+ defaults.set(ext, asset.contentType);
404
+ }
405
+ const defaultLines = [...defaults.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([ext, ct]) => ` <Default Extension="${ext}" ContentType="${ct}"/>`).join("\n");
406
+ const overrides = [
407
+ ' <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>',
408
+ ' <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>',
409
+ ' <Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/>',
410
+ ' <Override PartName="/word/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>',
411
+ ' <Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/>',
412
+ ' <Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>',
413
+ ' <Override PartName="/word/header1.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml"/>',
414
+ ' <Override PartName="/word/footer1.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"/>'
415
+ ].join("\n");
416
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
417
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
418
+ ${defaultLines}
419
+ ${overrides}
420
+ </Types>
421
+ `;
422
+ }
423
+ var ROOT_RELS_XML = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
424
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
425
+ <Relationship Id="rId1"
426
+ Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
427
+ Target="word/document.xml"/>
428
+ </Relationships>
429
+ `;
430
+ function buildDocumentRelsXml(assets) {
431
+ const relLines = [
432
+ ' <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>',
433
+ ' <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/>',
434
+ ' <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>',
435
+ ' <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/>',
436
+ ' <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/>',
437
+ ' <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml"/>',
438
+ ' <Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer1.xml"/>',
439
+ ...assets.map(
440
+ (a) => ` <Relationship Id="${a.relationshipId}" Type="${a.relationshipType}" Target="${a.target}"/>`
441
+ )
442
+ ].join("\n");
443
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
444
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
445
+ ${relLines}
446
+ </Relationships>
447
+ `;
448
+ }
449
+ async function createDocxZipUint8Array(xml, options = {}) {
450
+ const documentXml = normalizeDocumentXml(xml, options.inputKind ?? "auto");
451
+ validateXmlIfNeeded(documentXml, options.validateXml ?? true);
452
+ const zip = new JSZip();
453
+ zip.file("[Content_Types].xml", buildContentTypesXml([]));
454
+ const relsFolder = zip.folder("_rels");
455
+ relsFolder?.file(".rels", ROOT_RELS_XML);
456
+ const wordFolder = zip.folder("word");
457
+ wordFolder?.file("document.xml", documentXml);
458
+ wordFolder?.file("styles.xml", STYLES_XML);
459
+ wordFolder?.file("settings.xml", SETTINGS_XML);
460
+ wordFolder?.file("fontTable.xml", FONT_TABLE_XML);
461
+ wordFolder?.folder("theme")?.file("theme1.xml", THEME_XML);
462
+ wordFolder?.file("numbering.xml", NUMBERING_XML);
463
+ wordFolder?.file("header1.xml", HEADER1_XML);
464
+ wordFolder?.file("footer1.xml", FOOTER1_XML);
465
+ const wordRelsFolder = wordFolder?.folder("_rels");
466
+ wordRelsFolder?.file("document.xml.rels", buildDocumentRelsXml([]));
467
+ return zip.generateAsync({ type: "uint8array" });
468
+ }
469
+ async function createDocxZipWithAssetsUint8Array(xml, options, assets) {
470
+ const documentXml = normalizeDocumentXml(xml, options.inputKind ?? "auto");
471
+ validateXmlIfNeeded(documentXml, options.validateXml ?? true);
472
+ const zip = new JSZip();
473
+ zip.file("[Content_Types].xml", buildContentTypesXml(assets));
474
+ const relsFolder = zip.folder("_rels");
475
+ relsFolder?.file(".rels", ROOT_RELS_XML);
476
+ const wordFolder = zip.folder("word");
477
+ wordFolder?.file("document.xml", documentXml);
478
+ wordFolder?.file("styles.xml", STYLES_XML);
479
+ wordFolder?.file("settings.xml", SETTINGS_XML);
480
+ wordFolder?.file("fontTable.xml", FONT_TABLE_XML);
481
+ wordFolder?.folder("theme")?.file("theme1.xml", THEME_XML);
482
+ wordFolder?.file("numbering.xml", NUMBERING_XML);
483
+ wordFolder?.file("header1.xml", HEADER1_XML);
484
+ wordFolder?.file("footer1.xml", FOOTER1_XML);
485
+ const wordRelsFolder = wordFolder?.folder("_rels");
486
+ wordRelsFolder?.file("document.xml.rels", buildDocumentRelsXml(assets));
487
+ if (assets.length) {
488
+ for (const asset of assets) {
489
+ const targetPath = asset.target.replace(/^\.\//, "");
490
+ const normalized = targetPath.startsWith("word/") ? targetPath.slice("word/".length) : targetPath;
491
+ wordFolder?.file(normalized, asset.data);
492
+ }
493
+ }
494
+ return zip.generateAsync({ type: "uint8array" });
495
+ }
496
+ export {
497
+ createDocxZipUint8Array,
498
+ createDocxZipWithAssetsUint8Array
499
+ };
500
+ //# sourceMappingURL=createDocxZip-BWHSZ7VQ.js.map
@@ -0,0 +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":[]}