@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,288 @@
|
|
|
1
|
+
import { allNamed, childNamed } from '../preprocess/xml-utils';
|
|
2
|
+
import { escapeAttr, escapeHtml } from './html';
|
|
3
|
+
import { alternateContentChoice, detectLostInline, textboxLost } from './lost';
|
|
4
|
+
import { emuToPx, ptToPx } from './units-blocks';
|
|
5
|
+
/**
|
|
6
|
+
* Conversion des dessins Word en `<img>` : `w:drawing` (`wp:inline` et `wp:anchor`,
|
|
7
|
+
* image `pic:pic/…/a:blip r:embed`), `w:pict` (VML `v:imagedata r:id`) et leur enveloppe
|
|
8
|
+
* `mc:AlternateContent` (contenu du `mc:Choice`). Les octets viennent du paquet via les
|
|
9
|
+
* relations de la partie courante ; sans hook `upload`, ils deviennent une data URL base64.
|
|
10
|
+
* Un dessin sans image (zone de texte, forme, graphique) est délégué à `detectLostInline`
|
|
11
|
+
* et remplacé par son texte ; un dessin qui porte une image **et** une zone de texte rend
|
|
12
|
+
* l'image, puis le texte de la zone, signalée comme perdue.
|
|
13
|
+
*/
|
|
14
|
+
const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
|
|
15
|
+
/** Plafond des dimensions écrites sur `<img>` : au-delà, c'est une valeur hostile ou absurde. */
|
|
16
|
+
export const MAX_IMAGE_PX = 20000;
|
|
17
|
+
/** Schémas d'URL acceptés du hook `upload` (`data:` seulement pour une image). */
|
|
18
|
+
const SAFE_URL_SCHEMES = new Set(['http', 'https', 'blob']);
|
|
19
|
+
const URL_SCHEME = /^([a-z][a-z0-9+.-]*):/i;
|
|
20
|
+
/** Vrai si la chaîne contient un caractère de contrôle C0 ou DEL. */
|
|
21
|
+
function hasControlChar(text) {
|
|
22
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
23
|
+
const code = text.charCodeAt(index);
|
|
24
|
+
if (code < 0x20 || code === 0x7f)
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* URL de `src` acceptable : `http(s):`, `blob:`, `data:image/…` ou URL relative (sans
|
|
31
|
+
* schéma). Tout autre schéma (`javascript:`, `vbscript:`, `data:text/html`…) ou un
|
|
32
|
+
* caractère de contrôle (que les navigateurs retirent avant d'analyser le schéma) est
|
|
33
|
+
* refusé : défense en profondeur, `word` est le seul producteur de ce HTML.
|
|
34
|
+
*/
|
|
35
|
+
export function isSafeImageUrl(url) {
|
|
36
|
+
const trimmed = url.trim();
|
|
37
|
+
if (trimmed === '' || hasControlChar(trimmed))
|
|
38
|
+
return false;
|
|
39
|
+
const scheme = URL_SCHEME.exec(trimmed)?.[1]?.toLowerCase();
|
|
40
|
+
if (scheme === undefined)
|
|
41
|
+
return true;
|
|
42
|
+
if (scheme === 'data')
|
|
43
|
+
return /^data:image\//i.test(trimmed);
|
|
44
|
+
return SAFE_URL_SCHEMES.has(scheme);
|
|
45
|
+
}
|
|
46
|
+
/** Dimension en pixels entiers bornée à `MAX_IMAGE_PX`, `undefined` si nulle, négative ou non finie. */
|
|
47
|
+
function boundedPx(value) {
|
|
48
|
+
if (value === undefined || !Number.isFinite(value) || value <= 0)
|
|
49
|
+
return undefined;
|
|
50
|
+
return Math.min(Math.round(value), MAX_IMAGE_PX);
|
|
51
|
+
}
|
|
52
|
+
/** Types MIME par extension des images que l'éditeur affiche. */
|
|
53
|
+
const MIME_BY_EXTENSION = new Map([
|
|
54
|
+
['png', 'image/png'],
|
|
55
|
+
['jpg', 'image/jpeg'],
|
|
56
|
+
['jpeg', 'image/jpeg'],
|
|
57
|
+
['gif', 'image/gif'],
|
|
58
|
+
['bmp', 'image/bmp'],
|
|
59
|
+
['svg', 'image/svg+xml'],
|
|
60
|
+
['webp', 'image/webp'],
|
|
61
|
+
]);
|
|
62
|
+
/** Formats que les navigateurs n'affichent pas : image ignorée avec avertissement. */
|
|
63
|
+
const UNSUPPORTED_EXTENSIONS = new Set(['emf', 'wmf', 'tif', 'tiff']);
|
|
64
|
+
const ALIGNMENTS = new Set(['left', 'center', 'right']);
|
|
65
|
+
/** Attribut `r:…` (espace de noms des relations), avec repli sur le nom préfixé. */
|
|
66
|
+
export function relationshipAttribute(element, name) {
|
|
67
|
+
return element.getAttributeNS(R_NS, name) ?? element.getAttribute(`r:${name}`) ?? '';
|
|
68
|
+
}
|
|
69
|
+
/** Attribut par nom local quel que soit son préfixe (`o:title` VML), `null` si absent. */
|
|
70
|
+
function attributeByLocalName(element, localName) {
|
|
71
|
+
if (!element)
|
|
72
|
+
return null;
|
|
73
|
+
for (const attribute of Array.from(element.attributes)) {
|
|
74
|
+
if (attribute.localName === localName)
|
|
75
|
+
return attribute.value;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function extensionOf(path) {
|
|
80
|
+
const match = /\.([a-z0-9]+)$/i.exec(path);
|
|
81
|
+
return match?.[1]?.toLowerCase() ?? '';
|
|
82
|
+
}
|
|
83
|
+
/** Nom de fichier passé au hook `upload` : `image-1.png`, dérivé du type MIME. */
|
|
84
|
+
function imageFileName(mime, index) {
|
|
85
|
+
const subtype = mime.split('/')[1] ?? 'bin';
|
|
86
|
+
const extension = subtype.split('+')[0] ?? 'bin';
|
|
87
|
+
return `image-${String(index)}.${extension}`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Data URL base64 depuis des octets, par morceaux pour ne pas dépasser la taille maximale
|
|
91
|
+
* d'arguments de `String.fromCharCode`. `btoa` et non `Buffer` : le lecteur tourne dans
|
|
92
|
+
* le navigateur.
|
|
93
|
+
*/
|
|
94
|
+
export function bytesToDataUrl(bytes, mime) {
|
|
95
|
+
const CHUNK = 0x8000;
|
|
96
|
+
let binary = '';
|
|
97
|
+
for (let offset = 0; offset < bytes.length; offset += CHUNK) {
|
|
98
|
+
binary += String.fromCharCode(...bytes.subarray(offset, offset + CHUNK));
|
|
99
|
+
}
|
|
100
|
+
return `data:${mime};base64,${btoa(binary)}`;
|
|
101
|
+
}
|
|
102
|
+
/** Longueur CSS d'un `style` VML (`width:72pt`) en pixels entiers ; l'exposant (`1e9pt`) est lu. */
|
|
103
|
+
function vmlLengthPx(style, property) {
|
|
104
|
+
const match = new RegExp(`(?:^|;)\\s*${property}\\s*:\\s*(-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)(pt|px|in|cm|mm)?`, 'i').exec(style);
|
|
105
|
+
if (!match?.[1])
|
|
106
|
+
return undefined;
|
|
107
|
+
const value = Number(match[1]);
|
|
108
|
+
if (!Number.isFinite(value))
|
|
109
|
+
return undefined;
|
|
110
|
+
switch ((match[2] ?? 'pt').toLowerCase()) {
|
|
111
|
+
case 'px':
|
|
112
|
+
return Math.round(value);
|
|
113
|
+
case 'in':
|
|
114
|
+
return Math.round(value * 96);
|
|
115
|
+
case 'cm':
|
|
116
|
+
return Math.round((value / 2.54) * 96);
|
|
117
|
+
case 'mm':
|
|
118
|
+
return Math.round((value / 25.4) * 96);
|
|
119
|
+
default:
|
|
120
|
+
return ptToPx(value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Lit un `w:drawing` : image `pic:pic/pic:blipFill/a:blip` (un `a:blip` ailleurs est le
|
|
125
|
+
* fond d'une forme, pas une image), dimensions `wp:extent`, `wp:docPr`, alignement d'ancre.
|
|
126
|
+
*/
|
|
127
|
+
function readDrawing(drawing) {
|
|
128
|
+
const pic = allNamed(drawing, 'pic')[0];
|
|
129
|
+
const blip = pic ? allNamed(pic, 'blip')[0] : undefined;
|
|
130
|
+
if (!blip)
|
|
131
|
+
return null;
|
|
132
|
+
const relId = relationshipAttribute(blip, 'embed');
|
|
133
|
+
if (!relId)
|
|
134
|
+
return null;
|
|
135
|
+
const container = childNamed(drawing, 'anchor') ?? childNamed(drawing, 'inline') ?? drawing;
|
|
136
|
+
const extent = childNamed(container, 'extent');
|
|
137
|
+
const cx = Number(extent?.getAttribute('cx') ?? '');
|
|
138
|
+
const cy = Number(extent?.getAttribute('cy') ?? '');
|
|
139
|
+
const docPr = childNamed(container, 'docPr');
|
|
140
|
+
const spec = {
|
|
141
|
+
relId,
|
|
142
|
+
alt: docPr?.getAttribute('descr') ?? '',
|
|
143
|
+
};
|
|
144
|
+
const width = boundedPx(cx > 0 ? emuToPx(cx) : undefined);
|
|
145
|
+
const height = boundedPx(cy > 0 ? emuToPx(cy) : undefined);
|
|
146
|
+
if (width !== undefined)
|
|
147
|
+
spec.width = width;
|
|
148
|
+
if (height !== undefined)
|
|
149
|
+
spec.height = height;
|
|
150
|
+
const title = docPr?.getAttribute('title');
|
|
151
|
+
if (title)
|
|
152
|
+
spec.title = title;
|
|
153
|
+
if (container.localName === 'anchor') {
|
|
154
|
+
const positionH = childNamed(container, 'positionH');
|
|
155
|
+
const align = positionH ? childNamed(positionH, 'align')?.textContent?.trim() : undefined;
|
|
156
|
+
if (align && ALIGNMENTS.has(align))
|
|
157
|
+
spec.align = align;
|
|
158
|
+
}
|
|
159
|
+
return spec;
|
|
160
|
+
}
|
|
161
|
+
/** Lit un `w:pict` VML : `v:imagedata r:id`, dimensions du `style` de la forme. */
|
|
162
|
+
function readPict(pict) {
|
|
163
|
+
const imagedata = allNamed(pict, 'imagedata')[0];
|
|
164
|
+
if (!imagedata)
|
|
165
|
+
return null;
|
|
166
|
+
const relId = relationshipAttribute(imagedata, 'id');
|
|
167
|
+
if (!relId)
|
|
168
|
+
return null;
|
|
169
|
+
const shape = imagedata.parentElement;
|
|
170
|
+
const style = shape?.getAttribute('style') ?? '';
|
|
171
|
+
const spec = {
|
|
172
|
+
relId,
|
|
173
|
+
alt: attributeByLocalName(imagedata, 'title') ?? attributeByLocalName(shape, 'alt') ?? '',
|
|
174
|
+
};
|
|
175
|
+
const width = boundedPx(vmlLengthPx(style, 'width'));
|
|
176
|
+
const height = boundedPx(vmlLengthPx(style, 'height'));
|
|
177
|
+
if (width !== undefined)
|
|
178
|
+
spec.width = width;
|
|
179
|
+
if (height !== undefined)
|
|
180
|
+
spec.height = height;
|
|
181
|
+
return spec;
|
|
182
|
+
}
|
|
183
|
+
function renderImg(src, spec) {
|
|
184
|
+
const attrs = [`src="${escapeAttr(src)}"`, `alt="${escapeAttr(spec.alt)}"`];
|
|
185
|
+
if (spec.title)
|
|
186
|
+
attrs.push(`title="${escapeAttr(spec.title)}"`);
|
|
187
|
+
if (spec.width)
|
|
188
|
+
attrs.push(`width="${String(spec.width)}"`);
|
|
189
|
+
if (spec.height)
|
|
190
|
+
attrs.push(`height="${String(spec.height)}"`);
|
|
191
|
+
if (spec.align)
|
|
192
|
+
attrs.push(`data-align="${spec.align}"`);
|
|
193
|
+
return `<img ${attrs.join(' ')}>`;
|
|
194
|
+
}
|
|
195
|
+
function describeError(error) {
|
|
196
|
+
return error instanceof Error ? error.message : String(error);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Fabrique le convertisseur d'images du document. Même contrat que le chemin mammoth :
|
|
200
|
+
* avec `upload`, un `File` est construit depuis les octets et l'URL retournée devient
|
|
201
|
+
* `src` ; en cas d'échec (rejet, valeur non chaîne, vide) on avertit
|
|
202
|
+
* (`image-upload-failed`) et on replie en base64. Les formats non affichables (`emf`,
|
|
203
|
+
* `wmf`, `tiff`) et les images introuvables sont ignorés avec `image-skipped`.
|
|
204
|
+
*/
|
|
205
|
+
export function createImageConverter(pkg, options) {
|
|
206
|
+
let index = 0;
|
|
207
|
+
const skip = (ctx, reason) => {
|
|
208
|
+
ctx.warnings.push({ code: 'image-skipped', message: `Image ignorée : ${reason}.` });
|
|
209
|
+
return '';
|
|
210
|
+
};
|
|
211
|
+
const resolveSrc = async (bytes, mime, ctx) => {
|
|
212
|
+
const { upload } = options;
|
|
213
|
+
if (!upload)
|
|
214
|
+
return bytesToDataUrl(bytes, mime);
|
|
215
|
+
try {
|
|
216
|
+
// `slice()` donne une vue sur un `ArrayBuffer` propre, ce que `File` exige (pas de `SharedArrayBuffer`).
|
|
217
|
+
const file = new File([bytes.slice()], imageFileName(mime, index), { type: mime });
|
|
218
|
+
// Typé `unknown` : un hook JavaScript peut résoudre n'importe quoi malgré la signature.
|
|
219
|
+
const url = await upload(file);
|
|
220
|
+
if (typeof url !== 'string' || url.trim() === '') {
|
|
221
|
+
throw new Error("le hook upload n'a pas renvoyé d'URL");
|
|
222
|
+
}
|
|
223
|
+
if (!isSafeImageUrl(url)) {
|
|
224
|
+
throw new Error(`URL refusée (schéma non autorisé) : ${url.trim().slice(0, 40)}`);
|
|
225
|
+
}
|
|
226
|
+
return url.trim();
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
ctx.warnings.push({
|
|
230
|
+
code: 'image-upload-failed',
|
|
231
|
+
message: `Upload de l'image ${String(index)} échoué, repli en base64 : ${describeError(error)}`,
|
|
232
|
+
});
|
|
233
|
+
return bytesToDataUrl(bytes, mime);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Signale un objet perdu et rend son texte éventuel. Chaque dessin est signalé : deux
|
|
238
|
+
* formes anonymes ou deux zones de texte au même contenu sont deux pertes (le
|
|
239
|
+
* dédoublonnage ne vaut que pour ce qui est unique par document, dans `lost.ts`).
|
|
240
|
+
*/
|
|
241
|
+
const report = (lost, ctx) => {
|
|
242
|
+
ctx.lost.push(lost);
|
|
243
|
+
ctx.warnings.push({
|
|
244
|
+
code: 'object-lost',
|
|
245
|
+
message: `Objet non représentable ignoré (${lost.kind})${lost.detail ? ` : ${lost.detail}` : ''}.`,
|
|
246
|
+
});
|
|
247
|
+
return lost.text ? escapeHtml(lost.text) : '';
|
|
248
|
+
};
|
|
249
|
+
/** Dessin sans image : objet perdu, remplacé par son texte éventuel. */
|
|
250
|
+
const lostDrawing = (drawing, ctx) => {
|
|
251
|
+
const lost = detectLostInline(drawing, ctx);
|
|
252
|
+
return lost ? report(lost, ctx) : '';
|
|
253
|
+
};
|
|
254
|
+
/** Rend l'image du dessin ; une zone de texte qui l'accompagne est signalée et son texte conservé. */
|
|
255
|
+
const convertImage = async (drawing, spec, ctx) => {
|
|
256
|
+
const textbox = textboxLost(drawing, ctx);
|
|
257
|
+
const trailing = textbox ? report(textbox, ctx) : '';
|
|
258
|
+
index += 1;
|
|
259
|
+
const rel = (await pkg.rels(ctx.part)).get(spec.relId);
|
|
260
|
+
if (!rel)
|
|
261
|
+
return skip(ctx, `relation ${spec.relId} introuvable dans ${ctx.part}`) + trailing;
|
|
262
|
+
if (rel.external) {
|
|
263
|
+
return skip(ctx, `image externe non embarquée (${rel.target})`) + trailing;
|
|
264
|
+
}
|
|
265
|
+
const extension = extensionOf(rel.target);
|
|
266
|
+
if (UNSUPPORTED_EXTENSIONS.has(extension)) {
|
|
267
|
+
return skip(ctx, `format ${extension} non affichable (${rel.target})`) + trailing;
|
|
268
|
+
}
|
|
269
|
+
const mime = MIME_BY_EXTENSION.get(extension);
|
|
270
|
+
if (!mime)
|
|
271
|
+
return skip(ctx, `format inconnu (${rel.target})`) + trailing;
|
|
272
|
+
const bytes = await pkg.binary(rel.target);
|
|
273
|
+
if (!bytes)
|
|
274
|
+
return skip(ctx, `partie ${rel.target} absente du paquet`) + trailing;
|
|
275
|
+
return renderImg(await resolveSrc(bytes, mime, ctx), spec) + trailing;
|
|
276
|
+
};
|
|
277
|
+
return {
|
|
278
|
+
async drawing(element, ctx) {
|
|
279
|
+
// `mc:AlternateContent` : on convertit le contenu retenu (`mc:Choice`), jamais les deux.
|
|
280
|
+
const drawing = alternateContentChoice(element) ?? element;
|
|
281
|
+
const spec = drawing.localName === 'pict' ? readPict(drawing) : readDrawing(drawing);
|
|
282
|
+
if (!spec)
|
|
283
|
+
return lostDrawing(drawing, ctx);
|
|
284
|
+
return convertImage(drawing, spec, ctx);
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../../src/docx/reader/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConverterContext, ContextPatch, ReaderOptions, ReaderResult } from './types';
|
|
2
|
+
/** Dérive un contexte pour une autre partie ou un autre conteneur, sans recréer les résolveurs. */
|
|
3
|
+
export declare function deriveContext(ctx: ConverterContext, patch: ContextPatch): ConverterContext;
|
|
4
|
+
/**
|
|
5
|
+
* Lit un `.docx` (octets déjà prétraités pour les variables) et rend le HTML stylé, la mise
|
|
6
|
+
* en page, les objets perdus et les avertissements. Ne lève que si la partie principale
|
|
7
|
+
* est absente ou illisible.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readDocx(buffer: ArrayBuffer, options: ReaderOptions): Promise<ReaderResult>;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/docx/reader/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,YAAY,EACb,MAAM,SAAS,CAAC;AAsEjB,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,GAAG,gBAAgB,CAE1F;AAOD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAmDjG"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { childNamed, childrenNamed } from '../preprocess/xml-utils';
|
|
2
|
+
import { readHeadersFooters } from './headers';
|
|
3
|
+
import { escapeHtml } from './html';
|
|
4
|
+
import { createImageConverter } from './images';
|
|
5
|
+
import { createNumberingResolver, registerListItem, renderBlocks } from './lists';
|
|
6
|
+
import { detectLost } from './lost';
|
|
7
|
+
import { createNoteRegistry } from './notes';
|
|
8
|
+
import { openPackage } from './package';
|
|
9
|
+
import { convertParagraph } from './paragraphs';
|
|
10
|
+
import { readDocumentLang, readSectionLayout } from './sections';
|
|
11
|
+
import { createStyleResolver } from './styles';
|
|
12
|
+
import { convertTable } from './tables';
|
|
13
|
+
/**
|
|
14
|
+
* Lecteur OOXML d'Aster (chemin `fidelity: 'styled'`). Orchestre les modules du dossier :
|
|
15
|
+
* ouvre le paquet, construit les résolveurs (styles, numérotation, images, notes), parcourt
|
|
16
|
+
* le corps bloc par bloc, rend les listes, ajoute les notes, lit la mise en page et les
|
|
17
|
+
* en-têtes et pieds de la dernière section. Figé en phase 0 : les lots L24 et L25
|
|
18
|
+
* remplacent les modules, pas cet orchestrateur.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Enfants bloc d'un conteneur Word. `w:sdt` et `w:customXml` (balises XML personnalisées,
|
|
22
|
+
* bibliographies) sont traversés, les signets et `w:proofErr` ignorés. Chaque paragraphe
|
|
23
|
+
* numéroté est enregistré dans l'ordre du document (`registerListItem`), pour que la
|
|
24
|
+
* numérotation continue à travers les cellules, rendues avant le corps.
|
|
25
|
+
*/
|
|
26
|
+
async function convertBlocks(container, ctx) {
|
|
27
|
+
const blocks = [];
|
|
28
|
+
for (const child of Array.from(container.children)) {
|
|
29
|
+
switch (child.localName) {
|
|
30
|
+
case 'p': {
|
|
31
|
+
const block = await ctx.convert.paragraph(child, ctx);
|
|
32
|
+
registerListItem(block, ctx);
|
|
33
|
+
blocks.push(block);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case 'tbl':
|
|
37
|
+
blocks.push(await ctx.convert.table(child, ctx));
|
|
38
|
+
break;
|
|
39
|
+
case 'sdt': {
|
|
40
|
+
const content = childNamed(child, 'sdtContent');
|
|
41
|
+
if (content)
|
|
42
|
+
blocks.push(...(await convertBlocks(content, ctx)));
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'customXml':
|
|
46
|
+
blocks.push(...(await convertBlocks(child, ctx)));
|
|
47
|
+
break;
|
|
48
|
+
case 'customXmlPr':
|
|
49
|
+
case 'sectPr':
|
|
50
|
+
case 'bookmarkStart':
|
|
51
|
+
case 'bookmarkEnd':
|
|
52
|
+
case 'proofErr':
|
|
53
|
+
case 'commentRangeStart':
|
|
54
|
+
case 'commentRangeEnd':
|
|
55
|
+
case 'permStart':
|
|
56
|
+
case 'permEnd':
|
|
57
|
+
case 'tcPr':
|
|
58
|
+
case 'tblPr':
|
|
59
|
+
case 'tblGrid':
|
|
60
|
+
case 'trPr':
|
|
61
|
+
case 'sdtPr':
|
|
62
|
+
case 'sdtEndPr':
|
|
63
|
+
case 'pPr':
|
|
64
|
+
break;
|
|
65
|
+
default: {
|
|
66
|
+
const lost = detectLost(child, ctx);
|
|
67
|
+
if (lost) {
|
|
68
|
+
ctx.lost.push(lost);
|
|
69
|
+
ctx.warnings.push({
|
|
70
|
+
code: 'object-lost',
|
|
71
|
+
message: `Objet non représentable ignoré (${lost.kind})${lost.detail ? ` : ${lost.detail}` : ''}.`,
|
|
72
|
+
});
|
|
73
|
+
if (lost.text)
|
|
74
|
+
blocks.push({ kind: 'raw', html: `<p>${escapeHtml(lost.text)}</p>` });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return blocks;
|
|
80
|
+
}
|
|
81
|
+
/** Dérive un contexte pour une autre partie ou un autre conteneur, sans recréer les résolveurs. */
|
|
82
|
+
export function deriveContext(ctx, patch) {
|
|
83
|
+
return { ...ctx, ...patch };
|
|
84
|
+
}
|
|
85
|
+
/** `w:sectPr` final du corps (mise en page de la dernière section), `null` s'il manque. */
|
|
86
|
+
function finalSectPr(body) {
|
|
87
|
+
return childNamed(body, 'sectPr');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Lit un `.docx` (octets déjà prétraités pour les variables) et rend le HTML stylé, la mise
|
|
91
|
+
* en page, les objets perdus et les avertissements. Ne lève que si la partie principale
|
|
92
|
+
* est absente ou illisible.
|
|
93
|
+
*/
|
|
94
|
+
export async function readDocx(buffer, options) {
|
|
95
|
+
const pkg = await openPackage(buffer, options.parseXml);
|
|
96
|
+
const main = await pkg.part(pkg.mainPart);
|
|
97
|
+
if (!main) {
|
|
98
|
+
throw new Error(`partie principale ${pkg.mainPart} absente ou illisible`);
|
|
99
|
+
}
|
|
100
|
+
const body = childNamed(main.documentElement, 'body');
|
|
101
|
+
if (!body) {
|
|
102
|
+
throw new Error(`partie principale ${pkg.mainPart} sans élément body`);
|
|
103
|
+
}
|
|
104
|
+
const warnings = [];
|
|
105
|
+
const lost = [];
|
|
106
|
+
const [styles, numbering, notes] = await Promise.all([
|
|
107
|
+
createStyleResolver(pkg),
|
|
108
|
+
createNumberingResolver(pkg),
|
|
109
|
+
createNoteRegistry(pkg, options),
|
|
110
|
+
]);
|
|
111
|
+
const convert = {
|
|
112
|
+
paragraph: convertParagraph,
|
|
113
|
+
table: convertTable,
|
|
114
|
+
blocks: convertBlocks,
|
|
115
|
+
render: renderBlocks,
|
|
116
|
+
};
|
|
117
|
+
const ctx = {
|
|
118
|
+
pkg,
|
|
119
|
+
part: pkg.mainPart,
|
|
120
|
+
where: 'body',
|
|
121
|
+
styles,
|
|
122
|
+
numbering,
|
|
123
|
+
images: createImageConverter(pkg, options),
|
|
124
|
+
notes,
|
|
125
|
+
convert,
|
|
126
|
+
options,
|
|
127
|
+
warnings,
|
|
128
|
+
lost,
|
|
129
|
+
tableStyle: null,
|
|
130
|
+
};
|
|
131
|
+
const blocks = await convertBlocks(body, ctx);
|
|
132
|
+
const sectPr = finalSectPr(body);
|
|
133
|
+
const bodyHtml = renderBlocks(blocks, ctx);
|
|
134
|
+
const notesHtml = options.footnotes ? await notes.render(ctx) : '';
|
|
135
|
+
const lang = await readDocumentLang(pkg);
|
|
136
|
+
const headersFooters = await readEffectiveHeadersFooters(body, ctx);
|
|
137
|
+
const layout = {
|
|
138
|
+
...readSectionLayout(sectPr, styles, lang, warnings),
|
|
139
|
+
...headersFooters,
|
|
140
|
+
};
|
|
141
|
+
return { html: bodyHtml + notesHtml, layout, lost, warnings };
|
|
142
|
+
}
|
|
143
|
+
/** Tous les `w:sectPr` du corps dans l'ordre : ceux des `w:pPr` (fins de section) puis le final. */
|
|
144
|
+
function allSectPrs(body) {
|
|
145
|
+
const result = [];
|
|
146
|
+
for (const p of childrenNamed(body, 'p')) {
|
|
147
|
+
const pPr = childNamed(p, 'pPr');
|
|
148
|
+
const sectPr = pPr ? childNamed(pPr, 'sectPr') : null;
|
|
149
|
+
if (sectPr)
|
|
150
|
+
result.push(sectPr);
|
|
151
|
+
}
|
|
152
|
+
const last = finalSectPr(body);
|
|
153
|
+
if (last)
|
|
154
|
+
result.push(last);
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* En-têtes et pieds effectifs : Word fait hériter chaque section des références de la
|
|
159
|
+
* précédente quand elle n'en déclare pas. On lit donc toutes les sections dans l'ordre, les
|
|
160
|
+
* plus récentes recouvrant les plus anciennes type par type (`default`, `first`, `even`),
|
|
161
|
+
* et `titlePage` vaut celui de la dernière section qui le déclare. Un document dont seule
|
|
162
|
+
* la première section référence un pied (cas client) le conserve ainsi.
|
|
163
|
+
*/
|
|
164
|
+
async function readEffectiveHeadersFooters(body, ctx) {
|
|
165
|
+
const merged = {};
|
|
166
|
+
for (const sectPr of allSectPrs(body)) {
|
|
167
|
+
const section = await readHeadersFooters(sectPr, ctx);
|
|
168
|
+
if (section.headers)
|
|
169
|
+
merged.headers = { ...merged.headers, ...section.headers };
|
|
170
|
+
if (section.footers)
|
|
171
|
+
merged.footers = { ...merged.footers, ...section.footers };
|
|
172
|
+
if (section.titlePage !== undefined)
|
|
173
|
+
merged.titlePage = section.titlePage;
|
|
174
|
+
}
|
|
175
|
+
return merged;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/docx/reader/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Block, ConverterContext, DocxPackage, ListFormat, NumberingResolver } from './types';
|
|
2
|
+
/** Format de numérotation du contrat ; les formats non mappés (`decimalZero`, `ordinal`…) deviennent `1`. */
|
|
3
|
+
export declare function listFormatOf(numFmt: string): ListFormat;
|
|
4
|
+
/** Texte de puce lisible : caractères de polices symboliques remplacés. */
|
|
5
|
+
export declare function normalizeBullet(text: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Valeur de départ (`w:start`, `w:startOverride`) tronquée en entier sûr, sinon 1 : un
|
|
8
|
+
* `start="1e+300"` serait relu en 1 par l'éditeur, l'aller-retour ne serait plus idempotent.
|
|
9
|
+
*/
|
|
10
|
+
export declare function safeStart(value: number | undefined): number;
|
|
11
|
+
/**
|
|
12
|
+
* Crée le résolveur de numérotation. Signature figée : lit `numbering.xml` via
|
|
13
|
+
* `pkg.related(pkg.mainPart, '/numbering')`. Les `w:abstractNum` liés à un style
|
|
14
|
+
* (`w:numStyleLink`) sans niveaux propres donnent une définition vide.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createNumberingResolver(pkg: DocxPackage): Promise<NumberingResolver>;
|
|
17
|
+
/** Nombre d'éléments de premier niveau d'un fragment HTML (`<hr><p>…</p>` → 2). */
|
|
18
|
+
export declare function topLevelElementCount(html: string): number;
|
|
19
|
+
/** Retrait gauche en points du bloc, lu dans son `style` sérialisé, `undefined` sans retrait. */
|
|
20
|
+
export declare function marginLeftPt(html: string): number | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Retire d'un item le retrait venu de la numérotation (`margin-left`, `text-indent` marqués
|
|
23
|
+
* par `data-docx-num-indent`) et l'attribut : dans `<li>` la liste porte le retrait, et
|
|
24
|
+
* l'éditeur ignore l'attribut. Sans l'attribut, le retrait est direct et reste tel quel.
|
|
25
|
+
*/
|
|
26
|
+
export declare function stripNumberingIndent(html: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Enregistre un item dans l'ordre du document et retourne son rang parmi ceux de même
|
|
29
|
+
* `numId:niveau` (un item redémarre les niveaux plus profonds). À appeler à la conversion
|
|
30
|
+
* (`convertBlocks`) : les cellules sont rendues avant le corps, compter au rendu décalerait
|
|
31
|
+
* le corps. Un bloc déjà enregistré garde son rang ; sinon il l'est au rendu.
|
|
32
|
+
*/
|
|
33
|
+
export declare function registerListItem(block: Block, ctx: ConverterContext): number | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Rend une suite de blocs en HTML : paragraphes numérotés consécutifs regroupés en listes
|
|
36
|
+
* imbriquées selon leur niveau ; changement de `numId` à même niveau → liste fermée ;
|
|
37
|
+
* `start` posé si le niveau ne démarre pas à 1 ou si la liste reprend après interruption,
|
|
38
|
+
* y compris à travers une cellule, une note ou un en-tête (Word continue, HTML repart à 1).
|
|
39
|
+
* Un `<p>` non numéroté (jamais un titre) qui suit un item avec un retrait au moins égal
|
|
40
|
+
* reste dans le même `<li>` ; un bloc à plusieurs frères (saut de page) reste hors liste.
|
|
41
|
+
* `emptyParagraphs: 'drop'` retire les paragraphes vides.
|
|
42
|
+
*/
|
|
43
|
+
export declare function renderBlocks(blocks: readonly Block[], ctx: ConverterContext): string;
|
|
44
|
+
//# sourceMappingURL=lists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../../src/docx/reader/lists.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,KAAK,EACL,gBAAgB,EAChB,WAAW,EAEX,UAAU,EAEV,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAyCjB,6GAA6G;AAC7G,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAEvD;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI3D;AAuBD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuD1F;AAKD,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAezD;AAKD,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK7D;AAQD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBzD;AAqED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAmBxF;AAcD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAmEpF"}
|