@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.
- package/README.md +204 -82
- 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 +57 -2
- package/dist/docx/import-docx.js.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 +40 -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,309 @@
|
|
|
1
|
+
import { allNamed, childNamed, wordAttribute } from '../preprocess/xml-utils';
|
|
2
|
+
import { toVariableName } from '../preprocess/names';
|
|
3
|
+
import { emuToPx } from '../reader/units';
|
|
4
|
+
/** `{{nom}}`, blancs intérieurs tolérés, pour lister les champs du texte canonique. */
|
|
5
|
+
const PLACEHOLDER = /\{\{\s*([^{}]*?)\s*\}\}/g;
|
|
6
|
+
/**
|
|
7
|
+
* Instruction `MERGEFIELD nom` ou `MERGEFIELD "nom composé"`, options (`\* MERGEFORMAT`)
|
|
8
|
+
* ignorées : même lecture que `preprocess/fields.ts` (`parseMergeField`, non exporté).
|
|
9
|
+
*/
|
|
10
|
+
const MERGEFIELD_INSTR = /^\s*MERGEFIELD\s+(?:"([^"]*)"|(\S+))/iu;
|
|
11
|
+
/** Nom brut et normalisé d'une instruction `MERGEFIELD`, `null` pour toute autre instruction. */
|
|
12
|
+
function parseMergeField(instruction) {
|
|
13
|
+
const match = MERGEFIELD_INSTR.exec(instruction);
|
|
14
|
+
if (!match)
|
|
15
|
+
return null;
|
|
16
|
+
const raw = (match[1] ?? match[2] ?? '').trim();
|
|
17
|
+
const name = toVariableName(raw);
|
|
18
|
+
return name === null ? null : { raw, name };
|
|
19
|
+
}
|
|
20
|
+
function newSegment() {
|
|
21
|
+
return {
|
|
22
|
+
text: '',
|
|
23
|
+
placeholderText: '',
|
|
24
|
+
pageBreakAfter: false,
|
|
25
|
+
runs: [],
|
|
26
|
+
images: [],
|
|
27
|
+
notes: [],
|
|
28
|
+
mergeFields: new Map(),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function readImage(element) {
|
|
32
|
+
if (element.localName === 'pict') {
|
|
33
|
+
return allNamed(element, 'imagedata').length > 0 ? { kind: 'pict' } : null;
|
|
34
|
+
}
|
|
35
|
+
if (allNamed(element, 'blip').length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const container = childNamed(element, 'anchor') ?? childNamed(element, 'inline') ?? element;
|
|
38
|
+
const extent = childNamed(container, 'extent');
|
|
39
|
+
const cx = Number(extent?.getAttribute('cx') ?? '');
|
|
40
|
+
const cy = Number(extent?.getAttribute('cy') ?? '');
|
|
41
|
+
return {
|
|
42
|
+
kind: 'drawing',
|
|
43
|
+
...(cx > 0 ? { widthPx: emuToPx(cx) } : {}),
|
|
44
|
+
...(cy > 0 ? { heightPx: emuToPx(cy) } : {}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Clé de fusion de deux runs voisins : mêmes propriétés résolues. */
|
|
48
|
+
function runKey(props) {
|
|
49
|
+
return JSON.stringify(props, Object.keys(props).sort());
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Champs de fusion d'un texte canonique, dans l'ordre (`{{a}} … {{b}}` → `[a, b]`). Un
|
|
53
|
+
* `{{nom}}` qui commence à une position enregistrée dans `mergeFields` est un vrai champ
|
|
54
|
+
* (nom brut de l'instruction) ; tout autre est un `{{}}` en clair, dont le nom brut est
|
|
55
|
+
* l'intérieur des accolades et le nom normalisé celui des variables de l'import
|
|
56
|
+
* (`Numero Facture` → `numero_facture`), pour qu'il vaille le `MERGEFIELD` dont Aster l'a écrit.
|
|
57
|
+
*/
|
|
58
|
+
export function placeholderFields(placeholderText, mergeFields = new Map()) {
|
|
59
|
+
const fields = [];
|
|
60
|
+
for (const match of placeholderText.matchAll(PLACEHOLDER)) {
|
|
61
|
+
const field = mergeFields.get(match.index);
|
|
62
|
+
if (field) {
|
|
63
|
+
fields.push({ raw: field.raw, name: field.name, literal: false });
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const raw = match[1] ?? '';
|
|
67
|
+
if (raw === '')
|
|
68
|
+
continue;
|
|
69
|
+
fields.push({ raw, name: toVariableName(raw) ?? raw, literal: true });
|
|
70
|
+
}
|
|
71
|
+
return fields;
|
|
72
|
+
}
|
|
73
|
+
/** Vrai pour un segment sans contenu visible (texte, image, note). */
|
|
74
|
+
function isEmpty(segment) {
|
|
75
|
+
return segment.text === '' && segment.images.length === 0 && segment.notes.length === 0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Lit un `w:p` : un paragraphe par segment séparé par un saut de page explicite. Le dernier
|
|
79
|
+
* segment, vide, est omis (« a<br page> » : Word ne rend rien après le saut) ; un paragraphe
|
|
80
|
+
* réduit à un saut donne un segment vide marqué `pageBreakAfter`, que `readBlocks` replie
|
|
81
|
+
* sur le paragraphe précédent.
|
|
82
|
+
*/
|
|
83
|
+
export function readParagraphs(p, ctx) {
|
|
84
|
+
const pPr = childNamed(p, 'pPr');
|
|
85
|
+
const props = ctx.styles.paragraph(pPr);
|
|
86
|
+
const segments = [];
|
|
87
|
+
let current = newSegment();
|
|
88
|
+
const openFields = [];
|
|
89
|
+
let capture;
|
|
90
|
+
/** Vrai quand le prochain texte ne doit pas fusionner avec le run précédent (borne de champ). */
|
|
91
|
+
let breakRun = false;
|
|
92
|
+
const inInstruction = () => openFields.some((field) => !field.inResult);
|
|
93
|
+
const pushText = (runProps, text) => {
|
|
94
|
+
if (text === '' || inInstruction())
|
|
95
|
+
return;
|
|
96
|
+
current.text += text;
|
|
97
|
+
if (!capture)
|
|
98
|
+
current.placeholderText += text;
|
|
99
|
+
const key = runKey(runProps);
|
|
100
|
+
const last = current.runs[current.runs.length - 1];
|
|
101
|
+
if (last && last.key === key && !breakRun)
|
|
102
|
+
last.text += text;
|
|
103
|
+
else
|
|
104
|
+
current.runs.push({ text, props: runProps, key });
|
|
105
|
+
breakRun = false;
|
|
106
|
+
};
|
|
107
|
+
const startCapture = (field, runProps) => {
|
|
108
|
+
capture = {
|
|
109
|
+
field,
|
|
110
|
+
runStart: current.runs.length,
|
|
111
|
+
textStart: current.text.length,
|
|
112
|
+
props: runProps,
|
|
113
|
+
};
|
|
114
|
+
breakRun = true;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Clôt la capture : les runs du résultat deviennent un run `{{nom}}` aux propriétés du
|
|
118
|
+
* premier, fusionné avec ses voisins comme n'importe quel texte, pour que le `{{nom}}`
|
|
119
|
+
* écrit en clair par Aster donne les mêmes runs.
|
|
120
|
+
*/
|
|
121
|
+
const endCapture = () => {
|
|
122
|
+
if (!capture)
|
|
123
|
+
return;
|
|
124
|
+
const first = current.runs[capture.runStart];
|
|
125
|
+
const runProps = first?.props ?? capture.props;
|
|
126
|
+
current.runs.splice(capture.runStart);
|
|
127
|
+
const placeholder = `{{${capture.field.name}}}`;
|
|
128
|
+
const key = runKey(runProps);
|
|
129
|
+
const last = current.runs[current.runs.length - 1];
|
|
130
|
+
if (last && last.key === key)
|
|
131
|
+
last.text += placeholder;
|
|
132
|
+
else
|
|
133
|
+
current.runs.push({ text: placeholder, props: runProps, key });
|
|
134
|
+
current.mergeFields.set(current.placeholderText.length, capture.field);
|
|
135
|
+
current.placeholderText += placeholder;
|
|
136
|
+
capture = undefined;
|
|
137
|
+
breakRun = false;
|
|
138
|
+
};
|
|
139
|
+
const pageBreak = () => {
|
|
140
|
+
current.pageBreakAfter = true;
|
|
141
|
+
segments.push(current);
|
|
142
|
+
current = newSegment();
|
|
143
|
+
breakRun = false;
|
|
144
|
+
};
|
|
145
|
+
const readFieldChar = (child, runProps) => {
|
|
146
|
+
const type = wordAttribute(child, 'fldCharType');
|
|
147
|
+
const top = openFields[openFields.length - 1];
|
|
148
|
+
if (type === 'begin') {
|
|
149
|
+
openFields.push({ instruction: '', inResult: false, capturing: false });
|
|
150
|
+
}
|
|
151
|
+
else if (type === 'separate' && top) {
|
|
152
|
+
top.inResult = true;
|
|
153
|
+
const field = parseMergeField(top.instruction);
|
|
154
|
+
if (field !== null && !capture) {
|
|
155
|
+
top.capturing = true;
|
|
156
|
+
startCapture(field, runProps);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else if (type === 'end' && top) {
|
|
160
|
+
openFields.pop();
|
|
161
|
+
if (top.capturing) {
|
|
162
|
+
endCapture();
|
|
163
|
+
}
|
|
164
|
+
else if (!top.inResult) {
|
|
165
|
+
// Champ sans `separate` (jamais mis à jour) : Word n'affiche rien, le nom compte.
|
|
166
|
+
const field = parseMergeField(top.instruction);
|
|
167
|
+
if (field !== null && !capture) {
|
|
168
|
+
startCapture(field, runProps);
|
|
169
|
+
endCapture();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const readRun = (run) => {
|
|
175
|
+
const resolved = ctx.styles.run(childNamed(run, 'rPr'), props);
|
|
176
|
+
for (const child of Array.from(run.children)) {
|
|
177
|
+
switch (child.localName) {
|
|
178
|
+
case 't':
|
|
179
|
+
pushText(resolved, child.textContent ?? '');
|
|
180
|
+
break;
|
|
181
|
+
case 'instrText': {
|
|
182
|
+
const top = openFields[openFields.length - 1];
|
|
183
|
+
if (top && !top.inResult)
|
|
184
|
+
top.instruction += child.textContent ?? '';
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case 'tab':
|
|
188
|
+
case 'ptab':
|
|
189
|
+
pushText(resolved, '\t');
|
|
190
|
+
break;
|
|
191
|
+
case 'br':
|
|
192
|
+
if (wordAttribute(child, 'type') === 'page' && !capture && !inInstruction())
|
|
193
|
+
pageBreak();
|
|
194
|
+
else
|
|
195
|
+
pushText(resolved, '\n');
|
|
196
|
+
break;
|
|
197
|
+
case 'cr':
|
|
198
|
+
pushText(resolved, '\n');
|
|
199
|
+
break;
|
|
200
|
+
case 'noBreakHyphen':
|
|
201
|
+
pushText(resolved, String.fromCharCode(0x2011));
|
|
202
|
+
break;
|
|
203
|
+
case 'softHyphen':
|
|
204
|
+
pushText(resolved, String.fromCharCode(0xad));
|
|
205
|
+
break;
|
|
206
|
+
case 'sym': {
|
|
207
|
+
const code = Number.parseInt(wordAttribute(child, 'char'), 16);
|
|
208
|
+
if (Number.isFinite(code))
|
|
209
|
+
pushText(resolved, String.fromCodePoint(code));
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case 'fldChar':
|
|
213
|
+
readFieldChar(child, resolved);
|
|
214
|
+
break;
|
|
215
|
+
case 'drawing':
|
|
216
|
+
case 'pict': {
|
|
217
|
+
const image = inInstruction() ? null : readImage(child);
|
|
218
|
+
if (image)
|
|
219
|
+
current.images.push(image);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'footnoteReference':
|
|
223
|
+
case 'endnoteReference': {
|
|
224
|
+
const kind = child.localName === 'footnoteReference' ? 'footnote' : 'endnote';
|
|
225
|
+
const id = wordAttribute(child, 'id');
|
|
226
|
+
if (id && !inInstruction()) {
|
|
227
|
+
current.notes.push({ kind, text: ctx.notes.get(`${kind}:${id}`) ?? '' });
|
|
228
|
+
}
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
default:
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
const walk = (parent) => {
|
|
237
|
+
for (const child of Array.from(parent.children)) {
|
|
238
|
+
switch (child.localName) {
|
|
239
|
+
case 'r':
|
|
240
|
+
readRun(child);
|
|
241
|
+
break;
|
|
242
|
+
case 'del':
|
|
243
|
+
case 'moveFrom':
|
|
244
|
+
case 'pPr':
|
|
245
|
+
case 'bookmarkStart':
|
|
246
|
+
case 'bookmarkEnd':
|
|
247
|
+
case 'proofErr':
|
|
248
|
+
case 'commentRangeStart':
|
|
249
|
+
case 'commentRangeEnd':
|
|
250
|
+
break;
|
|
251
|
+
case 'sdt': {
|
|
252
|
+
const content = childNamed(child, 'sdtContent');
|
|
253
|
+
if (content)
|
|
254
|
+
walk(content);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case 'fldSimple': {
|
|
258
|
+
const field = parseMergeField(wordAttribute(child, 'instr'));
|
|
259
|
+
if (field !== null && !capture && !inInstruction()) {
|
|
260
|
+
startCapture(field, ctx.styles.run(null, props));
|
|
261
|
+
walk(child);
|
|
262
|
+
endCapture();
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
walk(child);
|
|
266
|
+
}
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
default:
|
|
270
|
+
// `w:hyperlink`, `w:ins`, `w:smartTag`… : conteneurs traversés.
|
|
271
|
+
walk(child);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
walk(p);
|
|
276
|
+
segments.push(current);
|
|
277
|
+
if (segments.length > 1 && !current.pageBreakAfter && isEmpty(current))
|
|
278
|
+
segments.pop();
|
|
279
|
+
const numbering = props.numbering;
|
|
280
|
+
const level = numbering
|
|
281
|
+
? ctx.numbering.definition(numbering.numId)?.levels.find((l) => l.level === numbering.level)
|
|
282
|
+
: undefined;
|
|
283
|
+
const revisionIds = Array.from(p.attributes)
|
|
284
|
+
.filter((attr) => attr.localName.startsWith('rsid'))
|
|
285
|
+
.map((attr) => `${attr.localName}=${attr.value}`)
|
|
286
|
+
.sort()
|
|
287
|
+
.join(' ');
|
|
288
|
+
return segments.map((segment) => ({
|
|
289
|
+
kind: 'paragraph',
|
|
290
|
+
text: segment.text,
|
|
291
|
+
placeholderText: segment.placeholderText,
|
|
292
|
+
fields: placeholderFields(segment.placeholderText, segment.mergeFields),
|
|
293
|
+
props,
|
|
294
|
+
...(level ? { listFormat: `${level.format}|${level.text}|${String(level.start)}` } : {}),
|
|
295
|
+
...(segment.pageBreakAfter ? { pageBreakAfter: true } : {}),
|
|
296
|
+
runs: segment.runs.map(({ text, props: runProps }) => ({ text, props: runProps })),
|
|
297
|
+
images: segment.images,
|
|
298
|
+
notes: segment.notes,
|
|
299
|
+
revisionIds,
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
/** Vrai pour un paragraphe sans contenu visible : seul un saut de page le justifie. */
|
|
303
|
+
export function isBlankParagraph(paragraph) {
|
|
304
|
+
return (paragraph.text === '' &&
|
|
305
|
+
paragraph.images.length === 0 &&
|
|
306
|
+
paragraph.notes.length === 0 &&
|
|
307
|
+
paragraph.fields.length === 0);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=model-paragraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-paragraph.js","sourceRoot":"","sources":["../../../src/docx/compare/model-paragraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BlockModel, ModelContext, SectionModel } from './model';
|
|
2
|
+
/**
|
|
3
|
+
* Sections du modèle comparable : chaque `w:sectPr` du corps (fins de section dans les
|
|
4
|
+
* `w:pPr`, puis le final) avec format de page, marges, colonnes, première page différente
|
|
5
|
+
* et les en-têtes et pieds qu'il référence, lus avec le même lecteur de blocs que le corps.
|
|
6
|
+
*/
|
|
7
|
+
/** Lecteur de blocs injecté par `model.ts`, pour ne pas créer de cycle d'imports. */
|
|
8
|
+
export type BlockReader = (container: Element, ctx: ModelContext) => BlockModel[];
|
|
9
|
+
/** Toutes les sections du corps, dans l'ordre du document. */
|
|
10
|
+
export declare function readSections(body: Element, ctx: ModelContext, readBlocks: BlockReader): Promise<SectionModel[]>;
|
|
11
|
+
//# sourceMappingURL=model-sections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-sections.d.ts","sourceRoot":"","sources":["../../../src/docx/compare/model-sections.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,UAAU,EAGV,YAAY,EACZ,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AAEH,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,KAAK,UAAU,EAAE,CAAC;AAuFlF,8DAA8D;AAC9D,wBAAsB,YAAY,CAChC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAMzB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { allNamed, childNamed, wordAttribute } from '../preprocess/xml-utils';
|
|
2
|
+
import { relationshipAttribute } from '../reader/images';
|
|
3
|
+
import { twipsToPt } from '../reader/units';
|
|
4
|
+
import { numericAttribute } from '../reader/units-blocks';
|
|
5
|
+
function attributesOf(element, names) {
|
|
6
|
+
const out = {};
|
|
7
|
+
if (!element)
|
|
8
|
+
return out;
|
|
9
|
+
for (const name of names) {
|
|
10
|
+
const value = numericAttribute(element, name);
|
|
11
|
+
if (value !== undefined)
|
|
12
|
+
out[name] = twipsToPt(value);
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
async function readSection(sectPr, ctx, readBlocks) {
|
|
17
|
+
const pgSz = childNamed(sectPr, 'pgSz');
|
|
18
|
+
// `w:orient` absent vaut portrait ; `w:cols` à une colonne vaut l'absence de colonnes.
|
|
19
|
+
const orient = (pgSz ? wordAttribute(pgSz, 'orient') : '') || 'portrait';
|
|
20
|
+
const colsElement = childNamed(sectPr, 'cols');
|
|
21
|
+
const cols = colsElement && (numericAttribute(colsElement, 'num') ?? 1) >= 2 ? colsElement : null;
|
|
22
|
+
const type = childNamed(sectPr, 'type');
|
|
23
|
+
const rels = await ctx.pkg.rels(ctx.part);
|
|
24
|
+
const headers = {};
|
|
25
|
+
const footers = {};
|
|
26
|
+
for (const reference of Array.from(sectPr.children)) {
|
|
27
|
+
const target = reference.localName === 'headerReference'
|
|
28
|
+
? headers
|
|
29
|
+
: reference.localName === 'footerReference'
|
|
30
|
+
? footers
|
|
31
|
+
: null;
|
|
32
|
+
if (!target)
|
|
33
|
+
continue;
|
|
34
|
+
const kind = wordAttribute(reference, 'type') || 'default';
|
|
35
|
+
if (kind !== 'default' && kind !== 'first' && kind !== 'even')
|
|
36
|
+
continue;
|
|
37
|
+
const rel = rels.get(relationshipAttribute(reference, 'id'));
|
|
38
|
+
if (!rel || rel.external)
|
|
39
|
+
continue;
|
|
40
|
+
const doc = await ctx.pkg.part(rel.target);
|
|
41
|
+
if (doc) {
|
|
42
|
+
target[kind] = { blocks: readBlocks(doc.documentElement, { ...ctx, part: rel.target }) };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
...(type ? { type: wordAttribute(type, 'val') } : {}),
|
|
47
|
+
...(pgSz ? { pageSize: { ...attributesOf(pgSz, ['w', 'h']), orient } } : {}),
|
|
48
|
+
...(childNamed(sectPr, 'pgMar')
|
|
49
|
+
? {
|
|
50
|
+
margins: attributesOf(childNamed(sectPr, 'pgMar'), [
|
|
51
|
+
'top',
|
|
52
|
+
'right',
|
|
53
|
+
'bottom',
|
|
54
|
+
'left',
|
|
55
|
+
'header',
|
|
56
|
+
'footer',
|
|
57
|
+
'gutter',
|
|
58
|
+
]),
|
|
59
|
+
}
|
|
60
|
+
: {}),
|
|
61
|
+
...(cols
|
|
62
|
+
? {
|
|
63
|
+
columns: {
|
|
64
|
+
num: numericAttribute(cols, 'num') ?? 1,
|
|
65
|
+
space: twipsToPt(numericAttribute(cols, 'space') ?? 0),
|
|
66
|
+
equalWidth: wordAttribute(cols, 'equalWidth') !== '0',
|
|
67
|
+
},
|
|
68
|
+
}
|
|
69
|
+
: {}),
|
|
70
|
+
titlePage: childNamed(sectPr, 'titlePg') !== null,
|
|
71
|
+
headers,
|
|
72
|
+
footers,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Tous les `w:sectPr` du corps dans l'ordre : fins de section dans les `w:pPr`, puis le final. */
|
|
76
|
+
function sectionProperties(body) {
|
|
77
|
+
const result = [];
|
|
78
|
+
for (const p of allNamed(body, 'p')) {
|
|
79
|
+
const pPr = childNamed(p, 'pPr');
|
|
80
|
+
const sectPr = pPr ? childNamed(pPr, 'sectPr') : null;
|
|
81
|
+
if (sectPr)
|
|
82
|
+
result.push(sectPr);
|
|
83
|
+
}
|
|
84
|
+
const last = childNamed(body, 'sectPr');
|
|
85
|
+
if (last)
|
|
86
|
+
result.push(last);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/** Toutes les sections du corps, dans l'ordre du document. */
|
|
90
|
+
export async function readSections(body, ctx, readBlocks) {
|
|
91
|
+
const sections = [];
|
|
92
|
+
for (const sectPr of sectionProperties(body)) {
|
|
93
|
+
sections.push(await readSection(sectPr, ctx, readBlocks));
|
|
94
|
+
}
|
|
95
|
+
return sections;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=model-sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-sections.js","sourceRoot":"","sources":["../../../src/docx/compare/model-sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { CellVerticalAlign } from '@aster-editor/core';
|
|
2
|
+
import type { DocxPackage, NumberingResolver, ResolvedParagraphProps, ResolvedRunProps, StyleResolver } from '../reader/types';
|
|
3
|
+
import { type EffectiveBorders } from './model-borders';
|
|
4
|
+
/**
|
|
5
|
+
* Modèle comparable d'un document Word : blocs du corps (paragraphes et tableaux, `w:sdt`
|
|
6
|
+
* aplatis) avec leurs propriétés **résolues** par le lecteur, sections avec leurs en-têtes
|
|
7
|
+
* et pieds. Les `Document` du paquet ne sont jamais modifiés. Les `w:rsid*`,
|
|
8
|
+
* `w:lastRenderedPageBreak`, `w:proofErr` et signets ne sont pas lus, sauf les
|
|
9
|
+
* identifiants de révision du paragraphe, exposés pour l'option `ignoreRevisionIds: false`.
|
|
10
|
+
* Les bordures et largeurs de cellules sont celles que Word rend (`model-borders.ts`), les
|
|
11
|
+
* sauts de page et champs de fusion sont modélisés par `model-paragraph.ts`.
|
|
12
|
+
*/
|
|
13
|
+
export interface RunModel {
|
|
14
|
+
readonly text: string;
|
|
15
|
+
readonly props: ResolvedRunProps;
|
|
16
|
+
}
|
|
17
|
+
export interface ImageModel {
|
|
18
|
+
readonly kind: 'drawing' | 'pict';
|
|
19
|
+
readonly widthPx?: number;
|
|
20
|
+
readonly heightPx?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface NoteModel {
|
|
23
|
+
readonly kind: 'footnote' | 'endnote';
|
|
24
|
+
readonly text: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Champ de fusion d'un paragraphe : vrai `MERGEFIELD` ou `{{nom}}` écrit en clair. Le nom
|
|
28
|
+
* brut distingue `MERGEFIELD "Nom Client"`, `nom_client` et `"NOM CLIENT"`, trois colonnes
|
|
29
|
+
* de source de données (R30-04) ; le nom normalisé ne sert que face à un `{{}}` littéral,
|
|
30
|
+
* celui qu'Aster écrit à l'import.
|
|
31
|
+
*/
|
|
32
|
+
export interface FieldModel {
|
|
33
|
+
/** Nom brut : celui de l'instruction (guillemets retirés) ou l'intérieur du `{{}}`, blancs rognés. */
|
|
34
|
+
readonly raw: string;
|
|
35
|
+
/** Nom de variable normalisé comme à l'import (`Nom Client` → `nom_client`). */
|
|
36
|
+
readonly name: string;
|
|
37
|
+
/** Vrai pour un `{{nom}}` en clair, faux pour un champ `MERGEFIELD` (simple ou complexe). */
|
|
38
|
+
readonly literal: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface ParagraphModel {
|
|
41
|
+
readonly kind: 'paragraph';
|
|
42
|
+
/** Texte tel que Word l'affiche : résultat des champs, tabulations et sauts de ligne compris. */
|
|
43
|
+
readonly text: string;
|
|
44
|
+
/** Texte canonique : chaque champ de fusion remplacé par `{{nom}}` normalisé, pour l'alignement et l'équivalence. */
|
|
45
|
+
readonly placeholderText: string;
|
|
46
|
+
/** Champs de fusion dans l'ordre, `MERGEFIELD` et `{{nom}}` en clair distingués par `literal`. */
|
|
47
|
+
readonly fields: readonly FieldModel[];
|
|
48
|
+
readonly props: ResolvedParagraphProps;
|
|
49
|
+
/** Format résolu du niveau de liste (`decimal|%1.|1`), `undefined` sans numérotation connue. */
|
|
50
|
+
readonly listFormat?: string;
|
|
51
|
+
/** Saut de page explicite (`w:br w:type="page"`) à la fin de ce paragraphe. */
|
|
52
|
+
readonly pageBreakAfter?: true;
|
|
53
|
+
readonly runs: readonly RunModel[];
|
|
54
|
+
readonly images: readonly ImageModel[];
|
|
55
|
+
readonly notes: readonly NoteModel[];
|
|
56
|
+
/** Attributs `w:rsid*` du paragraphe, triés, pour `ignoreRevisionIds: false`. */
|
|
57
|
+
readonly revisionIds: string;
|
|
58
|
+
}
|
|
59
|
+
export interface CellModel {
|
|
60
|
+
readonly colspan: number;
|
|
61
|
+
readonly vMerge?: 'restart' | 'continue';
|
|
62
|
+
/** Largeur effective : `w:tcW` en twips, sinon la somme des colonnes de grille couvertes. */
|
|
63
|
+
readonly widthPt?: number;
|
|
64
|
+
/** Bordures effectives (style, tableau selon la position, cellule), côtés visibles seulement. */
|
|
65
|
+
readonly borders?: EffectiveBorders;
|
|
66
|
+
readonly shading?: string;
|
|
67
|
+
readonly verticalAlign?: CellVerticalAlign;
|
|
68
|
+
readonly blocks: readonly BlockModel[];
|
|
69
|
+
}
|
|
70
|
+
export interface TableModel {
|
|
71
|
+
readonly kind: 'table';
|
|
72
|
+
readonly text: string;
|
|
73
|
+
readonly placeholderText: string;
|
|
74
|
+
readonly styleId?: string;
|
|
75
|
+
readonly width?: string;
|
|
76
|
+
readonly align?: string;
|
|
77
|
+
/** Bordures extérieures effectives (style puis `w:tblBorders`), côtés visibles seulement. */
|
|
78
|
+
readonly borders?: EffectiveBorders;
|
|
79
|
+
readonly columnWidthsPt: readonly number[];
|
|
80
|
+
readonly rows: readonly (readonly CellModel[])[];
|
|
81
|
+
}
|
|
82
|
+
export type BlockModel = ParagraphModel | TableModel;
|
|
83
|
+
export interface HeaderFooterModel {
|
|
84
|
+
readonly blocks: readonly BlockModel[];
|
|
85
|
+
}
|
|
86
|
+
export type HeaderFooterType = 'default' | 'first' | 'even';
|
|
87
|
+
export interface SectionModel {
|
|
88
|
+
readonly type?: string;
|
|
89
|
+
readonly pageSize?: Record<string, string | number>;
|
|
90
|
+
readonly margins?: Record<string, number>;
|
|
91
|
+
readonly columns?: Record<string, string | number | boolean>;
|
|
92
|
+
readonly titlePage: boolean;
|
|
93
|
+
readonly headers: Partial<Record<HeaderFooterType, HeaderFooterModel>>;
|
|
94
|
+
readonly footers: Partial<Record<HeaderFooterType, HeaderFooterModel>>;
|
|
95
|
+
}
|
|
96
|
+
export interface DocumentModel {
|
|
97
|
+
readonly blocks: readonly BlockModel[];
|
|
98
|
+
readonly sections: readonly SectionModel[];
|
|
99
|
+
readonly lang?: string;
|
|
100
|
+
}
|
|
101
|
+
/** Contexte de lecture d'une partie : paquet, chemin de la partie, résolveurs, textes des notes. */
|
|
102
|
+
export interface ModelContext {
|
|
103
|
+
readonly pkg: DocxPackage;
|
|
104
|
+
readonly part: string;
|
|
105
|
+
readonly styles: StyleResolver;
|
|
106
|
+
readonly numbering: NumberingResolver;
|
|
107
|
+
readonly notes: ReadonlyMap<string, string>;
|
|
108
|
+
}
|
|
109
|
+
/** Texte brut d'une suite de blocs, paragraphes séparés par des sauts de ligne. */
|
|
110
|
+
export declare function blocksText(blocks: readonly BlockModel[]): string;
|
|
111
|
+
/** Lit le modèle comparable d'un paquet ouvert. Lève si la partie principale est illisible. */
|
|
112
|
+
export declare function readDocumentModel(pkg: DocxPackage, styles: StyleResolver, numbering: NumberingResolver): Promise<DocumentModel>;
|
|
113
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/docx/compare/model.ts"],"names":[],"mappings":"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"}
|