@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,112 @@
1
+ import { childrenNamed, wordAttribute } from '../preprocess/xml-utils';
2
+ import { deriveContext } from './index';
3
+ /** Notes techniques de Word, jamais référencées depuis le corps. */
4
+ const TECHNICAL_TYPES = new Set([
5
+ 'separator',
6
+ 'continuationSeparator',
7
+ 'continuationNotice',
8
+ ]);
9
+ async function loadNotePart(pkg, kind) {
10
+ const path = await pkg.related(pkg.mainPart, `/${kind}s`);
11
+ if (!path)
12
+ return null;
13
+ const doc = await pkg.part(path);
14
+ if (!doc)
15
+ return null;
16
+ const notes = new Map();
17
+ for (const note of childrenNamed(doc.documentElement, kind)) {
18
+ if (TECHNICAL_TYPES.has(wordAttribute(note, 'type')))
19
+ continue;
20
+ const id = wordAttribute(note, 'id');
21
+ if (id)
22
+ notes.set(id, note);
23
+ }
24
+ return { path, notes };
25
+ }
26
+ /**
27
+ * Copie de la note sans son appel initial (`w:footnoteRef` / `w:endnoteRef`) ni l'espace
28
+ * que Word place juste après. Seul l'élément d'appel est retiré, jamais son run : un run
29
+ * qui porte l'appel et du texte garde son texte. On clone : le document du paquet n'est
30
+ * jamais modifié.
31
+ */
32
+ function noteContentClone(note, kind) {
33
+ const clone = note.cloneNode(true);
34
+ const ref = clone.getElementsByTagNameNS('*', `${kind}Ref`)[0];
35
+ const run = ref?.parentElement;
36
+ if (ref && run && run.localName === 'r') {
37
+ const paragraph = run.parentElement;
38
+ ref.remove();
39
+ const firstText = paragraph?.getElementsByTagNameNS('*', 't')[0];
40
+ if (firstText && (firstText.textContent ?? '').startsWith(' ')) {
41
+ firstText.textContent = (firstText.textContent ?? '').slice(1);
42
+ }
43
+ }
44
+ return clone;
45
+ }
46
+ /** Crée le registre des notes du document. Signature figée par `index.ts`. */
47
+ export async function createNoteRegistry(pkg, options) {
48
+ const parts = {
49
+ footnote: await loadNotePart(pkg, 'footnote'),
50
+ endnote: await loadNotePart(pkg, 'endnote'),
51
+ };
52
+ const references = [];
53
+ const numbers = new Map();
54
+ let droppedWarned = false;
55
+ const warnDropped = (ctx) => {
56
+ if (droppedWarned)
57
+ return;
58
+ droppedWarned = true;
59
+ ctx.warnings.push({
60
+ code: 'footnotes-dropped',
61
+ message: 'Notes de bas de page et de fin supprimées (option footnotes: false)',
62
+ });
63
+ };
64
+ return {
65
+ reference(id, kind, ctx) {
66
+ if (!options.footnotes) {
67
+ warnDropped(ctx);
68
+ return '';
69
+ }
70
+ const key = `${kind}:${id}`;
71
+ let number = numbers.get(key);
72
+ if (number === undefined) {
73
+ number = references.length + 1;
74
+ numbers.set(key, number);
75
+ references.push({ kind, id, number });
76
+ }
77
+ return `<sup data-footnote-ref="${String(number)}">${String(number)}</sup>`;
78
+ },
79
+ async render(ctx) {
80
+ if (!options.footnotes) {
81
+ warnDropped(ctx);
82
+ return '';
83
+ }
84
+ if (references.length === 0)
85
+ return '';
86
+ const items = [];
87
+ for (const { kind, id, number } of references) {
88
+ const part = parts[kind];
89
+ const note = part?.notes.get(id);
90
+ let html = '';
91
+ if (part && note) {
92
+ const derived = deriveContext(ctx, {
93
+ part: part.path,
94
+ where: kind,
95
+ tableStyle: null,
96
+ });
97
+ const blocks = await ctx.convert.blocks(noteContentClone(note, kind), derived);
98
+ html = ctx.convert.render(blocks, derived);
99
+ }
100
+ else {
101
+ ctx.warnings.push({
102
+ code: 'reader',
103
+ message: `Note ${kind} ${id} référencée mais introuvable dans le paquet.`,
104
+ });
105
+ }
106
+ items.push(`<li data-footnote="${String(number)}">${html || '<p></p>'}</li>`);
107
+ }
108
+ return `<ol data-footnotes="">${items.join('')}</ol>`;
109
+ },
110
+ };
111
+ }
112
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../../src/docx/reader/notes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DocxPackage, XmlParse } from './types';
2
+ /** Chemin du fichier `.rels` d'une partie : `word/document.xml` → `word/_rels/document.xml.rels`. */
3
+ export declare function relsPathOf(partPath: string): string;
4
+ /**
5
+ * Résout une cible de relation en chemin absolu du zip : relative au dossier de la partie,
6
+ * ou absolue (`/word/media/image1.png`). Les segments `..` sont repliés.
7
+ */
8
+ export declare function resolveTarget(partPath: string, target: string): string;
9
+ /** Parseur XML par défaut : `DOMParser` global, erreur claire sinon (SSR sans jsdom). */
10
+ export declare function defaultXmlParse(): XmlParse;
11
+ /**
12
+ * Ouvre un `.docx` en lecture. Les parties XML sont parsées une fois et mises en cache,
13
+ * les relations aussi. Jamais d'écriture : le gabarit reste intact pour l'export.
14
+ */
15
+ export declare function openPackage(buffer: ArrayBuffer, parseXml: XmlParse): Promise<DocxPackage>;
16
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/docx/reader/package.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAgB,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMnE,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAStE;AAED,yFAAyF;AACzF,wBAAgB,eAAe,IAAI,QAAQ,CAM1C;AAYD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAqF/F"}
@@ -0,0 +1,138 @@
1
+ import JSZip from 'jszip';
2
+ import { childrenNamed } from '../preprocess/xml-utils';
3
+ const DEFAULT_MAIN_PART = 'word/document.xml';
4
+ const ROOT_RELS = '_rels/.rels';
5
+ const OFFICE_DOCUMENT_TYPE = '/officeDocument';
6
+ /** Chemin du fichier `.rels` d'une partie : `word/document.xml` → `word/_rels/document.xml.rels`. */
7
+ export function relsPathOf(partPath) {
8
+ const slash = partPath.lastIndexOf('/');
9
+ const dir = slash < 0 ? '' : partPath.slice(0, slash + 1);
10
+ const name = slash < 0 ? partPath : partPath.slice(slash + 1);
11
+ return `${dir}_rels/${name}.rels`;
12
+ }
13
+ /**
14
+ * Résout une cible de relation en chemin absolu du zip : relative au dossier de la partie,
15
+ * ou absolue (`/word/media/image1.png`). Les segments `..` sont repliés.
16
+ */
17
+ export function resolveTarget(partPath, target) {
18
+ if (target.startsWith('/'))
19
+ return target.slice(1);
20
+ const slash = partPath.lastIndexOf('/');
21
+ const base = slash < 0 ? [] : partPath.slice(0, slash).split('/');
22
+ for (const segment of target.split('/')) {
23
+ if (segment === '..')
24
+ base.pop();
25
+ else if (segment !== '.' && segment !== '')
26
+ base.push(segment);
27
+ }
28
+ return base.join('/');
29
+ }
30
+ /** Parseur XML par défaut : `DOMParser` global, erreur claire sinon (SSR sans jsdom). */
31
+ export function defaultXmlParse() {
32
+ if (typeof DOMParser === 'undefined') {
33
+ throw new Error('lecteur .docx : aucun DOMParser disponible, passe `options.parse`');
34
+ }
35
+ const parser = new DOMParser();
36
+ return (xml) => parser.parseFromString(xml, 'application/xml');
37
+ }
38
+ /**
39
+ * Vrai si le document parsé est une erreur de parsing : `<parsererror>` en racine (jsdom,
40
+ * Firefox) ou injecté **dans** la racine (Chromium), d'où la recherche par nom local.
41
+ */
42
+ function isParseError(doc) {
43
+ const root = doc.documentElement;
44
+ if (root === null || root.localName === 'parsererror')
45
+ return true;
46
+ return doc.getElementsByTagNameNS('*', 'parsererror').length > 0;
47
+ }
48
+ /**
49
+ * Ouvre un `.docx` en lecture. Les parties XML sont parsées une fois et mises en cache,
50
+ * les relations aussi. Jamais d'écriture : le gabarit reste intact pour l'export.
51
+ */
52
+ export async function openPackage(buffer, parseXml) {
53
+ const zip = await JSZip.loadAsync(buffer);
54
+ const parts = new Map();
55
+ const relsCache = new Map();
56
+ const text = async (path) => {
57
+ const file = zip.file(path);
58
+ return file ? file.async('string') : null;
59
+ };
60
+ const part = (path) => {
61
+ let pending = parts.get(path);
62
+ if (!pending) {
63
+ pending = text(path).then((xml) => {
64
+ if (xml === null)
65
+ return null;
66
+ try {
67
+ const doc = parseXml(xml);
68
+ return isParseError(doc) ? null : doc;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ });
74
+ parts.set(path, pending);
75
+ }
76
+ return pending;
77
+ };
78
+ const rels = (partPath) => {
79
+ let pending = relsCache.get(partPath);
80
+ if (!pending) {
81
+ pending = part(relsPathOf(partPath)).then((doc) => {
82
+ const map = new Map();
83
+ if (!doc)
84
+ return map;
85
+ for (const rel of childrenNamed(doc.documentElement, 'Relationship')) {
86
+ const id = rel.getAttribute('Id') ?? '';
87
+ const target = rel.getAttribute('Target') ?? '';
88
+ if (!id || !target)
89
+ continue;
90
+ const external = rel.getAttribute('TargetMode') === 'External';
91
+ map.set(id, {
92
+ id,
93
+ type: rel.getAttribute('Type') ?? '',
94
+ target: external ? target : resolveTarget(partPath, target),
95
+ external,
96
+ });
97
+ }
98
+ return map;
99
+ });
100
+ relsCache.set(partPath, pending);
101
+ }
102
+ return pending;
103
+ };
104
+ const related = async (partPath, typeSuffix) => {
105
+ for (const rel of (await rels(partPath)).values()) {
106
+ if (!rel.external && rel.type.endsWith(typeSuffix))
107
+ return rel.target;
108
+ }
109
+ return null;
110
+ };
111
+ // Partie principale désignée par `_rels/.rels`, repli sur le nom usuel.
112
+ let mainPart = DEFAULT_MAIN_PART;
113
+ const rootDoc = await part(ROOT_RELS);
114
+ if (rootDoc) {
115
+ for (const rel of childrenNamed(rootDoc.documentElement, 'Relationship')) {
116
+ const type = rel.getAttribute('Type') ?? '';
117
+ const target = rel.getAttribute('Target') ?? '';
118
+ if (type.endsWith(OFFICE_DOCUMENT_TYPE) && target) {
119
+ const resolved = resolveTarget('', target);
120
+ if (zip.file(resolved))
121
+ mainPart = resolved;
122
+ break;
123
+ }
124
+ }
125
+ }
126
+ return {
127
+ mainPart,
128
+ has: (path) => zip.file(path) !== null,
129
+ part,
130
+ binary: async (path) => {
131
+ const file = zip.file(path);
132
+ return file ? file.async('uint8array') : null;
133
+ },
134
+ rels,
135
+ related,
136
+ };
137
+ }
138
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/docx/reader/package.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAC9C,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAE/C,qGAAqG;AACrG,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAAc;IAC5D,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,OAAO,KAAK,IAAI;YAAE,IAAI,CAAC,GAAG,EAAE,CAAC;aAC5B,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAa;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC;IACjC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IACnE,OAAO,GAAG,CAAC,sBAAsB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAmB,EAAE,QAAkB;IACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsD,CAAC;IAEhF,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;QAC1D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAAY,EAA4B,EAAE;QACtD,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBAChC,IAAI,GAAG,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAC1B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,QAAgB,EAA8C,EAAE;QAC5E,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;gBAC5C,IAAI,CAAC,GAAG;oBAAE,OAAO,GAAG,CAAC;gBACrB,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,CAAC;oBACrE,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAChD,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM;wBAAE,SAAS;oBAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,UAAU,CAAC;oBAC/D,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE;wBACV,EAAE;wBACF,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE;wBACpC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;wBAC3D,QAAQ;qBACT,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EAAE,QAAgB,EAAE,UAAkB,EAA0B,EAAE;QACrF,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,wEAAwE;IACxE,IAAI,QAAQ,GAAG,iBAAiB,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,MAAM,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC3C,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,QAAQ,GAAG,QAAQ,CAAC;gBAC5C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI;QACtC,IAAI;QACJ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QACD,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ConverterContext, ParagraphBlock, ResolvedParagraphProps } from './types';
2
+ /**
3
+ * Paragraphe Word → `<p …>` ou `<hN …>` avec la sérialisation exacte du contrat
4
+ * (`packages/core/src/api/layout.ts`). Les valeurs égales aux `docDefaults` ne sont pas
5
+ * écrites. Un `w:br w:type="page"` au milieu du paragraphe coupe le bloc : le `html` du
6
+ * `ParagraphBlock` contient alors plusieurs frères (`<p>a</p><hr data-page-break><p>b</p>`),
7
+ * que le rendu concatène tels quels (décision figée, L25 les laisse hors liste).
8
+ */
9
+ type ParagraphBase = Omit<ResolvedParagraphProps, 'runDefaults' | 'styleId'>;
10
+ /** Attributs du bloc dans l'ordre du contrat : `style`, `data-docx-style`, puis les drapeaux. */
11
+ export declare function paragraphAttributes(props: ResolvedParagraphProps, base: ParagraphBase, indentFromList?: boolean): string;
12
+ /** Convertit un `w:p` en bloc. Signature figée par la phase 0. */
13
+ export declare function convertParagraph(paragraph: Element, ctx: ConverterContext): Promise<ParagraphBlock>;
14
+ export {};
15
+ //# sourceMappingURL=paragraphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraphs.d.ts","sourceRoot":"","sources":["../../../src/docx/reader/paragraphs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AAEH,KAAK,aAAa,GAAG,IAAI,CAAC,sBAAsB,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;AAmG7E,iGAAiG;AACjG,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,sBAAsB,EAC7B,IAAI,EAAE,aAAa,EACnB,cAAc,UAAQ,GACrB,MAAM,CAuCR;AAQD,kEAAkE;AAClE,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,CAAC,CAuBzB"}
@@ -0,0 +1,162 @@
1
+ import { childNamed } from '../preprocess/xml-utils';
2
+ import { escapeAttr, pt, styleAttr } from './html';
3
+ import { convertRuns, PAGE_BREAK } from './runs';
4
+ import { docDefaultsOf, tableParagraphDefaultsOf } from './styles';
5
+ const INHERITABLE_PARAGRAPH_KEYS = [
6
+ 'align',
7
+ 'spacingBeforePt',
8
+ 'spacingAfterPt',
9
+ 'indentLeftPt',
10
+ 'indentRightPt',
11
+ 'indentFirstLinePt',
12
+ ];
13
+ const INHERITABLE_RUN_KEYS = ['fontFamily', 'fontSizePt', 'bold', 'italic', 'color'];
14
+ /**
15
+ * Approximation du style de tableau : ses défauts de paragraphe et de run s'intercalent
16
+ * entre `docDefaults` et le style de paragraphe. Faute de savoir ce que le style de
17
+ * paragraphe a posé lui-même, on ne prend la valeur du tableau que là où le paragraphe
18
+ * est encore égal aux `docDefaults`.
19
+ */
20
+ function applyTableStyle(props, ctx, defaults) {
21
+ if (!ctx.tableStyle)
22
+ return props;
23
+ const paragraph = {
24
+ ...props,
25
+ };
26
+ const tableParagraph = tableParagraphDefaultsOf(ctx.tableStyle);
27
+ if (tableParagraph) {
28
+ for (const key of INHERITABLE_PARAGRAPH_KEYS) {
29
+ const value = tableParagraph[key];
30
+ if (value !== undefined && props[key] === defaults.paragraph[key]) {
31
+ paragraph[key] = value;
32
+ }
33
+ }
34
+ const lineUnchanged = props.lineHeight === defaults.paragraph.lineHeight &&
35
+ props.lineHeightPt === defaults.paragraph.lineHeightPt;
36
+ if (lineUnchanged && (tableParagraph.lineHeight ?? tableParagraph.lineHeightPt) !== undefined) {
37
+ delete paragraph.lineHeight;
38
+ delete paragraph.lineHeightPt;
39
+ if (tableParagraph.lineHeightPt !== undefined)
40
+ paragraph.lineHeightPt = tableParagraph.lineHeightPt;
41
+ else
42
+ paragraph.lineHeight = tableParagraph.lineHeight;
43
+ }
44
+ }
45
+ const tableRun = ctx.tableStyle.runDefaults;
46
+ if (tableRun) {
47
+ const run = {
48
+ ...props.runDefaults,
49
+ };
50
+ for (const key of INHERITABLE_RUN_KEYS) {
51
+ const value = tableRun[key];
52
+ if (value !== undefined && props.runDefaults[key] === defaults.run[key]) {
53
+ run[key] = value;
54
+ }
55
+ }
56
+ paragraph.runDefaults = run;
57
+ }
58
+ return paragraph;
59
+ }
60
+ /**
61
+ * Retrait venant du niveau de liste (`numbering.xml`) quand le paragraphe n'a pas de
62
+ * `w:ind` direct : Word le place entre le style et les propriétés directes. Le bloc
63
+ * reçoit alors `data-docx-num-indent`, pour que L25 retire `margin-left`/`text-indent`
64
+ * en regroupant les items.
65
+ */
66
+ function applyListIndent(props, pPr, ctx) {
67
+ if (!props.numbering || (pPr && childNamed(pPr, 'ind')))
68
+ return { props, fromList: false };
69
+ const definition = ctx.numbering.definition(props.numbering.numId);
70
+ const level = definition?.levels.find((candidate) => candidate.level === props.numbering?.level);
71
+ if (!level || (level.indentLeftPt === undefined && level.hangingPt === undefined)) {
72
+ return { props, fromList: false };
73
+ }
74
+ const patched = {
75
+ ...props,
76
+ };
77
+ if (level.indentLeftPt !== undefined)
78
+ patched.indentLeftPt = level.indentLeftPt;
79
+ if (level.hangingPt !== undefined)
80
+ patched.indentFirstLinePt = -level.hangingPt;
81
+ return { props: patched, fromList: true };
82
+ }
83
+ function borderCss(border) {
84
+ return `${pt(border.widthPt)} ${border.style} ${border.color}`;
85
+ }
86
+ function sameBorders(a, b) {
87
+ return JSON.stringify(a ?? []) === JSON.stringify(b ?? []);
88
+ }
89
+ /** Attributs du bloc dans l'ordre du contrat : `style`, `data-docx-style`, puis les drapeaux. */
90
+ export function paragraphAttributes(props, base, indentFromList = false) {
91
+ const differs = (key) => props[key] !== undefined && props[key] !== base[key] ? props[key] : undefined;
92
+ const ptOrNone = (value) => value === undefined ? undefined : pt(value);
93
+ let lineHeight;
94
+ if (props.lineHeightPt !== undefined) {
95
+ if (props.lineHeightPt !== base.lineHeightPt)
96
+ lineHeight = pt(props.lineHeightPt);
97
+ }
98
+ else if (props.lineHeight !== undefined && props.lineHeight !== base.lineHeight) {
99
+ lineHeight = String(props.lineHeight);
100
+ }
101
+ const borders = sameBorders(props.borders, base.borders) ? [] : (props.borders ?? []);
102
+ const sides = borders.filter((border) => border.side !== 'between');
103
+ const between = borders.find((border) => border.side === 'between');
104
+ const style = styleAttr([
105
+ ['text-align', props.align && props.align !== 'left' ? props.align : undefined],
106
+ ['line-height', lineHeight],
107
+ ['margin-top', ptOrNone(differs('spacingBeforePt'))],
108
+ ['margin-bottom', ptOrNone(differs('spacingAfterPt'))],
109
+ ['margin-left', ptOrNone(differs('indentLeftPt'))],
110
+ ['margin-right', ptOrNone(differs('indentRightPt'))],
111
+ ['text-indent', ptOrNone(differs('indentFirstLinePt'))],
112
+ ...sides.map((border) => [
113
+ `border-${border.side}`,
114
+ borderCss(border),
115
+ ]),
116
+ ['background-color', differs('shading')],
117
+ ]);
118
+ const attrs = [style];
119
+ if (props.styleId)
120
+ attrs.push(` data-docx-style="${escapeAttr(props.styleId)}"`);
121
+ if (indentFromList)
122
+ attrs.push(' data-docx-num-indent');
123
+ if (between)
124
+ attrs.push(` data-border-between="${escapeAttr(borderCss(between))}"`);
125
+ if (props.keepWithNext)
126
+ attrs.push(' data-keep-next');
127
+ if (props.pageBreakBefore)
128
+ attrs.push(' data-page-break-before');
129
+ return attrs.join('');
130
+ }
131
+ /** Vrai si le HTML inline n'a ni texte, ni image, ni saut, ni appel de note. */
132
+ function isEmptyInline(inline) {
133
+ if (/<(?:img|br|hr|sup)\b/.test(inline))
134
+ return false;
135
+ return /^[ \t\r\n]*$/.test(inline.replace(/<[^>]*>/g, ''));
136
+ }
137
+ /** Convertit un `w:p` en bloc. Signature figée par la phase 0. */
138
+ export async function convertParagraph(paragraph, ctx) {
139
+ const pPr = childNamed(paragraph, 'pPr');
140
+ const defaults = docDefaultsOf(ctx.styles);
141
+ const resolved = applyTableStyle(ctx.styles.paragraph(pPr), ctx, defaults);
142
+ const { props, fromList } = applyListIndent(resolved, pPr, ctx);
143
+ const inline = await convertRuns(paragraph, ctx, props);
144
+ const tag = props.headingLevel ? `h${String(props.headingLevel)}` : 'p';
145
+ const attrs = paragraphAttributes(props, defaults.paragraph, fromList);
146
+ const wrap = (content) => `<${tag}${attrs}>${content}</${tag}>`;
147
+ const pieces = inline.split(PAGE_BREAK);
148
+ const parts = [];
149
+ pieces.forEach((piece, index) => {
150
+ if (index > 0)
151
+ parts.push(PAGE_BREAK);
152
+ if (piece !== '' || pieces.length === 1)
153
+ parts.push(wrap(piece));
154
+ });
155
+ return {
156
+ kind: 'paragraph',
157
+ html: parts.join(''),
158
+ ...(props.numbering ? { numbering: props.numbering } : {}),
159
+ isEmpty: isEmptyInline(inline),
160
+ };
161
+ }
162
+ //# sourceMappingURL=paragraphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraphs.js","sourceRoot":"","sources":["../../../src/docx/reader/paragraphs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import type { BlockBorder, BorderSide, DecorationStyle } from '@aster-editor/core';
2
+ import type { ParagraphAlign, ResolvedParagraphProps, ResolvedRunProps } from './types';
3
+ /**
4
+ * Lecture des propriétés de paragraphe (`w:pPr`) et de run (`w:rPr`) dans des
5
+ * accumulateurs mutables. Chaque appel **applique** un élément sur l'état hérité : une
6
+ * propriété explicitement désactivée (`w:b w:val="0"`, `w:u w:val="none"`, bordure
7
+ * `nil`, `w:numId` 0) efface la valeur héritée. Les éléments du paquet ne sont jamais
8
+ * modifiés. `styles.ts` enchaîne `docDefaults` → styles `basedOn` → propriétés directes ;
9
+ * `tables.ts` (L25) peut réutiliser `readBorder` et `readShadingFill`.
10
+ */
11
+ /** Polices du thème (`theme1.xml`), pour `w:asciiTheme="minorHAnsi"` et consorts. */
12
+ export interface ThemeFonts {
13
+ readonly major?: string;
14
+ readonly minor?: string;
15
+ }
16
+ /** Accumulateur de paragraphe. `outlineLevel` est en base 0 comme dans le XML. */
17
+ export interface MutableParagraph {
18
+ align?: ParagraphAlign;
19
+ lineHeight?: number;
20
+ lineHeightPt?: number;
21
+ spacingBeforePt?: number;
22
+ spacingAfterPt?: number;
23
+ indentLeftPt?: number;
24
+ indentRightPt?: number;
25
+ indentFirstLinePt?: number;
26
+ borders: Map<BorderSide, BlockBorder>;
27
+ shading?: string;
28
+ keepWithNext?: boolean;
29
+ pageBreakBefore?: boolean;
30
+ numbering?: {
31
+ readonly numId: string;
32
+ readonly level: number;
33
+ };
34
+ outlineLevel?: number;
35
+ }
36
+ /** Accumulateur de run ; `underline`/`strike` à `null` = explicitement sans trait. */
37
+ export interface MutableRun {
38
+ fontFamily?: string;
39
+ fontSizePt?: number;
40
+ bold?: boolean;
41
+ italic?: boolean;
42
+ underline?: DecorationStyle | null;
43
+ strike?: DecorationStyle | null;
44
+ color?: string;
45
+ highlight?: string;
46
+ superscript?: boolean;
47
+ subscript?: boolean;
48
+ letterSpacingPt?: number;
49
+ caps?: 'all' | 'small';
50
+ runStyle?: string;
51
+ lang?: string;
52
+ }
53
+ export declare function emptyParagraph(): MutableParagraph;
54
+ export declare function cloneParagraph(source: MutableParagraph): MutableParagraph;
55
+ /**
56
+ * Une bordure OOXML (`w:top`, `w:left`… de `w:pBdr`, `w:tcBorders`, `w:tblBorders`) :
57
+ * `w:val` → style, `w:sz` en huitièmes de point → `widthPt` (au plus 12 pt, sinon la
58
+ * largeur par défaut), `w:color` (`auto` → noir). `null` pour `nil`/`none` : la bordure
59
+ * est explicitement absente.
60
+ */
61
+ export declare function readBorder(element: Element, side: BorderSide): BlockBorder | null;
62
+ /** Applique les côtés d'un conteneur de bordures sur la carte héritée (`nil` efface). */
63
+ export declare function applyBorders(container: Element, borders: Map<BorderSide, BlockBorder>): void;
64
+ /** Bordures ordonnées comme le contrat les sérialise : haut, droite, bas, gauche, entre. */
65
+ export declare function orderedBorders(borders: ReadonlyMap<BorderSide, BlockBorder>): BlockBorder[];
66
+ /**
67
+ * Fond d'un `w:shd` : la couleur `w:fill` en `#rrggbb`. `undefined` quand le fond est
68
+ * absent, `auto` ou `nil` (ce qui efface un fond hérité). Les motifs (`pct25`…) sont
69
+ * ignorés : seul le remplissage est représentable.
70
+ */
71
+ export declare function readShadingFill(shd: Element): string | undefined;
72
+ /** Applique un `w:pPr` (de style ou direct) sur l'accumulateur. `w:pStyle` n'est pas lu ici. */
73
+ export declare function applyParagraphProperties(pPr: Element, acc: MutableParagraph): void;
74
+ /** Applique un `w:rPr` (de style ou direct) sur l'accumulateur. `w:rStyle` n'est pas lu ici. */
75
+ export declare function applyRunProperties(rPr: Element, acc: MutableRun, theme: ThemeFonts): void;
76
+ /**
77
+ * Applique le delta d'un style de caractère (ses `w:rPr` résolus sur un accumulateur
78
+ * vide) sur les propriétés héritées du paragraphe. Les propriétés à bascule d'ECMA-376
79
+ * §17.7.3 (`b`, `i`, `caps`, `smallCaps`, `strike`/`dstrike`) sont combinées en **XOR** :
80
+ * un style `Strong` (gras) sur un titre déjà gras rend non gras, comme Word. Une bascule
81
+ * explicitement désactivée dans le style (`w:b w:val="0"`) ne change rien (XOR avec
82
+ * faux). Les autres propriétés remplacent l'héritée, y compris par `undefined`
83
+ * (`w:color w:val="auto"` efface la couleur du paragraphe).
84
+ */
85
+ export declare function mergeRunDelta(acc: MutableRun, delta: MutableRun): void;
86
+ /** Propriétés de run figées : les booléens faux, `null` et `undefined` disparaissent. */
87
+ export declare function finalizeRun(acc: MutableRun): ResolvedRunProps;
88
+ /** Propriétés de paragraphe figées, sans le niveau de plan (converti par `styles.ts`). */
89
+ export declare function finalizeParagraph(acc: MutableParagraph, runDefaults: ResolvedRunProps): Omit<ResolvedParagraphProps, 'styleId' | 'headingLevel'>;
90
+ //# sourceMappingURL=properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/docx/reader/properties.ts"],"names":[],"mappings":"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"}