@aster-editor/word 0.4.3 → 0.5.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 (250) hide show
  1. package/README.md +204 -82
  2. package/dist/docx/compare/align.d.ts +24 -0
  3. package/dist/docx/compare/align.d.ts.map +1 -0
  4. package/dist/docx/compare/align.js +217 -0
  5. package/dist/docx/compare/align.js.map +1 -0
  6. package/dist/docx/compare/compare-blocks.d.ts +29 -0
  7. package/dist/docx/compare/compare-blocks.d.ts.map +1 -0
  8. package/dist/docx/compare/compare-blocks.js +234 -0
  9. package/dist/docx/compare/compare-blocks.js.map +1 -0
  10. package/dist/docx/compare/compare-context.d.ts +25 -0
  11. package/dist/docx/compare/compare-context.d.ts.map +1 -0
  12. package/dist/docx/compare/compare-context.js +31 -0
  13. package/dist/docx/compare/compare-context.js.map +1 -0
  14. package/dist/docx/compare/compare-docx.d.ts +4 -0
  15. package/dist/docx/compare/compare-docx.d.ts.map +1 -0
  16. package/dist/docx/compare/compare-docx.js +173 -0
  17. package/dist/docx/compare/compare-docx.js.map +1 -0
  18. package/dist/docx/compare/compare-tables.d.ts +13 -0
  19. package/dist/docx/compare/compare-tables.d.ts.map +1 -0
  20. package/dist/docx/compare/compare-tables.js +47 -0
  21. package/dist/docx/compare/compare-tables.js.map +1 -0
  22. package/dist/docx/compare/model-borders.d.ts +27 -0
  23. package/dist/docx/compare/model-borders.d.ts.map +1 -0
  24. package/dist/docx/compare/model-borders.js +41 -0
  25. package/dist/docx/compare/model-borders.js.map +1 -0
  26. package/dist/docx/compare/model-paragraph.d.ts +25 -0
  27. package/dist/docx/compare/model-paragraph.d.ts.map +1 -0
  28. package/dist/docx/compare/model-paragraph.js +309 -0
  29. package/dist/docx/compare/model-paragraph.js.map +1 -0
  30. package/dist/docx/compare/model-sections.d.ts +11 -0
  31. package/dist/docx/compare/model-sections.d.ts.map +1 -0
  32. package/dist/docx/compare/model-sections.js +97 -0
  33. package/dist/docx/compare/model-sections.js.map +1 -0
  34. package/dist/docx/compare/model.d.ts +113 -0
  35. package/dist/docx/compare/model.d.ts.map +1 -0
  36. package/dist/docx/compare/model.js +214 -0
  37. package/dist/docx/compare/model.js.map +1 -0
  38. package/dist/docx/compare/parts.d.ts +40 -0
  39. package/dist/docx/compare/parts.d.ts.map +1 -0
  40. package/dist/docx/compare/parts.js +113 -0
  41. package/dist/docx/compare/parts.js.map +1 -0
  42. package/dist/docx/compare/tally.d.ts +23 -0
  43. package/dist/docx/compare/tally.d.ts.map +1 -0
  44. package/dist/docx/compare/tally.js +94 -0
  45. package/dist/docx/compare/tally.js.map +1 -0
  46. package/dist/docx/compare/types.d.ts +55 -0
  47. package/dist/docx/compare/types.d.ts.map +1 -0
  48. package/dist/docx/compare/types.js +2 -0
  49. package/dist/docx/compare/types.js.map +1 -0
  50. package/dist/docx/compare/values.d.ts +13 -0
  51. package/dist/docx/compare/values.d.ts.map +1 -0
  52. package/dist/docx/compare/values.js +44 -0
  53. package/dist/docx/compare/values.js.map +1 -0
  54. package/dist/docx/import-docx.d.ts.map +1 -1
  55. package/dist/docx/import-docx.js +57 -2
  56. package/dist/docx/import-docx.js.map +1 -1
  57. package/dist/docx/preprocess/variables.d.ts.map +1 -1
  58. package/dist/docx/preprocess/variables.js +2 -2
  59. package/dist/docx/preprocess/variables.js.map +1 -1
  60. package/dist/docx/preprocess/xml-utils.d.ts +7 -0
  61. package/dist/docx/preprocess/xml-utils.d.ts.map +1 -1
  62. package/dist/docx/preprocess/xml-utils.js +9 -0
  63. package/dist/docx/preprocess/xml-utils.js.map +1 -1
  64. package/dist/docx/reader/headers.d.ts +17 -0
  65. package/dist/docx/reader/headers.d.ts.map +1 -0
  66. package/dist/docx/reader/headers.js +64 -0
  67. package/dist/docx/reader/headers.js.map +1 -0
  68. package/dist/docx/reader/html.d.ts +12 -0
  69. package/dist/docx/reader/html.d.ts.map +1 -0
  70. package/dist/docx/reader/html.js +27 -0
  71. package/dist/docx/reader/html.js.map +1 -0
  72. package/dist/docx/reader/images.d.ts +27 -0
  73. package/dist/docx/reader/images.d.ts.map +1 -0
  74. package/dist/docx/reader/images.js +288 -0
  75. package/dist/docx/reader/images.js.map +1 -0
  76. package/dist/docx/reader/index.d.ts +10 -0
  77. package/dist/docx/reader/index.d.ts.map +1 -0
  78. package/dist/docx/reader/index.js +177 -0
  79. package/dist/docx/reader/index.js.map +1 -0
  80. package/dist/docx/reader/lists.d.ts +44 -0
  81. package/dist/docx/reader/lists.d.ts.map +1 -0
  82. package/dist/docx/reader/lists.js +360 -0
  83. package/dist/docx/reader/lists.js.map +1 -0
  84. package/dist/docx/reader/lost.d.ts +30 -0
  85. package/dist/docx/reader/lost.d.ts.map +1 -0
  86. package/dist/docx/reader/lost.js +215 -0
  87. package/dist/docx/reader/lost.js.map +1 -0
  88. package/dist/docx/reader/notes.d.ts +4 -0
  89. package/dist/docx/reader/notes.d.ts.map +1 -0
  90. package/dist/docx/reader/notes.js +112 -0
  91. package/dist/docx/reader/notes.js.map +1 -0
  92. package/dist/docx/reader/package.d.ts +16 -0
  93. package/dist/docx/reader/package.d.ts.map +1 -0
  94. package/dist/docx/reader/package.js +138 -0
  95. package/dist/docx/reader/package.js.map +1 -0
  96. package/dist/docx/reader/paragraphs.d.ts +15 -0
  97. package/dist/docx/reader/paragraphs.d.ts.map +1 -0
  98. package/dist/docx/reader/paragraphs.js +162 -0
  99. package/dist/docx/reader/paragraphs.js.map +1 -0
  100. package/dist/docx/reader/properties.d.ts +90 -0
  101. package/dist/docx/reader/properties.d.ts.map +1 -0
  102. package/dist/docx/reader/properties.js +402 -0
  103. package/dist/docx/reader/properties.js.map +1 -0
  104. package/dist/docx/reader/runs.d.ts +49 -0
  105. package/dist/docx/reader/runs.d.ts.map +1 -0
  106. package/dist/docx/reader/runs.js +442 -0
  107. package/dist/docx/reader/runs.js.map +1 -0
  108. package/dist/docx/reader/sections.d.ts +36 -0
  109. package/dist/docx/reader/sections.d.ts.map +1 -0
  110. package/dist/docx/reader/sections.js +158 -0
  111. package/dist/docx/reader/sections.js.map +1 -0
  112. package/dist/docx/reader/styles.d.ts +24 -0
  113. package/dist/docx/reader/styles.d.ts.map +1 -0
  114. package/dist/docx/reader/styles.js +383 -0
  115. package/dist/docx/reader/styles.js.map +1 -0
  116. package/dist/docx/reader/tables.d.ts +6 -0
  117. package/dist/docx/reader/tables.d.ts.map +1 -0
  118. package/dist/docx/reader/tables.js +175 -0
  119. package/dist/docx/reader/tables.js.map +1 -0
  120. package/dist/docx/reader/test-support.d.ts +25 -0
  121. package/dist/docx/reader/test-support.d.ts.map +1 -0
  122. package/dist/docx/reader/test-support.js +135 -0
  123. package/dist/docx/reader/test-support.js.map +1 -0
  124. package/dist/docx/reader/testing-blocks.d.ts +50 -0
  125. package/dist/docx/reader/testing-blocks.d.ts.map +1 -0
  126. package/dist/docx/reader/testing-blocks.js +302 -0
  127. package/dist/docx/reader/testing-blocks.js.map +1 -0
  128. package/dist/docx/reader/types.d.ts +181 -0
  129. package/dist/docx/reader/types.d.ts.map +1 -0
  130. package/dist/docx/reader/types.js +2 -0
  131. package/dist/docx/reader/types.js.map +1 -0
  132. package/dist/docx/reader/units-blocks.d.ts +75 -0
  133. package/dist/docx/reader/units-blocks.d.ts.map +1 -0
  134. package/dist/docx/reader/units-blocks.js +254 -0
  135. package/dist/docx/reader/units-blocks.js.map +1 -0
  136. package/dist/docx/reader/units.d.ts +72 -0
  137. package/dist/docx/reader/units.d.ts.map +1 -0
  138. package/dist/docx/reader/units.js +177 -0
  139. package/dist/docx/reader/units.js.map +1 -0
  140. package/dist/docx/types.d.ts +40 -2
  141. package/dist/docx/types.d.ts.map +1 -1
  142. package/dist/docx/writer/content-types.d.ts +30 -0
  143. package/dist/docx/writer/content-types.d.ts.map +1 -0
  144. package/dist/docx/writer/content-types.js +81 -0
  145. package/dist/docx/writer/content-types.js.map +1 -0
  146. package/dist/docx/writer/core-properties.d.ts +16 -0
  147. package/dist/docx/writer/core-properties.d.ts.map +1 -0
  148. package/dist/docx/writer/core-properties.js +64 -0
  149. package/dist/docx/writer/core-properties.js.map +1 -0
  150. package/dist/docx/writer/footnotes-merge.d.ts +30 -0
  151. package/dist/docx/writer/footnotes-merge.d.ts.map +1 -0
  152. package/dist/docx/writer/footnotes-merge.js +71 -0
  153. package/dist/docx/writer/footnotes-merge.js.map +1 -0
  154. package/dist/docx/writer/graft.d.ts +41 -0
  155. package/dist/docx/writer/graft.d.ts.map +1 -0
  156. package/dist/docx/writer/graft.js +277 -0
  157. package/dist/docx/writer/graft.js.map +1 -0
  158. package/dist/docx/writer/header-footer-graft.d.ts +34 -0
  159. package/dist/docx/writer/header-footer-graft.d.ts.map +1 -0
  160. package/dist/docx/writer/header-footer-graft.js +155 -0
  161. package/dist/docx/writer/header-footer-graft.js.map +1 -0
  162. package/dist/docx/writer/header-footer-variables.d.ts +25 -0
  163. package/dist/docx/writer/header-footer-variables.d.ts.map +1 -0
  164. package/dist/docx/writer/header-footer-variables.js +101 -0
  165. package/dist/docx/writer/header-footer-variables.js.map +1 -0
  166. package/dist/docx/writer/media.d.ts +32 -0
  167. package/dist/docx/writer/media.d.ts.map +1 -0
  168. package/dist/docx/writer/media.js +88 -0
  169. package/dist/docx/writer/media.js.map +1 -0
  170. package/dist/docx/writer/numbering-merge.d.ts +37 -0
  171. package/dist/docx/writer/numbering-merge.d.ts.map +1 -0
  172. package/dist/docx/writer/numbering-merge.js +140 -0
  173. package/dist/docx/writer/numbering-merge.js.map +1 -0
  174. package/dist/docx/writer/relationships.d.ts +63 -0
  175. package/dist/docx/writer/relationships.d.ts.map +1 -0
  176. package/dist/docx/writer/relationships.js +127 -0
  177. package/dist/docx/writer/relationships.js.map +1 -0
  178. package/dist/docx/writer/settings-merge.d.ts +21 -0
  179. package/dist/docx/writer/settings-merge.d.ts.map +1 -0
  180. package/dist/docx/writer/settings-merge.js +165 -0
  181. package/dist/docx/writer/settings-merge.js.map +1 -0
  182. package/dist/docx/writer/style-reconcile.d.ts +29 -0
  183. package/dist/docx/writer/style-reconcile.d.ts.map +1 -0
  184. package/dist/docx/writer/style-reconcile.js +319 -0
  185. package/dist/docx/writer/style-reconcile.js.map +1 -0
  186. package/dist/docx/writer/style-strip.d.ts +33 -0
  187. package/dist/docx/writer/style-strip.d.ts.map +1 -0
  188. package/dist/docx/writer/style-strip.js +267 -0
  189. package/dist/docx/writer/style-strip.js.map +1 -0
  190. package/dist/docx/writer/styles-merge.d.ts +57 -0
  191. package/dist/docx/writer/styles-merge.d.ts.map +1 -0
  192. package/dist/docx/writer/styles-merge.js +184 -0
  193. package/dist/docx/writer/styles-merge.js.map +1 -0
  194. package/dist/docx/writer/template.d.ts +48 -0
  195. package/dist/docx/writer/template.d.ts.map +1 -0
  196. package/dist/docx/writer/template.js +280 -0
  197. package/dist/docx/writer/template.js.map +1 -0
  198. package/dist/docx/writer/testing.d.ts +52 -0
  199. package/dist/docx/writer/testing.d.ts.map +1 -0
  200. package/dist/docx/writer/testing.js +318 -0
  201. package/dist/docx/writer/testing.js.map +1 -0
  202. package/dist/docx/writer/xml-io.d.ts +90 -0
  203. package/dist/docx/writer/xml-io.d.ts.map +1 -0
  204. package/dist/docx/writer/xml-io.js +215 -0
  205. package/dist/docx/writer/xml-io.js.map +1 -0
  206. package/dist/export/blocks.d.ts.map +1 -1
  207. package/dist/export/blocks.js +149 -12
  208. package/dist/export/blocks.js.map +1 -1
  209. package/dist/export/context.d.ts +34 -2
  210. package/dist/export/context.d.ts.map +1 -1
  211. package/dist/export/context.js +28 -2
  212. package/dist/export/context.js.map +1 -1
  213. package/dist/export/css.d.ts +58 -0
  214. package/dist/export/css.d.ts.map +1 -1
  215. package/dist/export/css.js +194 -0
  216. package/dist/export/css.js.map +1 -1
  217. package/dist/export/dom.d.ts +2 -0
  218. package/dist/export/dom.d.ts.map +1 -1
  219. package/dist/export/dom.js +2 -0
  220. package/dist/export/dom.js.map +1 -1
  221. package/dist/export/export-docx.d.ts +4 -0
  222. package/dist/export/export-docx.d.ts.map +1 -1
  223. package/dist/export/export-docx.js +57 -4
  224. package/dist/export/export-docx.js.map +1 -1
  225. package/dist/export/header-footer.d.ts +15 -1
  226. package/dist/export/header-footer.d.ts.map +1 -1
  227. package/dist/export/header-footer.js +37 -0
  228. package/dist/export/header-footer.js.map +1 -1
  229. package/dist/export/html-to-docx.d.ts +20 -2
  230. package/dist/export/html-to-docx.d.ts.map +1 -1
  231. package/dist/export/html-to-docx.js +40 -14
  232. package/dist/export/html-to-docx.js.map +1 -1
  233. package/dist/export/inline.d.ts +25 -3
  234. package/dist/export/inline.d.ts.map +1 -1
  235. package/dist/export/inline.js +91 -34
  236. package/dist/export/inline.js.map +1 -1
  237. package/dist/export/styles.d.ts +51 -7
  238. package/dist/export/styles.d.ts.map +1 -1
  239. package/dist/export/styles.js +121 -16
  240. package/dist/export/styles.js.map +1 -1
  241. package/dist/export/tables.d.ts.map +1 -1
  242. package/dist/export/tables.js +140 -12
  243. package/dist/export/tables.js.map +1 -1
  244. package/dist/export/types.d.ts +44 -5
  245. package/dist/export/types.d.ts.map +1 -1
  246. package/dist/index.d.ts +5 -2
  247. package/dist/index.d.ts.map +1 -1
  248. package/dist/index.js +1 -0
  249. package/dist/index.js.map +1 -1
  250. package/package.json +2 -2
