@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,177 @@
1
+ /**
2
+ * Conversions d'unités et de couleurs OOXML, partagées par tous les modules du lecteur
3
+ * (L24 les crée, L25 les lit). Les twips (1/20 pt), demi-points, huitièmes de point et
4
+ * EMU n'existent que dans le paquet `word` : tout ce qui sort est en points, millimètres
5
+ * ou pixels, arrondi à deux décimales.
6
+ */
7
+ const TWIPS_PER_PT = 20;
8
+ const TWIPS_PER_MM = 1440 / 25.4;
9
+ const EMU_PER_PT = 12700;
10
+ const EMU_PER_PX = 9525;
11
+ /** Arrondi à deux décimales, sans flottement (`0.1 + 0.2`). */
12
+ export function round2(value) {
13
+ return Math.round(value * 100) / 100;
14
+ }
15
+ /** Nombre décimal strict : ni hexadécimal (`0x20`), ni exposant (`1e300`), ni `Infinity`. */
16
+ const DECIMAL_NUMBER = /^-?\d+(?:\.\d+)?$/;
17
+ /**
18
+ * Entier d'un attribut OOXML, `undefined` si absent ou non numérique. Les valeurs
19
+ * décimales (`"12.5"`, tolérées par certains producteurs) sont acceptées ; tout ce que
20
+ * `Number()` accepterait en plus (hexadécimal, exposant, espaces internes) est rejeté.
21
+ */
22
+ export function numberAttr(value) {
23
+ if (value === null || value === undefined)
24
+ return undefined;
25
+ const trimmed = value.trim();
26
+ if (!DECIMAL_NUMBER.test(trimmed))
27
+ return undefined;
28
+ const parsed = Number(trimmed);
29
+ return Number.isFinite(parsed) ? parsed : undefined;
30
+ }
31
+ /**
32
+ * Bornes de Word (ce que son interface accepte), en points : une valeur hors de ces
33
+ * bornes vient d'un producteur cassé ou d'un document hostile et est ignorée, comme une
34
+ * valeur non numérique — jamais écrite en CSS, jamais une exception.
35
+ */
36
+ export const WORD_LIMITS = {
37
+ /** Taille de police `w:sz` : 1 à 1638 pt. */
38
+ fontSizeMinPt: 1,
39
+ fontSizeMaxPt: 1638,
40
+ /** Largeur de bordure `w:sz` (huitièmes) : 12 pt au plus. */
41
+ borderMaxPt: 12,
42
+ /** Retraits, espacements avant/après, interligne exact, espacement de caractères : ±1584 pt. */
43
+ distanceMaxPt: 1584,
44
+ /** Interligne multiple (`w:lineRule="auto"`) : 132 lignes au plus. */
45
+ lineMultipleMax: 132,
46
+ };
47
+ /** `value` s'il est dans `[min, max]`, sinon `undefined` (valeur hors bornes ignorée). */
48
+ export function bounded(value, min, max) {
49
+ return value !== undefined && value >= min && value <= max ? value : undefined;
50
+ }
51
+ /** Distance signée (retrait, espacement) bornée à ±1584 pt. */
52
+ export function boundedDistancePt(value) {
53
+ return bounded(value, -WORD_LIMITS.distanceMaxPt, WORD_LIMITS.distanceMaxPt);
54
+ }
55
+ /**
56
+ * Nom de police acceptable : lettres, chiffres, espace, point, tiret, 64 caractères au
57
+ * plus (`Arial Narrow`, `Wingdings 2`, `Noto Sans CJK`). Tout le reste — en particulier
58
+ * un `;` ou un `(` qui ferait sortir de la déclaration `font-family` — est ignoré.
59
+ */
60
+ const FONT_NAME = /^[\w .-]{1,64}$/u;
61
+ /** Nom de police validé et épuré des espaces de bord, `undefined` s'il est irrecevable. */
62
+ export function fontName(value) {
63
+ const trimmed = (value ?? '').trim();
64
+ return FONT_NAME.test(trimmed) ? trimmed : undefined;
65
+ }
66
+ /** Identifiant CSS simple : pas d'espace, pas de point, ne commence pas par un chiffre. */
67
+ const CSS_IDENTIFIER = /^-?[A-Za-z_][\w-]*$/;
68
+ /**
69
+ * Valeur CSS de `font-family` pour un nom validé par `fontName` : citée entre guillemets
70
+ * dès qu'elle n'est pas un identifiant CSS (`"Wingdings 2"`, `"Arial Narrow"`), sinon
71
+ * telle quelle (`Calibri`). Le nom ne contient ni `"` ni `\`, aucun échappement n'est
72
+ * nécessaire ; le core relit la valeur citée telle quelle et la ré-émet à l'identique.
73
+ */
74
+ export function cssFontFamily(name) {
75
+ return CSS_IDENTIFIER.test(name) ? name : `"${name}"`;
76
+ }
77
+ /** Twips → points (`240` → `12`). */
78
+ export function twipsToPt(twips) {
79
+ return round2(twips / TWIPS_PER_PT);
80
+ }
81
+ /** Twips → millimètres (`1440` → `25.4`). */
82
+ export function twipsToMm(twips) {
83
+ return round2(twips / TWIPS_PER_MM);
84
+ }
85
+ /** Demi-points (`w:sz`) → points (`22` → `11`). */
86
+ export function halfPointsToPt(halfPoints) {
87
+ return round2(halfPoints / 2);
88
+ }
89
+ /** Huitièmes de point (`w:sz` des bordures) → points (`4` → `0.5`). */
90
+ export function eighthPointsToPt(eighths) {
91
+ return round2(eighths / 8);
92
+ }
93
+ /** EMU → points (`127000` → `10`). */
94
+ export function emuToPt(emu) {
95
+ return round2(emu / EMU_PER_PT);
96
+ }
97
+ /** EMU → pixels CSS à 96 dpi (`952500` → `100`). */
98
+ export function emuToPx(emu) {
99
+ return round2(emu / EMU_PER_PX);
100
+ }
101
+ /** Cinquantièmes de pour cent (`w:w w:type="pct"`, `5000` → `100`). */
102
+ export function fiftiethsToPercent(fiftieths) {
103
+ return round2(fiftieths / 50);
104
+ }
105
+ /** Interligne multiple `w:line` en 240e (`276` → `1.15`). */
106
+ export function lineToMultiple(line) {
107
+ return round2(line / 240);
108
+ }
109
+ /** Couleur `#rrggbb` minuscule : `RRGGBB` → `#rrggbb` ; `auto`, `none`, vide ou invalide → `undefined`. */
110
+ export function hexColor(value) {
111
+ if (!value)
112
+ return undefined;
113
+ const trimmed = value.trim().replace(/^#/, '');
114
+ if (!/^[0-9a-fA-F]{6}$/.test(trimmed))
115
+ return undefined;
116
+ return `#${trimmed.toLowerCase()}`;
117
+ }
118
+ /** Couleur de bordure : comme `hexColor` mais `auto` (et absent) → noir, comme Word l'affiche. */
119
+ export function borderColor(value) {
120
+ return hexColor(value) ?? '#000000';
121
+ }
122
+ /**
123
+ * Surlignages nommés de Word (`w:highlight`), valeurs d'affichage de Word. Clés en
124
+ * minuscules : la recherche se fait sur le nom abaissé (`darkBlue`, `DarkBlue` et
125
+ * `darkblue` désignent la même couleur).
126
+ */
127
+ const HIGHLIGHT_COLORS = {
128
+ yellow: '#ffff00',
129
+ green: '#00ff00',
130
+ cyan: '#00ffff',
131
+ magenta: '#ff00ff',
132
+ blue: '#0000ff',
133
+ red: '#ff0000',
134
+ darkblue: '#000080',
135
+ darkcyan: '#008080',
136
+ darkgreen: '#008000',
137
+ darkmagenta: '#800080',
138
+ darkred: '#800000',
139
+ darkyellow: '#808000',
140
+ darkgray: '#808080',
141
+ lightgray: '#c0c0c0',
142
+ black: '#000000',
143
+ white: '#ffffff',
144
+ };
145
+ /** Surlignage nommé → `#rrggbb`, `none` ou inconnu → `undefined`. */
146
+ export function highlightColor(name) {
147
+ if (!name)
148
+ return undefined;
149
+ return HIGHLIGHT_COLORS[name.trim().toLowerCase()];
150
+ }
151
+ /**
152
+ * Style de bordure OOXML (`w:val`) → style du contrat. `nil`/`none` → `null` (pas de
153
+ * bordure, annule une bordure héritée). Les motifs exotiques (3D, artistiques) sont
154
+ * ramenés au trait le plus proche.
155
+ */
156
+ export function borderStyleOf(value) {
157
+ const val = (value ?? '').trim();
158
+ if (val === '' || val === 'nil' || val === 'none')
159
+ return null;
160
+ if (/^(?:dotted|dotDash|dotDotDash)$/i.test(val))
161
+ return val === 'dotted' ? 'dotted' : 'dashed';
162
+ if (/^dash/i.test(val))
163
+ return 'dashed';
164
+ if (/^(?:double|triple|thinThick|thickThin|thinThickThin|thickThinThick)/i.test(val)) {
165
+ return 'double';
166
+ }
167
+ return 'solid';
168
+ }
169
+ /**
170
+ * Booléen OOXML (`w:b`, `w:i`, `w:keepNext`…) : l'élément présent sans `w:val` vaut
171
+ * vrai ; `0`, `false`, `off` valent faux (et annulent la valeur héritée).
172
+ */
173
+ export function onOff(value) {
174
+ const val = (value ?? '').trim().toLowerCase();
175
+ return val === '' || val === '1' || val === 'true' || val === 'on';
176
+ }
177
+ //# sourceMappingURL=units.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../../src/docx/reader/units.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { AsterVariable, UploadHandler } from '@aster-editor/core';
1
+ import type { AsterVariable, DocumentLayout, UploadHandler } from '@aster-editor/core';
2
2
  /**
3
3
  * Entrée acceptée par `importDocx` : un `File` du navigateur, les octets bruts, ou une
4
4
  * vue typée (`Uint8Array`, `Buffer` Node) dont seule la fenêtre visible est lue.
@@ -13,7 +13,7 @@ export type DocxInput = File | ArrayBuffer | ArrayBufferView;
13
13
  * - `variables-preprocess-failed` : le prétraitement des champs de fusion et contrôles de contenu
14
14
  * a échoué (archive ou XML illisible) ; le document est importé sans, les `{{nom}}` saisis restent détectés.
15
15
  */
16
- export type DocxImportWarningCode = 'mammoth' | 'image-upload-failed' | 'footnotes-dropped' | 'unsupported-style' | 'variables-preprocess-failed';
16
+ export type DocxImportWarningCode = 'mammoth' | 'image-upload-failed' | 'footnotes-dropped' | 'unsupported-style' | 'variables-preprocess-failed' | 'image-skipped' | 'object-lost' | 'reader';
17
17
  /** Avertissement remonté par l'import : un élément Word n'a pas pu être converti fidèlement. */
18
18
  export interface DocxImportWarning {
19
19
  /** Code stable, voir `DocxImportWarningCode`. */
@@ -69,6 +69,30 @@ export interface DocxImportOptions {
69
69
  * utile pour nettoyer un document Word qui espace ses blocs avec des lignes vides.
70
70
  */
71
71
  emptyParagraphs?: 'keep' | 'drop';
72
+ /**
73
+ * Chemin de lecture. `styled` (défaut du composant Angular, de la démo et du playground ; défaut de la lib prévu en 0.6) : lecteur OOXML d'Aster, HTML
74
+ * stylé (polices, interlignes, bordures, tableaux complets, listes fidèles), `layout`
75
+ * renseigné. `semantic` : mammoth, HTML sémantique sans mise en forme, comportement
76
+ * des versions 0.4.x.
77
+ */
78
+ fidelity?: 'styled' | 'semantic';
79
+ }
80
+ /** Nature d'un objet Word que l'éditeur ne sait pas représenter. */
81
+ export type DocxLostKind = 'textbox' | 'shape' | 'smartart' | 'chart' | 'equation' | 'comment' | 'revision' | 'field' | 'embedded-object' | 'unknown';
82
+ /** Où l'objet se trouvait dans le document. */
83
+ export type DocxLostWhere = 'body' | 'header' | 'footer' | 'footnote' | 'endnote';
84
+ /**
85
+ * Objet non représentable rencontré à l'import. Hors du corps, il est conservé tel quel
86
+ * dans le gabarit ; dans le corps, il est remplacé par son texte quand il en a un et
87
+ * signalé ici (et par un avertissement `object-lost`).
88
+ */
89
+ export interface DocxLostObject {
90
+ readonly kind: DocxLostKind;
91
+ readonly where: DocxLostWhere;
92
+ /** Texte de remplacement inséré dans le corps, s'il y en a un. */
93
+ readonly text?: string;
94
+ /** Détail lisible : nom de la forme, type d'objet incorporé… */
95
+ readonly detail?: string;
72
96
  }
73
97
  /**
74
98
  * Résultat de `importDocx` : le HTML à donner à l'éditeur et la liste, souvent vide, de
@@ -85,5 +109,19 @@ export interface DocxImportResult {
85
109
  * en-têtes et pieds de page, que mammoth ne rend pas. Vide si aucune.
86
110
  */
87
111
  variables: readonly AsterVariable[];
112
+ /**
113
+ * Mise en page lue dans la dernière section du document (format, orientation, marges,
114
+ * colonnes, police par défaut, langue, en-têtes et pieds en HTML stylé). Objet vide en
115
+ * mode `semantic`.
116
+ */
117
+ layout: DocumentLayout;
118
+ /**
119
+ * Le `.docx` d'origine, intact, à repasser à `exportDocx({ template })` pour que tout ce
120
+ * qui n'est pas le corps (styles, numérotation, thème, en-têtes, sections) ressorte
121
+ * identique. C'est le tampon reçu, pas une copie.
122
+ */
123
+ template: ArrayBuffer;
124
+ /** Objets non représentables rencontrés dans le corps ou les parties lues. Vide en mode `semantic`. */
125
+ lost: readonly DocxLostObject[];
88
126
  }
89
127
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/docx/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,eAAe,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,CAAC;AAElC,gGAAgG;AAChG,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,IAAI,EAAE,qBAAqB,CAAC;IAC5B,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC;CAC5D;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAE7E,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,kGAAkG;IAClG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,mFAAmF;IACnF,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC;;;;OAIG;IACH,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/docx/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEvF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,eAAe,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,GAC7B,eAAe,GACf,aAAa,GACb,QAAQ,CAAC;AAEb,gGAAgG;AAChG,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,IAAI,EAAE,qBAAqB,CAAC;IAC5B,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC;CAC5D;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAE7E,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,kGAAkG;IAClG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,mFAAmF;IACnF,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAClC;AAED,oEAAoE;AACpE,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,GACV,SAAS,GACT,UAAU,GACV,OAAO,GACP,iBAAiB,GACjB,SAAS,CAAC;AAEd,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAElF;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC;;;;OAIG;IACH,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IACpC;;;;OAIG;IACH,MAAM,EAAE,cAAc,CAAC;IACvB;;;;OAIG;IACH,QAAQ,EAAE,WAAW,CAAC;IACtB,uGAAuG;IACvG,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CACjC"}
@@ -0,0 +1,30 @@
1
+ import type { PartStore } from './xml-io';
2
+ /**
3
+ * `[Content_Types].xml` du gabarit : on y **ajoute** les types par défaut des extensions
4
+ * d'images nouvelles et les `Override` des parties créées (numérotation, notes). Rien
5
+ * n'est retiré ni réordonné ; sans ajout, la partie n'est pas réécrite.
6
+ */
7
+ /** Chemin de la partie des types de contenu. */
8
+ export declare const CONTENT_TYPES_PATH = "[Content_Types].xml";
9
+ /** Types de contenu des parties que la greffe peut créer. */
10
+ export declare const PART_CONTENT_TYPES: {
11
+ readonly numbering: "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
12
+ readonly footnotes: "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml";
13
+ readonly header: "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml";
14
+ readonly footer: "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml";
15
+ readonly settings: "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml";
16
+ readonly coreProperties: "application/vnd.openxmlformats-package.core-properties+xml";
17
+ };
18
+ /** Type MIME d'une extension d'image, `application/octet-stream` sinon. */
19
+ export declare function imageContentType(extension: string): string;
20
+ /** Ajouts à faire : extensions (`Default`) et parties (`Override`, chemin sans `/` initial). */
21
+ export interface ContentTypeAdditions {
22
+ readonly defaults: ReadonlyMap<string, string>;
23
+ readonly overrides: ReadonlyMap<string, string>;
24
+ }
25
+ /**
26
+ * Complète `[Content_Types].xml` avec les entrées manquantes. Rend vrai si la partie a
27
+ * été modifiée. Un gabarit sans cette partie (archive non conforme) la reçoit entière.
28
+ */
29
+ export declare function ensureContentTypes(store: PartStore, additions: ContentTypeAdditions): Promise<boolean>;
30
+ //# sourceMappingURL=content-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/content-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;GAIG;AAEH,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAMxD,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB;;;;;;;CAOrB,CAAC;AAYX,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,gGAAgG;AAChG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,oBAAoB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA6ClB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * `[Content_Types].xml` du gabarit : on y **ajoute** les types par défaut des extensions
3
+ * d'images nouvelles et les `Override` des parties créées (numérotation, notes). Rien
4
+ * n'est retiré ni réordonné ; sans ajout, la partie n'est pas réécrite.
5
+ */
6
+ /** Chemin de la partie des types de contenu. */
7
+ export const CONTENT_TYPES_PATH = '[Content_Types].xml';
8
+ const CONTENT_TYPES_NS = 'http://schemas.openxmlformats.org/package/2006/content-types';
9
+ const WORDPROCESSING = 'application/vnd.openxmlformats-officedocument.wordprocessingml';
10
+ /** Types de contenu des parties que la greffe peut créer. */
11
+ export const PART_CONTENT_TYPES = {
12
+ numbering: `${WORDPROCESSING}.numbering+xml`,
13
+ footnotes: `${WORDPROCESSING}.footnotes+xml`,
14
+ header: `${WORDPROCESSING}.header+xml`,
15
+ footer: `${WORDPROCESSING}.footer+xml`,
16
+ settings: `${WORDPROCESSING}.settings+xml`,
17
+ coreProperties: 'application/vnd.openxmlformats-package.core-properties+xml',
18
+ };
19
+ /** Types MIME des images que l'export embarque, par extension. */
20
+ const IMAGE_CONTENT_TYPES = {
21
+ png: 'image/png',
22
+ jpg: 'image/jpeg',
23
+ jpeg: 'image/jpeg',
24
+ gif: 'image/gif',
25
+ bmp: 'image/bmp',
26
+ svg: 'image/svg+xml',
27
+ };
28
+ /** Type MIME d'une extension d'image, `application/octet-stream` sinon. */
29
+ export function imageContentType(extension) {
30
+ return IMAGE_CONTENT_TYPES[extension.toLowerCase()] ?? 'application/octet-stream';
31
+ }
32
+ /**
33
+ * Complète `[Content_Types].xml` avec les entrées manquantes. Rend vrai si la partie a
34
+ * été modifiée. Un gabarit sans cette partie (archive non conforme) la reçoit entière.
35
+ */
36
+ export async function ensureContentTypes(store, additions) {
37
+ if (additions.defaults.size === 0 && additions.overrides.size === 0)
38
+ return false;
39
+ let doc = await store.dom(CONTENT_TYPES_PATH);
40
+ if (!doc) {
41
+ doc = store.parse(`<Types xmlns="${CONTENT_TYPES_NS}"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/></Types>`);
42
+ store.create(CONTENT_TYPES_PATH, doc, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
43
+ }
44
+ const root = doc.documentElement;
45
+ const existingDefaults = new Set();
46
+ const existingOverrides = new Set();
47
+ for (const child of Array.from(root.children)) {
48
+ if (child.localName === 'Default') {
49
+ existingDefaults.add((child.getAttribute('Extension') ?? '').toLowerCase());
50
+ }
51
+ else if (child.localName === 'Override') {
52
+ existingOverrides.add(child.getAttribute('PartName') ?? '');
53
+ }
54
+ }
55
+ let changed = false;
56
+ for (const [extension, type] of additions.defaults) {
57
+ if (existingDefaults.has(extension.toLowerCase()))
58
+ continue;
59
+ const element = doc.createElementNS(CONTENT_TYPES_NS, 'Default');
60
+ element.setAttribute('Extension', extension);
61
+ element.setAttribute('ContentType', type);
62
+ // Les `Default` précèdent les `Override` dans les fichiers de Word : on garde cet ordre.
63
+ const firstOverride = Array.from(root.children).find((child) => child.localName === 'Override');
64
+ root.insertBefore(element, firstOverride ?? null);
65
+ changed = true;
66
+ }
67
+ for (const [path, type] of additions.overrides) {
68
+ const partName = path.startsWith('/') ? path : `/${path}`;
69
+ if (existingOverrides.has(partName))
70
+ continue;
71
+ const element = doc.createElementNS(CONTENT_TYPES_NS, 'Override');
72
+ element.setAttribute('PartName', partName);
73
+ element.setAttribute('ContentType', type);
74
+ root.appendChild(element);
75
+ changed = true;
76
+ }
77
+ if (changed)
78
+ await store.markChanged(CONTENT_TYPES_PATH);
79
+ return changed;
80
+ }
81
+ //# sourceMappingURL=content-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-types.js","sourceRoot":"","sources":["../../../src/docx/writer/content-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DocxPackage } from '../reader/types';
2
+ import type { PartStore } from './xml-io';
3
+ export interface CorePropertiesInput {
4
+ readonly template: PartStore;
5
+ readonly pkg: DocxPackage;
6
+ /** `Override` à ajouter à `[Content_Types].xml` si la partie est créée. */
7
+ readonly overrides: Map<string, string>;
8
+ readonly title?: string;
9
+ readonly creator?: string;
10
+ }
11
+ /**
12
+ * Réécrit `dc:title` / `dc:creator` du gabarit. Rend le chemin de la partie si elle a été
13
+ * réécrite ou créée, `null` sinon.
14
+ */
15
+ export declare function writeCoreProperties(input: CorePropertiesInput): Promise<string | null>;
16
+ //# sourceMappingURL=core-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-properties.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/core-properties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAwB1C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAkBD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB5F"}
@@ -0,0 +1,64 @@
1
+ import { sanitizeXmlText } from '../../export/sanitize';
2
+ import { PART_CONTENT_TYPES } from './content-types';
3
+ import { REL_TYPE, RelationshipTable } from './relationships';
4
+ /**
5
+ * Propriétés du document (`docProps/core.xml`) dans le gabarit : `dc:title` et
6
+ * `dc:creator` sont réécrits quand `options.title` / `options.creator` sont fournis, les
7
+ * autres propriétés (dates, révision, mots-clés…) restent telles quelles. Sans option, la
8
+ * partie n'est pas touchée ; une valeur déjà identique ne la réécrit pas non plus. Un
9
+ * gabarit sans cette partie la reçoit, avec sa relation de paquet et son type de contenu.
10
+ */
11
+ const CP_NS = 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties';
12
+ const DC_NS = 'http://purl.org/dc/elements/1.1/';
13
+ const DCTERMS_NS = 'http://purl.org/dc/terms/';
14
+ const DCMITYPE_NS = 'http://purl.org/dc/dcmitype/';
15
+ const XSI_NS = 'http://www.w3.org/2001/XMLSchema-instance';
16
+ const CORE_PATH = 'docProps/core.xml';
17
+ const DECLARATION = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
18
+ const EMPTY_CORE = `<cp:coreProperties xmlns:cp="${CP_NS}" xmlns:dc="${DC_NS}" xmlns:dcterms="${DCTERMS_NS}"` +
19
+ ` xmlns:dcmitype="${DCMITYPE_NS}" xmlns:xsi="${XSI_NS}"/>`;
20
+ /** Pose `dc:<name>` à `value` (créé s'il manque). Rend vrai si le texte a changé. */
21
+ function setDublinCore(doc, name, value) {
22
+ const root = doc.documentElement;
23
+ let element = Array.from(root.children).find((child) => child.namespaceURI === DC_NS && child.localName === name);
24
+ if (!element) {
25
+ element = doc.createElementNS(DC_NS, `dc:${name}`);
26
+ root.appendChild(element);
27
+ }
28
+ else if (element.textContent === value) {
29
+ return false;
30
+ }
31
+ element.textContent = value;
32
+ return true;
33
+ }
34
+ /**
35
+ * Réécrit `dc:title` / `dc:creator` du gabarit. Rend le chemin de la partie si elle a été
36
+ * réécrite ou créée, `null` sinon.
37
+ */
38
+ export async function writeCoreProperties(input) {
39
+ if (input.title === undefined && input.creator === undefined)
40
+ return null;
41
+ let path = await input.pkg.related('', '/core-properties');
42
+ let doc = path ? await input.template.dom(path) : null;
43
+ let changed = false;
44
+ if (!doc) {
45
+ path = CORE_PATH;
46
+ doc = input.template.parse(EMPTY_CORE);
47
+ input.template.create(path, doc, DECLARATION);
48
+ const rootRelationships = await RelationshipTable.open(input.template, '');
49
+ await rootRelationships.ensure(REL_TYPE.coreProperties, path, false);
50
+ input.overrides.set(path, PART_CONTENT_TYPES.coreProperties);
51
+ changed = true;
52
+ }
53
+ if (input.title !== undefined) {
54
+ changed = setDublinCore(doc, 'title', sanitizeXmlText(input.title)) || changed;
55
+ }
56
+ if (input.creator !== undefined) {
57
+ changed = setDublinCore(doc, 'creator', sanitizeXmlText(input.creator)) || changed;
58
+ }
59
+ if (!changed || !path)
60
+ return null;
61
+ await input.template.markChanged(path);
62
+ return path;
63
+ }
64
+ //# sourceMappingURL=core-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-properties.js","sourceRoot":"","sources":["../../../src/docx/writer/core-properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type RelationshipTable } from './relationships';
2
+ import { type PartStore } from './xml-io';
3
+ /**
4
+ * Notes de bas de page du corps greffé. Les notes générées sont **ajoutées** à
5
+ * `footnotes.xml` du gabarit sous des identifiants libres (les séparateurs du gabarit
6
+ * sont conservés) ; sans cette partie dans le gabarit, elle est créée avec les
7
+ * séparateurs de l'export. Les notes du gabarit que le corps n'appelle plus restent dans
8
+ * la partie : Word les ignore.
9
+ */
10
+ export interface FootnoteMergerInput {
11
+ readonly template: PartStore;
12
+ readonly generated: PartStore;
13
+ readonly mainPart: string;
14
+ /** Chemin de `footnotes.xml` du gabarit (relation `/footnotes`), `null` s'il n'en a pas. */
15
+ readonly templatePath: string | null;
16
+ readonly relationships: RelationshipTable;
17
+ }
18
+ export interface FootnoteMerger {
19
+ /** `w:id` d'un `w:footnoteReference` généré → identifiant dans le gabarit. */
20
+ remap(id: string): Promise<string>;
21
+ /** Notes copiées dans le gabarit : leurs paragraphes passent aussi par la greffe des styles. */
22
+ readonly imported: () => readonly Element[];
23
+ readonly createdPart: () => {
24
+ readonly path: string;
25
+ readonly contentType: string;
26
+ } | null;
27
+ }
28
+ /** Crée le fusionneur de notes du gabarit. */
29
+ export declare function createFootnoteMerger(input: FootnoteMergerInput): Promise<FootnoteMerger>;
30
+ //# sourceMappingURL=footnotes-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footnotes-merge.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/footnotes-merge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAyD,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjG;;;;;;GAMG;AAEH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4FAA4F;IAC5F,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,gGAAgG;IAChG,QAAQ,CAAC,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5F;AAOD,8CAA8C;AAC9C,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAkE9F"}
@@ -0,0 +1,71 @@
1
+ import { childrenNamed } from '../preprocess/xml-utils';
2
+ import { PART_CONTENT_TYPES } from './content-types';
3
+ import { REL_TYPE } from './relationships';
4
+ import { directoryOf, emptyDocumentLike, setWordAttr, wordAttr } from './xml-io';
5
+ /** Notes techniques de Word, jamais référencées depuis le corps. */
6
+ const TECHNICAL_TYPES = new Set(['separator', 'continuationSeparator']);
7
+ const FOOTNOTES_FILE = 'footnotes.xml';
8
+ /** Crée le fusionneur de notes du gabarit. */
9
+ export async function createFootnoteMerger(input) {
10
+ const generatedDoc = await input.generated.dom('word/footnotes.xml');
11
+ let templatePath = input.templatePath;
12
+ let templateDoc = templatePath ? await input.template.dom(templatePath) : null;
13
+ let created = null;
14
+ const remapped = new Map();
15
+ const imported = [];
16
+ const nextId = () => {
17
+ let max = 0;
18
+ if (templateDoc) {
19
+ for (const note of childrenNamed(templateDoc.documentElement, 'footnote')) {
20
+ const value = Number(wordAttr(note, 'id'));
21
+ if (Number.isFinite(value) && value > max)
22
+ max = value;
23
+ }
24
+ }
25
+ return String(max + 1);
26
+ };
27
+ /** `footnotes.xml` du gabarit, créée (séparateurs compris) à la première note copiée. */
28
+ const ensureTemplateDoc = async () => {
29
+ if (templateDoc)
30
+ return templateDoc;
31
+ if (!generatedDoc)
32
+ return null;
33
+ templatePath = templatePath ?? `${directoryOf(input.mainPart)}${FOOTNOTES_FILE}`;
34
+ templateDoc = emptyDocumentLike(generatedDoc);
35
+ for (const note of childrenNamed(generatedDoc.documentElement, 'footnote')) {
36
+ if (TECHNICAL_TYPES.has(wordAttr(note, 'type'))) {
37
+ templateDoc.documentElement.appendChild(templateDoc.importNode(note, true));
38
+ }
39
+ }
40
+ input.template.create(templatePath, templateDoc, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
41
+ await input.relationships.ensure(REL_TYPE.footnotes, templatePath, false);
42
+ created = { path: templatePath, contentType: PART_CONTENT_TYPES.footnotes };
43
+ return templateDoc;
44
+ };
45
+ return {
46
+ async remap(id) {
47
+ const known = remapped.get(id);
48
+ if (known !== undefined)
49
+ return known;
50
+ const target = await ensureTemplateDoc();
51
+ const note = generatedDoc
52
+ ? childrenNamed(generatedDoc.documentElement, 'footnote').find((candidate) => wordAttr(candidate, 'id') === id)
53
+ : undefined;
54
+ if (!target || !templatePath || !note) {
55
+ remapped.set(id, id);
56
+ return id;
57
+ }
58
+ const newId = nextId();
59
+ const clone = target.importNode(note, true);
60
+ setWordAttr(clone, 'id', newId);
61
+ target.documentElement.appendChild(clone);
62
+ imported.push(clone);
63
+ await input.template.markChanged(templatePath);
64
+ remapped.set(id, newId);
65
+ return newId;
66
+ },
67
+ imported: () => imported,
68
+ createdPart: () => created,
69
+ };
70
+ }
71
+ //# sourceMappingURL=footnotes-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footnotes-merge.js","sourceRoot":"","sources":["../../../src/docx/writer/footnotes-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { DocumentLayout } from '@aster-editor/core';
2
+ import type { ListDefinition, VariableSettings } from '../../export/context';
3
+ import type { DocxExportWarning } from '../../export/types';
4
+ import type { TemplateContext } from './template';
5
+ import { type XmlCodec } from './xml-io';
6
+ /**
7
+ * Greffe du corps généré dans le gabarit. Principe figé (brief L27) : le `.docx` produit
8
+ * par la chaîne d'export (lib `docx`) n'est qu'une source ; le gabarit est ouvert et
9
+ * **aucune de ses parties n'est réécrite** sauf le corps, ses relations, les médias et
10
+ * numérotations ajoutés, les styles ajoutés, les notes ajoutées, `[Content_Types].xml`
11
+ * quand une partie ou une extension apparaît, les en-têtes et pieds quand les
12
+ * variables y sont résolues ou qu'un `layout` les régénère, `settings.xml` quand la
13
+ * table des matières ou un en-tête de pages paires l'exige, et `docProps/core.xml`
14
+ * quand `title` / `creator` sont fournis. Le `w:sectPr` final du gabarit (en-têtes,
15
+ * pieds, marges, colonnes) est conservé ; un corps régénéré n'a plus de sections
16
+ * intermédiaires : seules les propriétés de la **dernière** section survivent, complétées
17
+ * des en-têtes et pieds que les sections précédentes lui transmettaient par héritage.
18
+ */
19
+ export interface GraftInput {
20
+ /** Archive produite par `Packer` à partir du corps édité. */
21
+ readonly generated: ArrayBuffer;
22
+ readonly template: TemplateContext;
23
+ readonly lists: readonly ListDefinition[];
24
+ /** `numId` généré → référence `numbering`, lu sur `document.Numbering` après empaquetage. */
25
+ readonly concreteNumbering: ReadonlyMap<string, string>;
26
+ readonly variables: VariableSettings;
27
+ readonly layout: DocumentLayout | undefined;
28
+ /** Vrai avec `options.toc` : `w:updateFields` est posé dans `settings.xml`. */
29
+ readonly toc: boolean;
30
+ /** `options.title` / `options.creator`, réécrits dans `docProps/core.xml`. */
31
+ readonly title?: string;
32
+ readonly creator?: string;
33
+ readonly codec: XmlCodec;
34
+ }
35
+ /**
36
+ * Greffe le corps de `generated` dans le gabarit et rend l'archive résultante. Lève sur
37
+ * un gabarit sans partie principale (déjà validé par `openTemplate`) ou un document
38
+ * généré illisible : l'appelant replie alors sur l'export neuf.
39
+ */
40
+ export declare function graftIntoTemplate(input: GraftInput, warnings: DocxExportWarning[]): Promise<ArrayBuffer>;
41
+ //# sourceMappingURL=graft.d.ts.map