@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,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alignement de deux séquences de blocs (ou de runs) pour le rapport de fidélité.
|
|
3
|
+
* Préfixe et suffixe communs retirés, puis LCS sur les clés du milieu, borné
|
|
4
|
+
* (`MAX_LCS_CELLS`) ; au-delà, appariement guidé par les clés **uniques** des deux côtés :
|
|
5
|
+
* plus longue sous-suite croissante de leurs positions (patience diff, R30-06), puis LCS ou
|
|
6
|
+
* nouvel ancrage dans chaque trou entre deux ancres, glouton monotone en dernier recours.
|
|
7
|
+
* Entre deux paires appariées, un trou de **même longueur** des deux côtés est apparié par
|
|
8
|
+
* position (blocs modifiés, R30-09) : deux séquences de même longueur dont tout colle
|
|
9
|
+
* restent alignées par position, à coût nul, et un bloc retiré plus un bloc ajouté coûtent
|
|
10
|
+
* plus qu'un bloc retiré.
|
|
11
|
+
*/
|
|
12
|
+
/** Au-delà de ce nombre de cellules de la table LCS, l'ancrage par clés uniques prend le relais. */
|
|
13
|
+
export const MAX_LCS_CELLS = 1_000_000;
|
|
14
|
+
function lcsPairs(a, b) {
|
|
15
|
+
const rows = a.length;
|
|
16
|
+
const cols = b.length;
|
|
17
|
+
// Table (rows + 1) × (cols + 1) de longueurs de LCS, remplie de la fin vers le début.
|
|
18
|
+
const width = cols + 1;
|
|
19
|
+
const table = new Uint32Array((rows + 1) * width);
|
|
20
|
+
for (let i = rows - 1; i >= 0; i -= 1) {
|
|
21
|
+
for (let j = cols - 1; j >= 0; j -= 1) {
|
|
22
|
+
const index = i * width + j;
|
|
23
|
+
table[index] =
|
|
24
|
+
a[i] === b[j]
|
|
25
|
+
? (table[index + width + 1] ?? 0) + 1
|
|
26
|
+
: Math.max(table[index + width] ?? 0, table[index + 1] ?? 0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const pairs = [];
|
|
30
|
+
let i = 0;
|
|
31
|
+
let j = 0;
|
|
32
|
+
while (i < rows && j < cols) {
|
|
33
|
+
if (a[i] === b[j]) {
|
|
34
|
+
pairs.push([i, j]);
|
|
35
|
+
i += 1;
|
|
36
|
+
j += 1;
|
|
37
|
+
}
|
|
38
|
+
else if ((table[(i + 1) * width + j] ?? 0) >= (table[i * width + j + 1] ?? 0)) {
|
|
39
|
+
i += 1;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
j += 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return pairs;
|
|
46
|
+
}
|
|
47
|
+
/** Appariement glouton : chaque clé de `a` prend la première occurrence encore libre dans `b` après la précédente. */
|
|
48
|
+
function greedyPairs(a, b) {
|
|
49
|
+
const positions = new Map();
|
|
50
|
+
b.forEach((key, index) => {
|
|
51
|
+
const list = positions.get(key);
|
|
52
|
+
if (list)
|
|
53
|
+
list.push(index);
|
|
54
|
+
else
|
|
55
|
+
positions.set(key, [index]);
|
|
56
|
+
});
|
|
57
|
+
const pairs = [];
|
|
58
|
+
let cursor = 0;
|
|
59
|
+
a.forEach((key, i) => {
|
|
60
|
+
const list = positions.get(key);
|
|
61
|
+
if (!list)
|
|
62
|
+
return;
|
|
63
|
+
const j = list.find((candidate) => candidate >= cursor);
|
|
64
|
+
if (j === undefined)
|
|
65
|
+
return;
|
|
66
|
+
pairs.push([i, j]);
|
|
67
|
+
cursor = j + 1;
|
|
68
|
+
});
|
|
69
|
+
return pairs;
|
|
70
|
+
}
|
|
71
|
+
/** Position de chaque clé présente **une seule fois** dans la séquence. */
|
|
72
|
+
function uniquePositions(keys) {
|
|
73
|
+
const counts = new Map();
|
|
74
|
+
for (const key of keys)
|
|
75
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
76
|
+
const positions = new Map();
|
|
77
|
+
keys.forEach((key, index) => {
|
|
78
|
+
if (counts.get(key) === 1)
|
|
79
|
+
positions.set(key, index);
|
|
80
|
+
});
|
|
81
|
+
return positions;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Ancres : clés uniques des deux côtés, prises dans l'ordre de `a`, dont on garde la plus
|
|
85
|
+
* longue sous-suite croissante en `b` (patience sorting, O(m log m)). Un bloc déplacé du
|
|
86
|
+
* début à la fin ne fait plus sauter tout le reste, comme le faisait le glouton.
|
|
87
|
+
*/
|
|
88
|
+
function anchorPairs(a, b) {
|
|
89
|
+
const inB = uniquePositions(b);
|
|
90
|
+
const candidates = [];
|
|
91
|
+
for (const [key, i] of uniquePositions(a)) {
|
|
92
|
+
const j = inB.get(key);
|
|
93
|
+
if (j !== undefined)
|
|
94
|
+
candidates.push([i, j]);
|
|
95
|
+
}
|
|
96
|
+
candidates.sort((x, y) => x[0] - y[0]);
|
|
97
|
+
// `tails[k]` : index dans `candidates` de la fin de la plus petite sous-suite de longueur k + 1.
|
|
98
|
+
const tails = [];
|
|
99
|
+
const previous = new Array(candidates.length).fill(-1);
|
|
100
|
+
candidates.forEach(([, j], index) => {
|
|
101
|
+
let low = 0;
|
|
102
|
+
let high = tails.length;
|
|
103
|
+
while (low < high) {
|
|
104
|
+
const mid = (low + high) >>> 1;
|
|
105
|
+
const tail = candidates[tails[mid] ?? 0];
|
|
106
|
+
if (tail !== undefined && tail[1] < j)
|
|
107
|
+
low = mid + 1;
|
|
108
|
+
else
|
|
109
|
+
high = mid;
|
|
110
|
+
}
|
|
111
|
+
previous[index] = low > 0 ? (tails[low - 1] ?? -1) : -1;
|
|
112
|
+
tails[low] = index;
|
|
113
|
+
});
|
|
114
|
+
const chain = [];
|
|
115
|
+
for (let at = tails[tails.length - 1] ?? -1; at >= 0; at = previous[at] ?? -1) {
|
|
116
|
+
const pair = candidates[at];
|
|
117
|
+
if (pair)
|
|
118
|
+
chain.push(pair);
|
|
119
|
+
}
|
|
120
|
+
return chain.reverse();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Paires du milieu, après retrait du préfixe et du suffixe : LCS quand la table tient,
|
|
124
|
+
* sinon ancrage par clés uniques et traitement des trous entre ancres (pile explicite,
|
|
125
|
+
* un trou sans aucune ancre tombe sur le glouton). Les paires sont rendues triées.
|
|
126
|
+
*/
|
|
127
|
+
function middlePairs(a, b) {
|
|
128
|
+
const pairs = [];
|
|
129
|
+
const stack = [{ a, b, offsetA: 0, offsetB: 0 }];
|
|
130
|
+
for (let span = stack.pop(); span !== undefined; span = stack.pop()) {
|
|
131
|
+
const { offsetA, offsetB } = span;
|
|
132
|
+
if (span.a.length === 0 || span.b.length === 0)
|
|
133
|
+
continue;
|
|
134
|
+
const shift = (list) => {
|
|
135
|
+
for (const [i, j] of list)
|
|
136
|
+
pairs.push([offsetA + i, offsetB + j]);
|
|
137
|
+
};
|
|
138
|
+
if ((span.a.length + 1) * (span.b.length + 1) <= MAX_LCS_CELLS) {
|
|
139
|
+
shift(lcsPairs(span.a, span.b));
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const anchors = anchorPairs(span.a, span.b);
|
|
143
|
+
if (anchors.length === 0) {
|
|
144
|
+
shift(greedyPairs(span.a, span.b));
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
shift(anchors);
|
|
148
|
+
let fromA = 0;
|
|
149
|
+
let fromB = 0;
|
|
150
|
+
for (const [i, j] of [...anchors, [span.a.length, span.b.length]]) {
|
|
151
|
+
if (i > fromA && j > fromB) {
|
|
152
|
+
stack.push({
|
|
153
|
+
a: span.a.slice(fromA, i),
|
|
154
|
+
b: span.b.slice(fromB, j),
|
|
155
|
+
offsetA: offsetA + fromA,
|
|
156
|
+
offsetB: offsetB + fromB,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
fromA = i + 1;
|
|
160
|
+
fromB = j + 1;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return pairs.sort((x, y) => x[0] - y[0]);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Développe une liste de paires appariées en séquence complète. Entre deux paires, un trou
|
|
167
|
+
* de même longueur des deux côtés est apparié par position (blocs modifiés) ; sinon les
|
|
168
|
+
* orphelins sont intercalés à leur place (`a` seul = supprimé, `b` seul = inséré).
|
|
169
|
+
*/
|
|
170
|
+
function expand(pairs, aLength, bLength) {
|
|
171
|
+
const out = [];
|
|
172
|
+
let i = 0;
|
|
173
|
+
let j = 0;
|
|
174
|
+
for (const [pa, pb] of [...pairs, [aLength, bLength]]) {
|
|
175
|
+
if (pa - i === pb - j) {
|
|
176
|
+
while (i < pa)
|
|
177
|
+
out.push({ a: i++, b: j++ });
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
while (i < pa)
|
|
181
|
+
out.push({ a: i++ });
|
|
182
|
+
while (j < pb)
|
|
183
|
+
out.push({ b: j++ });
|
|
184
|
+
}
|
|
185
|
+
if (pa < aLength)
|
|
186
|
+
out.push({ a: pa, b: pb });
|
|
187
|
+
i = pa + 1;
|
|
188
|
+
j = pb + 1;
|
|
189
|
+
}
|
|
190
|
+
return out;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Aligne deux séquences par leurs clés. Les paires sont rendues dans l'ordre, les
|
|
194
|
+
* éléments sans vis-à-vis intercalés à leur place (`a` seul = supprimé, `b` seul = inséré).
|
|
195
|
+
*/
|
|
196
|
+
export function alignSequences(a, b) {
|
|
197
|
+
let prefix = 0;
|
|
198
|
+
while (prefix < a.length && prefix < b.length && a[prefix] === b[prefix])
|
|
199
|
+
prefix += 1;
|
|
200
|
+
let suffix = 0;
|
|
201
|
+
while (suffix < a.length - prefix &&
|
|
202
|
+
suffix < b.length - prefix &&
|
|
203
|
+
a[a.length - 1 - suffix] === b[b.length - 1 - suffix]) {
|
|
204
|
+
suffix += 1;
|
|
205
|
+
}
|
|
206
|
+
const pairs = [];
|
|
207
|
+
for (let k = 0; k < prefix; k += 1)
|
|
208
|
+
pairs.push([k, k]);
|
|
209
|
+
for (const [i, j] of middlePairs(a.slice(prefix, a.length - suffix), b.slice(prefix, b.length - suffix))) {
|
|
210
|
+
pairs.push([prefix + i, prefix + j]);
|
|
211
|
+
}
|
|
212
|
+
for (let k = 0; k < suffix; k += 1) {
|
|
213
|
+
pairs.push([a.length - suffix + k, b.length - suffix + k]);
|
|
214
|
+
}
|
|
215
|
+
return expand(pairs, a.length, b.length);
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=align.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"align.js","sourceRoot":"","sources":["../../../src/docx/compare/align.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CompareContext } from './compare-context';
|
|
2
|
+
import type { BlockModel, FieldModel, HeaderFooterModel, ParagraphModel } from './model';
|
|
3
|
+
/**
|
|
4
|
+
* Comparaison des blocs alignés : texte (avec l'équivalence `{{nom}}` / champ de fusion),
|
|
5
|
+
* champs de fusion, style et format de paragraphe (saut de page après compris), runs
|
|
6
|
+
* (alignés par texte après fusion des voisins identiques), listes, tableaux
|
|
7
|
+
* (`compare-tables.ts`, cellules récursivement), images et notes. Une propriété n'est
|
|
8
|
+
* comptée que si l'un des deux côtés la pose : une valeur ajoutée par le résultat compte
|
|
9
|
+
* comme perdue, une valeur absente des deux côtés ne gonfle pas le score. Un bloc sans
|
|
10
|
+
* vis-à-vis perd toutes ses propriétés.
|
|
11
|
+
*/
|
|
12
|
+
export { MISSING, type CompareContext } from './compare-context';
|
|
13
|
+
/** Listes de champs égales deux à deux, dans l'ordre. */
|
|
14
|
+
export declare function sameFields(a: readonly FieldModel[], b: readonly FieldModel[]): boolean;
|
|
15
|
+
/** Compare un paragraphe de l'original à son vis-à-vis (absent = tout perdu). */
|
|
16
|
+
export declare function compareParagraph(a: ParagraphModel, b: ParagraphModel | undefined, where: string, ctx: CompareContext): void;
|
|
17
|
+
/**
|
|
18
|
+
* Aligne deux listes de blocs (position si même longueur, LCS sur le texte sinon) et
|
|
19
|
+
* compare chaque paire ; un bloc du résultat sans vis-à-vis compte comme texte inséré.
|
|
20
|
+
*/
|
|
21
|
+
export declare function compareBlocks(original: readonly BlockModel[], result: readonly BlockModel[], prefix: string, ctx: CompareContext): void;
|
|
22
|
+
/** Texte affiché, texte canonique, champs de fusion et format d'un en-tête ou d'un pied, en un seul bloc chacun. */
|
|
23
|
+
export declare function headerFooterSummary(part: HeaderFooterModel): {
|
|
24
|
+
text: string;
|
|
25
|
+
placeholderText: string;
|
|
26
|
+
fields: readonly FieldModel[];
|
|
27
|
+
format: string;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=compare-blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-blocks.d.ts","sourceRoot":"","sources":["../../../src/docx/compare/compare-blocks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAGnG;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA4DjE,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAEtF;AAkGD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,cAAc,EACjB,CAAC,EAAE,cAAc,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,cAAc,GAClB,IAAI,CAgFN;AAOD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,SAAS,UAAU,EAAE,EAC/B,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,cAAc,GAClB,IAAI,CA2BN;AAYD,oHAAoH;AACpH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB,CAmBA"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { alignSequences } from './align';
|
|
2
|
+
import { MISSING, recordIfAny } from './compare-context';
|
|
3
|
+
import { compareTable } from './compare-tables';
|
|
4
|
+
import { ABSENT, fmt } from './values';
|
|
5
|
+
/**
|
|
6
|
+
* Comparaison des blocs alignés : texte (avec l'équivalence `{{nom}}` / champ de fusion),
|
|
7
|
+
* champs de fusion, style et format de paragraphe (saut de page après compris), runs
|
|
8
|
+
* (alignés par texte après fusion des voisins identiques), listes, tableaux
|
|
9
|
+
* (`compare-tables.ts`, cellules récursivement), images et notes. Une propriété n'est
|
|
10
|
+
* comptée que si l'un des deux côtés la pose : une valeur ajoutée par le résultat compte
|
|
11
|
+
* comme perdue, une valeur absente des deux côtés ne gonfle pas le score. Un bloc sans
|
|
12
|
+
* vis-à-vis perd toutes ses propriétés.
|
|
13
|
+
*/
|
|
14
|
+
export { MISSING } from './compare-context';
|
|
15
|
+
const PARAGRAPH_FORMAT_KEYS = [
|
|
16
|
+
'align',
|
|
17
|
+
'lineHeight',
|
|
18
|
+
'lineHeightPt',
|
|
19
|
+
'spacingBeforePt',
|
|
20
|
+
'spacingAfterPt',
|
|
21
|
+
'indentLeftPt',
|
|
22
|
+
'indentRightPt',
|
|
23
|
+
'indentFirstLinePt',
|
|
24
|
+
'borders',
|
|
25
|
+
'shading',
|
|
26
|
+
'keepWithNext',
|
|
27
|
+
'pageBreakBefore',
|
|
28
|
+
];
|
|
29
|
+
const RUN_KEYS = [
|
|
30
|
+
'fontFamily',
|
|
31
|
+
'fontSizePt',
|
|
32
|
+
'bold',
|
|
33
|
+
'italic',
|
|
34
|
+
'underline',
|
|
35
|
+
'strike',
|
|
36
|
+
'color',
|
|
37
|
+
'highlight',
|
|
38
|
+
'superscript',
|
|
39
|
+
'subscript',
|
|
40
|
+
'letterSpacingPt',
|
|
41
|
+
'caps',
|
|
42
|
+
'runStyle',
|
|
43
|
+
'lang',
|
|
44
|
+
];
|
|
45
|
+
const IMAGE_TOLERANCE_PX = 1;
|
|
46
|
+
/** Clé d'alignement : texte aux espaces repliés, pour qu'un espace final ne désaligne pas tout. */
|
|
47
|
+
function alignmentKey(text) {
|
|
48
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
49
|
+
}
|
|
50
|
+
/** Liste vide ramenée à `undefined` : un paragraphe sans champ ne crée pas d'occurrence. */
|
|
51
|
+
function nonEmptyList(list) {
|
|
52
|
+
return list && list.length > 0 ? list : undefined;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Deux champs de fusion sont égaux par leur nom **brut** quand ils sont de même nature
|
|
56
|
+
* (deux vrais `MERGEFIELD`, ou deux `{{}}` en clair) ; face à un `{{}}` en clair, un vrai
|
|
57
|
+
* champ vaut par son nom normalisé, celui qu'Aster écrit à l'import (R30-04).
|
|
58
|
+
*/
|
|
59
|
+
function sameField(a, b) {
|
|
60
|
+
return a.literal === b.literal ? a.raw === b.raw : a.name === b.name;
|
|
61
|
+
}
|
|
62
|
+
/** Listes de champs égales deux à deux, dans l'ordre. */
|
|
63
|
+
export function sameFields(a, b) {
|
|
64
|
+
return a.length === b.length && a.every((field, index) => sameField(field, b[index] ?? field));
|
|
65
|
+
}
|
|
66
|
+
/** Noms bruts des champs, pour le rapport. */
|
|
67
|
+
function fieldNames(fields) {
|
|
68
|
+
return nonEmptyList(fields.map((field) => field.raw));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Valeur de format de paragraphe ramenée à `undefined` quand elle vaut le défaut de Word
|
|
72
|
+
* (alignement à gauche, espacement ou retrait nul, interligne simple) : un document qui
|
|
73
|
+
* écrit `w:jc w:val="left"` et un autre qui ne dit rien se rendent pareil.
|
|
74
|
+
*/
|
|
75
|
+
function effectiveParagraphValue(key, value) {
|
|
76
|
+
if (key === 'align' && value === 'left')
|
|
77
|
+
return undefined;
|
|
78
|
+
if (key === 'lineHeight' && value === 1)
|
|
79
|
+
return undefined;
|
|
80
|
+
if (value === 0 && key !== 'lineHeight' && key !== 'lineHeightPt')
|
|
81
|
+
return undefined;
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
function compareRuns(original, result, where, ctx) {
|
|
85
|
+
const pairs = alignSequences(original.map((run) => alignmentKey(run.text)), result.map((run) => alignmentKey(run.text)));
|
|
86
|
+
for (const pair of pairs) {
|
|
87
|
+
if (pair.a === undefined)
|
|
88
|
+
continue;
|
|
89
|
+
const a = original[pair.a];
|
|
90
|
+
const b = pair.b === undefined ? undefined : result[pair.b];
|
|
91
|
+
if (!a)
|
|
92
|
+
continue;
|
|
93
|
+
const runWhere = `${where} run « ${a.text.slice(0, 30)} »`;
|
|
94
|
+
for (const key of RUN_KEYS) {
|
|
95
|
+
recordIfAny(ctx, 'run-format', `run.${key}`, runWhere, a.props[key], b?.props[key], !!b);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function compareImages(a, b, where, ctx) {
|
|
100
|
+
const actual = b?.images ?? [];
|
|
101
|
+
if (a.images.length === 0 && actual.length === 0)
|
|
102
|
+
return;
|
|
103
|
+
ctx.tally.record('image', 'image.count', where, String(a.images.length), b ? String(actual.length) : MISSING);
|
|
104
|
+
a.images.forEach((image, index) => {
|
|
105
|
+
const other = actual[index];
|
|
106
|
+
for (const key of ['widthPx', 'heightPx']) {
|
|
107
|
+
const expected = image[key];
|
|
108
|
+
const found = other?.[key];
|
|
109
|
+
if (expected === undefined && found === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
const kept = expected !== undefined &&
|
|
112
|
+
found !== undefined &&
|
|
113
|
+
Math.abs(expected - found) <= IMAGE_TOLERANCE_PX;
|
|
114
|
+
const name = key === 'widthPx' ? 'image.width' : 'image.height';
|
|
115
|
+
const label = `${where} image ${String(index + 1)}`;
|
|
116
|
+
const actualText = b ? fmt(found) : MISSING;
|
|
117
|
+
ctx.tally.record('image', name, label, fmt(expected), kept ? fmt(expected) : actualText);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function compareNotes(a, b, where, ctx) {
|
|
122
|
+
const actual = b?.notes ?? [];
|
|
123
|
+
if (a.notes.length === 0 && actual.length === 0)
|
|
124
|
+
return;
|
|
125
|
+
ctx.tally.record('note', 'note.count', where, String(a.notes.length), b ? String(actual.length) : MISSING);
|
|
126
|
+
a.notes.forEach((note, index) => {
|
|
127
|
+
const other = actual[index];
|
|
128
|
+
const label = `${where} note ${String(index + 1)}`;
|
|
129
|
+
const missing = b ? ABSENT : MISSING;
|
|
130
|
+
ctx.tally.record('note', 'note.kind', label, note.kind, other?.kind ?? missing);
|
|
131
|
+
ctx.tally.record('note', 'note.text', label, note.text, other?.text ?? missing);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** Compare un paragraphe de l'original à son vis-à-vis (absent = tout perdu). */
|
|
135
|
+
export function compareParagraph(a, b, where, ctx) {
|
|
136
|
+
const present = b !== undefined;
|
|
137
|
+
const fieldsKept = b !== undefined && sameFields(a.fields, b.fields);
|
|
138
|
+
// Un `{{nom}}` en clair face au résultat d'un `MERGEFIELD` de même nom : texte conservé ;
|
|
139
|
+
// un champ renommé (nom brut) change le texte que Word affiche, donc le texte est perdu.
|
|
140
|
+
const sameText = b !== undefined &&
|
|
141
|
+
(a.text === b.text || (a.placeholderText === b.placeholderText && fieldsKept));
|
|
142
|
+
ctx.tally.record('text', 'paragraph.text', where, a.text, sameText ? a.text : (b?.text ?? MISSING));
|
|
143
|
+
const expectedFields = fieldNames(a.fields);
|
|
144
|
+
recordIfAny(ctx, 'text', 'field.mergeField', where, expectedFields, b === undefined ? undefined : fieldsKept ? expectedFields : fieldNames(b.fields), present);
|
|
145
|
+
ctx.tally.record('paragraph-style', 'paragraph.style', where, fmt(a.props.styleId), b ? fmt(b.props.styleId) : MISSING);
|
|
146
|
+
recordIfAny(ctx, 'paragraph-style', 'paragraph.headingLevel', where, a.props.headingLevel, b?.props.headingLevel, present);
|
|
147
|
+
for (const key of PARAGRAPH_FORMAT_KEYS) {
|
|
148
|
+
recordIfAny(ctx, 'paragraph-format', `paragraph.${key}`, where, effectiveParagraphValue(key, a.props[key]), b ? effectiveParagraphValue(key, b.props[key]) : undefined, present);
|
|
149
|
+
}
|
|
150
|
+
recordIfAny(ctx, 'paragraph-format', 'paragraph.pageBreakAfter', where, a.pageBreakAfter, b?.pageBreakAfter, present);
|
|
151
|
+
if (!ctx.ignoreRevisionIds) {
|
|
152
|
+
ctx.tally.record('paragraph-format', 'paragraph.revisionIds', where, a.revisionIds, b?.revisionIds ?? MISSING);
|
|
153
|
+
}
|
|
154
|
+
const numbering = a.props.numbering;
|
|
155
|
+
const other = b?.props.numbering;
|
|
156
|
+
if (numbering || other) {
|
|
157
|
+
recordIfAny(ctx, 'list', 'list.numId', where, numbering?.numId, other?.numId, present);
|
|
158
|
+
recordIfAny(ctx, 'list', 'list.level', where, numbering?.level, other?.level, present);
|
|
159
|
+
recordIfAny(ctx, 'list', 'list.format', where, a.listFormat, b?.listFormat, present);
|
|
160
|
+
}
|
|
161
|
+
compareRuns(a.runs, b?.runs ?? [], where, ctx);
|
|
162
|
+
compareImages(a, b, where, ctx);
|
|
163
|
+
compareNotes(a, b, where, ctx);
|
|
164
|
+
}
|
|
165
|
+
/** Clé d'alignement d'un bloc : son texte canonique (`{{nom}}` pour les champs de fusion). */
|
|
166
|
+
function blockKey(block) {
|
|
167
|
+
return `${block.kind}:${alignmentKey(block.placeholderText)}`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Aligne deux listes de blocs (position si même longueur, LCS sur le texte sinon) et
|
|
171
|
+
* compare chaque paire ; un bloc du résultat sans vis-à-vis compte comme texte inséré.
|
|
172
|
+
*/
|
|
173
|
+
export function compareBlocks(original, result, prefix, ctx) {
|
|
174
|
+
const pairs = alignSequences(original.map(blockKey), result.map(blockKey));
|
|
175
|
+
const labelsA = labels(original, prefix, '');
|
|
176
|
+
const labelsB = labels(result, prefix, ' (résultat)');
|
|
177
|
+
const inserted = (block, where) => {
|
|
178
|
+
const name = block.kind === 'paragraph' ? 'paragraph.text' : 'table.rows';
|
|
179
|
+
const group = block.kind === 'paragraph' ? 'text' : 'table';
|
|
180
|
+
const actual = block.kind === 'paragraph' ? block.text : String(block.rows.length);
|
|
181
|
+
ctx.tally.record(group, name, where, ABSENT, actual);
|
|
182
|
+
};
|
|
183
|
+
for (const pair of pairs) {
|
|
184
|
+
const a = pair.a === undefined ? undefined : original[pair.a];
|
|
185
|
+
const b = pair.b === undefined ? undefined : result[pair.b];
|
|
186
|
+
const whereB = pair.b === undefined ? '' : (labelsB[pair.b] ?? '');
|
|
187
|
+
if (a) {
|
|
188
|
+
const where = pair.a === undefined ? '' : (labelsA[pair.a] ?? '');
|
|
189
|
+
if (a.kind === 'paragraph') {
|
|
190
|
+
compareParagraph(a, b?.kind === 'paragraph' ? b : undefined, where, ctx);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
compareTable(a, b?.kind === 'table' ? b : undefined, where, ctx, compareBlocks);
|
|
194
|
+
}
|
|
195
|
+
// Paragraphe face à un tableau (ou l'inverse) : le bloc du résultat est un ajout.
|
|
196
|
+
if (b && b.kind !== a.kind)
|
|
197
|
+
inserted(b, whereB);
|
|
198
|
+
}
|
|
199
|
+
else if (b) {
|
|
200
|
+
inserted(b, whereB);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Libellés `paragraphe N` / `tableau N` de chaque bloc, numérotés par nature sur un même côté. */
|
|
205
|
+
function labels(blocks, prefix, suffix) {
|
|
206
|
+
const counters = { paragraph: 0, table: 0 };
|
|
207
|
+
return blocks.map((block) => {
|
|
208
|
+
const count = (counters[block.kind] += 1);
|
|
209
|
+
const position = `${block.kind === 'paragraph' ? 'paragraphe' : 'tableau'} ${String(count)}`;
|
|
210
|
+
return `${prefix ? `${prefix} ${position}` : position}${suffix}`;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/** Texte affiché, texte canonique, champs de fusion et format d'un en-tête ou d'un pied, en un seul bloc chacun. */
|
|
214
|
+
export function headerFooterSummary(part) {
|
|
215
|
+
const format = part.blocks.map((block) => {
|
|
216
|
+
if (block.kind === 'table') {
|
|
217
|
+
return { kind: 'table', rows: block.rows.length, width: block.width, borders: block.borders };
|
|
218
|
+
}
|
|
219
|
+
const { runDefaults: _ignored, ...paragraph } = block.props;
|
|
220
|
+
return {
|
|
221
|
+
kind: 'paragraph',
|
|
222
|
+
...paragraph,
|
|
223
|
+
...(block.pageBreakAfter ? { pageBreakAfter: true } : {}),
|
|
224
|
+
runs: block.runs.map((run) => run.props),
|
|
225
|
+
};
|
|
226
|
+
});
|
|
227
|
+
return {
|
|
228
|
+
text: part.blocks.map((block) => block.text).join('\n'),
|
|
229
|
+
placeholderText: part.blocks.map((block) => block.placeholderText).join('\n'),
|
|
230
|
+
fields: part.blocks.flatMap((block) => (block.kind === 'paragraph' ? block.fields : [])),
|
|
231
|
+
format: fmt(format),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=compare-blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-blocks.js","sourceRoot":"","sources":["../../../src/docx/compare/compare-blocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAuB,MAAM,mBAAmB,CAAC;AAOjE,MAAM,qBAAqB,GAAkC;IAC3D,OAAO;IACP,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,mBAAmB;IACnB,SAAS;IACT,SAAS;IACT,cAAc;IACd,iBAAiB;CAClB,CAAC;AAEF,MAAM,QAAQ,GAAwC;IACpD,YAAY;IACZ,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,OAAO;IACP,WAAW;IACX,aAAa;IACb,WAAW;IACX,iBAAiB;IACjB,MAAM;IACN,UAAU;IACV,MAAM;CACP,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,mGAAmG;AACnG,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,4FAA4F;AAC5F,SAAS,YAAY,CAAC,IAAmC;IACvD,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,CAAa,EAAE,CAAa;IAC7C,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,CAAwB,EAAE,CAAwB;IAC3E,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,8CAA8C;AAC9C,SAAS,UAAU,CAAC,MAA6B;IAC/C,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,GAAuB,EAAE,KAAc;IACtE,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,GAAG,KAAK,YAAY,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,cAAc;QAAE,OAAO,SAAS,CAAC;IACpF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAClB,QAA6B,EAC7B,MAA2B,EAC3B,KAAa,EACb,GAAmB;IAEnB,MAAM,KAAK,GAAG,cAAc,CAC1B,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC5C,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,QAAQ,GAAG,GAAG,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,CAAiB,EACjB,CAA6B,EAC7B,KAAa,EACb,GAAmB;IAEnB,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzD,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,OAAO,EACP,aAAa,EACb,KAAK,EACL,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EACvB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CACpC,CAAC;IACF,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAU,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAC5D,MAAM,IAAI,GACR,QAAQ,KAAK,SAAS;gBACtB,KAAK,KAAK,SAAS;gBACnB,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,kBAAkB,CAAC;YACnD,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;YAChE,MAAM,KAAK,GAAG,GAAG,KAAK,UAAU,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,CAAiB,EACjB,CAA6B,EAC7B,KAAa,EACb,GAAmB;IAEnB,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACxD,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,MAAM,EACN,YAAY,EACZ,KAAK,EACL,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EACtB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CACpC,CAAC;IACF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACrC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;QAChF,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAC9B,CAAiB,EACjB,CAA6B,EAC7B,KAAa,EACb,GAAmB;IAEnB,MAAM,OAAO,GAAG,CAAC,KAAK,SAAS,CAAC;IAChC,MAAM,UAAU,GAAG,CAAC,KAAK,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrE,0FAA0F;IAC1F,yFAAyF;IACzF,MAAM,QAAQ,GACZ,CAAC,KAAK,SAAS;QACf,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,eAAe,IAAI,UAAU,CAAC,CAAC,CAAC;IACjF,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,MAAM,EACN,gBAAgB,EAChB,KAAK,EACL,CAAC,CAAC,IAAI,EACN,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,CAAC,CACzC,CAAC;IACF,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,WAAW,CACT,GAAG,EACH,MAAM,EACN,kBAAkB,EAClB,KAAK,EACL,cAAc,EACd,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAChF,OAAO,CACR,CAAC;IACF,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,EACL,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EACpB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CACnC,CAAC;IACF,WAAW,CACT,GAAG,EACH,iBAAiB,EACjB,wBAAwB,EACxB,KAAK,EACL,CAAC,CAAC,KAAK,CAAC,YAAY,EACpB,CAAC,EAAE,KAAK,CAAC,YAAY,EACrB,OAAO,CACR,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,WAAW,CACT,GAAG,EACH,kBAAkB,EAClB,aAAa,GAAG,EAAE,EAClB,KAAK,EACL,uBAAuB,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAC1D,OAAO,CACR,CAAC;IACJ,CAAC;IACD,WAAW,CACT,GAAG,EACH,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,EACL,CAAC,CAAC,cAAc,EAChB,CAAC,EAAE,cAAc,EACjB,OAAO,CACR,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,EACL,CAAC,CAAC,WAAW,EACb,CAAC,EAAE,WAAW,IAAI,OAAO,CAC1B,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACvF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACvF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACvF,CAAC;IACD,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAChC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,8FAA8F;AAC9F,SAAS,QAAQ,CAAC,KAAiB;IACjC,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,QAA+B,EAC/B,MAA6B,EAC7B,MAAc,EACd,GAAmB;IAEnB,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAE,KAAa,EAAQ,EAAE;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;QAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnF,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;YAClF,CAAC;YACD,kFAAkF;YAClF,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;gBAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC;YACb,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,SAAS,MAAM,CAAC,MAA6B,EAAE,MAAc,EAAE,MAAc;IAC3E,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC5C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7F,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IAMzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAChG,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5D,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,GAAG,SAAS;YACZ,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;SACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACvD,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7E,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Tally } from './tally';
|
|
2
|
+
import type { FidelityPropertyGroup } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Contexte et primitives d'enregistrement partagés par les comparateurs de blocs et de
|
|
5
|
+
* tableaux : une propriété n'est comptée que si l'un des deux côtés la pose, et un
|
|
6
|
+
* vis-à-vis absent perd toutes ses propriétés.
|
|
7
|
+
*/
|
|
8
|
+
export interface CompareContext {
|
|
9
|
+
readonly tally: Tally;
|
|
10
|
+
readonly ignoreRevisionIds: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Valeur « actuelle » d'un bloc, d'une cellule ou d'un run sans vis-à-vis : tout est perdu. */
|
|
13
|
+
export declare const MISSING = "(bloc absent)";
|
|
14
|
+
/** Largeurs de colonnes et de cellules : un passage par des pixels entiers déplace jusqu'à 0,375 pt. */
|
|
15
|
+
export declare const WIDTH_TOLERANCE_PT = 0.5;
|
|
16
|
+
/** Vrai si deux nombres (ou deux listes de nombres de même longueur) sont égaux à `tolerance` près. */
|
|
17
|
+
export declare function within(a: unknown, b: unknown, tolerance: number): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Compte `name` quand au moins un côté pose une valeur. `present` faux = le vis-à-vis
|
|
20
|
+
* n'existe pas : l'occurrence est perdue même si la valeur attendue est vide.
|
|
21
|
+
*/
|
|
22
|
+
export declare function recordIfAny(ctx: CompareContext, group: FidelityPropertyGroup, name: string, where: string, expected: unknown, actual: unknown, present?: boolean): void;
|
|
23
|
+
/** Comme `recordIfAny`, mais une valeur numérique à `tolerance` près compte comme conservée. */
|
|
24
|
+
export declare function recordWithin(ctx: CompareContext, group: FidelityPropertyGroup, name: string, where: string, expected: unknown, actual: unknown, present: boolean, tolerance: number): void;
|
|
25
|
+
//# sourceMappingURL=compare-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-context.d.ts","sourceRoot":"","sources":["../../../src/docx/compare/compare-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGrD;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC;AAED,gGAAgG;AAChG,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,uGAAuG;AACvG,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAMzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,OAAO,EACf,OAAO,UAAO,GACb,IAAI,CAGN;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAC1B,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAUN"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { fmt } from './values';
|
|
2
|
+
/** Valeur « actuelle » d'un bloc, d'une cellule ou d'un run sans vis-à-vis : tout est perdu. */
|
|
3
|
+
export const MISSING = '(bloc absent)';
|
|
4
|
+
/** Largeurs de colonnes et de cellules : un passage par des pixels entiers déplace jusqu'à 0,375 pt. */
|
|
5
|
+
export const WIDTH_TOLERANCE_PT = 0.5;
|
|
6
|
+
/** Vrai si deux nombres (ou deux listes de nombres de même longueur) sont égaux à `tolerance` près. */
|
|
7
|
+
export function within(a, b, tolerance) {
|
|
8
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
9
|
+
return Math.abs(a - b) <= tolerance;
|
|
10
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
11
|
+
return a.length === b.length && a.every((value, index) => within(value, b[index], tolerance));
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Compte `name` quand au moins un côté pose une valeur. `present` faux = le vis-à-vis
|
|
17
|
+
* n'existe pas : l'occurrence est perdue même si la valeur attendue est vide.
|
|
18
|
+
*/
|
|
19
|
+
export function recordIfAny(ctx, group, name, where, expected, actual, present = true) {
|
|
20
|
+
if (expected === undefined && actual === undefined)
|
|
21
|
+
return;
|
|
22
|
+
ctx.tally.record(group, name, where, fmt(expected), present ? fmt(actual) : MISSING);
|
|
23
|
+
}
|
|
24
|
+
/** Comme `recordIfAny`, mais une valeur numérique à `tolerance` près compte comme conservée. */
|
|
25
|
+
export function recordWithin(ctx, group, name, where, expected, actual, present, tolerance) {
|
|
26
|
+
if (expected === undefined && actual === undefined)
|
|
27
|
+
return;
|
|
28
|
+
const kept = present && within(expected, actual, tolerance);
|
|
29
|
+
ctx.tally.record(group, name, where, fmt(expected), kept ? fmt(expected) : present ? fmt(actual) : MISSING);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=compare-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-context.js","sourceRoot":"","sources":["../../../src/docx/compare/compare-context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAa/B,gGAAgG;AAChG,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC;AAEvC,wGAAwG;AACxG,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,uGAAuG;AACvG,MAAM,UAAU,MAAM,CAAC,CAAU,EAAE,CAAU,EAAE,SAAiB;IAC9D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;IACxF,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,GAAmB,EACnB,KAA4B,EAC5B,IAAY,EACZ,KAAa,EACb,QAAiB,EACjB,MAAe,EACf,OAAO,GAAG,IAAI;IAEd,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IAC3D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,KAA4B,EAC5B,IAAY,EACZ,KAAa,EACb,QAAiB,EACjB,MAAe,EACf,OAAgB,EAChB,SAAiB;IAEjB,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IAC3D,MAAM,IAAI,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5D,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,KAAK,EACL,IAAI,EACJ,KAAK,EACL,GAAG,CAAC,QAAQ,CAAC,EACb,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-docx.d.ts","sourceRoot":"","sources":["../../../src/docx/compare/compare-docx.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAsC,MAAM,SAAS,CAAC;AAkK/E,6GAA6G;AAC7G,eAAO,MAAM,WAAW,EAAE,WAgDzB,CAAC"}
|