@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,442 @@
1
+ import { childNamed, wordAttribute } from '../preprocess/xml-utils';
2
+ import { escapeAttr, escapeHtml, pt, styleAttr } from './html';
3
+ import { detectLostInline } from './lost';
4
+ import { docDefaultsOf } from './styles';
5
+ import { cssFontFamily, fontName } from './units';
6
+ /** Enfants d'un `w:p` sans contenu ni objet : jamais signalés. */
7
+ const IGNORED_PARAGRAPH_CHILDREN = new Set([
8
+ 'pPr',
9
+ 'bookmarkStart',
10
+ 'bookmarkEnd',
11
+ 'proofErr',
12
+ 'commentRangeStart',
13
+ 'commentRangeEnd',
14
+ 'permStart',
15
+ 'permEnd',
16
+ 'rPr',
17
+ ]);
18
+ /** Enfants d'un `w:r` qui portent un objet non représentable. */
19
+ const LOST_RUN_CHILDREN = new Set([
20
+ 'object',
21
+ 'commentReference',
22
+ 'oMath',
23
+ 'oMathPara',
24
+ ]);
25
+ function sameLost(a, b) {
26
+ return a.kind === b.kind && a.where === b.where && a.detail === b.detail && a.text === b.text;
27
+ }
28
+ /**
29
+ * Signale un objet non représentable rencontré dans le flux inline (classification par
30
+ * `lost.ts`), une seule fois par objet identique : révisions et commentaires reviennent
31
+ * souvent, `images.ts` dédoublonne de la même façon.
32
+ */
33
+ function reportLost(element, ctx) {
34
+ const lost = detectLostInline(element, ctx);
35
+ if (!lost || ctx.lost.some((known) => sameLost(known, lost)))
36
+ return;
37
+ ctx.lost.push(lost);
38
+ ctx.warnings.push({
39
+ code: 'object-lost',
40
+ message: `Objet non représentable ignoré (${lost.kind})${lost.detail ? ` : ${lost.detail}` : ''}.`,
41
+ });
42
+ }
43
+ /**
44
+ * Contenu inline d'un paragraphe Word → HTML stylé. Parcourt les enfants du `w:p` dans
45
+ * l'ordre (runs, hyperliens, champs simples et complexes, contrôles inline, révisions),
46
+ * résout chaque run par `ctx.styles.run`, et fusionne les runs voisins aux mêmes
47
+ * propriétés rendues en un seul groupe de balises.
48
+ *
49
+ * Décisions figées :
50
+ * - les propriétés égales aux `docDefaults` du document ne sont pas écrites ; tout ce qui
51
+ * en diffère (y compris hérité du style de paragraphe) est posé sur chaque run, jamais
52
+ * sur le bloc ;
53
+ * - `w:tab` → espace cadratin U+2003 (un seul caractère, non replié par HTML, réversible
54
+ * à l'export) ;
55
+ * - `w:br w:type="page"` → marqueur `PAGE_BREAK` dans le flux, que `paragraphs.ts` coupe
56
+ * en blocs frères ; dans un lien ou un champ, il dégénère en `<br>`.
57
+ */
58
+ /** Marqueur de saut de page inséré dans le flux inline, extrait par `paragraphs.ts`. */
59
+ export const PAGE_BREAK = '<hr data-page-break>';
60
+ const TAB = String.fromCharCode(0x2003);
61
+ const NO_BREAK_HYPHEN = String.fromCharCode(0x2011);
62
+ const SOFT_HYPHEN = String.fromCharCode(0xad);
63
+ function decorationAttr(style) {
64
+ return style === 'solid' ? '' : ` style="text-decoration-style: ${style}"`;
65
+ }
66
+ /**
67
+ * Balises d'un run : `<strong><em><u><s><sup|sub><span style data-docx-run-style>`. Les
68
+ * marques booléennes sont écrites dès qu'elles sont vraies ; les propriétés valuées
69
+ * seulement si elles diffèrent de `baseline` (les `docDefaults`).
70
+ */
71
+ export function renderRunTags(props, baseline) {
72
+ const differs = (key) => props[key] !== undefined && props[key] !== baseline[key] ? props[key] : undefined;
73
+ const fontSize = differs('fontSizePt');
74
+ const fontFamily = differs('fontFamily');
75
+ const spacing = differs('letterSpacingPt');
76
+ const caps = differs('caps');
77
+ const style = styleAttr([
78
+ // Ordre des déclarations = celui que le core sérialise (attributs de `textStyle`), pour
79
+ // que `setHTML(getHTML())` dans l'éditeur rende exactement ce HTML. La police est
80
+ // citée quand elle contient un espace (`"Wingdings 2"`) : le core relit la valeur
81
+ // telle quelle (`getStyleProperty`) et la ré-émet à l'identique, guillemets compris.
82
+ ['background-color', differs('highlight')],
83
+ ['color', differs('color')],
84
+ ['font-family', fontFamily === undefined ? undefined : cssFontFamily(fontFamily)],
85
+ ['font-size', fontSize === undefined ? undefined : pt(fontSize)],
86
+ ['letter-spacing', spacing === undefined ? undefined : pt(spacing)],
87
+ ['text-transform', caps === 'all' ? 'uppercase' : undefined],
88
+ ['font-variant', caps === 'small' ? 'small-caps' : undefined],
89
+ ]);
90
+ const runStyle = props.runStyle ? ` data-docx-run-style="${escapeAttr(props.runStyle)}"` : '';
91
+ const open = [];
92
+ const close = [];
93
+ const wrap = (tag, attrs = '') => {
94
+ open.push(`<${tag}${attrs}>`);
95
+ close.unshift(`</${tag}>`);
96
+ };
97
+ // Du plus extérieur au plus intérieur : l'imbrication est celle du schéma du core
98
+ // (`<span><strong><em><s><u><sup>`), sans quoi l'aller-retour dans l'éditeur réordonne.
99
+ if (style || runStyle)
100
+ wrap('span', `${style}${runStyle}`);
101
+ if (props.bold)
102
+ wrap('strong');
103
+ if (props.italic)
104
+ wrap('em');
105
+ if (props.strike)
106
+ wrap('s', decorationAttr(props.strike));
107
+ if (props.underline)
108
+ wrap('u', decorationAttr(props.underline));
109
+ if (props.superscript)
110
+ wrap('sup');
111
+ else if (props.subscript)
112
+ wrap('sub');
113
+ return { open: open.join(''), close: close.join('') };
114
+ }
115
+ /** Accumule le HTML inline en fusionnant les textes voisins portés par les mêmes balises. */
116
+ class InlineWriter {
117
+ out = [];
118
+ current = null;
119
+ text(tags, html) {
120
+ if (html === '')
121
+ return;
122
+ if (!this.current || this.current.tags.open !== tags.open) {
123
+ this.flush();
124
+ this.current = { tags, parts: [] };
125
+ }
126
+ this.current.parts.push(html);
127
+ }
128
+ raw(html) {
129
+ this.flush();
130
+ if (html !== '')
131
+ this.out.push(html);
132
+ }
133
+ flush() {
134
+ if (!this.current)
135
+ return;
136
+ const { tags, parts } = this.current;
137
+ this.out.push(tags.open + parts.join('') + tags.close);
138
+ this.current = null;
139
+ }
140
+ result() {
141
+ this.flush();
142
+ return this.out.join('');
143
+ }
144
+ }
145
+ /** Jeton d'instruction de champ : chaîne entre guillemets ou mot. */
146
+ const FIELD_TOKEN = /"([^"]*)"|(\S+)/g;
147
+ /** Commutateurs de `HYPERLINK` qui prennent un argument, hors `\l` (traité à part). */
148
+ const HYPERLINK_SWITCHES_WITH_ARGUMENT = new Set(['o', 't']);
149
+ /**
150
+ * Cible d'une instruction `HYPERLINK` : la première chaîne (citée ou non) qui n'est pas
151
+ * l'argument d'un commutateur est l'URL ; `\l "x"` ajoute le fragment `#x` (seul, c'est
152
+ * un signet interne `#x`). `HYPERLINK "https://x.io/p" \l "sec2"` → `https://x.io/p#sec2`.
153
+ * `null` pour un autre champ ou une instruction sans cible.
154
+ */
155
+ export function hyperlinkTarget(instr) {
156
+ const tokens = [];
157
+ for (const match of instr.matchAll(FIELD_TOKEN)) {
158
+ tokens.push({ value: match[1] ?? match[2] ?? '', quoted: match[1] !== undefined });
159
+ }
160
+ const keyword = tokens[0];
161
+ if (!keyword || keyword.quoted || keyword.value.toUpperCase() !== 'HYPERLINK')
162
+ return null;
163
+ let target;
164
+ let fragment;
165
+ for (let index = 1; index < tokens.length; index += 1) {
166
+ const token = tokens[index];
167
+ if (!token)
168
+ continue;
169
+ if (!token.quoted && token.value.startsWith('\\')) {
170
+ const name = token.value.slice(1).toLowerCase();
171
+ if (name === 'l') {
172
+ fragment = tokens[index + 1]?.value;
173
+ index += 1;
174
+ }
175
+ else if (HYPERLINK_SWITCHES_WITH_ARGUMENT.has(name)) {
176
+ index += 1;
177
+ }
178
+ continue;
179
+ }
180
+ target ??= token.value;
181
+ }
182
+ if (fragment)
183
+ return `${target ?? ''}#${fragment}`;
184
+ return target || null;
185
+ }
186
+ /** Protocoles autorisés dans un `href` produit par le lecteur. */
187
+ const SAFE_PROTOCOLS = new Set(['http', 'https', 'mailto', 'tel']);
188
+ /**
189
+ * `href` sûr hors de l'éditeur : `http`, `https`, `mailto`, `tel`, les ancres `#…` et les
190
+ * URL relatives passent ; tout autre protocole (`javascript:`, `data:`, `vbscript:`…)
191
+ * retire le lien, le texte est conservé. Le protocole est lu après suppression des
192
+ * caractères de contrôle et espaces, comme un navigateur le ferait (`java\tscript:`).
193
+ */
194
+ export function safeHref(href) {
195
+ if (href === null)
196
+ return null;
197
+ const trimmed = href.trim();
198
+ if (trimmed === '')
199
+ return null;
200
+ // eslint-disable-next-line no-control-regex -- les contrôles C0 sont précisément la cible.
201
+ const probe = trimmed.replace(/[\u0000- \u007f]/g, '').toLowerCase();
202
+ const scheme = /^([a-z][a-z0-9+.-]*):/.exec(probe);
203
+ if (scheme && !SAFE_PROTOCOLS.has(scheme[1] ?? ''))
204
+ return null;
205
+ return trimmed;
206
+ }
207
+ /** Attribut par nom local quel que soit son préfixe (`r:id`, `w:anchor`). */
208
+ function attrByLocalName(element, localName) {
209
+ for (const attr of Array.from(element.attributes)) {
210
+ if (attr.localName === localName)
211
+ return attr.value;
212
+ }
213
+ return '';
214
+ }
215
+ async function hyperlinkHref(hyperlink, ctx) {
216
+ const id = attrByLocalName(hyperlink, 'id');
217
+ if (id) {
218
+ const rel = (await ctx.pkg.rels(ctx.part)).get(id);
219
+ if (rel?.external)
220
+ return rel.target;
221
+ }
222
+ const anchor = wordAttribute(hyperlink, 'anchor');
223
+ return anchor ? `#${anchor}` : null;
224
+ }
225
+ /**
226
+ * Caractère d'un `w:sym` (`w:char` hexadécimal), chaîne vide s'il est illisible, nul,
227
+ * hors du plan Unicode (`110000`) ou dans les substituts (`D800`-`DFFF`) : jamais
228
+ * d'exception (`String.fromCodePoint` lève un `RangeError` hors plage).
229
+ */
230
+ function symbolChar(sym) {
231
+ const raw = wordAttribute(sym, 'char').trim();
232
+ if (!/^[0-9a-f]{1,6}$/i.test(raw))
233
+ return '';
234
+ const code = Number.parseInt(raw, 16);
235
+ if (code === 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff))
236
+ return '';
237
+ return String.fromCodePoint(code);
238
+ }
239
+ /**
240
+ * Convertit le contenu inline d'un paragraphe. `props` est le paragraphe résolu, base
241
+ * des runs (`runDefaults`).
242
+ */
243
+ export async function convertRuns(paragraph, ctx, props) {
244
+ const baseline = docDefaultsOf(ctx.styles).run;
245
+ const state = { writer: new InlineWriter(), fields: [], linkDepth: 0 };
246
+ const withAnchor = async (target, body) => {
247
+ const href = safeHref(target);
248
+ if (href === null) {
249
+ await body();
250
+ return;
251
+ }
252
+ state.writer.raw(`<a href="${escapeAttr(href)}">`);
253
+ state.linkDepth += 1;
254
+ await body();
255
+ state.linkDepth -= 1;
256
+ state.writer.raw('</a>');
257
+ };
258
+ const walkChildren = async (parent) => {
259
+ for (const child of Array.from(parent.children))
260
+ await walk(child);
261
+ };
262
+ const walk = async (element) => {
263
+ switch (element.localName) {
264
+ case 'r':
265
+ await convertRun(element);
266
+ return;
267
+ case 'hyperlink':
268
+ await withAnchor(await hyperlinkHref(element, ctx), () => walkChildren(element));
269
+ return;
270
+ case 'fldSimple':
271
+ // Le résultat du champ est rendu ; un champ hors fusion / page / lien est signalé.
272
+ reportLost(element, ctx);
273
+ await withAnchor(hyperlinkTarget(wordAttribute(element, 'instr')), () => walkChildren(element));
274
+ return;
275
+ case 'sdt': {
276
+ const content = childNamed(element, 'sdtContent');
277
+ if (content)
278
+ await walkChildren(content);
279
+ return;
280
+ }
281
+ case 'ins':
282
+ case 'moveTo':
283
+ // Texte inséré conservé ; la révision est signalée une fois par document (lost.ts).
284
+ reportLost(element, ctx);
285
+ await walkChildren(element);
286
+ return;
287
+ case 'del':
288
+ case 'moveFrom':
289
+ // Texte supprimé retiré, révision signalée.
290
+ reportLost(element, ctx);
291
+ return;
292
+ case 'smartTag':
293
+ case 'customXml':
294
+ case 'dir':
295
+ case 'bdo':
296
+ await walkChildren(element);
297
+ return;
298
+ default:
299
+ // `w:pPr`, signets, marques de commentaire, `w:proofErr` : rien à rendre. Le reste
300
+ // (maths, objets, champs inconnus…) est signalé comme objet non représentable.
301
+ if (!IGNORED_PARAGRAPH_CHILDREN.has(element.localName))
302
+ reportLost(element, ctx);
303
+ return;
304
+ }
305
+ };
306
+ /** Vrai tant qu'un champ (même englobant) est encore dans sa partie instruction. */
307
+ const inInstruction = () => state.fields.some((frame) => frame.phase === 'instr');
308
+ const fieldChar = (element) => {
309
+ const type = wordAttribute(element, 'fldCharType');
310
+ const top = state.fields[state.fields.length - 1];
311
+ if (type === 'begin') {
312
+ state.fields.push({ instr: [], phase: 'instr', anchor: false });
313
+ }
314
+ else if (type === 'separate' && top && top.phase === 'instr') {
315
+ top.phase = 'result';
316
+ const href = safeHref(hyperlinkTarget(top.instr.join('')));
317
+ if (href !== null && !inInstruction()) {
318
+ state.writer.raw(`<a href="${escapeAttr(href)}">`);
319
+ state.linkDepth += 1;
320
+ top.anchor = true;
321
+ }
322
+ }
323
+ else if (type === 'end' && top) {
324
+ if (top.anchor) {
325
+ state.linkDepth -= 1;
326
+ state.writer.raw('</a>');
327
+ }
328
+ state.fields.pop();
329
+ }
330
+ };
331
+ const convertRun = async (run) => {
332
+ const resolved = ctx.styles.run(childNamed(run, 'rPr'), props);
333
+ const tags = renderRunTags(resolved, baseline);
334
+ for (const child of Array.from(run.children)) {
335
+ const top = state.fields[state.fields.length - 1];
336
+ switch (child.localName) {
337
+ case 't':
338
+ if (!inInstruction())
339
+ state.writer.text(tags, escapeHtml(child.textContent ?? ''));
340
+ break;
341
+ case 'instrText':
342
+ if (top && top.phase === 'instr')
343
+ top.instr.push(child.textContent ?? '');
344
+ reportLost(child, ctx);
345
+ break;
346
+ case 'fldChar':
347
+ fieldChar(child);
348
+ break;
349
+ case 'tab':
350
+ case 'ptab':
351
+ if (!inInstruction())
352
+ state.writer.text(tags, TAB);
353
+ break;
354
+ case 'br':
355
+ if (inInstruction())
356
+ break;
357
+ if (wordAttribute(child, 'type') === 'page' && state.linkDepth === 0 && !top) {
358
+ state.writer.raw(PAGE_BREAK);
359
+ }
360
+ else {
361
+ state.writer.raw('<br>');
362
+ }
363
+ break;
364
+ case 'cr':
365
+ if (!inInstruction())
366
+ state.writer.raw('<br>');
367
+ break;
368
+ case 'sym': {
369
+ if (inInstruction())
370
+ break;
371
+ // Police du symbole validée comme celle d'un `w:rFonts` ; irrecevable → celle du run.
372
+ const font = fontName(wordAttribute(child, 'font'));
373
+ const symbolTags = font && font !== resolved.fontFamily
374
+ ? renderRunTags({ ...resolved, fontFamily: font }, baseline)
375
+ : tags;
376
+ state.writer.text(symbolTags, escapeHtml(symbolChar(child)));
377
+ break;
378
+ }
379
+ case 'noBreakHyphen':
380
+ if (!inInstruction())
381
+ state.writer.text(tags, NO_BREAK_HYPHEN);
382
+ break;
383
+ case 'softHyphen':
384
+ if (!inInstruction())
385
+ state.writer.text(tags, SOFT_HYPHEN);
386
+ break;
387
+ case 'drawing':
388
+ case 'pict':
389
+ if (!inInstruction())
390
+ state.writer.raw(await ctx.images.drawing(child, ctx));
391
+ break;
392
+ case 'AlternateContent': {
393
+ // Word 2010+ enveloppe zones de texte et formes `wps` : `<mc:Choice>` porte le
394
+ // dessin moderne, `<mc:Fallback>` son équivalent VML. Seul le premier enfant du
395
+ // `Choice` est traité, le `Fallback` jamais (sinon l'objet serait produit deux fois).
396
+ if (inInstruction())
397
+ break;
398
+ const choice = childNamed(child, 'Choice');
399
+ const content = choice?.firstElementChild ?? null;
400
+ if (!content) {
401
+ reportLost(child, ctx);
402
+ }
403
+ else if (content.localName === 'drawing' || content.localName === 'pict') {
404
+ state.writer.raw(await ctx.images.drawing(content, ctx));
405
+ }
406
+ else {
407
+ reportLost(content, ctx);
408
+ }
409
+ break;
410
+ }
411
+ case 'footnoteReference':
412
+ case 'endnoteReference': {
413
+ const id = wordAttribute(child, 'id');
414
+ if (id && !inInstruction()) {
415
+ const kind = child.localName === 'footnoteReference' ? 'footnote' : 'endnote';
416
+ state.writer.raw(ctx.notes.reference(id, kind, ctx));
417
+ }
418
+ break;
419
+ }
420
+ default:
421
+ // `w:rPr`, `w:delText`, `w:lastRenderedPageBreak` : ignorés. Objets incorporés,
422
+ // références de commentaire et maths dans un run : signalés, jamais rendus.
423
+ if (LOST_RUN_CHILDREN.has(child.localName))
424
+ reportLost(child, ctx);
425
+ break;
426
+ }
427
+ }
428
+ };
429
+ await walkChildren(paragraph);
430
+ // Champs jamais fermés (`w:fldChar end` absent ou dans un paragraphe suivant) : leurs
431
+ // `<a>` sont fermés ici, sinon le parseur HTML les reconstruirait dans chaque paragraphe
432
+ // suivant. Aucun `<a>` ouvert ne survit à `convertRuns`.
433
+ while (state.fields.length > 0) {
434
+ const frame = state.fields.pop();
435
+ if (frame?.anchor) {
436
+ state.linkDepth -= 1;
437
+ state.writer.raw('</a>');
438
+ }
439
+ }
440
+ return state.writer.result();
441
+ }
442
+ //# sourceMappingURL=runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/docx/reader/runs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { DocumentLayout, PageOrientation, PageSizeName } from '@aster-editor/core';
2
+ import type { DocxImportWarning } from '../types';
3
+ import type { DocxPackage, StyleResolver } from './types';
4
+ /**
5
+ * Mise en page d'une section (`w:sectPr`) vers le `DocumentLayout` du contrat : format
6
+ * de page nommé quand les dimensions correspondent à ±1 mm, sinon dimensions libres ;
7
+ * orientation ; marges en millimètres ; colonnes ; police par défaut ; langue. Les
8
+ * valeurs hors des bornes de Word (page de 12,7 à 558,8 mm, marges dans la page, 45
9
+ * colonnes au plus) sont ignorées avec un avertissement `reader`.
10
+ */
11
+ /** Bornes de Word : côté de page en millimètres (0,5 à 22 pouces) et nombre de colonnes. */
12
+ export declare const MIN_PAGE_MM = 12.7;
13
+ export declare const MAX_PAGE_MM = 558.8;
14
+ export declare const MAX_COLUMNS = 45;
15
+ interface NamedSize {
16
+ readonly size: PageSizeName;
17
+ readonly orientation: PageOrientation;
18
+ }
19
+ /** Format nommé correspondant aux dimensions, dans l'une ou l'autre orientation. */
20
+ export declare function namedPageSize(widthMm: number, heightMm: number): NamedSize | null;
21
+ /**
22
+ * Lit la mise en page de la section : `page` (format, orientation, marges), `columns`
23
+ * (`w:cols w:num` de 2 à 45), `defaultFont` (résolveur de styles) et `lang` quand l'appelant
24
+ * la fournit (voir `readDocumentLang`). `sectPr` absent → seule la police par défaut. Les
25
+ * valeurs hors bornes sont ignorées et signalées dans `warnings` quand il est fourni.
26
+ */
27
+ export declare function readSectionLayout(sectPr: Element | null, styles: StyleResolver, lang?: string, warnings?: DocxImportWarning[]): DocumentLayout;
28
+ /**
29
+ * Langue du document : `w:lang w:val` des `docDefaults` de `styles.xml` (BCP 47, ex.
30
+ * `fr-FR`). Lecture directe de la partie, sans passer par le résolveur de styles, dont
31
+ * l'interface ne l'expose pas. À brancher dans `index.ts` en troisième argument de
32
+ * `readSectionLayout`.
33
+ */
34
+ export declare function readDocumentLang(pkg: DocxPackage): Promise<string | undefined>;
35
+ export {};
36
+ //# sourceMappingURL=sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../src/docx/reader/sections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,eAAe,EAEf,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;;;GAMG;AAEH,4FAA4F;AAC5F,eAAO,MAAM,WAAW,OAAO,CAAC;AAChC,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,WAAW,KAAK,CAAC;AAa9B,UAAU,SAAS;IACjB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;CACvC;AAMD,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUjF;AAqED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,GAAG,IAAI,EACtB,MAAM,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAC7B,cAAc,CAmBhB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAUpF"}
@@ -0,0 +1,158 @@
1
+ import { childNamed, wordAttribute } from '../preprocess/xml-utils';
2
+ import { numericAttribute, twipsToMm } from './units-blocks';
3
+ /**
4
+ * Mise en page d'une section (`w:sectPr`) vers le `DocumentLayout` du contrat : format
5
+ * de page nommé quand les dimensions correspondent à ±1 mm, sinon dimensions libres ;
6
+ * orientation ; marges en millimètres ; colonnes ; police par défaut ; langue. Les
7
+ * valeurs hors des bornes de Word (page de 12,7 à 558,8 mm, marges dans la page, 45
8
+ * colonnes au plus) sont ignorées avec un avertissement `reader`.
9
+ */
10
+ /** Bornes de Word : côté de page en millimètres (0,5 à 22 pouces) et nombre de colonnes. */
11
+ export const MIN_PAGE_MM = 12.7;
12
+ export const MAX_PAGE_MM = 558.8;
13
+ export const MAX_COLUMNS = 45;
14
+ /** Formats nommés, largeur × hauteur en portrait (mm). */
15
+ const PAGE_SIZES = [
16
+ ['A4', 210, 297],
17
+ ['A3', 297, 420],
18
+ ['A5', 148, 210],
19
+ ['Letter', 215.9, 279.4],
20
+ ['Legal', 215.9, 355.6],
21
+ ];
22
+ const SIZE_TOLERANCE_MM = 1;
23
+ function near(a, b) {
24
+ return Math.abs(a - b) <= SIZE_TOLERANCE_MM;
25
+ }
26
+ /** Format nommé correspondant aux dimensions, dans l'une ou l'autre orientation. */
27
+ export function namedPageSize(widthMm, heightMm) {
28
+ for (const [size, portraitWidth, portraitHeight] of PAGE_SIZES) {
29
+ if (near(widthMm, portraitWidth) && near(heightMm, portraitHeight)) {
30
+ return { size, orientation: 'portrait' };
31
+ }
32
+ if (near(widthMm, portraitHeight) && near(heightMm, portraitWidth)) {
33
+ return { size, orientation: 'landscape' };
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ function inPageBounds(mm) {
39
+ return mm >= MIN_PAGE_MM && mm <= MAX_PAGE_MM;
40
+ }
41
+ function readPage(sectPr, warn) {
42
+ const page = {};
43
+ const pgSz = childNamed(sectPr, 'pgSz');
44
+ const width = numericAttribute(pgSz, 'w');
45
+ const height = numericAttribute(pgSz, 'h');
46
+ // Dimensions connues de la page (bornes des marges) ; les bornes de Word par défaut.
47
+ let pageWidthMm = MAX_PAGE_MM;
48
+ let pageHeightMm = MAX_PAGE_MM;
49
+ if (pgSz && width && height && width > 0 && height > 0) {
50
+ const widthMm = twipsToMm(width);
51
+ const heightMm = twipsToMm(height);
52
+ if (!inPageBounds(widthMm) || !inPageBounds(heightMm)) {
53
+ warn(`Format de page ${String(widthMm)} × ${String(heightMm)} mm hors des bornes Word (${String(MIN_PAGE_MM)} à ${String(MAX_PAGE_MM)} mm), ignoré.`);
54
+ }
55
+ else {
56
+ pageWidthMm = widthMm;
57
+ pageHeightMm = heightMm;
58
+ const named = namedPageSize(widthMm, heightMm);
59
+ if (named) {
60
+ page.size = named.size;
61
+ page.orientation = named.orientation;
62
+ }
63
+ else {
64
+ page.size = { widthMm, heightMm };
65
+ const orient = wordAttribute(pgSz, 'orient');
66
+ if (orient === 'landscape' || orient === 'portrait')
67
+ page.orientation = orient;
68
+ }
69
+ }
70
+ }
71
+ const pgMar = childNamed(sectPr, 'pgMar');
72
+ if (pgMar) {
73
+ const margins = {};
74
+ const read = (name) => {
75
+ const value = numericAttribute(pgMar, name);
76
+ if (value === undefined)
77
+ return undefined;
78
+ // Une marge haute négative signifie « exacte » dans Word : seule la distance compte.
79
+ const mm = twipsToMm(Math.abs(value));
80
+ const limit = name === 'left' || name === 'right' ? pageWidthMm : pageHeightMm;
81
+ if (mm > limit) {
82
+ warn(`Marge ${name} de ${String(mm)} mm plus grande que la page, ignorée.`);
83
+ return undefined;
84
+ }
85
+ return mm;
86
+ };
87
+ const top = read('top');
88
+ const right = read('right');
89
+ const bottom = read('bottom');
90
+ const left = read('left');
91
+ const header = read('header');
92
+ const footer = read('footer');
93
+ if (top !== undefined)
94
+ margins.topMm = top;
95
+ if (right !== undefined)
96
+ margins.rightMm = right;
97
+ if (bottom !== undefined)
98
+ margins.bottomMm = bottom;
99
+ if (left !== undefined)
100
+ margins.leftMm = left;
101
+ if (header !== undefined)
102
+ margins.headerMm = header;
103
+ if (footer !== undefined)
104
+ margins.footerMm = footer;
105
+ if (Object.keys(margins).length > 0)
106
+ page.margins = margins;
107
+ }
108
+ return Object.keys(page).length > 0 ? page : undefined;
109
+ }
110
+ /**
111
+ * Lit la mise en page de la section : `page` (format, orientation, marges), `columns`
112
+ * (`w:cols w:num` de 2 à 45), `defaultFont` (résolveur de styles) et `lang` quand l'appelant
113
+ * la fournit (voir `readDocumentLang`). `sectPr` absent → seule la police par défaut. Les
114
+ * valeurs hors bornes sont ignorées et signalées dans `warnings` quand il est fourni.
115
+ */
116
+ export function readSectionLayout(sectPr, styles, lang, warnings) {
117
+ const layout = {};
118
+ const warn = (message) => {
119
+ warnings?.push({ code: 'reader', message });
120
+ };
121
+ if (sectPr) {
122
+ const page = readPage(sectPr, warn);
123
+ if (page)
124
+ layout.page = page;
125
+ const columns = numericAttribute(childNamed(sectPr, 'cols'), 'num');
126
+ if (columns !== undefined && columns > MAX_COLUMNS) {
127
+ warn(`${String(columns)} colonnes, plus que les ${String(MAX_COLUMNS)} de Word : ignoré.`);
128
+ }
129
+ else if (columns !== undefined && columns >= 2) {
130
+ layout.columns = Math.floor(columns);
131
+ }
132
+ }
133
+ const font = styles.defaultFont();
134
+ if (font.family || font.sizePt)
135
+ layout.defaultFont = font;
136
+ if (lang)
137
+ layout.lang = lang;
138
+ return layout;
139
+ }
140
+ /**
141
+ * Langue du document : `w:lang w:val` des `docDefaults` de `styles.xml` (BCP 47, ex.
142
+ * `fr-FR`). Lecture directe de la partie, sans passer par le résolveur de styles, dont
143
+ * l'interface ne l'expose pas. À brancher dans `index.ts` en troisième argument de
144
+ * `readSectionLayout`.
145
+ */
146
+ export async function readDocumentLang(pkg) {
147
+ const path = await pkg.related(pkg.mainPart, '/styles');
148
+ const doc = path ? await pkg.part(path) : null;
149
+ if (!doc)
150
+ return undefined;
151
+ const docDefaults = childNamed(doc.documentElement, 'docDefaults');
152
+ const rPrDefault = docDefaults ? childNamed(docDefaults, 'rPrDefault') : null;
153
+ const rPr = rPrDefault ? childNamed(rPrDefault, 'rPr') : null;
154
+ const lang = rPr ? childNamed(rPr, 'lang') : null;
155
+ const value = lang ? wordAttribute(lang, 'val') : '';
156
+ return value || undefined;
157
+ }
158
+ //# sourceMappingURL=sections.js.map