quoin-editor 0.4.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/CHANGELOG.md +205 -0
  2. package/MIGRATION.md +233 -0
  3. package/README.md +78 -716
  4. package/dist/ai.cjs +1107 -0
  5. package/dist/ai.cjs.map +1 -0
  6. package/dist/ai.d.cts +68 -0
  7. package/dist/ai.d.ts +68 -0
  8. package/dist/ai.js +1107 -0
  9. package/dist/ai.js.map +1 -0
  10. package/dist/catalogue.cjs +59 -0
  11. package/dist/catalogue.cjs.map +1 -0
  12. package/dist/catalogue.d.cts +39 -0
  13. package/dist/catalogue.d.ts +39 -0
  14. package/dist/catalogue.js +59 -0
  15. package/dist/catalogue.js.map +1 -0
  16. package/dist/chunk-2QCRZ7OL.cjs +319 -0
  17. package/dist/chunk-2QCRZ7OL.cjs.map +1 -0
  18. package/dist/chunk-2VDK27IF.cjs +6666 -0
  19. package/dist/chunk-2VDK27IF.cjs.map +1 -0
  20. package/dist/chunk-47MLKSI2.js +326 -0
  21. package/dist/chunk-47MLKSI2.js.map +1 -0
  22. package/dist/chunk-5DNCCN6X.cjs +326 -0
  23. package/dist/chunk-5DNCCN6X.cjs.map +1 -0
  24. package/dist/chunk-AEJXZBVR.cjs +1378 -0
  25. package/dist/chunk-AEJXZBVR.cjs.map +1 -0
  26. package/dist/chunk-CDELOHDY.cjs +239 -0
  27. package/dist/chunk-CDELOHDY.cjs.map +1 -0
  28. package/dist/chunk-E75EHRPA.cjs +175 -0
  29. package/dist/chunk-E75EHRPA.cjs.map +1 -0
  30. package/dist/chunk-EL2OEJQC.cjs +562 -0
  31. package/dist/chunk-EL2OEJQC.cjs.map +1 -0
  32. package/dist/chunk-GLLXHMH2.cjs +25 -0
  33. package/dist/chunk-GLLXHMH2.cjs.map +1 -0
  34. package/dist/chunk-GTTPVJSD.cjs +3286 -0
  35. package/dist/chunk-GTTPVJSD.cjs.map +1 -0
  36. package/dist/chunk-HELJTLNC.cjs +100 -0
  37. package/dist/chunk-HELJTLNC.cjs.map +1 -0
  38. package/dist/chunk-HJIQT3S5.js +4047 -0
  39. package/dist/chunk-HJIQT3S5.js.map +1 -0
  40. package/dist/chunk-HZSSEYJS.cjs +504 -0
  41. package/dist/chunk-HZSSEYJS.cjs.map +1 -0
  42. package/dist/chunk-JDPTZUBW.js +184 -0
  43. package/dist/chunk-JDPTZUBW.js.map +1 -0
  44. package/dist/chunk-JEIFJHEI.js +14 -0
  45. package/dist/chunk-JEIFJHEI.js.map +1 -0
  46. package/dist/chunk-K574XHMM.js +25 -0
  47. package/dist/chunk-K574XHMM.js.map +1 -0
  48. package/dist/chunk-KAVU6T6J.js +249 -0
  49. package/dist/chunk-KAVU6T6J.js.map +1 -0
  50. package/dist/chunk-KXOBZGQO.js +1378 -0
  51. package/dist/chunk-KXOBZGQO.js.map +1 -0
  52. package/dist/chunk-LCQSG4M6.js +3335 -0
  53. package/dist/chunk-LCQSG4M6.js.map +1 -0
  54. package/dist/chunk-MQ2XQ4MX.js +100 -0
  55. package/dist/chunk-MQ2XQ4MX.js.map +1 -0
  56. package/dist/chunk-ND5XJVK2.cjs +3335 -0
  57. package/dist/chunk-ND5XJVK2.cjs.map +1 -0
  58. package/dist/chunk-NNDYYEW5.js +504 -0
  59. package/dist/chunk-NNDYYEW5.js.map +1 -0
  60. package/dist/chunk-NOKWNK2O.js +319 -0
  61. package/dist/chunk-NOKWNK2O.js.map +1 -0
  62. package/dist/chunk-OMOBMXD5.cjs +57 -0
  63. package/dist/chunk-OMOBMXD5.cjs.map +1 -0
  64. package/dist/chunk-PMWCQSQX.js +239 -0
  65. package/dist/chunk-PMWCQSQX.js.map +1 -0
  66. package/dist/chunk-POBM7MGR.js +30 -0
  67. package/dist/chunk-POBM7MGR.js.map +1 -0
  68. package/dist/chunk-PWUEPDA3.cjs +598 -0
  69. package/dist/chunk-PWUEPDA3.cjs.map +1 -0
  70. package/dist/chunk-PZ4GT5JO.cjs +4047 -0
  71. package/dist/chunk-PZ4GT5JO.cjs.map +1 -0
  72. package/dist/chunk-QAW5NH6S.cjs +14 -0
  73. package/dist/chunk-QAW5NH6S.cjs.map +1 -0
  74. package/dist/chunk-RDG4VI6E.cjs +706 -0
  75. package/dist/chunk-RDG4VI6E.cjs.map +1 -0
  76. package/dist/chunk-RUDWMKYX.js +562 -0
  77. package/dist/chunk-RUDWMKYX.js.map +1 -0
  78. package/dist/chunk-SG37UBDO.js +706 -0
  79. package/dist/chunk-SG37UBDO.js.map +1 -0
  80. package/dist/chunk-SLVDAHHK.cjs +30 -0
  81. package/dist/chunk-SLVDAHHK.cjs.map +1 -0
  82. package/dist/chunk-T7SW6OWV.js +598 -0
  83. package/dist/chunk-T7SW6OWV.js.map +1 -0
  84. package/dist/chunk-TC4DARU2.js +175 -0
  85. package/dist/chunk-TC4DARU2.js.map +1 -0
  86. package/dist/chunk-WQHV3MRE.cjs +184 -0
  87. package/dist/chunk-WQHV3MRE.cjs.map +1 -0
  88. package/dist/chunk-WXMYDXPN.cjs +33 -0
  89. package/dist/chunk-WXMYDXPN.cjs.map +1 -0
  90. package/dist/chunk-XEBWC7ZL.js +57 -0
  91. package/dist/chunk-XEBWC7ZL.js.map +1 -0
  92. package/dist/chunk-ZC24WB7Y.cjs +249 -0
  93. package/dist/chunk-ZC24WB7Y.cjs.map +1 -0
  94. package/dist/chunk-ZGZEJCRV.js +6666 -0
  95. package/dist/chunk-ZGZEJCRV.js.map +1 -0
  96. package/dist/chunk-ZHOSSWUM.js +33 -0
  97. package/dist/chunk-ZHOSSWUM.js.map +1 -0
  98. package/dist/chunk-ZS2WA357.js +3286 -0
  99. package/dist/chunk-ZS2WA357.js.map +1 -0
  100. package/dist/comments.cjs +993 -0
  101. package/dist/comments.cjs.map +1 -0
  102. package/dist/comments.d.cts +88 -0
  103. package/dist/comments.d.ts +88 -0
  104. package/dist/comments.js +993 -0
  105. package/dist/comments.js.map +1 -0
  106. package/dist/diff.cjs +343 -0
  107. package/dist/diff.cjs.map +1 -0
  108. package/dist/diff.d.cts +67 -0
  109. package/dist/diff.d.ts +67 -0
  110. package/dist/diff.js +343 -0
  111. package/dist/diff.js.map +1 -0
  112. package/dist/docx.cjs +854 -0
  113. package/dist/docx.cjs.map +1 -0
  114. package/dist/docx.d.cts +27 -0
  115. package/dist/docx.d.ts +27 -0
  116. package/dist/docx.js +854 -0
  117. package/dist/docx.js.map +1 -0
  118. package/dist/embed-provider-jXwlRmnp.d.cts +19 -0
  119. package/dist/embed-provider-jXwlRmnp.d.ts +19 -0
  120. package/dist/embed.cjs +17 -0
  121. package/dist/embed.cjs.map +1 -0
  122. package/dist/embed.d.cts +56 -0
  123. package/dist/embed.d.ts +56 -0
  124. package/dist/embed.js +17 -0
  125. package/dist/embed.js.map +1 -0
  126. package/dist/emoji-data.cjs +1968 -0
  127. package/dist/emoji-data.cjs.map +1 -0
  128. package/dist/emoji-data.js +1968 -0
  129. package/dist/emoji-data.js.map +1 -0
  130. package/dist/emoji-extension-C12gDPm6.d.cts +46 -0
  131. package/dist/emoji-extension-DpQ43HjE.d.ts +46 -0
  132. package/dist/emoji.cjs +18 -0
  133. package/dist/emoji.cjs.map +1 -0
  134. package/dist/emoji.d.cts +31 -0
  135. package/dist/emoji.d.ts +31 -0
  136. package/dist/emoji.js +18 -0
  137. package/dist/emoji.js.map +1 -0
  138. package/dist/engine.cjs +119 -0
  139. package/dist/engine.cjs.map +1 -0
  140. package/dist/engine.d.cts +144 -0
  141. package/dist/engine.d.ts +144 -0
  142. package/dist/engine.js +119 -0
  143. package/dist/engine.js.map +1 -0
  144. package/dist/find-extension-DKqLLSuP.d.ts +41 -0
  145. package/dist/find-extension-_sbZEt3R.d.cts +41 -0
  146. package/dist/find.cjs +20 -0
  147. package/dist/find.cjs.map +1 -0
  148. package/dist/find.d.cts +44 -0
  149. package/dist/find.d.ts +44 -0
  150. package/dist/find.js +20 -0
  151. package/dist/find.js.map +1 -0
  152. package/dist/headless.cjs +151 -518
  153. package/dist/headless.cjs.map +1 -1
  154. package/dist/headless.d.cts +102 -69
  155. package/dist/headless.d.ts +102 -69
  156. package/dist/headless.js +149 -467
  157. package/dist/headless.js.map +1 -1
  158. package/dist/index-CgD72kHB.d.cts +65 -0
  159. package/dist/index-DNYbTK3w.d.ts +65 -0
  160. package/dist/index.cjs +183 -2753
  161. package/dist/index.cjs.map +1 -1
  162. package/dist/index.d.cts +345 -253
  163. package/dist/index.d.ts +345 -253
  164. package/dist/index.js +168 -2696
  165. package/dist/index.js.map +1 -1
  166. package/dist/math.cjs +18 -0
  167. package/dist/math.cjs.map +1 -0
  168. package/dist/math.d.cts +49 -0
  169. package/dist/math.d.ts +49 -0
  170. package/dist/math.js +18 -0
  171. package/dist/math.js.map +1 -0
  172. package/dist/mention.cjs +18 -0
  173. package/dist/mention.cjs.map +1 -0
  174. package/dist/mention.d.cts +50 -0
  175. package/dist/mention.d.ts +50 -0
  176. package/dist/mention.js +18 -0
  177. package/dist/mention.js.map +1 -0
  178. package/dist/presence.cjs +565 -0
  179. package/dist/presence.cjs.map +1 -0
  180. package/dist/presence.d.cts +30 -0
  181. package/dist/presence.d.ts +30 -0
  182. package/dist/presence.js +565 -0
  183. package/dist/presence.js.map +1 -0
  184. package/dist/registry-CWBOSAHm.d.cts +121 -0
  185. package/dist/registry-CWBOSAHm.d.ts +121 -0
  186. package/dist/stats-extension-Bly88uio.d.ts +40 -0
  187. package/dist/stats-extension-CJPijvUb.d.cts +40 -0
  188. package/dist/stats.cjs +19 -0
  189. package/dist/stats.cjs.map +1 -0
  190. package/dist/stats.d.cts +19 -0
  191. package/dist/stats.d.ts +19 -0
  192. package/dist/stats.js +19 -0
  193. package/dist/stats.js.map +1 -0
  194. package/dist/styles.css +1 -1
  195. package/dist/table-extension-BTLxFy2S.d.cts +57 -0
  196. package/dist/table-extension-Dzf4k6hI.d.ts +57 -0
  197. package/dist/table.cjs +50 -0
  198. package/dist/table.cjs.map +1 -0
  199. package/dist/table.d.cts +57 -0
  200. package/dist/table.d.ts +57 -0
  201. package/dist/table.js +50 -0
  202. package/dist/table.js.map +1 -0
  203. package/dist/to-html-C5t7xyaM.d.ts +21 -0
  204. package/dist/to-html-CNCITCln.d.cts +21 -0
  205. package/dist/toc-extension-B3-s6h2x.d.cts +25 -0
  206. package/dist/toc-extension-DWm5alVj.d.ts +25 -0
  207. package/dist/toc.cjs +18 -0
  208. package/dist/toc.cjs.map +1 -0
  209. package/dist/toc.d.cts +24 -0
  210. package/dist/toc.d.ts +24 -0
  211. package/dist/toc.js +18 -0
  212. package/dist/toc.js.map +1 -0
  213. package/dist/types-Cz7XJLaK.d.cts +366 -0
  214. package/dist/types-DULc8wwg.d.cts +120 -0
  215. package/dist/types-DULc8wwg.d.ts +120 -0
  216. package/dist/types-a1CRBlEh.d.ts +366 -0
  217. package/dist/view-controller-DSHw0ltQ.d.cts +118 -0
  218. package/dist/view-controller-UbpzblGl.d.ts +118 -0
  219. package/dist/view.cjs +23 -0
  220. package/dist/view.cjs.map +1 -0
  221. package/dist/view.d.cts +40 -0
  222. package/dist/view.d.ts +40 -0
  223. package/dist/view.js +23 -0
  224. package/dist/view.js.map +1 -0
  225. package/dist/yjs.cjs +1026 -0
  226. package/dist/yjs.cjs.map +1 -0
  227. package/dist/yjs.d.cts +22 -0
  228. package/dist/yjs.d.ts +22 -0
  229. package/dist/yjs.js +1026 -0
  230. package/dist/yjs.js.map +1 -0
  231. package/package.json +217 -18