@@ -0,0 +1,280 @@
1
+ import { transformVariablesXml } from '../preprocess/variables';
2
+ import { childNamed, childrenNamed } from '../preprocess/xml-utils';
3
+ import { readHeadersFooters } from '../reader/headers';
4
+ import { createImageConverter } from '../reader/images';
5
+ import { createNumberingResolver, registerListItem, renderBlocks } from '../reader/lists';
6
+ import { createNoteRegistry } from '../reader/notes';
7
+ import { openPackage } from '../reader/package';
8
+ import { convertParagraph } from '../reader/paragraphs';
9
+ import { createStyleResolver } from '../reader/styles';
10
+ import { convertTable } from '../reader/tables';
11
+ import { headerFooterParts } from './header-footer-variables';
12
+ import { wordAttr, xmlDeclarationOf } from './xml-io';
13
+ /**
14
+ * Ouverture du gabarit de `exportDocx({ template })` : octets, paquet en lecture, partie
15
+ * principale déjà parsée (la greffe la réutilise sans la reparser), identifiants de
16
+ * styles définis, largeur utile de la page, et, sur demande, les en-têtes et pieds tels
17
+ * que l'import les lit (pour savoir si `layout.headers` / `footers` en diffère). Un
18
+ * gabarit illisible ne lève jamais : l'export neuf prend le relais avec un avertissement
19
+ * `template-invalid`. Une partie principale de plus de 16 Mo est refusée avant tout parse :
20
+ * un DOM de cette taille épuise la mémoire du processus.
21
+ */
22
+ /** Taille maximale de la partie principale du gabarit (octets décompressés). */
23
+ export const MAX_MAIN_PART_BYTES = 16 * 1024 * 1024;
24
+ /** Détection d'`ArrayBuffer` robuste aux realms (jsdom vs Node), contrairement à `instanceof`. */
25
+ function isArrayBuffer(input) {
26
+ return Object.prototype.toString.call(input) === '[object ArrayBuffer]';
27
+ }
28
+ /** Vrai si l'entrée est un `File`/`Blob` (`arrayBuffer()` disponible). */
29
+ function isBlobLike(input) {
30
+ return (typeof input === 'object' &&
31
+ input !== null &&
32
+ typeof input.arrayBuffer === 'function');
33
+ }
34
+ /** Les 4 premiers octets d'un .docx valide sont la signature zip `PK\x03\x04`. */
35
+ function hasZipSignature(buffer) {
36
+ const bytes = new Uint8Array(buffer, 0, Math.min(4, buffer.byteLength));
37
+ return (bytes.length === 4 &&
38
+ bytes[0] === 0x50 &&
39
+ bytes[1] === 0x4b &&
40
+ bytes[2] === 0x03 &&
41
+ bytes[3] === 0x04);
42
+ }
43
+ /** Octets d'une entrée `DocxInput`, `null` si elle n'en est pas une. Une vue typée est copiée. */
44
+ async function toArrayBuffer(input) {
45
+ if (isArrayBuffer(input))
46
+ return input;
47
+ if (ArrayBuffer.isView(input)) {
48
+ return new Uint8Array(input.buffer, input.byteOffset, input.byteLength).slice().buffer;
49
+ }
50
+ if (isBlobLike(input)) {
51
+ try {
52
+ return await input.arrayBuffer();
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ /** Largeur utile (`w:pgSz w:w` moins les marges) du `w:sectPr` final, en pixels à 96 dpi. */
61
+ function contentWidthOf(body) {
62
+ const sectPr = childNamed(body, 'sectPr');
63
+ const pgSz = sectPr ? childNamed(sectPr, 'pgSz') : null;
64
+ const pgMar = sectPr ? childNamed(sectPr, 'pgMar') : null;
65
+ const width = Number(pgSz ? wordAttr(pgSz, 'w') : '');
66
+ if (!Number.isFinite(width) || width <= 0)
67
+ return undefined;
68
+ const left = Math.abs(Number(pgMar ? wordAttr(pgMar, 'left') : '') || 0);
69
+ const right = Math.abs(Number(pgMar ? wordAttr(pgMar, 'right') : '') || 0);
70
+ const usable = width - left - right;
71
+ return usable > 0 ? Math.max(1, Math.floor((usable / 1440) * 96)) : undefined;
72
+ }
73
+ /** Marque d'ordre des octets qu'un éditeur peut avoir posée avant `<?xml`. */
74
+ const BOM = String.fromCharCode(0xfeff);
75
+ /** Déclaration XML lue dans les premiers octets d'une partie (sans la décoder en entier). */
76
+ function declarationOf(bytes) {
77
+ const head = new TextDecoder().decode(bytes.subarray(0, 256));
78
+ return xmlDeclarationOf(head.startsWith(BOM) ? head.slice(BOM.length) : head);
79
+ }
80
+ /**
81
+ * Ouvre et valide le gabarit : archive zip, partie principale sous le plafond de taille
82
+ * et lisible avec un `w:body`. Rend `null` avec un avertissement `template-invalid` sinon.
83
+ */
84
+ export async function openTemplate(input, codec, warnings, options = {}) {
85
+ const invalid = (detail) => {
86
+ warnings.push({
87
+ code: 'template-invalid',
88
+ message: `Gabarit illisible, export neuf à la place : ${detail}`,
89
+ });
90
+ return null;
91
+ };
92
+ const buffer = await toArrayBuffer(input);
93
+ if (!buffer)
94
+ return invalid("l'entrée n'est ni un File, ni un ArrayBuffer, ni une vue typée");
95
+ if (!hasZipSignature(buffer))
96
+ return invalid('signature zip absente');
97
+ let pkg;
98
+ try {
99
+ pkg = await openPackage(buffer, codec.parse);
100
+ }
101
+ catch (error) {
102
+ return invalid(error instanceof Error ? error.message : String(error));
103
+ }
104
+ // La taille est contrôlée sur les octets, avant tout parse : un DOM de dizaines de Mo tue le processus.
105
+ const mainBytes = await pkg.binary(pkg.mainPart);
106
+ if (!mainBytes)
107
+ return invalid(`partie principale ${pkg.mainPart} absente`);
108
+ if (mainBytes.byteLength > MAX_MAIN_PART_BYTES) {
109
+ const megabytes = (mainBytes.byteLength / (1024 * 1024)).toFixed(1);
110
+ return invalid(`partie principale ${pkg.mainPart} de ${megabytes} Mo, plus que les ${String(MAX_MAIN_PART_BYTES / (1024 * 1024))} Mo acceptés`);
111
+ }
112
+ const mainDeclaration = declarationOf(mainBytes);
113
+ const main = await pkg.part(pkg.mainPart);
114
+ if (!main)
115
+ return invalid(`partie principale ${pkg.mainPart} illisible`);
116
+ const body = childNamed(main.documentElement, 'body');
117
+ if (!body)
118
+ return invalid(`partie principale ${pkg.mainPart} sans w:body`);
119
+ const stylesPath = (await pkg.related(pkg.mainPart, '/styles')) ?? 'word/styles.xml';
120
+ const styleIds = new Set();
121
+ const styles = await pkg.part(stylesPath);
122
+ if (styles) {
123
+ for (const style of childrenNamed(styles.documentElement, 'style')) {
124
+ const id = wordAttr(style, 'styleId');
125
+ if (id)
126
+ styleIds.add(id);
127
+ }
128
+ }
129
+ const [numbering, resolver] = await Promise.all([
130
+ createNumberingResolver(pkg),
131
+ createStyleResolver(pkg),
132
+ ]);
133
+ const context = {
134
+ buffer,
135
+ pkg,
136
+ mainDoc: main,
137
+ mainDeclaration,
138
+ stylesPath,
139
+ styleIds,
140
+ contentWidthPx: contentWidthOf(body),
141
+ numbering,
142
+ resolver,
143
+ };
144
+ if (!options.readHeadersFooters)
145
+ return context;
146
+ try {
147
+ const read = await readTemplateHeadersFooters(pkg, body, codec, resolver, numbering);
148
+ return {
149
+ ...context,
150
+ ...(read.headers ? { headers: read.headers } : {}),
151
+ ...(read.footers ? { footers: read.footers } : {}),
152
+ };
153
+ }
154
+ catch {
155
+ return context;
156
+ }
157
+ }
158
+ /**
159
+ * Vue du paquet dont les parties d'en-tête et de pied ont subi le prétraitement des
160
+ * variables de l'import (champs de fusion et contrôles de contenu → `{{nom}}`) : le HTML
161
+ * relu est ainsi comparable terme à terme au `layout` que l'import a donné à l'intégrateur.
162
+ * Les autres parties sont servies telles quelles.
163
+ */
164
+ async function preprocessedView(pkg, codec) {
165
+ const rewritten = new Map();
166
+ for (const path of await headerFooterParts(pkg, pkg.mainPart)) {
167
+ const bytes = await pkg.binary(path);
168
+ if (!bytes)
169
+ continue;
170
+ try {
171
+ const xml = transformVariablesXml(new TextDecoder().decode(bytes), { mergeFields: true, contentControls: true }, new Map(), codec);
172
+ if (xml !== null)
173
+ rewritten.set(path, codec.parse(xml));
174
+ }
175
+ catch {
176
+ // Partie illisible pour le prétraitement : servie telle quelle, comme à l'import.
177
+ }
178
+ }
179
+ if (rewritten.size === 0)
180
+ return pkg;
181
+ return {
182
+ ...pkg,
183
+ part: (path) => {
184
+ const doc = rewritten.get(path);
185
+ return doc ? Promise.resolve(doc) : pkg.part(path);
186
+ },
187
+ };
188
+ }
189
+ /**
190
+ * Enfants bloc d'un en-tête ou d'un pied (`w:hdr`, `w:ftr`, `w:tc`, `w:sdtContent`) :
191
+ * paragraphes (enregistrés pour les listes), tableaux, contrôles de contenu et balises
192
+ * personnalisées traversés. Même parcours que le lecteur pour le corps, sans la détection
193
+ * des objets perdus de premier niveau (inexistants dans un en-tête : les dessins y sont
194
+ * dans les runs).
195
+ */
196
+ async function convertHeaderBlocks(container, ctx) {
197
+ const blocks = [];
198
+ for (const child of Array.from(container.children)) {
199
+ switch (child.localName) {
200
+ case 'p': {
201
+ const block = await ctx.convert.paragraph(child, ctx);
202
+ registerListItem(block, ctx);
203
+ blocks.push(block);
204
+ break;
205
+ }
206
+ case 'tbl':
207
+ blocks.push(await ctx.convert.table(child, ctx));
208
+ break;
209
+ case 'sdt': {
210
+ const content = childNamed(child, 'sdtContent');
211
+ if (content)
212
+ blocks.push(...(await convertHeaderBlocks(content, ctx)));
213
+ break;
214
+ }
215
+ case 'customXml':
216
+ blocks.push(...(await convertHeaderBlocks(child, ctx)));
217
+ break;
218
+ default:
219
+ break;
220
+ }
221
+ }
222
+ return blocks;
223
+ }
224
+ /** Tous les `w:sectPr` du corps dans l'ordre : ceux des `w:pPr` (fins de section) puis le final. */
225
+ function allSectPrs(body) {
226
+ const result = [];
227
+ for (const paragraph of childrenNamed(body, 'p')) {
228
+ const pPr = childNamed(paragraph, 'pPr');
229
+ const sectPr = pPr ? childNamed(pPr, 'sectPr') : null;
230
+ if (sectPr)
231
+ result.push(sectPr);
232
+ }
233
+ const last = childNamed(body, 'sectPr');
234
+ if (last)
235
+ result.push(last);
236
+ return result;
237
+ }
238
+ /**
239
+ * En-têtes et pieds effectifs du gabarit, lus par le lecteur stylé (`reader/headers.ts`)
240
+ * sur le paquet déjà ouvert : seules les parties d'en-tête et de pied sont converties,
241
+ * pas le corps. Comme à l'import, chaque section hérite des références de la précédente,
242
+ * les plus récentes recouvrant les plus anciennes type par type.
243
+ */
244
+ async function readTemplateHeadersFooters(pkg, body, codec, styles, numbering) {
245
+ const options = {
246
+ footnotes: false,
247
+ emptyParagraphs: 'keep',
248
+ parseXml: codec.parse,
249
+ };
250
+ const view = await preprocessedView(pkg, codec);
251
+ const ctx = {
252
+ pkg: view,
253
+ part: pkg.mainPart,
254
+ where: 'body',
255
+ styles,
256
+ numbering,
257
+ images: createImageConverter(view, options),
258
+ notes: await createNoteRegistry(view, options),
259
+ convert: {
260
+ paragraph: convertParagraph,
261
+ table: convertTable,
262
+ blocks: convertHeaderBlocks,
263
+ render: renderBlocks,
264
+ },
265
+ options,
266
+ warnings: [],
267
+ lost: [],
268
+ tableStyle: null,
269
+ };
270
+ const merged = {};
271
+ for (const sectPr of allSectPrs(body)) {
272
+ const section = await readHeadersFooters(sectPr, ctx);
273
+ if (section.headers)
274
+ merged.headers = { ...merged.headers, ...section.headers };
275
+ if (section.footers)
276
+ merged.footers = { ...merged.footers, ...section.footers };
277
+ }
278
+ return merged;
279
+ }
280
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/docx/writer/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { DocxImportResult } from '../types';
2
+ import type { DocxExportOptions, DocxExportWarning } from '../../export/types';
3
+ /** Octets d'une fixture `.docx` (`13-styles-nommes.docx`). */
4
+ export declare function fixture(name: string): Promise<ArrayBuffer>;
5
+ /** Chemin absolu d'une fixture (pour `existsSync`). */
6
+ export declare function fixturePath(name: string): string;
7
+ /** Parties d'une archive : chemin → octets. */
8
+ export declare function partsOf(buffer: ArrayBuffer): Promise<ReadonlyMap<string, Uint8Array>>;
9
+ /** Texte d'une partie, `''` si absente. */
10
+ export declare function textOf(parts: ReadonlyMap<string, Uint8Array>, path: string): string;
11
+ /** Chemins dont les octets diffèrent (ou qui n'existent que d'un côté). */
12
+ export declare function differingParts(a: ReadonlyMap<string, Uint8Array>, b: ReadonlyMap<string, Uint8Array>): string[];
13
+ /**
14
+ * Variante d'un gabarit : parties retirées (et leurs relations dans
15
+ * `word/_rels/document.xml.rels`), parties remplacées ou ajoutées.
16
+ */
17
+ export declare function alterTemplate(buffer: ArrayBuffer, changes: {
18
+ readonly remove?: readonly string[];
19
+ readonly replace?: Readonly<Record<string, string>>;
20
+ }): Promise<ArrayBuffer>;
21
+ /** Résultat d'un export dans le gabarit : octets, parties et avertissements. */
22
+ export interface TemplateExport {
23
+ readonly buffer: ArrayBuffer;
24
+ readonly parts: ReadonlyMap<string, Uint8Array>;
25
+ readonly warnings: readonly DocxExportWarning[];
26
+ }
27
+ /** Exporte `html` dans `template` et décompose le résultat. */
28
+ export declare function exportInTemplate(html: string, template: ArrayBuffer, options?: DocxExportOptions): Promise<TemplateExport>;
29
+ /** Import stylé d'une fixture. */
30
+ export declare function importStyled(buffer: ArrayBuffer): Promise<DocxImportResult>;
31
+ /**
32
+ * XML comparable : identifiants de révision et de paragraphe retirés, déclaration et
33
+ * blancs entre balises neutralisés.
34
+ */
35
+ export declare function normalizeXml(xml: string): string;
36
+ /** Corps (`<w:body>…</w:body>`) d'un `document.xml`. */
37
+ export declare function bodyOf(xml: string): string;
38
+ /** `w:sectPr` final du corps (le dernier `<w:sectPr>` de la partie). */
39
+ export declare function finalSectPr(xml: string): string;
40
+ /**
41
+ * Validateur d'intégrité d'un paquet produit (protocole de la relecture R27) : chaque
42
+ * partie XML parse et garde sa déclaration, `[Content_Types].xml` couvre chaque partie
43
+ * sans doublon ni cible absente, relations à `Id` uniques et cibles internes existantes,
44
+ * chaque `r:id`/`r:embed`/`r:link` du corps résolu, chaque `w:numId` → `w:num`, chaque
45
+ * `abstractNumId` → `w:abstractNum`, chaque `pStyle`/`rStyle`/`tblStyle` → `styles.xml`
46
+ * (styles intégrés de Word tolérés : `ignoredStyles`), chaque `footnoteReference` →
47
+ * `footnotes.xml`, identifiants de notes et de styles uniques. Rend la liste des problèmes.
48
+ */
49
+ export declare function checkIntegrity(parts: ReadonlyMap<string, Uint8Array>, ignoredStyles?: ReadonlySet<string>): string[];
50
+ /** Blocs de premier niveau du corps (`<w:p>`, `<w:tbl>`), hors `w:sectPr`. */
51
+ export declare function topLevelBlocks(body: string): string[];
52
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/testing.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAU/E,8DAA8D;AAC9D,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGhE;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,+CAA+C;AAC/C,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAQ3F;AAED,2CAA2C;AAC3C,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnF;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAC5B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAClC,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GACjC,MAAM,EAAE,CAaV;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IACP,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,GACA,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,+DAA+D;AAC/D,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CASzB;AAED,kCAAkC;AAClC,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEjF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wDAAwD;AACxD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAqBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EACtC,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,GAC7C,MAAM,EAAE,CAqIV;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBrD"}
@@ -0,0 +1,318 @@
1
+ import JSZip from 'jszip';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { importDocx } from '../import-docx';
5
+ import { exportDocx } from '../../export/export-docx';
6
+ /**
7
+ * Harnais des specs de la greffe : fixtures, archives décomposées en parties, exports
8
+ * dans le gabarit avec leurs avertissements, normalisation du XML. Aucune utilité en
9
+ * production.
10
+ */
11
+ const FIXTURES = join(import.meta.env.ASTER_FIXTURES, 'docx');
12
+ /** Octets d'une fixture `.docx` (`13-styles-nommes.docx`). */
13
+ export async function fixture(name) {
14
+ const buffer = await readFile(join(FIXTURES, name));
15
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
16
+ }
17
+ /** Chemin absolu d'une fixture (pour `existsSync`). */
18
+ export function fixturePath(name) {
19
+ return join(FIXTURES, name);
20
+ }
21
+ /** Parties d'une archive : chemin → octets. */
22
+ export async function partsOf(buffer) {
23
+ const zip = await JSZip.loadAsync(buffer);
24
+ const parts = new Map();
25
+ for (const name of Object.keys(zip.files).sort()) {
26
+ const file = zip.files[name];
27
+ if (file && !file.dir)
28
+ parts.set(name, await file.async('uint8array'));
29
+ }
30
+ return parts;
31
+ }
32
+ /** Texte d'une partie, `''` si absente. */
33
+ export function textOf(parts, path) {
34
+ const bytes = parts.get(path);
35
+ return bytes ? new TextDecoder().decode(bytes) : '';
36
+ }
37
+ /** Chemins dont les octets diffèrent (ou qui n'existent que d'un côté). */
38
+ export function differingParts(a, b) {
39
+ const paths = new Set([...a.keys(), ...b.keys()]);
40
+ const result = [];
41
+ for (const path of Array.from(paths).sort()) {
42
+ const left = a.get(path);
43
+ const right = b.get(path);
44
+ if (!left || !right || left.byteLength !== right.byteLength) {
45
+ result.push(path);
46
+ continue;
47
+ }
48
+ if (!left.every((byte, index) => byte === right[index]))
49
+ result.push(path);
50
+ }
51
+ return result;
52
+ }
53
+ /**
54
+ * Variante d'un gabarit : parties retirées (et leurs relations dans
55
+ * `word/_rels/document.xml.rels`), parties remplacées ou ajoutées.
56
+ */
57
+ export async function alterTemplate(buffer, changes) {
58
+ const zip = await JSZip.loadAsync(buffer);
59
+ for (const path of changes.remove ?? []) {
60
+ zip.remove(path);
61
+ const relsPath = 'word/_rels/document.xml.rels';
62
+ const rels = await zip.file(relsPath)?.async('string');
63
+ if (rels) {
64
+ const target = path.replace(/^word\//, '');
65
+ zip.file(relsPath, rels.replace(new RegExp(`<Relationship [^>]*Target="${target}"[^>]*/>`), ''));
66
+ }
67
+ const types = await zip.file('[Content_Types].xml')?.async('string');
68
+ if (types) {
69
+ zip.file('[Content_Types].xml', types.replace(new RegExp(`<Override [^>]*PartName="/${path}"[^>]*/>`), ''));
70
+ }
71
+ }
72
+ for (const [path, content] of Object.entries(changes.replace ?? {}))
73
+ zip.file(path, content);
74
+ return zip.generateAsync({ type: 'arraybuffer', compression: 'DEFLATE' });
75
+ }
76
+ /** Exporte `html` dans `template` et décompose le résultat. */
77
+ export async function exportInTemplate(html, template, options = {}) {
78
+ const warnings = [];
79
+ const blob = await exportDocx(html, {
80
+ ...options,
81
+ template,
82
+ onWarning: (warning) => warnings.push(warning),
83
+ });
84
+ const buffer = await blob.arrayBuffer();
85
+ return { buffer, parts: await partsOf(buffer), warnings };
86
+ }
87
+ /** Import stylé d'une fixture. */
88
+ export async function importStyled(buffer) {
89
+ return importDocx(buffer, { fidelity: 'styled' });
90
+ }
91
+ /**
92
+ * XML comparable : identifiants de révision et de paragraphe retirés, déclaration et
93
+ * blancs entre balises neutralisés.
94
+ */
95
+ export function normalizeXml(xml) {
96
+ return xml
97
+ .replace(/^<\?xml[^>]*\?>\s*/, '')
98
+ .replace(/\s+w:rsid[A-Za-z]*="[^"]*"/g, '')
99
+ .replace(/\s+w14:(?:paraId|textId)="[^"]*"/g, '')
100
+ .replace(/>\s+</g, '><')
101
+ .trim();
102
+ }
103
+ /** Corps (`<w:body>…</w:body>`) d'un `document.xml`. */
104
+ export function bodyOf(xml) {
105
+ const start = xml.indexOf('<w:body>');
106
+ const end = xml.lastIndexOf('</w:body>');
107
+ return start < 0 || end < 0 ? '' : xml.slice(start + '<w:body>'.length, end);
108
+ }
109
+ /** `w:sectPr` final du corps (le dernier `<w:sectPr>` de la partie). */
110
+ export function finalSectPr(xml) {
111
+ const matches = xml.match(/<w:sectPr\b[\s\S]*?<\/w:sectPr>|<w:sectPr\b[^>]*\/>/g);
112
+ return matches?.[matches.length - 1] ?? '';
113
+ }
114
+ const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
115
+ /** Attribut dans l'espace de noms de l'élément, chaîne vide si absent. */
116
+ function attr(element, name) {
117
+ return element.getAttributeNS(element.namespaceURI, name) ?? element.getAttribute(name) ?? '';
118
+ }
119
+ /** Chemin de zip d'une cible de relation, segments `.`/`..` repliés. */
120
+ function resolveRelTarget(relsPath, target) {
121
+ const dir = relsPath.replace(/_rels\/[^/]+$/, '');
122
+ const raw = target.startsWith('/') ? target.slice(1) : `${dir}${target}`;
123
+ const out = [];
124
+ for (const segment of raw.split('/')) {
125
+ if (segment === '..')
126
+ out.pop();
127
+ else if (segment !== '.' && segment !== '')
128
+ out.push(segment);
129
+ }
130
+ return out.join('/');
131
+ }
132
+ /**
133
+ * Validateur d'intégrité d'un paquet produit (protocole de la relecture R27) : chaque
134
+ * partie XML parse et garde sa déclaration, `[Content_Types].xml` couvre chaque partie
135
+ * sans doublon ni cible absente, relations à `Id` uniques et cibles internes existantes,
136
+ * chaque `r:id`/`r:embed`/`r:link` du corps résolu, chaque `w:numId` → `w:num`, chaque
137
+ * `abstractNumId` → `w:abstractNum`, chaque `pStyle`/`rStyle`/`tblStyle` → `styles.xml`
138
+ * (styles intégrés de Word tolérés : `ignoredStyles`), chaque `footnoteReference` →
139
+ * `footnotes.xml`, identifiants de notes et de styles uniques. Rend la liste des problèmes.
140
+ */
141
+ export function checkIntegrity(parts, ignoredStyles = new Set()) {
142
+ const problems = [];
143
+ const parser = new DOMParser();
144
+ const docs = new Map();
145
+ for (const name of parts.keys()) {
146
+ if (!/\.(xml|rels)$/i.test(name))
147
+ continue;
148
+ const xml = textOf(parts, name);
149
+ const doc = parser.parseFromString(xml, 'application/xml');
150
+ if (doc.documentElement.localName === 'parsererror')
151
+ problems.push(`XML invalide : ${name}`);
152
+ else
153
+ docs.set(name, doc);
154
+ if (!xml.startsWith('<?xml') && !name.startsWith('customXml/')) {
155
+ problems.push(`déclaration XML absente : ${name}`);
156
+ }
157
+ }
158
+ const types = docs.get('[Content_Types].xml');
159
+ if (!types)
160
+ problems.push('[Content_Types].xml absent ou invalide');
161
+ else {
162
+ const defaults = new Set();
163
+ const overrides = new Set();
164
+ for (const child of Array.from(types.documentElement.children)) {
165
+ if (child.localName === 'Default') {
166
+ defaults.add((child.getAttribute('Extension') ?? '').toLowerCase());
167
+ }
168
+ else if (child.localName === 'Override') {
169
+ const partName = child.getAttribute('PartName') ?? '';
170
+ if (overrides.has(partName))
171
+ problems.push(`Override en double : ${partName}`);
172
+ overrides.add(partName);
173
+ }
174
+ }
175
+ for (const name of parts.keys()) {
176
+ if (name === '[Content_Types].xml')
177
+ continue;
178
+ const extension = name.split('.').pop()?.toLowerCase() ?? '';
179
+ if (!overrides.has(`/${name}`) && !defaults.has(extension)) {
180
+ problems.push(`sans type de contenu : ${name}`);
181
+ }
182
+ }
183
+ for (const partName of overrides) {
184
+ if (!parts.has(partName.slice(1)))
185
+ problems.push(`Override vers partie absente : ${partName}`);
186
+ }
187
+ }
188
+ for (const [name, doc] of docs) {
189
+ if (!name.endsWith('.rels'))
190
+ continue;
191
+ const ids = new Set();
192
+ for (const rel of Array.from(doc.documentElement.children)) {
193
+ const id = rel.getAttribute('Id') ?? '';
194
+ if (ids.has(id))
195
+ problems.push(`${name} : Id en double ${id}`);
196
+ ids.add(id);
197
+ if (rel.getAttribute('TargetMode') === 'External')
198
+ continue;
199
+ const target = rel.getAttribute('Target') ?? '';
200
+ if (!parts.has(resolveRelTarget(name, target))) {
201
+ problems.push(`${name} : cible absente ${target}`);
202
+ }
203
+ }
204
+ }
205
+ const main = docs.get('word/document.xml');
206
+ if (!main)
207
+ return problems;
208
+ const relIds = new Set();
209
+ const rels = docs.get('word/_rels/document.xml.rels');
210
+ if (rels) {
211
+ for (const rel of Array.from(rels.documentElement.children)) {
212
+ relIds.add(rel.getAttribute('Id') ?? '');
213
+ }
214
+ }
215
+ for (const element of Array.from(main.getElementsByTagNameNS('*', '*'))) {
216
+ for (const attribute of Array.from(element.attributes)) {
217
+ if (attribute.namespaceURI === R_NS &&
218
+ ['id', 'embed', 'link'].includes(attribute.localName) &&
219
+ !relIds.has(attribute.value)) {
220
+ problems.push(`corps : ${element.localName} r:${attribute.localName}="${attribute.value}" sans relation`);
221
+ }
222
+ }
223
+ }
224
+ const numIds = new Set();
225
+ const abstractIds = new Set();
226
+ const numbering = docs.get('word/numbering.xml');
227
+ if (numbering) {
228
+ for (const child of Array.from(numbering.documentElement.children)) {
229
+ if (child.localName === 'num') {
230
+ const id = attr(child, 'numId');
231
+ if (numIds.has(id))
232
+ problems.push(`numbering : numId en double ${id}`);
233
+ numIds.add(id);
234
+ }
235
+ else if (child.localName === 'abstractNum') {
236
+ const id = attr(child, 'abstractNumId');
237
+ if (abstractIds.has(id))
238
+ problems.push(`numbering : abstractNumId en double ${id}`);
239
+ abstractIds.add(id);
240
+ }
241
+ }
242
+ for (const reference of Array.from(numbering.getElementsByTagNameNS('*', 'abstractNumId'))) {
243
+ const value = attr(reference, 'val');
244
+ if (!abstractIds.has(value))
245
+ problems.push(`numbering : abstractNumId ${value} introuvable`);
246
+ }
247
+ }
248
+ for (const reference of Array.from(main.getElementsByTagNameNS('*', 'numId'))) {
249
+ const value = attr(reference, 'val');
250
+ if (value !== '0' && !numIds.has(value))
251
+ problems.push(`corps : numId ${value} introuvable`);
252
+ }
253
+ const styleIds = new Set();
254
+ const styles = docs.get('word/styles.xml');
255
+ if (styles) {
256
+ for (const style of Array.from(styles.documentElement.children)) {
257
+ if (style.localName !== 'style')
258
+ continue;
259
+ const id = attr(style, 'styleId');
260
+ if (styleIds.has(id))
261
+ problems.push(`styles : styleId en double ${id}`);
262
+ styleIds.add(id);
263
+ }
264
+ }
265
+ for (const name of ['pStyle', 'rStyle', 'tblStyle']) {
266
+ for (const reference of Array.from(main.getElementsByTagNameNS('*', name))) {
267
+ const value = attr(reference, 'val');
268
+ if (!styleIds.has(value) && !ignoredStyles.has(value)) {
269
+ problems.push(`corps : ${name} ${value} introuvable`);
270
+ }
271
+ }
272
+ }
273
+ const noteIds = new Set();
274
+ const footnotes = docs.get('word/footnotes.xml');
275
+ if (footnotes) {
276
+ for (const note of Array.from(footnotes.documentElement.children)) {
277
+ if (note.localName !== 'footnote')
278
+ continue;
279
+ const id = attr(note, 'id');
280
+ if (noteIds.has(id))
281
+ problems.push(`footnotes : id en double ${id}`);
282
+ noteIds.add(id);
283
+ }
284
+ }
285
+ for (const reference of Array.from(main.getElementsByTagNameNS('*', 'footnoteReference'))) {
286
+ const value = attr(reference, 'id');
287
+ if (!noteIds.has(value))
288
+ problems.push(`corps : footnoteReference ${value} introuvable`);
289
+ }
290
+ return problems;
291
+ }
292
+ /** Blocs de premier niveau du corps (`<w:p>`, `<w:tbl>`), hors `w:sectPr`. */
293
+ export function topLevelBlocks(body) {
294
+ const blocks = [];
295
+ let depth = 0;
296
+ let start = -1;
297
+ const tag = /<(\/?)w:(p|tbl)\b[^>]*?(\/?)>/g;
298
+ for (const match of body.matchAll(tag)) {
299
+ const closing = match[1] === '/';
300
+ const selfClosing = match[3] === '/';
301
+ if (!closing) {
302
+ if (depth === 0)
303
+ start = match.index;
304
+ if (!selfClosing)
305
+ depth += 1;
306
+ else if (depth === 0)
307
+ blocks.push(match[0]);
308
+ continue;
309
+ }
310
+ depth -= 1;
311
+ if (depth === 0 && start >= 0) {
312
+ blocks.push(body.slice(start, match.index + match[0].length));
313
+ start = -1;
314
+ }
315
+ }
316
+ return blocks;
317
+ }
318
+ //# sourceMappingURL=testing.js.map