@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,41 @@
|
|
|
1
|
+
import type { DocumentLayout } from '@aster-editor/core';
|
|
2
|
+
import type { ListDefinition, VariableSettings } from '../../export/context';
|
|
3
|
+
import type { DocxExportWarning } from '../../export/types';
|
|
4
|
+
import type { TemplateContext } from './template';
|
|
5
|
+
import { type XmlCodec } from './xml-io';
|
|
6
|
+
/**
|
|
7
|
+
* Greffe du corps généré dans le gabarit. Principe figé (brief L27) : le `.docx` produit
|
|
8
|
+
* par la chaîne d'export (lib `docx`) n'est qu'une source ; le gabarit est ouvert et
|
|
9
|
+
* **aucune de ses parties n'est réécrite** sauf le corps, ses relations, les médias et
|
|
10
|
+
* numérotations ajoutés, les styles ajoutés, les notes ajoutées, `[Content_Types].xml`
|
|
11
|
+
* quand une partie ou une extension apparaît, les en-têtes et pieds quand les
|
|
12
|
+
* variables y sont résolues ou qu'un `layout` les régénère, `settings.xml` quand la
|
|
13
|
+
* table des matières ou un en-tête de pages paires l'exige, et `docProps/core.xml`
|
|
14
|
+
* quand `title` / `creator` sont fournis. Le `w:sectPr` final du gabarit (en-têtes,
|
|
15
|
+
* pieds, marges, colonnes) est conservé ; un corps régénéré n'a plus de sections
|
|
16
|
+
* intermédiaires : seules les propriétés de la **dernière** section survivent, complétées
|
|
17
|
+
* des en-têtes et pieds que les sections précédentes lui transmettaient par héritage.
|
|
18
|
+
*/
|
|
19
|
+
export interface GraftInput {
|
|
20
|
+
/** Archive produite par `Packer` à partir du corps édité. */
|
|
21
|
+
readonly generated: ArrayBuffer;
|
|
22
|
+
readonly template: TemplateContext;
|
|
23
|
+
readonly lists: readonly ListDefinition[];
|
|
24
|
+
/** `numId` généré → référence `numbering`, lu sur `document.Numbering` après empaquetage. */
|
|
25
|
+
readonly concreteNumbering: ReadonlyMap<string, string>;
|
|
26
|
+
readonly variables: VariableSettings;
|
|
27
|
+
readonly layout: DocumentLayout | undefined;
|
|
28
|
+
/** Vrai avec `options.toc` : `w:updateFields` est posé dans `settings.xml`. */
|
|
29
|
+
readonly toc: boolean;
|
|
30
|
+
/** `options.title` / `options.creator`, réécrits dans `docProps/core.xml`. */
|
|
31
|
+
readonly title?: string;
|
|
32
|
+
readonly creator?: string;
|
|
33
|
+
readonly codec: XmlCodec;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Greffe le corps de `generated` dans le gabarit et rend l'archive résultante. Lève sur
|
|
37
|
+
* un gabarit sans partie principale (déjà validé par `openTemplate`) ou un document
|
|
38
|
+
* généré illisible : l'appelant replie alors sur l'export neuf.
|
|
39
|
+
*/
|
|
40
|
+
export declare function graftIntoTemplate(input: GraftInput, warnings: DocxExportWarning[]): Promise<ArrayBuffer>;
|
|
41
|
+
//# sourceMappingURL=graft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graft.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/graft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3E;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,6FAA6F;IAC7F,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B;AA+BD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,OAAO,CAAC,WAAW,CAAC,CA8HtB"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { allNamed, childNamed, childrenNamed } from '../preprocess/xml-utils';
|
|
2
|
+
import { ensureContentTypes } from './content-types';
|
|
3
|
+
import { writeCoreProperties } from './core-properties';
|
|
4
|
+
import { createFootnoteMerger } from './footnotes-merge';
|
|
5
|
+
import { graftHeadersFooters } from './header-footer-graft';
|
|
6
|
+
import { resolveHeaderFooterVariables } from './header-footer-variables';
|
|
7
|
+
import { MediaCopier } from './media';
|
|
8
|
+
import { createNumberingMerger } from './numbering-merge';
|
|
9
|
+
import { REL_TYPE, RelationshipTable } from './relationships';
|
|
10
|
+
import { ensureSettings } from './settings-merge';
|
|
11
|
+
import { createStyleMerger } from './styles-merge';
|
|
12
|
+
import { PartStore, setWordAttr, wordAttr } from './xml-io';
|
|
13
|
+
/** Partie principale que la lib `docx` écrit toujours. */
|
|
14
|
+
const GENERATED_MAIN_PART = 'word/document.xml';
|
|
15
|
+
const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
|
|
16
|
+
const XMLNS_NS = 'http://www.w3.org/2000/xmlns/';
|
|
17
|
+
/** Attributs de relation que le corps généré peut porter (liens, images). */
|
|
18
|
+
const RELATIONSHIP_ATTRIBUTES = new Set(['id', 'embed', 'link']);
|
|
19
|
+
/** Éléments du `w:sectPr` qui doivent précéder tout le reste (ordre du schéma). */
|
|
20
|
+
const SECTION_REFERENCES = ['headerReference', 'footerReference'];
|
|
21
|
+
/** Enfants du `w:sectPr` placés après `w:titlePg` dans l'ordre du schéma. */
|
|
22
|
+
const AFTER_TITLE_PAGE = new Set([
|
|
23
|
+
'textDirection',
|
|
24
|
+
'bidi',
|
|
25
|
+
'rtlGutter',
|
|
26
|
+
'docGrid',
|
|
27
|
+
'printerSettings',
|
|
28
|
+
'sectPrChange',
|
|
29
|
+
]);
|
|
30
|
+
/** Référence de style du corps → type de style qu'elle impose. */
|
|
31
|
+
const STYLE_REFERENCES = [
|
|
32
|
+
['pStyle', 'paragraph'],
|
|
33
|
+
['rStyle', 'character'],
|
|
34
|
+
['tblStyle', 'table'],
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Greffe le corps de `generated` dans le gabarit et rend l'archive résultante. Lève sur
|
|
38
|
+
* un gabarit sans partie principale (déjà validé par `openTemplate`) ou un document
|
|
39
|
+
* généré illisible : l'appelant replie alors sur l'export neuf.
|
|
40
|
+
*/
|
|
41
|
+
export async function graftIntoTemplate(input, warnings) {
|
|
42
|
+
const { pkg, mainDoc, mainDeclaration } = input.template;
|
|
43
|
+
const mainPart = pkg.mainPart;
|
|
44
|
+
const template = await PartStore.open(input.template.buffer, input.codec);
|
|
45
|
+
// La partie principale a déjà été parsée à l'ouverture du gabarit : on la réutilise.
|
|
46
|
+
template.adopt(mainPart, mainDoc, mainDeclaration);
|
|
47
|
+
const generated = await PartStore.open(input.generated, input.codec);
|
|
48
|
+
const templateDoc = mainDoc;
|
|
49
|
+
const generatedDoc = await generated.dom(GENERATED_MAIN_PART);
|
|
50
|
+
const templateBody = childNamed(templateDoc.documentElement, 'body');
|
|
51
|
+
const generatedBody = generatedDoc ? childNamed(generatedDoc.documentElement, 'body') : null;
|
|
52
|
+
if (!templateBody)
|
|
53
|
+
throw new Error(`gabarit : ${mainPart} sans w:body`);
|
|
54
|
+
if (!generatedDoc || !generatedBody)
|
|
55
|
+
throw new Error('corps généré illisible');
|
|
56
|
+
// Variables des en-têtes et pieds (mode `resolve`) : avant toute autre écriture.
|
|
57
|
+
await resolveHeaderFooterVariables({
|
|
58
|
+
template,
|
|
59
|
+
pkg,
|
|
60
|
+
mainPart,
|
|
61
|
+
settings: input.variables,
|
|
62
|
+
codec: input.codec,
|
|
63
|
+
warnings,
|
|
64
|
+
});
|
|
65
|
+
const relationships = await RelationshipTable.open(template, mainPart);
|
|
66
|
+
const generatedRelationships = await RelationshipTable.open(generated, GENERATED_MAIN_PART);
|
|
67
|
+
const styles = await createStyleMerger({
|
|
68
|
+
template,
|
|
69
|
+
generated,
|
|
70
|
+
templatePath: input.template.stylesPath,
|
|
71
|
+
resolver: input.template.resolver,
|
|
72
|
+
warnings,
|
|
73
|
+
});
|
|
74
|
+
const numbering = await createNumberingMerger({
|
|
75
|
+
template,
|
|
76
|
+
generated,
|
|
77
|
+
mainPart,
|
|
78
|
+
templatePath: await pkg.related(mainPart, '/numbering'),
|
|
79
|
+
relationships,
|
|
80
|
+
lists: input.lists,
|
|
81
|
+
concrete: input.concreteNumbering,
|
|
82
|
+
warnings,
|
|
83
|
+
});
|
|
84
|
+
const footnotes = await createFootnoteMerger({
|
|
85
|
+
template,
|
|
86
|
+
generated,
|
|
87
|
+
mainPart,
|
|
88
|
+
templatePath: await pkg.related(mainPart, '/footnotes'),
|
|
89
|
+
relationships,
|
|
90
|
+
});
|
|
91
|
+
const contentDefaults = new Map();
|
|
92
|
+
const media = new MediaCopier(template, generated, mainPart, contentDefaults);
|
|
93
|
+
// 1. Le corps généré, sans son `w:sectPr` final.
|
|
94
|
+
const blocks = Array.from(generatedBody.children).filter((child) => child.localName !== 'sectPr');
|
|
95
|
+
// 2. Remappages sur les blocs générés (relations, numérotation, notes, styles).
|
|
96
|
+
for (const block of blocks) {
|
|
97
|
+
for (const element of [block, ...allNamed(block, '*')]) {
|
|
98
|
+
await remapRelationships(element, generatedRelationships, relationships, media);
|
|
99
|
+
if (element.localName === 'numId' && element.parentElement?.localName === 'numPr') {
|
|
100
|
+
setWordAttr(element, 'val', await numbering.remap(wordAttr(element, 'val')));
|
|
101
|
+
}
|
|
102
|
+
else if (element.localName === 'footnoteReference') {
|
|
103
|
+
setWordAttr(element, 'id', await footnotes.remap(wordAttr(element, 'id')));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const paragraphs = [
|
|
108
|
+
...blocks.flatMap((block) => (block.localName === 'p' ? [block] : allNamed(block, 'p'))),
|
|
109
|
+
...footnotes.imported().flatMap((note) => allNamed(note, 'p')),
|
|
110
|
+
];
|
|
111
|
+
await remapStyles(blocks, footnotes.imported(), styles);
|
|
112
|
+
for (const paragraph of paragraphs)
|
|
113
|
+
styles.stripParagraph(paragraph);
|
|
114
|
+
// 3. Greffe : les blocs remplacent ceux du gabarit, devant son `w:sectPr` final complété.
|
|
115
|
+
const sectPr = inheritedSectionProperties(templateBody);
|
|
116
|
+
for (const child of Array.from(templateBody.childNodes))
|
|
117
|
+
templateBody.removeChild(child);
|
|
118
|
+
for (const block of blocks)
|
|
119
|
+
templateBody.appendChild(templateDoc.importNode(block, true));
|
|
120
|
+
if (sectPr)
|
|
121
|
+
templateBody.appendChild(sectPr);
|
|
122
|
+
copyNamespaceDeclarations(generatedDoc.documentElement, templateDoc.documentElement);
|
|
123
|
+
await template.markChanged(mainPart);
|
|
124
|
+
// 4. En-têtes et pieds régénérés depuis `layout` quand ils diffèrent du gabarit.
|
|
125
|
+
const overrides = new Map();
|
|
126
|
+
const grafted = await graftHeadersFooters({
|
|
127
|
+
template,
|
|
128
|
+
generated,
|
|
129
|
+
mainPart,
|
|
130
|
+
sectPr,
|
|
131
|
+
generatedSectPr: childNamed(generatedBody, 'sectPr'),
|
|
132
|
+
relationships,
|
|
133
|
+
generatedRelationships,
|
|
134
|
+
styles,
|
|
135
|
+
media,
|
|
136
|
+
layout: input.layout,
|
|
137
|
+
templateHeaders: input.template.headers,
|
|
138
|
+
templateFooters: input.template.footers,
|
|
139
|
+
overrides,
|
|
140
|
+
warnings,
|
|
141
|
+
});
|
|
142
|
+
// 5. Réglages et propriétés que le corps greffé exige.
|
|
143
|
+
await ensureSettings({
|
|
144
|
+
template,
|
|
145
|
+
pkg,
|
|
146
|
+
mainPart,
|
|
147
|
+
relationships,
|
|
148
|
+
overrides,
|
|
149
|
+
updateFields: input.toc,
|
|
150
|
+
evenAndOddHeaders: grafted.even,
|
|
151
|
+
});
|
|
152
|
+
await writeCoreProperties({
|
|
153
|
+
template,
|
|
154
|
+
pkg,
|
|
155
|
+
overrides,
|
|
156
|
+
...(input.title !== undefined ? { title: input.title } : {}),
|
|
157
|
+
...(input.creator !== undefined ? { creator: input.creator } : {}),
|
|
158
|
+
});
|
|
159
|
+
// 6. Types de contenu des médias et des parties créées.
|
|
160
|
+
for (const created of [numbering.createdPart(), footnotes.createdPart()]) {
|
|
161
|
+
if (created)
|
|
162
|
+
overrides.set(created.path, created.contentType);
|
|
163
|
+
}
|
|
164
|
+
await ensureContentTypes(template, { defaults: contentDefaults, overrides });
|
|
165
|
+
return template.generate();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Attributs `r:id` / `r:embed` / `r:link` d'un élément généré → relation du gabarit :
|
|
169
|
+
* un lien externe réutilise une relation de même cible ou en reçoit une neuve, une image
|
|
170
|
+
* passe par le copieur de médias. Une relation inconnue est laissée telle quelle.
|
|
171
|
+
*/
|
|
172
|
+
async function remapRelationships(element, source, target, media) {
|
|
173
|
+
for (const attribute of Array.from(element.attributes)) {
|
|
174
|
+
if (attribute.namespaceURI !== R_NS || !RELATIONSHIP_ATTRIBUTES.has(attribute.localName)) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const relationship = source.get(attribute.value);
|
|
178
|
+
if (!relationship)
|
|
179
|
+
continue;
|
|
180
|
+
let id = null;
|
|
181
|
+
if (relationship.external) {
|
|
182
|
+
id = await target.ensure(relationship.type, relationship.target, true);
|
|
183
|
+
}
|
|
184
|
+
else if (relationship.type === REL_TYPE.image) {
|
|
185
|
+
id = await media.copy(relationship.resolved, target);
|
|
186
|
+
}
|
|
187
|
+
if (id !== null)
|
|
188
|
+
attribute.value = id;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Styles référencés par les blocs et les notes : réutilisés, ajoutés, laissés en place
|
|
193
|
+
* (styles intégrés de Word) ou retirés avec avertissement. Chaque référence impose le
|
|
194
|
+
* type du style (`w:pStyle` → paragraphe…) : un style d'un autre type est retiré.
|
|
195
|
+
*/
|
|
196
|
+
async function remapStyles(blocks, notes, styles) {
|
|
197
|
+
const references = [];
|
|
198
|
+
for (const root of [...blocks, ...notes]) {
|
|
199
|
+
for (const [name, expected] of STYLE_REFERENCES) {
|
|
200
|
+
if (root.localName === name)
|
|
201
|
+
references.push([root, expected]);
|
|
202
|
+
for (const reference of allNamed(root, name))
|
|
203
|
+
references.push([reference, expected]);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const [reference, expected] of references) {
|
|
207
|
+
const id = wordAttr(reference, 'val');
|
|
208
|
+
if (!id)
|
|
209
|
+
continue;
|
|
210
|
+
const ensured = await styles.ensure(id, expected);
|
|
211
|
+
if (ensured.status === 'missing')
|
|
212
|
+
reference.remove();
|
|
213
|
+
else if (ensured.id !== id)
|
|
214
|
+
setWordAttr(reference, 'val', ensured.id);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* `w:sectPr` final du gabarit, complété des références d'en-tête et de pied (et de
|
|
219
|
+
* `w:titlePg`) que les sections précédentes lui transmettaient : Word fait hériter chaque
|
|
220
|
+
* section de la précédente, et le corps régénéré ne garde que la dernière. `null` si le
|
|
221
|
+
* gabarit n'a aucun `w:sectPr` final.
|
|
222
|
+
*/
|
|
223
|
+
function inheritedSectionProperties(body) {
|
|
224
|
+
const last = childNamed(body, 'sectPr');
|
|
225
|
+
if (!last)
|
|
226
|
+
return null;
|
|
227
|
+
const inherited = new Map();
|
|
228
|
+
let titlePage = null;
|
|
229
|
+
for (const paragraph of childrenNamed(body, 'p')) {
|
|
230
|
+
const pPr = childNamed(paragraph, 'pPr');
|
|
231
|
+
const sectPr = pPr ? childNamed(pPr, 'sectPr') : null;
|
|
232
|
+
if (!sectPr)
|
|
233
|
+
continue;
|
|
234
|
+
for (const child of Array.from(sectPr.children)) {
|
|
235
|
+
if (child.localName === 'headerReference' || child.localName === 'footerReference') {
|
|
236
|
+
inherited.set(`${child.localName}:${wordAttr(child, 'type') || 'default'}`, child);
|
|
237
|
+
}
|
|
238
|
+
else if (child.localName === 'titlePg') {
|
|
239
|
+
titlePage = child;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const own = new Set();
|
|
244
|
+
for (const child of Array.from(last.children)) {
|
|
245
|
+
if (child.localName === 'headerReference' || child.localName === 'footerReference') {
|
|
246
|
+
own.add(`${child.localName}:${wordAttr(child, 'type') || 'default'}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Les références manquantes sont insérées en tête, en-têtes avant pieds (ordre du schéma).
|
|
250
|
+
for (const name of [...SECTION_REFERENCES].reverse()) {
|
|
251
|
+
for (const [key, element] of Array.from(inherited).reverse()) {
|
|
252
|
+
if (!key.startsWith(`${name}:`) || own.has(key))
|
|
253
|
+
continue;
|
|
254
|
+
last.insertBefore(element.cloneNode(true), last.firstChild);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (titlePage && !childNamed(last, 'titlePg')) {
|
|
258
|
+
const after = Array.from(last.children).find((child) => AFTER_TITLE_PAGE.has(child.localName));
|
|
259
|
+
last.insertBefore(titlePage.cloneNode(true), after ?? null);
|
|
260
|
+
}
|
|
261
|
+
return last;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Déclarations `xmlns:*` du document généré absentes de la racine du gabarit : les blocs
|
|
265
|
+
* importés (dessins `wp:`, `a:`, `pic:`…) les trouvent ainsi en portée sans que le
|
|
266
|
+
* sérialiseur ne les répète sur chaque élément.
|
|
267
|
+
*/
|
|
268
|
+
function copyNamespaceDeclarations(source, target) {
|
|
269
|
+
for (const attribute of Array.from(source.attributes)) {
|
|
270
|
+
if (attribute.namespaceURI !== XMLNS_NS && !attribute.name.startsWith('xmlns:'))
|
|
271
|
+
continue;
|
|
272
|
+
if (target.hasAttribute(attribute.name))
|
|
273
|
+
continue;
|
|
274
|
+
target.setAttributeNS(XMLNS_NS, attribute.name, attribute.value);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=graft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graft.js","sourceRoot":"","sources":["../../../src/docx/writer/graft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DocumentLayout, HeaderFooterSet } from '@aster-editor/core';
|
|
2
|
+
import type { DocxExportWarning } from '../../export/types';
|
|
3
|
+
import type { MediaCopier } from './media';
|
|
4
|
+
import { RelationshipTable } from './relationships';
|
|
5
|
+
import type { StyleMerger } from './styles-merge';
|
|
6
|
+
import { type PartStore } from './xml-io';
|
|
7
|
+
export interface HeaderFooterGraftInput {
|
|
8
|
+
readonly template: PartStore;
|
|
9
|
+
readonly generated: PartStore;
|
|
10
|
+
readonly mainPart: string;
|
|
11
|
+
/** `w:sectPr` final du gabarit (déjà complété par héritage), `null` s'il n'y en a pas. */
|
|
12
|
+
readonly sectPr: Element | null;
|
|
13
|
+
/** `w:sectPr` final du document généré, qui référence les parties générées. */
|
|
14
|
+
readonly generatedSectPr: Element | null;
|
|
15
|
+
readonly relationships: RelationshipTable;
|
|
16
|
+
readonly generatedRelationships: RelationshipTable;
|
|
17
|
+
readonly styles: StyleMerger;
|
|
18
|
+
readonly media: MediaCopier;
|
|
19
|
+
readonly layout: DocumentLayout | undefined;
|
|
20
|
+
/** En-têtes et pieds du gabarit tels que l'import les lit, `undefined` si non lus. */
|
|
21
|
+
readonly templateHeaders: HeaderFooterSet | undefined;
|
|
22
|
+
readonly templateFooters: HeaderFooterSet | undefined;
|
|
23
|
+
/** `Override` à ajouter à `[Content_Types].xml` pour les parties créées. */
|
|
24
|
+
readonly overrides: Map<string, string>;
|
|
25
|
+
readonly warnings: DocxExportWarning[];
|
|
26
|
+
}
|
|
27
|
+
/** Issue de la greffe : parties créées, et si l'une d'elles est de type `even`. */
|
|
28
|
+
export interface HeaderFooterGraftResult {
|
|
29
|
+
readonly created: readonly string[];
|
|
30
|
+
readonly even: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Greffe les en-têtes et pieds régénérés. */
|
|
33
|
+
export declare function graftHeadersFooters(input: HeaderFooterGraftInput): Promise<HeaderFooterGraftResult>;
|
|
34
|
+
//# sourceMappingURL=header-footer-graft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer-graft.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/header-footer-graft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAY,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AA0B9E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,sFAAsF;IACtF,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IACtD,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CACxC;AAED,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AA+BD,8CAA8C;AAC9C,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CA6BlC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { allNamed, childNamed } from '../preprocess/xml-utils';
|
|
2
|
+
import { PART_CONTENT_TYPES } from './content-types';
|
|
3
|
+
import { REL_TYPE, RelationshipTable } from './relationships';
|
|
4
|
+
import { directoryOf, setWordAttr, wordAttr } from './xml-io';
|
|
5
|
+
/**
|
|
6
|
+
* En-têtes et pieds de page du gabarit quand `options.layout.headers` / `footers` est
|
|
7
|
+
* fourni. Pour chaque type (`default`, `first`, `even`) dont le HTML diffère de ce que le
|
|
8
|
+
* lecteur relit dans le gabarit, la partie générée par la chaîne d'export (lib `docx`,
|
|
9
|
+
* `header-footer.ts`) est copiée dans le gabarit sous un nom libre, ses relations
|
|
10
|
+
* (images, liens) et ses styles greffés comme ceux du corps, et le `w:sectPr` final
|
|
11
|
+
* pointe dessus à la place de l'ancienne. Un type identique ou absent du `layout` laisse
|
|
12
|
+
* la partie du gabarit intacte à l'octet ; l'ancienne partie n'est jamais supprimée. Sans
|
|
13
|
+
* `w:sectPr` final dans le gabarit, rien ne peut être accroché : avertissement
|
|
14
|
+
* `template-section-missing`. Un type `even` greffé est signalé à l'appelant, qui doit
|
|
15
|
+
* activer `w:evenAndOddHeaders` dans `settings.xml` pour que Word l'affiche.
|
|
16
|
+
*/
|
|
17
|
+
const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
|
|
18
|
+
const KINDS = ['header', 'footer'];
|
|
19
|
+
const SET_KEYS = ['default', 'first', 'even'];
|
|
20
|
+
/** Attributs de relation que la partie générée peut porter (liens, images). */
|
|
21
|
+
const RELATIONSHIP_ATTRIBUTES = new Set(['id', 'embed', 'link']);
|
|
22
|
+
/** HTML comparable : blancs réduits, blancs collés aux balises retirés. */
|
|
23
|
+
function normalizeHtml(html) {
|
|
24
|
+
return html.replace(/\s+/g, ' ').replace(/>\s+</g, '><').trim();
|
|
25
|
+
}
|
|
26
|
+
/** `w:headerReference` / `w:footerReference` de ce type dans un `w:sectPr`. */
|
|
27
|
+
function referenceOf(sectPr, kind, type) {
|
|
28
|
+
return (Array.from(sectPr.children).find((child) => child.localName === `${kind}Reference` && (wordAttr(child, 'type') || 'default') === type) ?? null);
|
|
29
|
+
}
|
|
30
|
+
/** Chemin libre `word/header<n>.xml` / `word/footer<n>.xml` dans le gabarit. */
|
|
31
|
+
function freePartPath(store, mainPart, kind) {
|
|
32
|
+
const directory = directoryOf(mainPart);
|
|
33
|
+
for (let index = 1;; index += 1) {
|
|
34
|
+
const candidate = `${directory}${kind}${String(index)}.xml`;
|
|
35
|
+
if (!store.has(candidate))
|
|
36
|
+
return candidate;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Vrai si le `layout` demande au moins un en-tête ou un pied. */
|
|
40
|
+
function wantsHeadersFooters(layout) {
|
|
41
|
+
return Boolean(layout?.headers || layout?.footers);
|
|
42
|
+
}
|
|
43
|
+
/** Greffe les en-têtes et pieds régénérés. */
|
|
44
|
+
export async function graftHeadersFooters(input) {
|
|
45
|
+
const created = [];
|
|
46
|
+
let even = false;
|
|
47
|
+
if (!wantsHeadersFooters(input.layout))
|
|
48
|
+
return { created, even };
|
|
49
|
+
if (!input.sectPr) {
|
|
50
|
+
input.warnings.push({
|
|
51
|
+
code: 'template-section-missing',
|
|
52
|
+
message: 'Gabarit sans w:sectPr final : les en-têtes et pieds de layout ne peuvent pas y être accrochés, ignorés',
|
|
53
|
+
});
|
|
54
|
+
return { created, even };
|
|
55
|
+
}
|
|
56
|
+
if (!input.layout || !input.generatedSectPr)
|
|
57
|
+
return { created, even };
|
|
58
|
+
for (const kind of KINDS) {
|
|
59
|
+
const wanted = kind === 'header' ? input.layout.headers : input.layout.footers;
|
|
60
|
+
const existing = kind === 'header' ? input.templateHeaders : input.templateFooters;
|
|
61
|
+
if (!wanted)
|
|
62
|
+
continue;
|
|
63
|
+
for (const type of SET_KEYS) {
|
|
64
|
+
const html = wanted[type]?.html;
|
|
65
|
+
if (html === undefined)
|
|
66
|
+
continue;
|
|
67
|
+
const current = existing?.[type]?.html;
|
|
68
|
+
if (current !== undefined && normalizeHtml(current) === normalizeHtml(html))
|
|
69
|
+
continue;
|
|
70
|
+
const path = await graftOne(input, kind, type);
|
|
71
|
+
if (!path)
|
|
72
|
+
continue;
|
|
73
|
+
created.push(path);
|
|
74
|
+
if (type === 'even')
|
|
75
|
+
even = true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { created, even };
|
|
79
|
+
}
|
|
80
|
+
/** Copie la partie générée d'un type dans le gabarit et y fait pointer le `w:sectPr`. */
|
|
81
|
+
async function graftOne(input, kind, type) {
|
|
82
|
+
const sectPr = input.sectPr;
|
|
83
|
+
const generatedSectPr = input.generatedSectPr;
|
|
84
|
+
if (!sectPr || !generatedSectPr)
|
|
85
|
+
return null;
|
|
86
|
+
const generatedReference = referenceOf(generatedSectPr, kind, type);
|
|
87
|
+
const generatedId = generatedReference?.getAttributeNS(R_NS, 'id') ?? '';
|
|
88
|
+
const generatedPath = input.generatedRelationships.get(generatedId)?.resolved;
|
|
89
|
+
const doc = generatedPath ? await input.generated.dom(generatedPath) : null;
|
|
90
|
+
// Un HTML vide ne produit pas de partie : l'ancienne reste (rien à retirer sans la supprimer).
|
|
91
|
+
if (!generatedPath || !doc)
|
|
92
|
+
return null;
|
|
93
|
+
const path = freePartPath(input.template, input.mainPart, kind);
|
|
94
|
+
const partRelationships = await RelationshipTable.open(input.template, path);
|
|
95
|
+
const generatedPartRelationships = await RelationshipTable.open(input.generated, generatedPath);
|
|
96
|
+
for (const element of allNamed(doc, '*')) {
|
|
97
|
+
for (const attribute of Array.from(element.attributes)) {
|
|
98
|
+
if (attribute.namespaceURI !== R_NS || !RELATIONSHIP_ATTRIBUTES.has(attribute.localName)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const relationship = generatedPartRelationships.get(attribute.value);
|
|
102
|
+
if (!relationship)
|
|
103
|
+
continue;
|
|
104
|
+
let id = null;
|
|
105
|
+
if (relationship.external) {
|
|
106
|
+
id = await partRelationships.ensure(relationship.type, relationship.target, true);
|
|
107
|
+
}
|
|
108
|
+
else if (relationship.type === REL_TYPE.image) {
|
|
109
|
+
id = await input.media.copy(relationship.resolved, partRelationships);
|
|
110
|
+
}
|
|
111
|
+
if (id !== null)
|
|
112
|
+
attribute.value = id;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const [name, expected] of [
|
|
116
|
+
['pStyle', 'paragraph'],
|
|
117
|
+
['rStyle', 'character'],
|
|
118
|
+
]) {
|
|
119
|
+
for (const reference of allNamed(doc, name)) {
|
|
120
|
+
const styleId = wordAttr(reference, 'val');
|
|
121
|
+
if (!styleId)
|
|
122
|
+
continue;
|
|
123
|
+
const ensured = await input.styles.ensure(styleId, expected);
|
|
124
|
+
if (ensured.status === 'missing')
|
|
125
|
+
reference.remove();
|
|
126
|
+
else if (ensured.id !== styleId)
|
|
127
|
+
setWordAttr(reference, 'val', ensured.id);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
for (const paragraph of allNamed(doc, 'p'))
|
|
131
|
+
input.styles.stripParagraph(paragraph);
|
|
132
|
+
input.template.create(path, doc, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
|
|
133
|
+
input.overrides.set(path, PART_CONTENT_TYPES[kind]);
|
|
134
|
+
const id = await input.relationships.add(REL_TYPE[kind], path, false);
|
|
135
|
+
const reference = referenceOf(sectPr, kind, type);
|
|
136
|
+
if (reference) {
|
|
137
|
+
reference.setAttributeNS(R_NS, 'r:id', id);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const element = sectPr.ownerDocument.createElementNS(sectPr.namespaceURI, `${sectPr.prefix ? `${sectPr.prefix}:` : ''}${kind}Reference`);
|
|
141
|
+
setWordAttr(element, 'type', type);
|
|
142
|
+
element.setAttributeNS(R_NS, 'r:id', id);
|
|
143
|
+
// Ordre du schéma : les `headerReference` d'abord, puis les `footerReference`, puis le reste.
|
|
144
|
+
const anchor = Array.from(sectPr.children).find((child) => child.localName !== 'headerReference' &&
|
|
145
|
+
(kind === 'header' || child.localName !== 'footerReference'));
|
|
146
|
+
sectPr.insertBefore(element, anchor ?? null);
|
|
147
|
+
}
|
|
148
|
+
if (type === 'first' && !childNamed(sectPr, 'titlePg')) {
|
|
149
|
+
const titlePage = sectPr.ownerDocument.createElementNS(sectPr.namespaceURI, `${sectPr.prefix ? `${sectPr.prefix}:` : ''}titlePg`);
|
|
150
|
+
const after = Array.from(sectPr.children).find((child) => ['textDirection', 'bidi', 'rtlGutter', 'docGrid', 'printerSettings', 'sectPrChange'].includes(child.localName));
|
|
151
|
+
sectPr.insertBefore(titlePage, after ?? null);
|
|
152
|
+
}
|
|
153
|
+
return path;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=header-footer-graft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer-graft.js","sourceRoot":"","sources":["../../../src/docx/writer/header-footer-graft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { VariableSettings } from '../../export/context';
|
|
2
|
+
import type { DocxExportWarning } from '../../export/types';
|
|
3
|
+
import type { DocxPackage } from '../reader/types';
|
|
4
|
+
import { type PartStore, type XmlCodec } from './xml-io';
|
|
5
|
+
export interface HeaderFooterVariablesInput {
|
|
6
|
+
readonly template: PartStore;
|
|
7
|
+
readonly pkg: DocxPackage;
|
|
8
|
+
readonly mainPart: string;
|
|
9
|
+
readonly settings: VariableSettings;
|
|
10
|
+
readonly codec: XmlCodec;
|
|
11
|
+
readonly warnings: DocxExportWarning[];
|
|
12
|
+
}
|
|
13
|
+
/** Parties d'en-tête et de pied référencées par la partie principale (chemins du zip, dédoublonnés). */
|
|
14
|
+
export declare function headerFooterParts(pkg: DocxPackage, mainPart: string): Promise<string[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Remplace les `{{nom}}` des `w:t` du document par leur valeur. Rend vrai si un texte a
|
|
17
|
+
* changé. Les noms sans valeur sont signalés une fois chacun.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveVariablesInTexts(doc: Document, settings: VariableSettings, warnings: DocxExportWarning[]): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Résout les variables des en-têtes et pieds du gabarit (mode `resolve` seulement). Les
|
|
22
|
+
* parties modifiées sont réécrites dans le paquet, les autres restent intactes.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveHeaderFooterVariables(input: HeaderFooterVariablesInput): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=header-footer-variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer-variables.d.ts","sourceRoot":"","sources":["../../../src/docx/writer/header-footer-variables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAI5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAkB3E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CACxC;AAED,wGAAwG;AACxG,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO7F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,OAAO,CA6BT;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|