package/dist/docx.cjs ADDED
@@ -0,0 +1,854 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('./chunk-PZ4GT5JO.cjs');
2
+ require('./chunk-2QCRZ7OL.cjs');
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+ var _chunkND5XJVK2cjs = require('./chunk-ND5XJVK2.cjs');
19
+
20
+ // src/docx/asset-source.ts
21
+ function assetUrl(block, resolveAssetUrl) {
22
+ const key = _chunkND5XJVK2cjs.str.call(void 0, block.attrs.storageKey);
23
+ const src = key === "" ? null : resolveAssetUrl(key);
24
+ return src ? _chunkND5XJVK2cjs.sanitizeAssetUrl.call(void 0, src) : null;
25
+ }
26
+ function pictureUrl(block, resolveAssetUrl) {
27
+ const url = _chunkND5XJVK2cjs.str.call(void 0, block.attrs.url);
28
+ return url === "" ? assetUrl(block, resolveAssetUrl) : _chunkND5XJVK2cjs.sanitizeHref.call(void 0, url);
29
+ }
30
+
31
+ // src/docx/docx-context.ts
32
+ var FIRST_RELATIONSHIP = 3;
33
+ function createContext({ schema, resolveAssetUrl, headings: headings2, images }) {
34
+ const bookmarks = new Map(headings2.map(({ blockId }, at) => [blockId, `_q${at + 1}`]));
35
+ const relationships = [];
36
+ const lists = [];
37
+ const media = [];
38
+ const related = /* @__PURE__ */ new Map();
39
+ const placed = /* @__PURE__ */ new Map();
40
+ let drawings = 0;
41
+ const relate = (kind, target) => {
42
+ const key = `${kind} ${target}`;
43
+ let id = related.get(key);
44
+ if (id === void 0) {
45
+ id = `rId${relationships.length + FIRST_RELATIONSHIP}`;
46
+ related.set(key, id);
47
+ relationships.push({ id, kind, target });
48
+ }
49
+ return id;
50
+ };
51
+ return {
52
+ schema,
53
+ resolveAssetUrl,
54
+ headings: headings2,
55
+ bookmarks,
56
+ relationships,
57
+ lists,
58
+ media,
59
+ link: (target) => relate("hyperlink", target),
60
+ list(ordered, level, start) {
61
+ const numId = lists.length + 1;
62
+ lists.push({ numId, ordered, level, start });
63
+ return numId;
64
+ },
65
+ picture(url) {
66
+ const image = url === null ? null : images.get(url);
67
+ if (!url || !image) return null;
68
+ let place = placed.get(url);
69
+ if (!place) {
70
+ const name = `image${media.length + 1}.${image.extension}`;
71
+ media.push({ path: `word/media/${name}`, data: image.data, extension: image.extension, type: image.type });
72
+ place = { rId: relate("image", `media/${name}`), image, name };
73
+ placed.set(url, place);
74
+ }
75
+ return place;
76
+ },
77
+ drawingId: () => ++drawings
78
+ };
79
+ }
80
+
81
+ // src/docx/palette-hex.ts
82
+ var TEXT = {
83
+ default: "0A0A0A",
84
+ gray: "6C6C6C",
85
+ brown: "855F49",
86
+ orange: "B2580B",
87
+ yellow: "93690D",
88
+ green: "2A7E4F",
89
+ blue: "0A71B1",
90
+ purple: "8050B0",
91
+ pink: "B53874",
92
+ red: "C9302D"
93
+ };
94
+ var BACKGROUND = {
95
+ default: "FFFFFF",
96
+ gray: "F0F0F0",
97
+ brown: "F6ECE7",
98
+ orange: "FFEDDC",
99
+ yellow: "FDF4D2",
100
+ green: "E1F7E7",
101
+ blue: "E1F3FF",
102
+ purple: "F4ECFE",
103
+ pink: "FEEAF2",
104
+ red: "FDE9E8"
105
+ };
106
+ var pick = (table2, name) => {
107
+ const color = _chunkND5XJVK2cjs.paletteOrUndefined.call(void 0, name);
108
+ return color === void 0 ? void 0 : table2[color];
109
+ };
110
+ var textHex = (name) => pick(TEXT, name);
111
+ var backgroundHex = (name) => pick(BACKGROUND, name);
112
+
113
+ // src/docx/xml.ts
114
+ var ESCAPES = { "<": "&lt;", ">": "&gt;", "&": "&amp;", '"': "&quot;", "'": "&apos;" };
115
+ var NOT_XML = /(?![\t\n\r])\p{Cc}|[\uD800-\uDFFF\uFFFE\uFFFF]/gu;
116
+ var escapeXml = (text) => text.replace(NOT_XML, "").replace(/[<>&"']/g, (char) => ESCAPES[char]);
117
+ function xmlElement(name, attrs = {}, inner = "") {
118
+ const written = Object.entries(attrs).filter((entry) => entry[1] !== void 0).map(([key, value]) => ` ${key}="${escapeXml(String(value))}"`).join("");
119
+ return inner === "" ? `<${name}${written}/>` : `<${name}${written}>${inner}</${name}>`;
120
+ }
121
+ var XML_DECLARATION = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
122
+
123
+ // src/docx/paragraph-xml.ts
124
+ var INDENT_STEP = 720;
125
+ var JUSTIFY = { left: "left", center: "center", right: "right", justify: "both" };
126
+ var BOTTOM_BORDER = xmlElement(
127
+ "w:pBdr",
128
+ {},
129
+ xmlElement("w:bottom", { "w:val": "single", "w:sz": 6, "w:space": 1, "w:color": "auto" })
130
+ );
131
+ function numberingXml({ numId, level }) {
132
+ if (numId === void 0) return "";
133
+ return xmlElement("w:numPr", {}, xmlElement("w:ilvl", { "w:val": _nullishCoalesce(level, () => ( 0)) }) + xmlElement("w:numId", { "w:val": numId }));
134
+ }
135
+ function paragraphPropsXml(props) {
136
+ const align = _chunkND5XJVK2cjs.alignOrUndefined.call(void 0, props.align);
137
+ const indented = (_nullishCoalesce(props.indent, () => ( 0))) > 0 || props.hanging !== void 0;
138
+ const inner = [
139
+ props.style === void 0 ? "" : xmlElement("w:pStyle", { "w:val": props.style }),
140
+ numberingXml(props),
141
+ props.border ? BOTTOM_BORDER : "",
142
+ props.shade === void 0 ? "" : xmlElement("w:shd", { "w:val": "clear", "w:color": "auto", "w:fill": props.shade }),
143
+ indented ? xmlElement("w:ind", { "w:left": _nullishCoalesce(props.indent, () => ( 0)), "w:hanging": props.hanging }) : "",
144
+ align === void 0 ? "" : xmlElement("w:jc", { "w:val": JUSTIFY[align] })
145
+ ].join("");
146
+ return inner === "" ? "" : xmlElement("w:pPr", {}, inner);
147
+ }
148
+ var paragraphXml = (props, runs) => xmlElement("w:p", {}, paragraphPropsXml(props) + runs);
149
+ var indentOf = (indent) => indent * INDENT_STEP;
150
+
151
+ // src/docx/style-ids.ts
152
+ var CODE_STYLE = "QuoinCode";
153
+ var CODE_CHAR_STYLE = "QuoinCodeChar";
154
+
155
+ // src/docx/run-properties.ts
156
+ var HIGHLIGHT = "yellow";
157
+ function markProps(mark) {
158
+ const color = _optionalChain([mark, 'access', _2 => _2.attrs, 'optionalAccess', _3 => _3.color]);
159
+ switch (mark.type) {
160
+ case "bold":
161
+ return { bold: true };
162
+ case "italic":
163
+ return { italic: true };
164
+ case "underline":
165
+ return { underline: true };
166
+ case "strike":
167
+ return { strike: true };
168
+ case "sub":
169
+ return { vertAlign: "subscript" };
170
+ case "sup":
171
+ return { vertAlign: "superscript" };
172
+ case "code":
173
+ return { style: CODE_CHAR_STYLE };
174
+ case "highlight":
175
+ return { shade: backgroundHex(color || HIGHLIGHT) };
176
+ case "color":
177
+ return { color: textHex(color) };
178
+ case "background":
179
+ return { shade: backgroundHex(color) };
180
+ default:
181
+ return {};
182
+ }
183
+ }
184
+ var defined = (props) => Object.fromEntries(Object.entries(props).filter(([, value]) => value !== void 0));
185
+ function propsOf(marks, base, linked) {
186
+ const props = marks.reduce((all, mark) => ({ ...all, ...defined(markProps(mark)) }), base);
187
+ return linked && props.style === void 0 ? { ...props, style: "Hyperlink" } : props;
188
+ }
189
+ var on = (flag, name) => flag ? xmlElement(name) : "";
190
+ function runPropertiesXml(props) {
191
+ const inner = [
192
+ props.style === void 0 ? "" : xmlElement("w:rStyle", { "w:val": props.style }),
193
+ on(props.bold, "w:b"),
194
+ on(props.italic, "w:i"),
195
+ on(props.strike, "w:strike"),
196
+ props.color === void 0 ? "" : xmlElement("w:color", { "w:val": props.color }),
197
+ props.underline ? xmlElement("w:u", { "w:val": "single" }) : "",
198
+ props.shade === void 0 ? "" : xmlElement("w:shd", { "w:val": "clear", "w:color": "auto", "w:fill": props.shade }),
199
+ props.vertAlign === void 0 ? "" : xmlElement("w:vertAlign", { "w:val": props.vertAlign })
200
+ ].join("");
201
+ return inner === "" ? "" : xmlElement("w:rPr", {}, inner);
202
+ }
203
+
204
+ // src/docx/word-link.ts
205
+ var LINKED = /^(?:https?|mailto|tel):/i;
206
+ function wordLink(href) {
207
+ const safe = _chunkND5XJVK2cjs.sanitizeHref.call(void 0, href);
208
+ return safe !== null && LINKED.test(safe) ? safe : null;
209
+ }
210
+
211
+ // src/docx/runs-xml.ts
212
+ var pieceXml = (piece) => piece === "" ? "" : xmlElement("w:t", { "xml:space": "preserve" }, escapeXml(piece));
213
+ var lineXml = (line) => line.split(" ").map(pieceXml).join("<w:tab/>");
214
+ var textXml = (text) => text.split(/\r\n|\r|\n/).map(lineXml).join("<w:br/>");
215
+ var runXml = (text, props = {}) => text === "" ? "" : xmlElement("w:r", {}, runPropertiesXml(props) + textXml(text));
216
+ function linkOf(marks) {
217
+ const link = marks.find((mark) => mark.type === "link");
218
+ return link ? wordLink(_nullishCoalesce(_optionalChain([link, 'access', _4 => _4.attrs, 'optionalAccess', _5 => _5.href]), () => ( ""))) : null;
219
+ }
220
+ function nodeRun(node, ctx, base, linked) {
221
+ const props = propsOf(node.marks, base, linked);
222
+ if (node.kind === "text") return runXml(node.text, props);
223
+ const text = _nullishCoalesce(_optionalChain([ctx, 'access', _6 => _6.schema, 'access', _7 => _7.atoms, 'access', _8 => _8.get, 'call', _9 => _9(node.type), 'optionalAccess', _10 => _10.plainText, 'call', _11 => _11(node.attrs)]), () => ( ""));
224
+ return runXml(text, node.type === "math" ? { ...props, style: CODE_CHAR_STYLE } : props);
225
+ }
226
+ function runsXml(inline, ctx, base = {}) {
227
+ let out = "";
228
+ let open = null;
229
+ let runs = "";
230
+ const flush = () => {
231
+ out += open === null || runs === "" ? runs : xmlElement("w:hyperlink", { "r:id": ctx.link(open) }, runs);
232
+ runs = "";
233
+ };
234
+ for (const node of _nullishCoalesce(inline, () => ( []))) {
235
+ const href = linkOf(node.marks);
236
+ if (href !== open) {
237
+ flush();
238
+ open = href;
239
+ }
240
+ runs += nodeRun(node, ctx, base, href !== null);
241
+ }
242
+ flush();
243
+ return out;
244
+ }
245
+
246
+ // src/docx/line-xml.ts
247
+ var CHECKBOX_HANG = 360;
248
+ function bookmarked(block, ctx, runs) {
249
+ const name = ctx.bookmarks.get(block.id);
250
+ if (name === void 0) return runs;
251
+ const id = name.slice(2);
252
+ return xmlElement("w:bookmarkStart", { "w:id": id, "w:name": name }) + runs + xmlElement("w:bookmarkEnd", { "w:id": id });
253
+ }
254
+ function lineXml2(block, ctx, numId) {
255
+ const { attrs } = block;
256
+ const runs = runsXml(block.regions.text, ctx, { color: textHex(attrs.color) });
257
+ const props = { align: attrs.align, shade: backgroundHex(attrs.background), indent: indentOf(block.indent) };
258
+ switch (attrs.kind) {
259
+ case "heading":
260
+ return paragraphXml({ ...props, style: `Heading${_nullishCoalesce(_chunkND5XJVK2cjs.headingLevel2.call(void 0, block), () => ( 1))}` }, bookmarked(block, ctx, runs));
261
+ case "bullet":
262
+ case "ordered":
263
+ return paragraphXml({ ...props, indent: void 0, numId, level: Math.min(block.indent, 8) }, runs);
264
+ case "task": {
265
+ const box = attrs.checked === true ? "\u2611 " : "\u2610 ";
266
+ const hung = { ...props, indent: indentOf(block.indent) + CHECKBOX_HANG, hanging: CHECKBOX_HANG };
267
+ return paragraphXml(hung, runXml(box) + runs);
268
+ }
269
+ case "quote":
270
+ return paragraphXml({ ...props, style: "Quote" }, runs);
271
+ default:
272
+ return paragraphXml(props, runs);
273
+ }
274
+ }
275
+
276
+ // src/docx/drawing-xml.ts
277
+ var EMU_PER_PIXEL = 9525;
278
+ var EMU_PER_TWIP = 635;
279
+ var PAGE_TEXT_WIDTH = 9026;
280
+ var PAGE_WIDTH_EMU = PAGE_TEXT_WIDTH * EMU_PER_TWIP;
281
+ var DEFAULT_SIZE = { width: 480, height: 360 };
282
+ var PICTURE = "http://schemas.openxmlformats.org/drawingml/2006/picture";
283
+ var DRAWING = "http://schemas.openxmlformats.org/drawingml/2006/main";
284
+ function pixelSize({ image }, attrs) {
285
+ if (image.width && image.height) return { width: image.width, height: image.height };
286
+ const width = _chunkND5XJVK2cjs.optionalNumber.call(void 0, attrs.width);
287
+ const height = _chunkND5XJVK2cjs.optionalNumber.call(void 0, attrs.height);
288
+ return width && height && width > 0 && height > 0 ? { width, height } : DEFAULT_SIZE;
289
+ }
290
+ function extent(place, attrs) {
291
+ const { width, height } = pixelSize(place, attrs);
292
+ const percent = _chunkND5XJVK2cjs.optionalNumber.call(void 0, attrs.widthPercent);
293
+ const own = width * EMU_PER_PIXEL;
294
+ const share = percent && percent > 0 && percent <= 100 ? PAGE_WIDTH_EMU * percent / 100 : void 0;
295
+ const cx = Math.round(_nullishCoalesce(share, () => ( Math.min(own, PAGE_WIDTH_EMU))));
296
+ return { cx, cy: Math.round(cx * height / width) };
297
+ }
298
+ function drawingXml(place, attrs, alt, id) {
299
+ const { cx, cy } = extent(place, attrs);
300
+ const size = { cx, cy };
301
+ const picture = xmlElement(
302
+ "pic:pic",
303
+ { "xmlns:pic": PICTURE },
304
+ xmlElement("pic:nvPicPr", {}, xmlElement("pic:cNvPr", { id, name: place.name }) + xmlElement("pic:cNvPicPr")) + xmlElement("pic:blipFill", {}, xmlElement("a:blip", { "r:embed": place.rId }) + "<a:stretch><a:fillRect/></a:stretch>") + xmlElement(
305
+ "pic:spPr",
306
+ {},
307
+ xmlElement("a:xfrm", {}, xmlElement("a:off", { x: 0, y: 0 }) + xmlElement("a:ext", size)) + '<a:prstGeom prst="rect"><a:avLst/></a:prstGeom>'
308
+ )
309
+ );
310
+ const inline = xmlElement(
311
+ "wp:inline",
312
+ { distT: 0, distB: 0, distL: 0, distR: 0 },
313
+ xmlElement("wp:extent", size) + xmlElement("wp:docPr", { id, name: `Picture ${id}`, descr: alt || void 0 }) + xmlElement("a:graphic", { "xmlns:a": DRAWING }, xmlElement("a:graphicData", { uri: PICTURE }, picture))
314
+ );
315
+ return xmlElement("w:r", {}, xmlElement("w:drawing", {}, inline));
316
+ }
317
+
318
+ // src/docx/media-xml.ts
319
+ function linkParagraphXml(href, text, ctx, indent) {
320
+ const safe = href === null ? null : wordLink(href);
321
+ const runs = safe ? xmlElement("w:hyperlink", { "r:id": ctx.link(safe) }, runXml(text, { style: "Hyperlink" })) : runXml(text);
322
+ return paragraphXml({ indent: indentOf(indent) }, runs);
323
+ }
324
+ function imageXml(block, ctx) {
325
+ const { attrs } = block;
326
+ const alt = _chunkND5XJVK2cjs.str.call(void 0, attrs.alt);
327
+ const place = ctx.picture(pictureUrl(block, ctx.resolveAssetUrl));
328
+ const props = { indent: indentOf(block.indent), align: attrs.align };
329
+ const picture = place ? drawingXml(place, attrs, alt, ctx.drawingId()) : runXml(alt);
330
+ const caption = _nullishCoalesce(block.regions.caption, () => ( []));
331
+ return (picture === "" ? "" : paragraphXml(props, picture)) + (caption.length > 0 ? paragraphXml({ ...props, style: "Caption" }, runsXml(caption, ctx)) : "");
332
+ }
333
+ var fileXml = (block, ctx) => linkParagraphXml(assetUrl(block, ctx.resolveAssetUrl), _chunkND5XJVK2cjs.str.call(void 0, block.attrs.filename), ctx, block.indent);
334
+ function webLinkXml(block, ctx) {
335
+ const url = _chunkND5XJVK2cjs.str.call(void 0, block.attrs.url);
336
+ const text = block.type === "BOOKMARK" ? _chunkND5XJVK2cjs.str.call(void 0, block.attrs.title) || url : url;
337
+ return url === "" ? "" : linkParagraphXml(url, text, ctx, block.indent);
338
+ }
339
+
340
+ // src/docx/table-xml.ts
341
+ var TONE_COLORS = {
342
+ info: "blue",
343
+ tip: "purple",
344
+ success: "green",
345
+ warning: "yellow",
346
+ danger: "red"
347
+ };
348
+ var NO_BORDERS = xmlElement(
349
+ "w:tblBorders",
350
+ {},
351
+ ["top", "left", "bottom", "right", "insideH", "insideV"].map((side) => xmlElement(`w:${side}`, { "w:val": "nil" })).join("")
352
+ );
353
+ function tableShell({ cols, indent, style, rows }) {
354
+ const width = Math.floor((PAGE_TEXT_WIDTH - indentOf(indent)) / cols);
355
+ const props = (style ? xmlElement("w:tblStyle", { "w:val": style }) : "") + xmlElement("w:tblW", { "w:w": width * cols, "w:type": "dxa" }) + (indent > 0 ? xmlElement("w:tblInd", { "w:w": indentOf(indent), "w:type": "dxa" }) : "") + (style ? "" : NO_BORDERS);
356
+ const grid = Array.from({ length: cols }, () => xmlElement("w:gridCol", { "w:w": width })).join("");
357
+ return xmlElement("w:tbl", {}, xmlElement("w:tblPr", {}, props) + xmlElement("w:tblGrid", {}, grid) + rows.join(""));
358
+ }
359
+ var cellXml = (inner, cellProps = "") => xmlElement("w:tc", {}, (cellProps && xmlElement("w:tcPr", {}, cellProps)) + inner);
360
+ function tableXml(block, ctx) {
361
+ const rows = _chunkND5XJVK2cjs.tableCells.call(void 0, block);
362
+ const cols = _nullishCoalesce(_optionalChain([rows, 'access', _12 => _12[0], 'optionalAccess', _13 => _13.length]), () => ( 0));
363
+ if (rows.length === 0 || cols === 0) return "";
364
+ const aligns = Array.isArray(block.attrs.align) ? block.attrs.align : [];
365
+ const headed = block.attrs.header !== false;
366
+ const rowXml = (cells, header2) => {
367
+ const base = header2 ? { bold: true } : {};
368
+ const written2 = cells.map((cell, col) => cellXml(paragraphXml({ align: aligns[col] }, runsXml(cell, ctx, base))));
369
+ return xmlElement("w:tr", {}, (header2 ? "<w:trPr><w:tblHeader/></w:trPr>" : "") + written2.join(""));
370
+ };
371
+ const written = rows.map((cells, row) => rowXml(cells, headed && row === 0));
372
+ return tableShell({ cols, indent: block.indent, style: "TableGrid", rows: written });
373
+ }
374
+ function calloutXml(block, ctx) {
375
+ const icon = _chunkND5XJVK2cjs.str.call(void 0, block.attrs.icon);
376
+ const fill = backgroundHex(_nullishCoalesce(TONE_COLORS[_chunkND5XJVK2cjs.str.call(void 0, block.attrs.tone)], () => ( "gray")));
377
+ const shade = xmlElement("w:shd", { "w:val": "clear", "w:color": "auto", "w:fill": fill });
378
+ const body = paragraphXml({}, (icon === "" ? "" : runXml(`${icon} `)) + runsXml(block.regions.body, ctx));
379
+ return tableShell({ cols: 1, indent: block.indent, rows: [xmlElement("w:tr", {}, cellXml(body, shade))] });
380
+ }
381
+
382
+ // src/docx/toc-xml.ts
383
+ var LEVEL_STEP = 360;
384
+ function entriesXml(nodes, depth, ctx, indent) {
385
+ return nodes.map(({ heading, children }) => {
386
+ const anchor = _nullishCoalesce(ctx.bookmarks.get(heading.blockId), () => ( ""));
387
+ const run = runXml(heading.text, { style: "Hyperlink" });
388
+ const link = xmlElement("w:hyperlink", { "w:anchor": anchor, "w:history": 1 }, run);
389
+ return paragraphXml({ indent: indent + depth * LEVEL_STEP }, link) + entriesXml(children, depth + 1, ctx, indent);
390
+ }).join("");
391
+ }
392
+ var tocXml = (headings2, ctx, indent) => entriesXml(_chunkND5XJVK2cjs.nestHeadings.call(void 0, headings2), 0, ctx, indent);
393
+
394
+ // src/docx/block-xml.ts
395
+ function unknownXml(block, ctx) {
396
+ const text = _chunkND5XJVK2cjs.blockPlainText.call(void 0, block, ctx.schema);
397
+ const label = runXml(`[${block.type}]`, { italic: true });
398
+ return paragraphXml({ indent: indentOf(block.indent) }, label + runXml(text && ` ${text}`));
399
+ }
400
+ function blockXml(block, ctx, numId) {
401
+ const indent = { indent: indentOf(block.indent) };
402
+ switch (block.type) {
403
+ case "MARKDOWN":
404
+ return lineXml2(block, ctx, numId);
405
+ case "CALLOUT":
406
+ return calloutXml(block, ctx);
407
+ case "CODE":
408
+ return paragraphXml({ ...indent, style: CODE_STYLE }, runXml(_chunkND5XJVK2cjs.str.call(void 0, block.attrs.code)));
409
+ case "IMAGE":
410
+ return imageXml(block, ctx);
411
+ case "FILE":
412
+ return fileXml(block, ctx);
413
+ case "DIVIDER":
414
+ return paragraphXml({ ...indent, border: true }, "");
415
+ case "TOGGLE":
416
+ return paragraphXml(indent, runsXml(block.regions.text, ctx));
417
+ case "TABLE":
418
+ return tableXml(block, ctx);
419
+ case "EMBED":
420
+ case "BOOKMARK":
421
+ return webLinkXml(block, ctx);
422
+ case "MATH":
423
+ return paragraphXml(indent, runXml(_chunkND5XJVK2cjs.str.call(void 0, block.attrs.latex), { style: CODE_CHAR_STYLE }));
424
+ case "TOC":
425
+ return tocXml(ctx.headings, ctx, indent.indent);
426
+ default:
427
+ return unknownXml(block, ctx);
428
+ }
429
+ }
430
+
431
+ // src/docx/document-xml.ts
432
+ var NAMESPACES = {
433
+ "xmlns:w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
434
+ "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
435
+ "xmlns:wp": "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
436
+ };
437
+ var MARGIN = 1440;
438
+ var SECTION = xmlElement(
439
+ "w:sectPr",
440
+ {},
441
+ xmlElement("w:pgSz", { "w:w": PAGE_TEXT_WIDTH + 2 * MARGIN, "w:h": 16838 }) + xmlElement("w:pgMar", {
442
+ "w:top": MARGIN,
443
+ "w:right": MARGIN,
444
+ "w:bottom": MARGIN,
445
+ "w:left": MARGIN,
446
+ "w:header": 708,
447
+ "w:footer": 708,
448
+ "w:gutter": 0
449
+ })
450
+ );
451
+ var LEVELS = 9;
452
+ function entryXml({ block, children }, ctx, numId) {
453
+ return blockXml(block, ctx, numId) + groupsXml(children, ctx);
454
+ }
455
+ function groupXml(group, ctx) {
456
+ if (group.kind === "single") return entryXml(group.entry, ctx);
457
+ if (group.kind === "quote") return group.items.map((entry) => entryXml(entry, ctx)).join("");
458
+ const first = group.items[0].block;
459
+ const start = first.attrs.start;
460
+ const numId = group.list === "task" ? void 0 : ctx.list(group.list === "ordered", Math.min(first.indent, LEVELS - 1), Number.isInteger(start) ? Number(start) : 1);
461
+ return group.items.map((entry) => entryXml(entry, ctx, numId)).join("");
462
+ }
463
+ var groupsXml = (groups, ctx) => groups.map((group) => groupXml(group, ctx)).join("");
464
+ var separateTables = (body) => body.replaceAll("</w:tbl><w:tbl>", "</w:tbl><w:p/><w:tbl>").replace(/<\/w:tbl>$/, "</w:tbl><w:p/>");
465
+ function documentXml(groups, ctx) {
466
+ const body = separateTables(groupsXml(groups, ctx)) || "<w:p/>";
467
+ return XML_DECLARATION + xmlElement("w:document", NAMESPACES, xmlElement("w:body", {}, body + SECTION));
468
+ }
469
+
470
+ // src/docx/fetch-asset.ts
471
+ async function bytesOf(answer) {
472
+ if (answer instanceof Uint8Array) return answer;
473
+ if (answer instanceof ArrayBuffer) return new Uint8Array(answer);
474
+ if ("ok" in answer && !answer.ok) throw new Error(`status ${answer.status}`);
475
+ return new Uint8Array(await answer.arrayBuffer());
476
+ }
477
+ var defaultFetch = (url, init) => fetch(url, init);
478
+ var LONGEST_WAIT = 2147483647;
479
+ var waitOf = (timeout) => timeout >= 0 && timeout <= LONGEST_WAIT ? timeout : LONGEST_WAIT;
480
+ async function fetchBytes(url, fetchAsset = defaultFetch, timeout) {
481
+ const controller = new AbortController();
482
+ let timer;
483
+ const expired = new Promise((resolve) => {
484
+ timer = setTimeout(() => {
485
+ controller.abort();
486
+ resolve(null);
487
+ }, waitOf(timeout));
488
+ });
489
+ const read = (async () => bytesOf(await fetchAsset(url, { signal: controller.signal })))();
490
+ try {
491
+ return await Promise.race([read, expired]);
492
+ } catch (e) {
493
+ return null;
494
+ } finally {
495
+ clearTimeout(timer);
496
+ read.catch(() => void 0);
497
+ }
498
+ }
499
+
500
+ // src/docx/image-size.ts
501
+ var startsWith = (bytes, signature, at = 0) => bytes.length >= at + signature.length && signature.every((byte, index) => bytes[at + index] === byte);
502
+ var ascii = (text) => [...text].map((char) => char.charCodeAt(0));
503
+ var sized = (width, height) => width > 0 && height > 0 ? { width, height } : void 0;
504
+ function pngSize(view) {
505
+ return view.byteLength >= 24 ? sized(view.getUint32(16), view.getUint32(20)) : void 0;
506
+ }
507
+ function gifSize(view) {
508
+ return view.byteLength >= 10 ? sized(view.getUint16(6, true), view.getUint16(8, true)) : void 0;
509
+ }
510
+ function jpegSize(view) {
511
+ let at = 2;
512
+ while (at + 9 <= view.byteLength && view.getUint8(at) === 255) {
513
+ if (view.getUint8(at + 1) === 255) {
514
+ at++;
515
+ continue;
516
+ }
517
+ const marker = view.getUint8(at + 1);
518
+ if (marker >= 192 && marker <= 207 && marker !== 196 && marker !== 200 && marker !== 204) {
519
+ return sized(view.getUint16(at + 7), view.getUint16(at + 5));
520
+ }
521
+ at += 2 + view.getUint16(at + 2);
522
+ }
523
+ return void 0;
524
+ }
525
+ var uint24 = (view, at) => view.getUint8(at) | view.getUint8(at + 1) << 8 | view.getUint8(at + 2) << 16;
526
+ function webpSize(view, bytes) {
527
+ if (startsWith(bytes, ascii("VP8 "), 12) && view.byteLength >= 30) {
528
+ return sized(view.getUint16(26, true) & 16383, view.getUint16(28, true) & 16383);
529
+ }
530
+ if (startsWith(bytes, ascii("VP8L"), 12) && view.byteLength >= 25) {
531
+ const bits = view.getUint32(21, true);
532
+ return sized((bits & 16383) + 1, (bits >>> 14 & 16383) + 1);
533
+ }
534
+ if (startsWith(bytes, ascii("VP8X"), 12) && view.byteLength >= 30) return sized(uint24(view, 24) + 1, uint24(view, 27) + 1);
535
+ return void 0;
536
+ }
537
+ var FORMATS = [
538
+ { extension: "png", signature: [137, 80, 78, 71], size: pngSize },
539
+ { extension: "jpeg", signature: [255, 216, 255], size: jpegSize },
540
+ { extension: "gif", signature: ascii("GIF8"), size: gifSize },
541
+ { extension: "webp", signature: ascii("RIFF"), size: webpSize }
542
+ ];
543
+ function imageFormat(bytes) {
544
+ const format = FORMATS.find(
545
+ ({ extension, signature }) => startsWith(bytes, signature) && (extension !== "webp" || startsWith(bytes, ascii("WEBP"), 8))
546
+ );
547
+ if (!format) return null;
548
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
549
+ return { extension: format.extension, type: `image/${format.extension}`, ...format.size(view, bytes) };
550
+ }
551
+
552
+ // src/docx/images.ts
553
+ async function load(url, loading) {
554
+ const data = await fetchBytes(url, loading.fetchAsset, loading.timeout);
555
+ const format = data && imageFormat(data);
556
+ return format ? { ...format, data } : null;
557
+ }
558
+ async function loadImages(urls, loading) {
559
+ const queue = [...new Set(urls)];
560
+ const loaded = /* @__PURE__ */ new Map();
561
+ const worker = async () => {
562
+ for (let url = queue.shift(); url !== void 0; url = queue.shift()) loaded.set(url, await load(url, loading));
563
+ };
564
+ const workers = Math.min(Math.max(1, Math.floor(loading.concurrency) || 1), queue.length);
565
+ await Promise.all(Array.from({ length: workers }, worker));
566
+ return loaded;
567
+ }
568
+
569
+ // src/docx/numbering-xml.ts
570
+ var LEVELS2 = 9;
571
+ var BULLETS = ["\u2022", "\u25E6", "\u25AA"];
572
+ var ORDERED_FORMATS = ["decimal", "lowerLetter", "lowerRoman"];
573
+ var HANG = 360;
574
+ var BULLET = 0;
575
+ var ORDERED = 1;
576
+ function levelXml(level, ordered) {
577
+ const format = ordered ? ORDERED_FORMATS[level % 3] : "bullet";
578
+ const text = ordered ? `%${level + 1}.` : BULLETS[level % 3];
579
+ return xmlElement(
580
+ "w:lvl",
581
+ { "w:ilvl": level },
582
+ xmlElement("w:start", { "w:val": 1 }) + xmlElement("w:numFmt", { "w:val": format }) + xmlElement("w:lvlText", { "w:val": text }) + xmlElement("w:lvlJc", { "w:val": "left" }) + xmlElement("w:pPr", {}, xmlElement("w:ind", { "w:left": (level + 1) * INDENT_STEP, "w:hanging": HANG }))
583
+ );
584
+ }
585
+ var abstractXml = (id, ordered) => xmlElement(
586
+ "w:abstractNum",
587
+ { "w:abstractNumId": id },
588
+ xmlElement("w:multiLevelType", { "w:val": "hybridMultilevel" }) + Array.from({ length: LEVELS2 }, (_, level) => levelXml(level, ordered)).join("")
589
+ );
590
+ function numXml({ numId, ordered, level, start }) {
591
+ const override = (at) => xmlElement("w:lvlOverride", { "w:ilvl": at }, xmlElement("w:startOverride", { "w:val": at === level ? start : 1 }));
592
+ const restart = ordered ? Array.from({ length: LEVELS2 }, (_, at) => override(at)).join("") : "";
593
+ const scheme = xmlElement("w:abstractNumId", { "w:val": ordered ? ORDERED : BULLET });
594
+ return xmlElement("w:num", { "w:numId": numId }, scheme + restart);
595
+ }
596
+ var numberingXml2 = (lists) => XML_DECLARATION + xmlElement(
597
+ "w:numbering",
598
+ { "xmlns:w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main" },
599
+ abstractXml(BULLET, false) + abstractXml(ORDERED, true) + lists.map(numXml).join("")
600
+ );
601
+
602
+ // src/docx/package-xml.ts
603
+ var RELATIONSHIPS = "http://schemas.openxmlformats.org/package/2006/relationships";
604
+ var OFFICE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
605
+ var WORD = "application/vnd.openxmlformats-officedocument.wordprocessingml";
606
+ var CORE_PROPERTIES = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
607
+ var relationshipsXml = (items) => XML_DECLARATION + xmlElement("Relationships", { xmlns: RELATIONSHIPS }, items.map((item) => xmlElement("Relationship", item)).join(""));
608
+ function contentTypesXml(media) {
609
+ const pictures = [...new Map(media.map(({ extension, type }) => [extension, type]))];
610
+ const defaults = [
611
+ ["rels", "application/vnd.openxmlformats-package.relationships+xml"],
612
+ ["xml", "application/xml"],
613
+ ...pictures
614
+ ].map(([Extension, ContentType]) => xmlElement("Default", { Extension, ContentType }));
615
+ const overrides = [
616
+ ["/word/document.xml", `${WORD}.document.main+xml`],
617
+ ["/word/styles.xml", `${WORD}.styles+xml`],
618
+ ["/word/numbering.xml", `${WORD}.numbering+xml`],
619
+ ["/docProps/core.xml", "application/vnd.openxmlformats-package.core-properties+xml"]
620
+ ].map(([PartName, ContentType]) => xmlElement("Override", { PartName, ContentType }));
621
+ const types = "http://schemas.openxmlformats.org/package/2006/content-types";
622
+ return XML_DECLARATION + xmlElement("Types", { xmlns: types }, [...defaults, ...overrides].join(""));
623
+ }
624
+ var packageRelationshipsXml = () => relationshipsXml([
625
+ { Id: "rId1", Type: `${OFFICE}/officeDocument`, Target: "word/document.xml" },
626
+ { Id: "rId2", Type: CORE_PROPERTIES, Target: "docProps/core.xml" }
627
+ ]);
628
+ var documentRelationshipsXml = (relationships) => relationshipsXml([
629
+ { Id: "rId1", Type: `${OFFICE}/styles`, Target: "styles.xml" },
630
+ { Id: "rId2", Type: `${OFFICE}/numbering`, Target: "numbering.xml" },
631
+ ...relationships.map(({ id, kind, target }) => ({
632
+ Id: id,
633
+ Type: `${OFFICE}/${kind}`,
634
+ Target: target,
635
+ TargetMode: kind === "hyperlink" ? "External" : void 0
636
+ }))
637
+ ]);
638
+ function corePropertiesXml(title) {
639
+ const attrs = {
640
+ "xmlns:cp": "http://schemas.openxmlformats.org/package/2006/metadata/core-properties",
641
+ "xmlns:dc": "http://purl.org/dc/elements/1.1/",
642
+ "xmlns:dcterms": "http://purl.org/dc/terms/"
643
+ };
644
+ const inner = title ? xmlElement("dc:title", {}, escapeXml(title)) : "";
645
+ return XML_DECLARATION + xmlElement("cp:coreProperties", attrs, inner);
646
+ }
647
+
648
+ // src/docx/styles-xml.ts
649
+ var MONO = '<w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:cs="Consolas"/>';
650
+ var HEADING_SIZES = [36, 30, 26, 24, 22, 22];
651
+ function styleXml({ type, id, name, basedOn, pPr, rPr, tblPr }) {
652
+ return xmlElement(
653
+ "w:style",
654
+ { "w:type": type, "w:styleId": id, "w:default": id === "Normal" ? 1 : void 0 },
655
+ xmlElement("w:name", { "w:val": name }) + (basedOn ? xmlElement("w:basedOn", { "w:val": basedOn }) : "") + (type === "paragraph" ? xmlElement("w:next", { "w:val": "Normal" }) : "") + (pPr ? xmlElement("w:pPr", {}, pPr) : "") + (rPr ? xmlElement("w:rPr", {}, rPr) : "") + (tblPr ? xmlElement("w:tblPr", {}, tblPr) : "")
656
+ );
657
+ }
658
+ var headings = HEADING_SIZES.map((size, at) => ({
659
+ type: "paragraph",
660
+ id: `Heading${at + 1}`,
661
+ name: `heading ${at + 1}`,
662
+ basedOn: "Normal",
663
+ pPr: `<w:keepNext/><w:spacing w:before="${at < 2 ? 360 : 240}" w:after="120"/><w:outlineLvl w:val="${at}"/>`,
664
+ rPr: `<w:b/><w:sz w:val="${size}"/><w:szCs w:val="${size}"/>`
665
+ }));
666
+ var border = (side) => `<w:${side} w:val="single" w:sz="4" w:space="0" w:color="BFBFBF"/>`;
667
+ var STYLES = [
668
+ { type: "paragraph", id: "Normal", name: "Normal", pPr: '<w:spacing w:after="120" w:line="276" w:lineRule="auto"/>' },
669
+ ...headings,
670
+ {
671
+ type: "paragraph",
672
+ id: "Quote",
673
+ name: "Quote",
674
+ basedOn: "Normal",
675
+ pPr: '<w:pBdr><w:left w:val="single" w:sz="18" w:space="8" w:color="BFBFBF"/></w:pBdr><w:ind w:left="240"/>',
676
+ rPr: '<w:i/><w:color w:val="595959"/>'
677
+ },
678
+ {
679
+ type: "paragraph",
680
+ id: CODE_STYLE,
681
+ name: "Code",
682
+ basedOn: "Normal",
683
+ pPr: '<w:shd w:val="clear" w:color="auto" w:fill="F0F0F0"/><w:spacing w:after="120" w:line="240" w:lineRule="auto"/>',
684
+ rPr: `${MONO}<w:sz w:val="20"/>`
685
+ },
686
+ {
687
+ type: "paragraph",
688
+ id: "Caption",
689
+ name: "caption",
690
+ basedOn: "Normal",
691
+ rPr: '<w:i/><w:color w:val="595959"/><w:sz w:val="18"/>'
692
+ },
693
+ {
694
+ type: "character",
695
+ id: CODE_CHAR_STYLE,
696
+ name: "Code Char",
697
+ rPr: `${MONO}<w:shd w:val="clear" w:color="auto" w:fill="F0F0F0"/>`
698
+ },
699
+ { type: "character", id: "Hyperlink", name: "Hyperlink", rPr: '<w:color w:val="0A71B1"/><w:u w:val="single"/>' },
700
+ {
701
+ type: "table",
702
+ id: "TableGrid",
703
+ name: "Table Grid",
704
+ tblPr: `<w:tblBorders>${["top", "left", "bottom", "right", "insideH", "insideV"].map(border).join("")}</w:tblBorders>`
705
+ }
706
+ ];
707
+ var DEFAULTS = '<w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:eastAsia="Calibri" w:cs="Calibri"/><w:sz w:val="22"/><w:szCs w:val="22"/><w:lang w:val="en-US"/></w:rPr></w:rPrDefault><w:pPrDefault/></w:docDefaults>';
708
+ var stylesXml = () => XML_DECLARATION + xmlElement(
709
+ "w:styles",
710
+ { "xmlns:w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main" },
711
+ DEFAULTS + STYLES.map(styleXml).join("")
712
+ );
713
+
714
+ // src/docx/crc32.ts
715
+ var table;
716
+ function crcTable() {
717
+ table ??= Uint32Array.from({ length: 256 }, (_, byte) => {
718
+ let crc = byte;
719
+ for (let bit = 0; bit < 8; bit++) crc = crc & 1 ? 3988292384 ^ crc >>> 1 : crc >>> 1;
720
+ return crc;
721
+ });
722
+ return table;
723
+ }
724
+ function crc32(bytes) {
725
+ const lookup = crcTable();
726
+ let crc = 4294967295;
727
+ for (const byte of bytes) crc = lookup[(crc ^ byte) & 255] ^ crc >>> 8;
728
+ return (crc ^ 4294967295) >>> 0;
729
+ }
730
+
731
+ // src/docx/deflate.ts
732
+ async function deflateRaw(bytes) {
733
+ try {
734
+ const compressed = new Blob([bytes]).stream().pipeThrough(new CompressionStream("deflate-raw"));
735
+ return new Uint8Array(await new Response(compressed).arrayBuffer());
736
+ } catch (e2) {
737
+ return null;
738
+ }
739
+ }
740
+
741
+ // src/docx/zip.ts
742
+ var UTF8_NAMES = 2048;
743
+ var DEFLATE = 8;
744
+ var DOS_DATE = 0 << 9 | 1 << 5 | 1;
745
+ async function entryOf({ path, data }) {
746
+ const deflated = await deflateRaw(data);
747
+ const smaller = deflated !== null && deflated.length < data.length;
748
+ return {
749
+ name: new TextEncoder().encode(path),
750
+ crc: crc32(data),
751
+ size: data.length,
752
+ method: smaller ? DEFLATE : 0,
753
+ body: smaller ? deflated : data
754
+ };
755
+ }
756
+ function header(signature, entry, central) {
757
+ const length = central === void 0 ? 30 : 46;
758
+ const bytes = new Uint8Array(length + entry.name.length);
759
+ const view = new DataView(bytes.buffer);
760
+ let at = 0;
761
+ const u16 = (value) => (view.setUint16(at, value, true), at += 2);
762
+ const u32 = (value) => (view.setUint32(at, value, true), at += 4);
763
+ u32(signature);
764
+ if (central !== void 0) u16(20);
765
+ u16(20);
766
+ u16(UTF8_NAMES);
767
+ u16(entry.method);
768
+ u16(0);
769
+ u16(DOS_DATE);
770
+ u32(entry.crc);
771
+ u32(entry.body.length);
772
+ u32(entry.size);
773
+ u16(entry.name.length);
774
+ u16(0);
775
+ if (central !== void 0) {
776
+ u16(0);
777
+ u16(0);
778
+ u16(0);
779
+ u32(0);
780
+ u32(central);
781
+ }
782
+ bytes.set(entry.name, length);
783
+ return bytes;
784
+ }
785
+ function endOfDirectory(count, size, offset) {
786
+ const bytes = new Uint8Array(22);
787
+ const view = new DataView(bytes.buffer);
788
+ view.setUint32(0, 101010256, true);
789
+ view.setUint16(8, count, true);
790
+ view.setUint16(10, count, true);
791
+ view.setUint32(12, size, true);
792
+ view.setUint32(16, offset, true);
793
+ return bytes;
794
+ }
795
+ function concat(parts) {
796
+ const out = new Uint8Array(parts.reduce((sum, part) => sum + part.length, 0));
797
+ let at = 0;
798
+ for (const part of parts) {
799
+ out.set(part, at);
800
+ at += part.length;
801
+ }
802
+ return out;
803
+ }
804
+ async function zipArchive(files) {
805
+ const entries = await Promise.all(files.map(entryOf));
806
+ const local = [];
807
+ const central = [];
808
+ let offset = 0;
809
+ for (const entry of entries) {
810
+ const head = header(67324752, entry, void 0);
811
+ central.push(header(33639248, entry, offset));
812
+ local.push(head, entry.body);
813
+ offset += head.length + entry.body.length;
814
+ }
815
+ const directory = concat(central);
816
+ return concat([...local, directory, endOfDirectory(entries.length, directory.length, offset)]);
817
+ }
818
+
819
+ // src/docx/index.ts
820
+ var WORD_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
821
+ var IMAGE_TIMEOUT = 1e4;
822
+ var IMAGE_CONCURRENCY = 4;
823
+ var encode = (xml) => new TextEncoder().encode(xml);
824
+ async function toDocx(blocks, options = {}) {
825
+ const schema = _nullishCoalesce(options.schema, () => ( _chunkND5XJVK2cjs.createSchema.call(void 0, )));
826
+ const resolveAssetUrl = _nullishCoalesce(options.resolveAssetUrl, () => ( _chunkND5XJVK2cjs.sanitizeHref));
827
+ const engine = _chunkND5XJVK2cjs.engineBlocksOf.call(void 0, blocks, schema);
828
+ const urls = engine.filter((block) => block.type === "IMAGE").map((block) => pictureUrl(block, resolveAssetUrl));
829
+ const images = await loadImages(
830
+ urls.filter((url) => url !== null),
831
+ {
832
+ fetchAsset: options.fetchAsset,
833
+ timeout: _nullishCoalesce(options.imageTimeout, () => ( IMAGE_TIMEOUT)),
834
+ concurrency: _nullishCoalesce(options.imageConcurrency, () => ( IMAGE_CONCURRENCY))
835
+ }
836
+ );
837
+ const ctx = createContext({ schema, resolveAssetUrl, headings: _chunkND5XJVK2cjs.collectHeadings.call(void 0, engine, schema), images });
838
+ const mainPart = documentXml(_chunkND5XJVK2cjs.groupBlocks.call(void 0, engine), ctx);
839
+ const archive = await zipArchive([
840
+ { path: "[Content_Types].xml", data: encode(contentTypesXml(ctx.media)) },
841
+ { path: "_rels/.rels", data: encode(packageRelationshipsXml()) },
842
+ { path: "docProps/core.xml", data: encode(corePropertiesXml(options.title)) },
843
+ { path: "word/document.xml", data: encode(mainPart) },
844
+ { path: "word/styles.xml", data: encode(stylesXml()) },
845
+ { path: "word/numbering.xml", data: encode(numberingXml2(ctx.lists)) },
846
+ { path: "word/_rels/document.xml.rels", data: encode(documentRelationshipsXml(ctx.relationships)) },
847
+ ...ctx.media.map(({ path, data }) => ({ path, data }))
848
+ ]);
849
+ return new Blob([archive], { type: WORD_TYPE });
850
+ }
851
+
852
+
853
+ exports.toDocx = toDocx;
854
+ //# sourceMappingURL=docx.cjs.map