@aster-editor/word 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +204 -82
- package/dist/docx/compare/align.d.ts +24 -0
- package/dist/docx/compare/align.d.ts.map +1 -0
- package/dist/docx/compare/align.js +217 -0
- package/dist/docx/compare/align.js.map +1 -0
- package/dist/docx/compare/compare-blocks.d.ts +29 -0
- package/dist/docx/compare/compare-blocks.d.ts.map +1 -0
- package/dist/docx/compare/compare-blocks.js +234 -0
- package/dist/docx/compare/compare-blocks.js.map +1 -0
- package/dist/docx/compare/compare-context.d.ts +25 -0
- package/dist/docx/compare/compare-context.d.ts.map +1 -0
- package/dist/docx/compare/compare-context.js +31 -0
- package/dist/docx/compare/compare-context.js.map +1 -0
- package/dist/docx/compare/compare-docx.d.ts +4 -0
- package/dist/docx/compare/compare-docx.d.ts.map +1 -0
- package/dist/docx/compare/compare-docx.js +173 -0
- package/dist/docx/compare/compare-docx.js.map +1 -0
- package/dist/docx/compare/compare-tables.d.ts +13 -0
- package/dist/docx/compare/compare-tables.d.ts.map +1 -0
- package/dist/docx/compare/compare-tables.js +47 -0
- package/dist/docx/compare/compare-tables.js.map +1 -0
- package/dist/docx/compare/model-borders.d.ts +27 -0
- package/dist/docx/compare/model-borders.d.ts.map +1 -0
- package/dist/docx/compare/model-borders.js +41 -0
- package/dist/docx/compare/model-borders.js.map +1 -0
- package/dist/docx/compare/model-paragraph.d.ts +25 -0
- package/dist/docx/compare/model-paragraph.d.ts.map +1 -0
- package/dist/docx/compare/model-paragraph.js +309 -0
- package/dist/docx/compare/model-paragraph.js.map +1 -0
- package/dist/docx/compare/model-sections.d.ts +11 -0
- package/dist/docx/compare/model-sections.d.ts.map +1 -0
- package/dist/docx/compare/model-sections.js +97 -0
- package/dist/docx/compare/model-sections.js.map +1 -0
- package/dist/docx/compare/model.d.ts +113 -0
- package/dist/docx/compare/model.d.ts.map +1 -0
- package/dist/docx/compare/model.js +214 -0
- package/dist/docx/compare/model.js.map +1 -0
- package/dist/docx/compare/parts.d.ts +40 -0
- package/dist/docx/compare/parts.d.ts.map +1 -0
- package/dist/docx/compare/parts.js +113 -0
- package/dist/docx/compare/parts.js.map +1 -0
- package/dist/docx/compare/tally.d.ts +23 -0
- package/dist/docx/compare/tally.d.ts.map +1 -0
- package/dist/docx/compare/tally.js +94 -0
- package/dist/docx/compare/tally.js.map +1 -0
- package/dist/docx/compare/types.d.ts +55 -0
- package/dist/docx/compare/types.d.ts.map +1 -0
- package/dist/docx/compare/types.js +2 -0
- package/dist/docx/compare/types.js.map +1 -0
- package/dist/docx/compare/values.d.ts +13 -0
- package/dist/docx/compare/values.d.ts.map +1 -0
- package/dist/docx/compare/values.js +44 -0
- package/dist/docx/compare/values.js.map +1 -0
- package/dist/docx/import-docx.d.ts.map +1 -1
- package/dist/docx/import-docx.js +57 -2
- package/dist/docx/import-docx.js.map +1 -1
- package/dist/docx/preprocess/variables.d.ts.map +1 -1
- package/dist/docx/preprocess/variables.js +2 -2
- package/dist/docx/preprocess/variables.js.map +1 -1
- package/dist/docx/preprocess/xml-utils.d.ts +7 -0
- package/dist/docx/preprocess/xml-utils.d.ts.map +1 -1
- package/dist/docx/preprocess/xml-utils.js +9 -0
- package/dist/docx/preprocess/xml-utils.js.map +1 -1
- package/dist/docx/reader/headers.d.ts +17 -0
- package/dist/docx/reader/headers.d.ts.map +1 -0
- package/dist/docx/reader/headers.js +64 -0
- package/dist/docx/reader/headers.js.map +1 -0
- package/dist/docx/reader/html.d.ts +12 -0
- package/dist/docx/reader/html.d.ts.map +1 -0
- package/dist/docx/reader/html.js +27 -0
- package/dist/docx/reader/html.js.map +1 -0
- package/dist/docx/reader/images.d.ts +27 -0
- package/dist/docx/reader/images.d.ts.map +1 -0
- package/dist/docx/reader/images.js +288 -0
- package/dist/docx/reader/images.js.map +1 -0
- package/dist/docx/reader/index.d.ts +10 -0
- package/dist/docx/reader/index.d.ts.map +1 -0
- package/dist/docx/reader/index.js +177 -0
- package/dist/docx/reader/index.js.map +1 -0
- package/dist/docx/reader/lists.d.ts +44 -0
- package/dist/docx/reader/lists.d.ts.map +1 -0
- package/dist/docx/reader/lists.js +360 -0
- package/dist/docx/reader/lists.js.map +1 -0
- package/dist/docx/reader/lost.d.ts +30 -0
- package/dist/docx/reader/lost.d.ts.map +1 -0
- package/dist/docx/reader/lost.js +215 -0
- package/dist/docx/reader/lost.js.map +1 -0
- package/dist/docx/reader/notes.d.ts +4 -0
- package/dist/docx/reader/notes.d.ts.map +1 -0
- package/dist/docx/reader/notes.js +112 -0
- package/dist/docx/reader/notes.js.map +1 -0
- package/dist/docx/reader/package.d.ts +16 -0
- package/dist/docx/reader/package.d.ts.map +1 -0
- package/dist/docx/reader/package.js +138 -0
- package/dist/docx/reader/package.js.map +1 -0
- package/dist/docx/reader/paragraphs.d.ts +15 -0
- package/dist/docx/reader/paragraphs.d.ts.map +1 -0
- package/dist/docx/reader/paragraphs.js +162 -0
- package/dist/docx/reader/paragraphs.js.map +1 -0
- package/dist/docx/reader/properties.d.ts +90 -0
- package/dist/docx/reader/properties.d.ts.map +1 -0
- package/dist/docx/reader/properties.js +402 -0
- package/dist/docx/reader/properties.js.map +1 -0
- package/dist/docx/reader/runs.d.ts +49 -0
- package/dist/docx/reader/runs.d.ts.map +1 -0
- package/dist/docx/reader/runs.js +442 -0
- package/dist/docx/reader/runs.js.map +1 -0
- package/dist/docx/reader/sections.d.ts +36 -0
- package/dist/docx/reader/sections.d.ts.map +1 -0
- package/dist/docx/reader/sections.js +158 -0
- package/dist/docx/reader/sections.js.map +1 -0
- package/dist/docx/reader/styles.d.ts +24 -0
- package/dist/docx/reader/styles.d.ts.map +1 -0
- package/dist/docx/reader/styles.js +383 -0
- package/dist/docx/reader/styles.js.map +1 -0
- package/dist/docx/reader/tables.d.ts +6 -0
- package/dist/docx/reader/tables.d.ts.map +1 -0
- package/dist/docx/reader/tables.js +175 -0
- package/dist/docx/reader/tables.js.map +1 -0
- package/dist/docx/reader/test-support.d.ts +25 -0
- package/dist/docx/reader/test-support.d.ts.map +1 -0
- package/dist/docx/reader/test-support.js +135 -0
- package/dist/docx/reader/test-support.js.map +1 -0
- package/dist/docx/reader/testing-blocks.d.ts +50 -0
- package/dist/docx/reader/testing-blocks.d.ts.map +1 -0
- package/dist/docx/reader/testing-blocks.js +302 -0
- package/dist/docx/reader/testing-blocks.js.map +1 -0
- package/dist/docx/reader/types.d.ts +181 -0
- package/dist/docx/reader/types.d.ts.map +1 -0
- package/dist/docx/reader/types.js +2 -0
- package/dist/docx/reader/types.js.map +1 -0
- package/dist/docx/reader/units-blocks.d.ts +75 -0
- package/dist/docx/reader/units-blocks.d.ts.map +1 -0
- package/dist/docx/reader/units-blocks.js +254 -0
- package/dist/docx/reader/units-blocks.js.map +1 -0
- package/dist/docx/reader/units.d.ts +72 -0
- package/dist/docx/reader/units.d.ts.map +1 -0
- package/dist/docx/reader/units.js +177 -0
- package/dist/docx/reader/units.js.map +1 -0
- package/dist/docx/types.d.ts +40 -2
- package/dist/docx/types.d.ts.map +1 -1
- package/dist/docx/writer/content-types.d.ts +30 -0
- package/dist/docx/writer/content-types.d.ts.map +1 -0
- package/dist/docx/writer/content-types.js +81 -0
- package/dist/docx/writer/content-types.js.map +1 -0
- package/dist/docx/writer/core-properties.d.ts +16 -0
- package/dist/docx/writer/core-properties.d.ts.map +1 -0
- package/dist/docx/writer/core-properties.js +64 -0
- package/dist/docx/writer/core-properties.js.map +1 -0
- package/dist/docx/writer/footnotes-merge.d.ts +30 -0
- package/dist/docx/writer/footnotes-merge.d.ts.map +1 -0
- package/dist/docx/writer/footnotes-merge.js +71 -0
- package/dist/docx/writer/footnotes-merge.js.map +1 -0
- package/dist/docx/writer/graft.d.ts +41 -0
- package/dist/docx/writer/graft.d.ts.map +1 -0
- package/dist/docx/writer/graft.js +277 -0
- package/dist/docx/writer/graft.js.map +1 -0
- package/dist/docx/writer/header-footer-graft.d.ts +34 -0
- package/dist/docx/writer/header-footer-graft.d.ts.map +1 -0
- package/dist/docx/writer/header-footer-graft.js +155 -0
- package/dist/docx/writer/header-footer-graft.js.map +1 -0
- package/dist/docx/writer/header-footer-variables.d.ts +25 -0
- package/dist/docx/writer/header-footer-variables.d.ts.map +1 -0
- package/dist/docx/writer/header-footer-variables.js +101 -0
- package/dist/docx/writer/header-footer-variables.js.map +1 -0
- package/dist/docx/writer/media.d.ts +32 -0
- package/dist/docx/writer/media.d.ts.map +1 -0
- package/dist/docx/writer/media.js +88 -0
- package/dist/docx/writer/media.js.map +1 -0
- package/dist/docx/writer/numbering-merge.d.ts +37 -0
- package/dist/docx/writer/numbering-merge.d.ts.map +1 -0
- package/dist/docx/writer/numbering-merge.js +140 -0
- package/dist/docx/writer/numbering-merge.js.map +1 -0
- package/dist/docx/writer/relationships.d.ts +63 -0
- package/dist/docx/writer/relationships.d.ts.map +1 -0
- package/dist/docx/writer/relationships.js +127 -0
- package/dist/docx/writer/relationships.js.map +1 -0
- package/dist/docx/writer/settings-merge.d.ts +21 -0
- package/dist/docx/writer/settings-merge.d.ts.map +1 -0
- package/dist/docx/writer/settings-merge.js +165 -0
- package/dist/docx/writer/settings-merge.js.map +1 -0
- package/dist/docx/writer/style-reconcile.d.ts +29 -0
- package/dist/docx/writer/style-reconcile.d.ts.map +1 -0
- package/dist/docx/writer/style-reconcile.js +319 -0
- package/dist/docx/writer/style-reconcile.js.map +1 -0
- package/dist/docx/writer/style-strip.d.ts +33 -0
- package/dist/docx/writer/style-strip.d.ts.map +1 -0
- package/dist/docx/writer/style-strip.js +267 -0
- package/dist/docx/writer/style-strip.js.map +1 -0
- package/dist/docx/writer/styles-merge.d.ts +57 -0
- package/dist/docx/writer/styles-merge.d.ts.map +1 -0
- package/dist/docx/writer/styles-merge.js +184 -0
- package/dist/docx/writer/styles-merge.js.map +1 -0
- package/dist/docx/writer/template.d.ts +48 -0
- package/dist/docx/writer/template.d.ts.map +1 -0
- package/dist/docx/writer/template.js +280 -0
- package/dist/docx/writer/template.js.map +1 -0
- package/dist/docx/writer/testing.d.ts +52 -0
- package/dist/docx/writer/testing.d.ts.map +1 -0
- package/dist/docx/writer/testing.js +318 -0
- package/dist/docx/writer/testing.js.map +1 -0
- package/dist/docx/writer/xml-io.d.ts +90 -0
- package/dist/docx/writer/xml-io.d.ts.map +1 -0
- package/dist/docx/writer/xml-io.js +215 -0
- package/dist/docx/writer/xml-io.js.map +1 -0
- package/dist/export/blocks.d.ts.map +1 -1
- package/dist/export/blocks.js +149 -12
- package/dist/export/blocks.js.map +1 -1
- package/dist/export/context.d.ts +34 -2
- package/dist/export/context.d.ts.map +1 -1
- package/dist/export/context.js +28 -2
- package/dist/export/context.js.map +1 -1
- package/dist/export/css.d.ts +58 -0
- package/dist/export/css.d.ts.map +1 -1
- package/dist/export/css.js +194 -0
- package/dist/export/css.js.map +1 -1
- package/dist/export/dom.d.ts +2 -0
- package/dist/export/dom.d.ts.map +1 -1
- package/dist/export/dom.js +2 -0
- package/dist/export/dom.js.map +1 -1
- package/dist/export/export-docx.d.ts +4 -0
- package/dist/export/export-docx.d.ts.map +1 -1
- package/dist/export/export-docx.js +57 -4
- package/dist/export/export-docx.js.map +1 -1
- package/dist/export/header-footer.d.ts +15 -1
- package/dist/export/header-footer.d.ts.map +1 -1
- package/dist/export/header-footer.js +37 -0
- package/dist/export/header-footer.js.map +1 -1
- package/dist/export/html-to-docx.d.ts +20 -2
- package/dist/export/html-to-docx.d.ts.map +1 -1
- package/dist/export/html-to-docx.js +40 -14
- package/dist/export/html-to-docx.js.map +1 -1
- package/dist/export/inline.d.ts +25 -3
- package/dist/export/inline.d.ts.map +1 -1
- package/dist/export/inline.js +91 -34
- package/dist/export/inline.js.map +1 -1
- package/dist/export/styles.d.ts +51 -7
- package/dist/export/styles.d.ts.map +1 -1
- package/dist/export/styles.js +121 -16
- package/dist/export/styles.js.map +1 -1
- package/dist/export/tables.d.ts.map +1 -1
- package/dist/export/tables.js +140 -12
- package/dist/export/tables.js.map +1 -1
- package/dist/export/types.d.ts +44 -5
- package/dist/export/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer-variables.js","sourceRoot":"","sources":["../../../src/docx/writer/header-footer-variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type RelationshipTable } from './relationships';
|
|
2
|
+
import { type PartStore } from './xml-io';
|
|
3
|
+
/**
|
|
4
|
+
* Copie des médias du paquet généré dans `word/media/` du gabarit. Une image dont les
|
|
5
|
+
* octets existent déjà dans le gabarit réutilise cette partie (et sa relation d'image,
|
|
6
|
+
* s'il y en a une dans la table visée) ; sinon elle est ajoutée sous son nom, suffixé en
|
|
7
|
+
* cas de collision. Rien n'est jamais supprimé. Les extensions nouvelles sont collectées
|
|
8
|
+
* pour `[Content_Types].xml`.
|
|
9
|
+
*/
|
|
10
|
+
export declare class MediaCopier {
|
|
11
|
+
private readonly template;
|
|
12
|
+
private readonly generated;
|
|
13
|
+
private readonly mainPart;
|
|
14
|
+
readonly contentDefaults: Map<string, string>;
|
|
15
|
+
private readonly copied;
|
|
16
|
+
private templateMedia;
|
|
17
|
+
constructor(template: PartStore, generated: PartStore, mainPart: string, contentDefaults: Map<string, string>);
|
|
18
|
+
/**
|
|
19
|
+
* Chemin généré (`word/media/<sha>.png`) → identifiant de relation d'image dans
|
|
20
|
+
* `relationships` (la table de la partie qui référence l'image), `null` si les octets
|
|
21
|
+
* sont introuvables.
|
|
22
|
+
*/
|
|
23
|
+
copy(generatedPath: string, relationships: RelationshipTable): Promise<string | null>;
|
|
24
|
+
/** Partie du gabarit qui porte les octets de l'image générée, copiée au besoin. */
|
|
25
|
+
private store;
|
|
26
|
+
/** Chemin libre dans le dossier `media/` du gabarit, suffixé `-2`, `-3`… si le nom est pris. */
|
|
27
|
+
private freePath;
|
|
28
|
+
/** Partie média du gabarit aux mêmes octets, `null` sinon. */
|
|
29
|
+
private findIdentical;
|
|
30
|
+
private loadTemplateMedia;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/media.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEnE;;;;;;GAMG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAP/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,aAAa,CAAyD;gBAG3D,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EACxB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAG/C;;;;OAIG;IACG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ3F,mFAAmF;YACrE,KAAK;IAYnB,gGAAgG;IAChG,OAAO,CAAC,QAAQ;IAahB,8DAA8D;YAChD,aAAa;YAcb,iBAAiB;CAQhC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { imageContentType } from './content-types';
|
|
2
|
+
import { REL_TYPE } from './relationships';
|
|
3
|
+
import { basenameOf, directoryOf } from './xml-io';
|
|
4
|
+
/**
|
|
5
|
+
* Copie des médias du paquet généré dans `word/media/` du gabarit. Une image dont les
|
|
6
|
+
* octets existent déjà dans le gabarit réutilise cette partie (et sa relation d'image,
|
|
7
|
+
* s'il y en a une dans la table visée) ; sinon elle est ajoutée sous son nom, suffixé en
|
|
8
|
+
* cas de collision. Rien n'est jamais supprimé. Les extensions nouvelles sont collectées
|
|
9
|
+
* pour `[Content_Types].xml`.
|
|
10
|
+
*/
|
|
11
|
+
export class MediaCopier {
|
|
12
|
+
template;
|
|
13
|
+
generated;
|
|
14
|
+
mainPart;
|
|
15
|
+
contentDefaults;
|
|
16
|
+
copied = new Map();
|
|
17
|
+
templateMedia = null;
|
|
18
|
+
constructor(template, generated, mainPart, contentDefaults) {
|
|
19
|
+
this.template = template;
|
|
20
|
+
this.generated = generated;
|
|
21
|
+
this.mainPart = mainPart;
|
|
22
|
+
this.contentDefaults = contentDefaults;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Chemin généré (`word/media/<sha>.png`) → identifiant de relation d'image dans
|
|
26
|
+
* `relationships` (la table de la partie qui référence l'image), `null` si les octets
|
|
27
|
+
* sont introuvables.
|
|
28
|
+
*/
|
|
29
|
+
async copy(generatedPath, relationships) {
|
|
30
|
+
const known = this.copied.get(generatedPath);
|
|
31
|
+
const path = known ?? (await this.store(generatedPath));
|
|
32
|
+
if (path === null)
|
|
33
|
+
return null;
|
|
34
|
+
this.copied.set(generatedPath, path);
|
|
35
|
+
return relationships.ensure(REL_TYPE.image, path, false);
|
|
36
|
+
}
|
|
37
|
+
/** Partie du gabarit qui porte les octets de l'image générée, copiée au besoin. */
|
|
38
|
+
async store(generatedPath) {
|
|
39
|
+
const bytes = await this.generated.binary(generatedPath);
|
|
40
|
+
if (!bytes)
|
|
41
|
+
return null;
|
|
42
|
+
const extension = basenameOf(generatedPath).split('.').pop()?.toLowerCase() ?? '';
|
|
43
|
+
const existing = await this.findIdentical(bytes, extension);
|
|
44
|
+
if (existing)
|
|
45
|
+
return existing;
|
|
46
|
+
const path = this.freePath(generatedPath);
|
|
47
|
+
this.template.write(path, bytes);
|
|
48
|
+
if (extension)
|
|
49
|
+
this.contentDefaults.set(extension, imageContentType(extension));
|
|
50
|
+
return path;
|
|
51
|
+
}
|
|
52
|
+
/** Chemin libre dans le dossier `media/` du gabarit, suffixé `-2`, `-3`… si le nom est pris. */
|
|
53
|
+
freePath(generatedPath) {
|
|
54
|
+
const name = basenameOf(generatedPath);
|
|
55
|
+
const dot = name.lastIndexOf('.');
|
|
56
|
+
const stem = dot < 0 ? name : name.slice(0, dot);
|
|
57
|
+
const extension = dot < 0 ? '' : name.slice(dot);
|
|
58
|
+
const directory = `${directoryOf(this.mainPart)}media/`;
|
|
59
|
+
let candidate = `${directory}${name}`;
|
|
60
|
+
for (let index = 2; this.template.has(candidate); index += 1) {
|
|
61
|
+
candidate = `${directory}${stem}-${String(index)}${extension}`;
|
|
62
|
+
}
|
|
63
|
+
return candidate;
|
|
64
|
+
}
|
|
65
|
+
/** Partie média du gabarit aux mêmes octets, `null` sinon. */
|
|
66
|
+
async findIdentical(bytes, extension) {
|
|
67
|
+
this.templateMedia ??= this.loadTemplateMedia();
|
|
68
|
+
for (const [path, candidate] of await this.templateMedia) {
|
|
69
|
+
if (!path.toLowerCase().endsWith(`.${extension}`) ||
|
|
70
|
+
candidate.byteLength !== bytes.byteLength) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (candidate.every((byte, index) => byte === bytes[index]))
|
|
74
|
+
return path;
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
async loadTemplateMedia() {
|
|
79
|
+
const map = new Map();
|
|
80
|
+
for (const path of this.template.paths(`${directoryOf(this.mainPart)}media/`)) {
|
|
81
|
+
const bytes = await this.template.binary(path);
|
|
82
|
+
if (bytes)
|
|
83
|
+
map.set(path, bytes);
|
|
84
|
+
}
|
|
85
|
+
return map;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/docx/writer/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ListDefinition } from '../../export/context';
|
|
2
|
+
import type { DocxExportWarning } from '../../export/types';
|
|
3
|
+
import { type RelationshipTable } from './relationships';
|
|
4
|
+
import { type PartStore } from './xml-io';
|
|
5
|
+
/**
|
|
6
|
+
* Numérotation des listes du corps greffé. La lib `docx` numérote ses `w:num` à partir
|
|
7
|
+
* de 1 : chaque `w:numId` du corps est remappé. Une liste qui portait `data-docx-num-id`
|
|
8
|
+
* **réutilise** le `w:num` du gabarit (même compteur, mêmes puces, mêmes retraits que
|
|
9
|
+
* l'original) ; les autres voient leur `w:num` et leur `w:abstractNum` générés
|
|
10
|
+
* **ajoutés** à `numbering.xml` sous des identifiants libres. Les définitions du gabarit
|
|
11
|
+
* ne sont jamais modifiées. Sans `numbering.xml` dans le gabarit, la partie est créée.
|
|
12
|
+
*/
|
|
13
|
+
export interface NumberingMergerInput {
|
|
14
|
+
readonly template: PartStore;
|
|
15
|
+
readonly generated: PartStore;
|
|
16
|
+
/** Partie principale du gabarit, dont dépend l'emplacement de `numbering.xml`. */
|
|
17
|
+
readonly mainPart: string;
|
|
18
|
+
/** Chemin de `numbering.xml` dans le gabarit (relation `/numbering`), `null` s'il n'en a pas. */
|
|
19
|
+
readonly templatePath: string | null;
|
|
20
|
+
readonly relationships: RelationshipTable;
|
|
21
|
+
readonly lists: readonly ListDefinition[];
|
|
22
|
+
/** `numId` généré → référence `numbering` de l'export (`document.Numbering` après empaquetage). */
|
|
23
|
+
readonly concrete: ReadonlyMap<string, string>;
|
|
24
|
+
readonly warnings: DocxExportWarning[];
|
|
25
|
+
}
|
|
26
|
+
export interface NumberingMerger {
|
|
27
|
+
/** `numId` du corps généré → `numId` à écrire dans le gabarit. */
|
|
28
|
+
remap(numId: string): Promise<string>;
|
|
29
|
+
/** Partie `numbering.xml` créée dans le gabarit, à déclarer dans `[Content_Types].xml`. */
|
|
30
|
+
readonly createdPart: () => {
|
|
31
|
+
readonly path: string;
|
|
32
|
+
readonly contentType: string;
|
|
33
|
+
} | null;
|
|
34
|
+
}
|
|
35
|
+
/** Crée le fusionneur de numérotation du gabarit. */
|
|
36
|
+
export declare function createNumberingMerger(input: NumberingMergerInput): Promise<NumberingMerger>;
|
|
37
|
+
//# sourceMappingURL=numbering-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbering-merge.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/numbering-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAyD,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjG;;;;;;;GAOG;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iGAAiG;IACjG,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,EAAE,MAAM;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5F;AAQD,qDAAqD;AACrD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqIjG"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { childNamed, childrenNamed } from '../preprocess/xml-utils';
|
|
2
|
+
import { PART_CONTENT_TYPES } from './content-types';
|
|
3
|
+
import { REL_TYPE } from './relationships';
|
|
4
|
+
import { directoryOf, emptyDocumentLike, setWordAttr, wordAttr } from './xml-io';
|
|
5
|
+
/** Chemin par défaut de `numbering.xml`, à côté de la partie principale. */
|
|
6
|
+
const NUMBERING_FILE = 'numbering.xml';
|
|
7
|
+
/** Plus grand `ST_DecimalNumber` (`xsd:int`) qu'un `w:numId` ou `w:abstractNumId` peut porter. */
|
|
8
|
+
const MAX_DECIMAL_NUMBER = 2_147_483_647;
|
|
9
|
+
/** Crée le fusionneur de numérotation du gabarit. */
|
|
10
|
+
export async function createNumberingMerger(input) {
|
|
11
|
+
const generatedDoc = await input.generated.dom('word/numbering.xml');
|
|
12
|
+
let templatePath = input.templatePath;
|
|
13
|
+
let templateDoc = templatePath ? await input.template.dom(templatePath) : null;
|
|
14
|
+
let created = null;
|
|
15
|
+
const remapped = new Map();
|
|
16
|
+
const copiedAbstracts = new Map();
|
|
17
|
+
const warned = new Set();
|
|
18
|
+
const byReference = new Map();
|
|
19
|
+
for (const list of input.lists)
|
|
20
|
+
byReference.set(list.reference, list);
|
|
21
|
+
/** `w:num` et `w:abstractNum` du gabarit, indexés par identifiant (recalculés à chaque ajout). */
|
|
22
|
+
const templateIds = () => {
|
|
23
|
+
const nums = new Map();
|
|
24
|
+
const abstracts = new Map();
|
|
25
|
+
if (templateDoc) {
|
|
26
|
+
for (const num of childrenNamed(templateDoc.documentElement, 'num')) {
|
|
27
|
+
nums.set(wordAttr(num, 'numId'), num);
|
|
28
|
+
}
|
|
29
|
+
for (const abstractNum of childrenNamed(templateDoc.documentElement, 'abstractNum')) {
|
|
30
|
+
abstracts.set(wordAttr(abstractNum, 'abstractNumId'), abstractNum);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { nums, abstracts };
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Identifiant libre : le plus grand + 1 (ids ajoutés après ceux du gabarit, comme Word
|
|
37
|
+
* les attribue), borné à `xsd:int` (`ST_DecimalNumber`, 2^31 - 1) : au-delà, Word
|
|
38
|
+
* répare ou refuse. Quand le gabarit occupe déjà le plafond, premier entier libre
|
|
39
|
+
* à partir de 1.
|
|
40
|
+
*/
|
|
41
|
+
const nextId = (ids) => {
|
|
42
|
+
const taken = new Set();
|
|
43
|
+
let max = 0;
|
|
44
|
+
for (const id of ids) {
|
|
45
|
+
const value = Number(id);
|
|
46
|
+
if (!Number.isFinite(value))
|
|
47
|
+
continue;
|
|
48
|
+
taken.add(value);
|
|
49
|
+
if (value > max)
|
|
50
|
+
max = value;
|
|
51
|
+
}
|
|
52
|
+
if (max < MAX_DECIMAL_NUMBER)
|
|
53
|
+
return String(max + 1);
|
|
54
|
+
let candidate = 1;
|
|
55
|
+
while (taken.has(candidate) && candidate < MAX_DECIMAL_NUMBER)
|
|
56
|
+
candidate += 1;
|
|
57
|
+
return String(candidate);
|
|
58
|
+
};
|
|
59
|
+
const warnFallback = (templateNumId) => {
|
|
60
|
+
if (warned.has(templateNumId))
|
|
61
|
+
return;
|
|
62
|
+
warned.add(templateNumId);
|
|
63
|
+
input.warnings.push({
|
|
64
|
+
code: 'template-numbering-fallback',
|
|
65
|
+
message: `Numérotation ${templateNumId} du gabarit introuvable (data-docx-num-id) : numérotation neuve ajoutée`,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
/** `numbering.xml` du gabarit, créée à la première copie si le gabarit n'en avait pas. */
|
|
69
|
+
const ensureTemplateDoc = async () => {
|
|
70
|
+
if (templateDoc)
|
|
71
|
+
return templateDoc;
|
|
72
|
+
if (!generatedDoc)
|
|
73
|
+
return null;
|
|
74
|
+
templatePath = templatePath ?? `${directoryOf(input.mainPart)}${NUMBERING_FILE}`;
|
|
75
|
+
templateDoc = emptyDocumentLike(generatedDoc);
|
|
76
|
+
input.template.create(templatePath, templateDoc, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
|
|
77
|
+
await input.relationships.ensure(REL_TYPE.numbering, templatePath, false);
|
|
78
|
+
created = { path: templatePath, contentType: PART_CONTENT_TYPES.numbering };
|
|
79
|
+
return templateDoc;
|
|
80
|
+
};
|
|
81
|
+
/** Copie le `w:num` généré (et son `w:abstractNum`) sous des identifiants libres. */
|
|
82
|
+
const copy = async (numId) => {
|
|
83
|
+
const target = await ensureTemplateDoc();
|
|
84
|
+
if (!generatedDoc || !target || !templatePath)
|
|
85
|
+
return numId;
|
|
86
|
+
const generatedNum = childrenNamed(generatedDoc.documentElement, 'num').find((num) => wordAttr(num, 'numId') === numId);
|
|
87
|
+
if (!generatedNum)
|
|
88
|
+
return numId;
|
|
89
|
+
const abstractRef = childNamed(generatedNum, 'abstractNumId');
|
|
90
|
+
const generatedAbstractId = abstractRef ? wordAttr(abstractRef, 'val') : '';
|
|
91
|
+
const generatedAbstract = childrenNamed(generatedDoc.documentElement, 'abstractNum').find((abstractNum) => wordAttr(abstractNum, 'abstractNumId') === generatedAbstractId);
|
|
92
|
+
const root = target.documentElement;
|
|
93
|
+
let abstractId = copiedAbstracts.get(generatedAbstractId);
|
|
94
|
+
if (abstractId === undefined && generatedAbstract) {
|
|
95
|
+
abstractId = nextId(templateIds().abstracts.keys());
|
|
96
|
+
const clone = target.importNode(generatedAbstract, true);
|
|
97
|
+
setWordAttr(clone, 'abstractNumId', abstractId);
|
|
98
|
+
// Schéma : tous les `w:abstractNum` précèdent les `w:num`.
|
|
99
|
+
const firstNum = childNamed(root, 'num');
|
|
100
|
+
root.insertBefore(clone, firstNum);
|
|
101
|
+
copiedAbstracts.set(generatedAbstractId, abstractId);
|
|
102
|
+
}
|
|
103
|
+
const newNumId = nextId(templateIds().nums.keys());
|
|
104
|
+
const numClone = target.importNode(generatedNum, true);
|
|
105
|
+
setWordAttr(numClone, 'numId', newNumId);
|
|
106
|
+
const cloneAbstractRef = childNamed(numClone, 'abstractNumId');
|
|
107
|
+
if (cloneAbstractRef && abstractId !== undefined)
|
|
108
|
+
setWordAttr(cloneAbstractRef, 'val', abstractId);
|
|
109
|
+
// `w:numIdMacAtCleanup`, s'il existe, reste le dernier enfant.
|
|
110
|
+
root.insertBefore(numClone, childNamed(root, 'numIdMacAtCleanup'));
|
|
111
|
+
await input.template.markChanged(templatePath);
|
|
112
|
+
return newNumId;
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
async remap(numId) {
|
|
116
|
+
const known = remapped.get(numId);
|
|
117
|
+
if (known !== undefined)
|
|
118
|
+
return known;
|
|
119
|
+
const reference = input.concrete.get(numId);
|
|
120
|
+
const definition = reference === undefined ? undefined : byReference.get(reference);
|
|
121
|
+
let result;
|
|
122
|
+
if (definition?.templateNumId !== undefined) {
|
|
123
|
+
if (templateIds().nums.has(definition.templateNumId)) {
|
|
124
|
+
result = definition.templateNumId;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
warnFallback(definition.templateNumId);
|
|
128
|
+
result = await copy(numId);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
result = await copy(numId);
|
|
133
|
+
}
|
|
134
|
+
remapped.set(numId, result);
|
|
135
|
+
return result;
|
|
136
|
+
},
|
|
137
|
+
createdPart: () => created,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=numbering-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbering-merge.js","sourceRoot":"","sources":["../../../src/docx/writer/numbering-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type PartStore } from './xml-io';
|
|
2
|
+
/**
|
|
3
|
+
* Relations OPC d'une partie (`word/_rels/document.xml.rels`) en lecture et en écriture
|
|
4
|
+
* pour la greffe : les identifiants du corps généré (`rId1`… attribués par la lib `docx`
|
|
5
|
+
* à partir de 1) entrent en collision avec ceux du gabarit, chaque relation du corps est
|
|
6
|
+
* donc **remappée** : réutilisation d'une relation du gabarit de même type et même cible
|
|
7
|
+
* quand elle existe, sinon ajout sous un identifiant libre. Un fichier `.rels` absent
|
|
8
|
+
* n'est créé qu'au premier ajout : une partie sans relation n'en reçoit pas de vide.
|
|
9
|
+
*/
|
|
10
|
+
/** Espace de noms des fichiers `.rels`. */
|
|
11
|
+
export declare const RELATIONSHIPS_NS = "http://schemas.openxmlformats.org/package/2006/relationships";
|
|
12
|
+
/** Types de relations manipulés par la greffe. */
|
|
13
|
+
export declare const REL_TYPE: {
|
|
14
|
+
readonly image: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
|
15
|
+
readonly hyperlink: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink";
|
|
16
|
+
readonly numbering: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
|
|
17
|
+
readonly footnotes: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes";
|
|
18
|
+
readonly styles: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
|
|
19
|
+
readonly settings: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings";
|
|
20
|
+
readonly header: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header";
|
|
21
|
+
readonly footer: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer";
|
|
22
|
+
/** Propriétés du document (`docProps/core.xml`), relation du paquet (`_rels/.rels`). */
|
|
23
|
+
readonly coreProperties: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
|
|
24
|
+
};
|
|
25
|
+
/** Une relation : identifiant, type, cible telle qu'écrite, cible résolue en chemin du zip. */
|
|
26
|
+
export interface RelationshipEntry {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly type: string;
|
|
29
|
+
readonly target: string;
|
|
30
|
+
readonly resolved: string;
|
|
31
|
+
readonly external: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** Table des relations d'une partie, créée (en mémoire) vide si le fichier `.rels` manque. */
|
|
34
|
+
export declare class RelationshipTable {
|
|
35
|
+
private readonly store;
|
|
36
|
+
readonly path: string;
|
|
37
|
+
private readonly partPath;
|
|
38
|
+
private readonly doc;
|
|
39
|
+
/** Vrai tant que le `.rels` n'existe pas dans le paquet : il sera créé au premier ajout. */
|
|
40
|
+
private missing;
|
|
41
|
+
private readonly entries;
|
|
42
|
+
private nextNumber;
|
|
43
|
+
private constructor();
|
|
44
|
+
/** Ouvre les relations de `partPath`. Un `.rels` absent ou illisible donne une table vide. */
|
|
45
|
+
static open(store: PartStore, partPath: string): Promise<RelationshipTable>;
|
|
46
|
+
get(id: string): RelationshipEntry | undefined;
|
|
47
|
+
values(): IterableIterator<RelationshipEntry>;
|
|
48
|
+
/** Première relation de ce type dont la cible résolue (ou l'URL externe) est `resolved`. */
|
|
49
|
+
find(type: string, resolved: string, external: boolean): RelationshipEntry | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Ajoute une relation et rend son identifiant. `target` est une URL (externe) ou un
|
|
52
|
+
* chemin de partie du zip, réécrit relativement au dossier de la partie.
|
|
53
|
+
*/
|
|
54
|
+
add(type: string, target: string, external: boolean): Promise<string>;
|
|
55
|
+
/** Identifiant d'une relation de ce type vers cette cible : existante, sinon ajoutée. */
|
|
56
|
+
ensure(type: string, target: string, external: boolean): Promise<string>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Cible relative au dossier de la partie : `word/media/a.png` depuis `word/document.xml`
|
|
60
|
+
* → `media/a.png` ; hors du dossier, chemin absolu `/x/y.xml` (que Word accepte).
|
|
61
|
+
*/
|
|
62
|
+
export declare function relativeTarget(partPath: string, target: string): string;
|
|
63
|
+
//# sourceMappingURL=relationships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/relationships.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;;;GAOG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,iEAAiE,CAAC;AAK/F,kDAAkD;AAClD,eAAO,MAAM,QAAQ;;;;;;;;;IASnB,wFAAwF;;CAEhF,CAAC;AAEX,+FAA+F;AAC/F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAMD,8FAA8F;AAC9F,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,4FAA4F;IAC5F,OAAO,CAAC,OAAO;IATjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO;IA0BP,8FAA8F;WACjF,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOjF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI9C,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,CAAC;IAI7C,4FAA4F;IAC5F,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS;IAStF;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB3E,yFAAyF;IACnF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAG/E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { relsPathOf, resolveTarget } from '../reader/package';
|
|
2
|
+
import { directoryOf } from './xml-io';
|
|
3
|
+
/**
|
|
4
|
+
* Relations OPC d'une partie (`word/_rels/document.xml.rels`) en lecture et en écriture
|
|
5
|
+
* pour la greffe : les identifiants du corps généré (`rId1`… attribués par la lib `docx`
|
|
6
|
+
* à partir de 1) entrent en collision avec ceux du gabarit, chaque relation du corps est
|
|
7
|
+
* donc **remappée** : réutilisation d'une relation du gabarit de même type et même cible
|
|
8
|
+
* quand elle existe, sinon ajout sous un identifiant libre. Un fichier `.rels` absent
|
|
9
|
+
* n'est créé qu'au premier ajout : une partie sans relation n'en reçoit pas de vide.
|
|
10
|
+
*/
|
|
11
|
+
/** Espace de noms des fichiers `.rels`. */
|
|
12
|
+
export const RELATIONSHIPS_NS = 'http://schemas.openxmlformats.org/package/2006/relationships';
|
|
13
|
+
const OFFICE_RELATIONSHIPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
|
|
14
|
+
const PACKAGE_RELATIONSHIPS = 'http://schemas.openxmlformats.org/package/2006/relationships';
|
|
15
|
+
/** Types de relations manipulés par la greffe. */
|
|
16
|
+
export const REL_TYPE = {
|
|
17
|
+
image: `${OFFICE_RELATIONSHIPS}/image`,
|
|
18
|
+
hyperlink: `${OFFICE_RELATIONSHIPS}/hyperlink`,
|
|
19
|
+
numbering: `${OFFICE_RELATIONSHIPS}/numbering`,
|
|
20
|
+
footnotes: `${OFFICE_RELATIONSHIPS}/footnotes`,
|
|
21
|
+
styles: `${OFFICE_RELATIONSHIPS}/styles`,
|
|
22
|
+
settings: `${OFFICE_RELATIONSHIPS}/settings`,
|
|
23
|
+
header: `${OFFICE_RELATIONSHIPS}/header`,
|
|
24
|
+
footer: `${OFFICE_RELATIONSHIPS}/footer`,
|
|
25
|
+
/** Propriétés du document (`docProps/core.xml`), relation du paquet (`_rels/.rels`). */
|
|
26
|
+
coreProperties: `${PACKAGE_RELATIONSHIPS}/metadata/core-properties`,
|
|
27
|
+
};
|
|
28
|
+
const EMPTY_RELS = `<Relationships xmlns="${RELATIONSHIPS_NS}"/>`;
|
|
29
|
+
const DECLARATION = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
|
|
30
|
+
/** Table des relations d'une partie, créée (en mémoire) vide si le fichier `.rels` manque. */
|
|
31
|
+
export class RelationshipTable {
|
|
32
|
+
store;
|
|
33
|
+
path;
|
|
34
|
+
partPath;
|
|
35
|
+
doc;
|
|
36
|
+
missing;
|
|
37
|
+
entries = new Map();
|
|
38
|
+
nextNumber = 1;
|
|
39
|
+
constructor(store, path, partPath, doc,
|
|
40
|
+
/** Vrai tant que le `.rels` n'existe pas dans le paquet : il sera créé au premier ajout. */
|
|
41
|
+
missing) {
|
|
42
|
+
this.store = store;
|
|
43
|
+
this.path = path;
|
|
44
|
+
this.partPath = partPath;
|
|
45
|
+
this.doc = doc;
|
|
46
|
+
this.missing = missing;
|
|
47
|
+
for (const rel of Array.from(doc.documentElement.children)) {
|
|
48
|
+
if (rel.localName !== 'Relationship')
|
|
49
|
+
continue;
|
|
50
|
+
const id = rel.getAttribute('Id') ?? '';
|
|
51
|
+
const target = rel.getAttribute('Target') ?? '';
|
|
52
|
+
if (!id || !target)
|
|
53
|
+
continue;
|
|
54
|
+
const external = rel.getAttribute('TargetMode') === 'External';
|
|
55
|
+
this.entries.set(id, {
|
|
56
|
+
id,
|
|
57
|
+
type: rel.getAttribute('Type') ?? '',
|
|
58
|
+
target,
|
|
59
|
+
resolved: external ? target : resolveTarget(partPath, target),
|
|
60
|
+
external,
|
|
61
|
+
});
|
|
62
|
+
const numbered = /^rId(\d+)$/.exec(id);
|
|
63
|
+
if (numbered)
|
|
64
|
+
this.nextNumber = Math.max(this.nextNumber, Number(numbered[1]) + 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Ouvre les relations de `partPath`. Un `.rels` absent ou illisible donne une table vide. */
|
|
68
|
+
static async open(store, partPath) {
|
|
69
|
+
const path = relsPathOf(partPath);
|
|
70
|
+
const existing = await store.dom(path);
|
|
71
|
+
const doc = existing ?? store.parse(EMPTY_RELS);
|
|
72
|
+
return new RelationshipTable(store, path, partPath, doc, existing === null);
|
|
73
|
+
}
|
|
74
|
+
get(id) {
|
|
75
|
+
return this.entries.get(id);
|
|
76
|
+
}
|
|
77
|
+
values() {
|
|
78
|
+
return this.entries.values();
|
|
79
|
+
}
|
|
80
|
+
/** Première relation de ce type dont la cible résolue (ou l'URL externe) est `resolved`. */
|
|
81
|
+
find(type, resolved, external) {
|
|
82
|
+
for (const entry of this.entries.values()) {
|
|
83
|
+
if (entry.type === type && entry.external === external && entry.resolved === resolved) {
|
|
84
|
+
return entry;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Ajoute une relation et rend son identifiant. `target` est une URL (externe) ou un
|
|
91
|
+
* chemin de partie du zip, réécrit relativement au dossier de la partie.
|
|
92
|
+
*/
|
|
93
|
+
async add(type, target, external) {
|
|
94
|
+
const id = `rId${String(this.nextNumber)}`;
|
|
95
|
+
this.nextNumber += 1;
|
|
96
|
+
const written = external ? target : relativeTarget(this.partPath, target);
|
|
97
|
+
const element = this.doc.createElementNS(RELATIONSHIPS_NS, 'Relationship');
|
|
98
|
+
element.setAttribute('Id', id);
|
|
99
|
+
element.setAttribute('Type', type);
|
|
100
|
+
element.setAttribute('Target', written);
|
|
101
|
+
if (external)
|
|
102
|
+
element.setAttribute('TargetMode', 'External');
|
|
103
|
+
this.doc.documentElement.appendChild(element);
|
|
104
|
+
this.entries.set(id, { id, type, target: written, resolved: target, external });
|
|
105
|
+
if (this.missing) {
|
|
106
|
+
this.store.create(this.path, this.doc, DECLARATION);
|
|
107
|
+
this.missing = false;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
await this.store.markChanged(this.path);
|
|
111
|
+
}
|
|
112
|
+
return id;
|
|
113
|
+
}
|
|
114
|
+
/** Identifiant d'une relation de ce type vers cette cible : existante, sinon ajoutée. */
|
|
115
|
+
async ensure(type, target, external) {
|
|
116
|
+
return this.find(type, target, external)?.id ?? this.add(type, target, external);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Cible relative au dossier de la partie : `word/media/a.png` depuis `word/document.xml`
|
|
121
|
+
* → `media/a.png` ; hors du dossier, chemin absolu `/x/y.xml` (que Word accepte).
|
|
122
|
+
*/
|
|
123
|
+
export function relativeTarget(partPath, target) {
|
|
124
|
+
const dir = directoryOf(partPath);
|
|
125
|
+
return target.startsWith(dir) ? target.slice(dir.length) : `/${target}`;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=relationships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../../src/docx/writer/relationships.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DocxPackage } from '../reader/types';
|
|
2
|
+
import { type RelationshipTable } from './relationships';
|
|
3
|
+
import { type PartStore } from './xml-io';
|
|
4
|
+
export interface SettingsMergeInput {
|
|
5
|
+
readonly template: PartStore;
|
|
6
|
+
readonly pkg: DocxPackage;
|
|
7
|
+
readonly mainPart: string;
|
|
8
|
+
readonly relationships: RelationshipTable;
|
|
9
|
+
/** `Override` à ajouter à `[Content_Types].xml` si la partie est créée. */
|
|
10
|
+
readonly overrides: Map<string, string>;
|
|
11
|
+
/** Poser `<w:updateFields w:val="true"/>` (table des matières). */
|
|
12
|
+
readonly updateFields?: boolean;
|
|
13
|
+
/** Poser `<w:evenAndOddHeaders/>` (en-tête ou pied de pages paires greffé). */
|
|
14
|
+
readonly evenAndOddHeaders?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pose les réglages demandés dans `settings.xml` du gabarit. Rend le chemin de la partie
|
|
18
|
+
* si elle a été réécrite ou créée, `null` sinon.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ensureSettings(input: SettingsMergeInput): Promise<string | null>;
|
|
21
|
+
//# sourceMappingURL=settings-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-merge.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/settings-merge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAML,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AA2HlB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAsBD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBtF"}
|