@aster-editor/word 0.4.2 → 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.
- package/README.md +204 -81
- package/dist/docx/compare/align.d.ts +24 -0
- package/dist/docx/compare/align.d.ts.map +1 -0
- package/dist/docx/compare/align.js +217 -0
- package/dist/docx/compare/align.js.map +1 -0
- package/dist/docx/compare/compare-blocks.d.ts +29 -0
- package/dist/docx/compare/compare-blocks.d.ts.map +1 -0
- package/dist/docx/compare/compare-blocks.js +234 -0
- package/dist/docx/compare/compare-blocks.js.map +1 -0
- package/dist/docx/compare/compare-context.d.ts +25 -0
- package/dist/docx/compare/compare-context.d.ts.map +1 -0
- package/dist/docx/compare/compare-context.js +31 -0
- package/dist/docx/compare/compare-context.js.map +1 -0
- package/dist/docx/compare/compare-docx.d.ts +4 -0
- package/dist/docx/compare/compare-docx.d.ts.map +1 -0
- package/dist/docx/compare/compare-docx.js +173 -0
- package/dist/docx/compare/compare-docx.js.map +1 -0
- package/dist/docx/compare/compare-tables.d.ts +13 -0
- package/dist/docx/compare/compare-tables.d.ts.map +1 -0
- package/dist/docx/compare/compare-tables.js +47 -0
- package/dist/docx/compare/compare-tables.js.map +1 -0
- package/dist/docx/compare/model-borders.d.ts +27 -0
- package/dist/docx/compare/model-borders.d.ts.map +1 -0
- package/dist/docx/compare/model-borders.js +41 -0
- package/dist/docx/compare/model-borders.js.map +1 -0
- package/dist/docx/compare/model-paragraph.d.ts +25 -0
- package/dist/docx/compare/model-paragraph.d.ts.map +1 -0
- package/dist/docx/compare/model-paragraph.js +309 -0
- package/dist/docx/compare/model-paragraph.js.map +1 -0
- package/dist/docx/compare/model-sections.d.ts +11 -0
- package/dist/docx/compare/model-sections.d.ts.map +1 -0
- package/dist/docx/compare/model-sections.js +97 -0
- package/dist/docx/compare/model-sections.js.map +1 -0
- package/dist/docx/compare/model.d.ts +113 -0
- package/dist/docx/compare/model.d.ts.map +1 -0
- package/dist/docx/compare/model.js +214 -0
- package/dist/docx/compare/model.js.map +1 -0
- package/dist/docx/compare/parts.d.ts +40 -0
- package/dist/docx/compare/parts.d.ts.map +1 -0
- package/dist/docx/compare/parts.js +113 -0
- package/dist/docx/compare/parts.js.map +1 -0
- package/dist/docx/compare/tally.d.ts +23 -0
- package/dist/docx/compare/tally.d.ts.map +1 -0
- package/dist/docx/compare/tally.js +94 -0
- package/dist/docx/compare/tally.js.map +1 -0
- package/dist/docx/compare/types.d.ts +55 -0
- package/dist/docx/compare/types.d.ts.map +1 -0
- package/dist/docx/compare/types.js +2 -0
- package/dist/docx/compare/types.js.map +1 -0
- package/dist/docx/compare/values.d.ts +13 -0
- package/dist/docx/compare/values.d.ts.map +1 -0
- package/dist/docx/compare/values.js +44 -0
- package/dist/docx/compare/values.js.map +1 -0
- package/dist/docx/import-docx.d.ts.map +1 -1
- package/dist/docx/import-docx.js +65 -6
- package/dist/docx/import-docx.js.map +1 -1
- package/dist/docx/postprocess/strip-empty-paragraphs.d.ts +3 -0
- package/dist/docx/postprocess/strip-empty-paragraphs.d.ts.map +1 -1
- package/dist/docx/postprocess/strip-empty-paragraphs.js +7 -1
- package/dist/docx/postprocess/strip-empty-paragraphs.js.map +1 -1
- package/dist/docx/postprocess/types.d.ts +1 -1
- package/dist/docx/postprocess/types.d.ts.map +1 -1
- package/dist/docx/preprocess/variables.d.ts.map +1 -1
- package/dist/docx/preprocess/variables.js +2 -2
- package/dist/docx/preprocess/variables.js.map +1 -1
- package/dist/docx/preprocess/xml-utils.d.ts +7 -0
- package/dist/docx/preprocess/xml-utils.d.ts.map +1 -1
- package/dist/docx/preprocess/xml-utils.js +9 -0
- package/dist/docx/preprocess/xml-utils.js.map +1 -1
- package/dist/docx/reader/headers.d.ts +17 -0
- package/dist/docx/reader/headers.d.ts.map +1 -0
- package/dist/docx/reader/headers.js +64 -0
- package/dist/docx/reader/headers.js.map +1 -0
- package/dist/docx/reader/html.d.ts +12 -0
- package/dist/docx/reader/html.d.ts.map +1 -0
- package/dist/docx/reader/html.js +27 -0
- package/dist/docx/reader/html.js.map +1 -0
- package/dist/docx/reader/images.d.ts +27 -0
- package/dist/docx/reader/images.d.ts.map +1 -0
- package/dist/docx/reader/images.js +288 -0
- package/dist/docx/reader/images.js.map +1 -0
- package/dist/docx/reader/index.d.ts +10 -0
- package/dist/docx/reader/index.d.ts.map +1 -0
- package/dist/docx/reader/index.js +177 -0
- package/dist/docx/reader/index.js.map +1 -0
- package/dist/docx/reader/lists.d.ts +44 -0
- package/dist/docx/reader/lists.d.ts.map +1 -0
- package/dist/docx/reader/lists.js +360 -0
- package/dist/docx/reader/lists.js.map +1 -0
- package/dist/docx/reader/lost.d.ts +30 -0
- package/dist/docx/reader/lost.d.ts.map +1 -0
- package/dist/docx/reader/lost.js +215 -0
- package/dist/docx/reader/lost.js.map +1 -0
- package/dist/docx/reader/notes.d.ts +4 -0
- package/dist/docx/reader/notes.d.ts.map +1 -0
- package/dist/docx/reader/notes.js +112 -0
- package/dist/docx/reader/notes.js.map +1 -0
- package/dist/docx/reader/package.d.ts +16 -0
- package/dist/docx/reader/package.d.ts.map +1 -0
- package/dist/docx/reader/package.js +138 -0
- package/dist/docx/reader/package.js.map +1 -0
- package/dist/docx/reader/paragraphs.d.ts +15 -0
- package/dist/docx/reader/paragraphs.d.ts.map +1 -0
- package/dist/docx/reader/paragraphs.js +162 -0
- package/dist/docx/reader/paragraphs.js.map +1 -0
- package/dist/docx/reader/properties.d.ts +90 -0
- package/dist/docx/reader/properties.d.ts.map +1 -0
- package/dist/docx/reader/properties.js +402 -0
- package/dist/docx/reader/properties.js.map +1 -0
- package/dist/docx/reader/runs.d.ts +49 -0
- package/dist/docx/reader/runs.d.ts.map +1 -0
- package/dist/docx/reader/runs.js +442 -0
- package/dist/docx/reader/runs.js.map +1 -0
- package/dist/docx/reader/sections.d.ts +36 -0
- package/dist/docx/reader/sections.d.ts.map +1 -0
- package/dist/docx/reader/sections.js +158 -0
- package/dist/docx/reader/sections.js.map +1 -0
- package/dist/docx/reader/styles.d.ts +24 -0
- package/dist/docx/reader/styles.d.ts.map +1 -0
- package/dist/docx/reader/styles.js +383 -0
- package/dist/docx/reader/styles.js.map +1 -0
- package/dist/docx/reader/tables.d.ts +6 -0
- package/dist/docx/reader/tables.d.ts.map +1 -0
- package/dist/docx/reader/tables.js +175 -0
- package/dist/docx/reader/tables.js.map +1 -0
- package/dist/docx/reader/test-support.d.ts +25 -0
- package/dist/docx/reader/test-support.d.ts.map +1 -0
- package/dist/docx/reader/test-support.js +135 -0
- package/dist/docx/reader/test-support.js.map +1 -0
- package/dist/docx/reader/testing-blocks.d.ts +50 -0
- package/dist/docx/reader/testing-blocks.d.ts.map +1 -0
- package/dist/docx/reader/testing-blocks.js +302 -0
- package/dist/docx/reader/testing-blocks.js.map +1 -0
- package/dist/docx/reader/types.d.ts +181 -0
- package/dist/docx/reader/types.d.ts.map +1 -0
- package/dist/docx/reader/types.js +2 -0
- package/dist/docx/reader/types.js.map +1 -0
- package/dist/docx/reader/units-blocks.d.ts +75 -0
- package/dist/docx/reader/units-blocks.d.ts.map +1 -0
- package/dist/docx/reader/units-blocks.js +254 -0
- package/dist/docx/reader/units-blocks.js.map +1 -0
- package/dist/docx/reader/units.d.ts +72 -0
- package/dist/docx/reader/units.d.ts.map +1 -0
- package/dist/docx/reader/units.js +177 -0
- package/dist/docx/reader/units.js.map +1 -0
- package/dist/docx/types.d.ts +47 -2
- package/dist/docx/types.d.ts.map +1 -1
- package/dist/docx/writer/content-types.d.ts +30 -0
- package/dist/docx/writer/content-types.d.ts.map +1 -0
- package/dist/docx/writer/content-types.js +81 -0
- package/dist/docx/writer/content-types.js.map +1 -0
- package/dist/docx/writer/core-properties.d.ts +16 -0
- package/dist/docx/writer/core-properties.d.ts.map +1 -0
- package/dist/docx/writer/core-properties.js +64 -0
- package/dist/docx/writer/core-properties.js.map +1 -0
- package/dist/docx/writer/footnotes-merge.d.ts +30 -0
- package/dist/docx/writer/footnotes-merge.d.ts.map +1 -0
- package/dist/docx/writer/footnotes-merge.js +71 -0
- package/dist/docx/writer/footnotes-merge.js.map +1 -0
- package/dist/docx/writer/graft.d.ts +41 -0
- package/dist/docx/writer/graft.d.ts.map +1 -0
- package/dist/docx/writer/graft.js +277 -0
- package/dist/docx/writer/graft.js.map +1 -0
- package/dist/docx/writer/header-footer-graft.d.ts +34 -0
- package/dist/docx/writer/header-footer-graft.d.ts.map +1 -0
- package/dist/docx/writer/header-footer-graft.js +155 -0
- package/dist/docx/writer/header-footer-graft.js.map +1 -0
- package/dist/docx/writer/header-footer-variables.d.ts +25 -0
- package/dist/docx/writer/header-footer-variables.d.ts.map +1 -0
- package/dist/docx/writer/header-footer-variables.js +101 -0
- package/dist/docx/writer/header-footer-variables.js.map +1 -0
- package/dist/docx/writer/media.d.ts +32 -0
- package/dist/docx/writer/media.d.ts.map +1 -0
- package/dist/docx/writer/media.js +88 -0
- package/dist/docx/writer/media.js.map +1 -0
- package/dist/docx/writer/numbering-merge.d.ts +37 -0
- package/dist/docx/writer/numbering-merge.d.ts.map +1 -0
- package/dist/docx/writer/numbering-merge.js +140 -0
- package/dist/docx/writer/numbering-merge.js.map +1 -0
- package/dist/docx/writer/relationships.d.ts +63 -0
- package/dist/docx/writer/relationships.d.ts.map +1 -0
- package/dist/docx/writer/relationships.js +127 -0
- package/dist/docx/writer/relationships.js.map +1 -0
- package/dist/docx/writer/settings-merge.d.ts +21 -0
- package/dist/docx/writer/settings-merge.d.ts.map +1 -0
- package/dist/docx/writer/settings-merge.js +165 -0
- package/dist/docx/writer/settings-merge.js.map +1 -0
- package/dist/docx/writer/style-reconcile.d.ts +29 -0
- package/dist/docx/writer/style-reconcile.d.ts.map +1 -0
- package/dist/docx/writer/style-reconcile.js +319 -0
- package/dist/docx/writer/style-reconcile.js.map +1 -0
- package/dist/docx/writer/style-strip.d.ts +33 -0
- package/dist/docx/writer/style-strip.d.ts.map +1 -0
- package/dist/docx/writer/style-strip.js +267 -0
- package/dist/docx/writer/style-strip.js.map +1 -0
- package/dist/docx/writer/styles-merge.d.ts +57 -0
- package/dist/docx/writer/styles-merge.d.ts.map +1 -0
- package/dist/docx/writer/styles-merge.js +184 -0
- package/dist/docx/writer/styles-merge.js.map +1 -0
- package/dist/docx/writer/template.d.ts +48 -0
- package/dist/docx/writer/template.d.ts.map +1 -0
- package/dist/docx/writer/template.js +280 -0
- package/dist/docx/writer/template.js.map +1 -0
- package/dist/docx/writer/testing.d.ts +52 -0
- package/dist/docx/writer/testing.d.ts.map +1 -0
- package/dist/docx/writer/testing.js +318 -0
- package/dist/docx/writer/testing.js.map +1 -0
- package/dist/docx/writer/xml-io.d.ts +90 -0
- package/dist/docx/writer/xml-io.d.ts.map +1 -0
- package/dist/docx/writer/xml-io.js +215 -0
- package/dist/docx/writer/xml-io.js.map +1 -0
- package/dist/export/blocks.d.ts.map +1 -1
- package/dist/export/blocks.js +149 -12
- package/dist/export/blocks.js.map +1 -1
- package/dist/export/context.d.ts +34 -2
- package/dist/export/context.d.ts.map +1 -1
- package/dist/export/context.js +28 -2
- package/dist/export/context.js.map +1 -1
- package/dist/export/css.d.ts +58 -0
- package/dist/export/css.d.ts.map +1 -1
- package/dist/export/css.js +194 -0
- package/dist/export/css.js.map +1 -1
- package/dist/export/dom.d.ts +2 -0
- package/dist/export/dom.d.ts.map +1 -1
- package/dist/export/dom.js +2 -0
- package/dist/export/dom.js.map +1 -1
- package/dist/export/export-docx.d.ts +4 -0
- package/dist/export/export-docx.d.ts.map +1 -1
- package/dist/export/export-docx.js +57 -4
- package/dist/export/export-docx.js.map +1 -1
- package/dist/export/header-footer.d.ts +15 -1
- package/dist/export/header-footer.d.ts.map +1 -1
- package/dist/export/header-footer.js +37 -0
- package/dist/export/header-footer.js.map +1 -1
- package/dist/export/html-to-docx.d.ts +20 -2
- package/dist/export/html-to-docx.d.ts.map +1 -1
- package/dist/export/html-to-docx.js +40 -14
- package/dist/export/html-to-docx.js.map +1 -1
- package/dist/export/inline.d.ts +25 -3
- package/dist/export/inline.d.ts.map +1 -1
- package/dist/export/inline.js +91 -34
- package/dist/export/inline.js.map +1 -1
- package/dist/export/styles.d.ts +51 -7
- package/dist/export/styles.d.ts.map +1 -1
- package/dist/export/styles.js +121 -16
- package/dist/export/styles.js.map +1 -1
- package/dist/export/tables.d.ts.map +1 -1
- package/dist/export/tables.js +140 -12
- package/dist/export/tables.js.map +1 -1
- package/dist/export/types.d.ts +44 -5
- package/dist/export/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- 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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"}
|
package/dist/docx/types.d.ts
CHANGED
|
@@ -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`. */
|
|
@@ -62,6 +62,37 @@ export interface DocxImportOptions {
|
|
|
62
62
|
parse?: HtmlParser;
|
|
63
63
|
/** Détection des variables (`{{nom}}`, champs de fusion, contrôles de contenu). Tout actif par défaut. */
|
|
64
64
|
variables?: DocxVariableOptions;
|
|
65
|
+
/**
|
|
66
|
+
* Sort des paragraphes vides du document (lignes laissées par Entrée). `keep` par défaut :
|
|
67
|
+
* ils deviennent des `<p></p>`, ce qui rend l'aller-retour export → import fidèle aux
|
|
68
|
+
* sauts de ligne de l'auteur. `drop` retrouve l'ancien comportement (mammoth les ignore),
|
|
69
|
+
* utile pour nettoyer un document Word qui espace ses blocs avec des lignes vides.
|
|
70
|
+
*/
|
|
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;
|
|
65
96
|
}
|
|
66
97
|
/**
|
|
67
98
|
* Résultat de `importDocx` : le HTML à donner à l'éditeur et la liste, souvent vide, de
|
|
@@ -78,5 +109,19 @@ export interface DocxImportResult {
|
|
|
78
109
|
* en-têtes et pieds de page, que mammoth ne rend pas. Vide si aucune.
|
|
79
110
|
*/
|
|
80
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[];
|
|
81
126
|
}
|
|
82
127
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/docx/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG9D;;;;;;GAMG;AAEH,MAAM,KAAK,GAAG,yEAAyE,CAAC;AACxF,MAAM,KAAK,GAAG,kCAAkC,CAAC;AACjD,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAC/C,MAAM,WAAW,GAAG,8BAA8B,CAAC;AACnD,MAAM,MAAM,GAAG,2CAA2C,CAAC;AAE3D,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC,MAAM,WAAW,GAAG,yDAAyD,CAAC;AAE9E,MAAM,UAAU,GACd,gCAAgC,KAAK,eAAe,KAAK,oBAAoB,UAAU,GAAG;IAC1F,oBAAoB,WAAW,gBAAgB,MAAM,KAAK,CAAC;AAW7D,qFAAqF;AACrF,SAAS,aAAa,CAAC,GAAa,EAAE,IAAY,EAAE,KAAa;IAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CACpE,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAA0B;IAClE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC3D,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,GAAG,SAAS,CAAC;QACjB,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACrE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAC7D,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -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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"}
|