myrole-docx-editor 0.1.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 +107 -0
- package/dist/chunks/sdk-BKkeAoJT.js +15065 -0
- package/dist/chunks/sdk-BKkeAoJT.js.map +1 -0
- package/dist/chunks/vars-blockly-C-cJRHx8.js +42 -0
- package/dist/chunks/vars-blockly-C-cJRHx8.js.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/react.js +36 -0
- package/dist/react.js.map +1 -0
- package/dist/types/packages/docx-editor/src/chrome.d.ts +28 -0
- package/dist/types/packages/docx-editor/src/commands.d.ts +16 -0
- package/dist/types/packages/docx-editor/src/comments.d.ts +24 -0
- package/dist/types/packages/docx-editor/src/editor.d.ts +293 -0
- package/dist/types/packages/docx-editor/src/embed.d.ts +7 -0
- package/dist/types/packages/docx-editor/src/font-manifest.d.ts +7 -0
- package/dist/types/packages/docx-editor/src/fonts.d.ts +5 -0
- package/dist/types/packages/docx-editor/src/html.d.ts +13 -0
- package/dist/types/packages/docx-editor/src/index.d.ts +20 -0
- package/dist/types/packages/docx-editor/src/inspector-ui.d.ts +6 -0
- package/dist/types/packages/docx-editor/src/inspector.d.ts +101 -0
- package/dist/types/packages/docx-editor/src/react.d.ts +24 -0
- package/dist/types/packages/docx-editor/src/ruler.d.ts +4 -0
- package/dist/types/packages/docx-editor/src/sdk.d.ts +85 -0
- package/dist/types/packages/docx-editor/src/ui/icons.d.ts +2 -0
- package/dist/types/packages/docx-editor/src/ui/shell.d.ts +57 -0
- package/dist/types/packages/docx-editor/src/variables.d.ts +68 -0
- package/dist/types/packages/docx-editor/src/vars-blockly.d.ts +9 -0
- package/dist/types/packages/docx-editor/src/vars-complete.d.ts +60 -0
- package/dist/types/packages/docx-editor/src/vars-library.d.ts +59 -0
- package/dist/types/packages/docx-editor/src/vars-panel.d.ts +38 -0
- package/dist/types/packages/docx-model/src/edit.d.ts +64 -0
- package/dist/types/packages/docx-model/src/editor.d.ts +254 -0
- package/dist/types/packages/docx-model/src/fonts.d.ts +60 -0
- package/dist/types/packages/docx-model/src/heal.d.ts +28 -0
- package/dist/types/packages/docx-model/src/index.d.ts +113 -0
- package/dist/types/packages/docx-model/src/insert.d.ts +30 -0
- package/dist/types/packages/docx-model/src/layout.d.ts +411 -0
- package/dist/types/packages/docx-model/src/numbering.d.ts +63 -0
- package/dist/types/packages/docx-model/src/paste.d.ts +51 -0
- package/dist/types/packages/docx-model/src/rels.d.ts +18 -0
- package/dist/types/packages/docx-model/src/spans.d.ts +69 -0
- package/dist/types/packages/docx-model/src/styles.d.ts +42 -0
- package/dist/types/packages/docx-model/src/tables.d.ts +196 -0
- package/dist/types/packages/docx-model/src/textbox.d.ts +61 -0
- package/dist/types/packages/docx-render/src/border.d.ts +39 -0
- package/dist/types/packages/docx-render/src/document.d.ts +55 -0
- package/dist/types/packages/docx-render/src/font-advances.d.ts +1 -0
- package/dist/types/packages/docx-render/src/hit.d.ts +94 -0
- package/dist/types/packages/docx-render/src/index.d.ts +12 -0
- package/dist/types/packages/docx-render/src/metrics.d.ts +6 -0
- package/dist/types/packages/docx-render/src/node-ctx.d.ts +36 -0
- package/dist/types/packages/docx-render/src/paragraph.d.ts +18 -0
- package/dist/types/packages/docx-render/src/parts.d.ts +40 -0
- package/dist/types/packages/docx-render/src/renderer.d.ts +251 -0
- package/dist/types/packages/docx-render/src/table.d.ts +15 -0
- package/dist/types/packages/docx-render/src/text.d.ts +396 -0
- package/dist/types/packages/docx-render/src/types.d.ts +514 -0
- package/dist/types/packages/docx-tags/src/add-comments.d.ts +2 -0
- package/dist/types/packages/docx-tags/src/comments.d.ts +19 -0
- package/dist/types/packages/docx-tags/src/grammar.d.ts +71 -0
- package/dist/types/packages/docx-tags/src/highlight.d.ts +22 -0
- package/dist/types/packages/docx-tags/src/index.d.ts +4 -0
- package/dist/types/packages/docx-tags/src/scan.d.ts +27 -0
- package/dist/types/packages/docx-vars/src/audit.d.ts +44 -0
- package/dist/types/packages/docx-vars/src/blockify.d.ts +61 -0
- package/dist/types/packages/docx-vars/src/blocks.d.ts +46 -0
- package/dist/types/packages/docx-vars/src/describe.d.ts +21 -0
- package/dist/types/packages/docx-vars/src/generate.d.ts +11 -0
- package/dist/types/packages/docx-vars/src/icons.d.ts +52 -0
- package/dist/types/packages/docx-vars/src/idioms.d.ts +36 -0
- package/dist/types/packages/docx-vars/src/index.d.ts +31 -0
- package/dist/types/packages/docx-vars/src/labels.d.ts +42 -0
- package/dist/types/packages/docx-vars/src/library.d.ts +47 -0
- package/dist/types/packages/docx-vars/src/phrase.d.ts +3 -0
- package/dist/types/packages/docx-vars/src/picker.d.ts +19 -0
- package/dist/types/packages/docx-vars/src/plugin.d.ts +126 -0
- package/dist/types/packages/docx-vars/src/plugins.d.ts +29 -0
- package/dist/types/packages/docx-vars/src/preview.d.ts +25 -0
- package/dist/types/packages/docx-vars/src/scenario.d.ts +20 -0
- package/dist/types/packages/docx-vars/src/substitute.d.ts +28 -0
- package/dist/types/packages/docx-vars/src/sync.d.ts +56 -0
- package/dist/types/packages/docx-vars/src/target-canvas.d.ts +66 -0
- package/dist/types/packages/docx-vars/src/tokens.d.ts +18 -0
- package/dist/types/packages/fonts/src/advances.d.ts +90 -0
- package/dist/types/packages/fonts/src/aliases.d.ts +27 -0
- package/dist/types/packages/fonts/src/families.d.ts +1 -0
- package/dist/types/packages/fonts/src/load.d.ts +25 -0
- package/dist/types/packages/fonts/src/metrics.d.ts +44 -0
- package/fonts/ttf/abadi-mt-condensed-extra-bold-400-normal.ttf +0 -0
- package/fonts/ttf/abadi-mt-condensed-light-400-normal.ttf +0 -0
- package/fonts/ttf/angsana-new-400-italic.ttf +0 -0
- package/fonts/ttf/angsana-new-400-normal.ttf +0 -0
- package/fonts/ttf/angsana-new-700-italic.ttf +0 -0
- package/fonts/ttf/angsana-new-700-normal.ttf +0 -0
- package/fonts/ttf/apple-color-emoji-400-normal.ttf +0 -0
- package/fonts/ttf/apple-symbols-400-normal.ttf +0 -0
- package/fonts/ttf/aptos-400-italic.ttf +0 -0
- package/fonts/ttf/aptos-400-normal.ttf +0 -0
- package/fonts/ttf/aptos-700-italic.ttf +0 -0
- package/fonts/ttf/aptos-700-normal.ttf +0 -0
- package/fonts/ttf/aptos-narrow-400-italic.ttf +0 -0
- package/fonts/ttf/aptos-narrow-400-normal.ttf +0 -0
- package/fonts/ttf/aptos-narrow-700-italic.ttf +0 -0
- package/fonts/ttf/aptos-narrow-700-normal.ttf +0 -0
- package/fonts/ttf/arial-400-italic.ttf +0 -0
- package/fonts/ttf/arial-400-normal.ttf +0 -0
- package/fonts/ttf/arial-700-italic.ttf +0 -0
- package/fonts/ttf/arial-700-normal.ttf +0 -0
- package/fonts/ttf/arial-black-700-normal.ttf +0 -0
- package/fonts/ttf/arial-hebrew-400-normal.ttf +0 -0
- package/fonts/ttf/arial-hebrew-700-normal.ttf +0 -0
- package/fonts/ttf/arial-narrow-400-italic.ttf +0 -0
- package/fonts/ttf/arial-narrow-400-normal.ttf +0 -0
- package/fonts/ttf/arial-narrow-700-italic.ttf +0 -0
- package/fonts/ttf/arial-narrow-700-normal.ttf +0 -0
- package/fonts/ttf/arial-rounded-mt-bold-400-normal.ttf +0 -0
- package/fonts/ttf/arial-unicode-ms-400-normal.ttf +0 -0
- package/fonts/ttf/avenir-400-italic.ttf +0 -0
- package/fonts/ttf/avenir-400-normal.ttf +0 -0
- package/fonts/ttf/avenir-700-normal.ttf +0 -0
- package/fonts/ttf/avenir-black-700-normal.ttf +0 -0
- package/fonts/ttf/avenir-book-400-normal.ttf +0 -0
- package/fonts/ttf/avenir-heavy-700-italic.ttf +0 -0
- package/fonts/ttf/avenir-heavy-700-normal.ttf +0 -0
- package/fonts/ttf/avenir-light-400-italic.ttf +0 -0
- package/fonts/ttf/avenir-light-400-normal.ttf +0 -0
- package/fonts/ttf/avenir-next-400-italic.ttf +0 -0
- package/fonts/ttf/avenir-next-400-normal.ttf +0 -0
- package/fonts/ttf/avenir-next-700-italic.ttf +0 -0
- package/fonts/ttf/avenir-next-700-normal.ttf +0 -0
- package/fonts/ttf/baskerville-old-face-400-normal.ttf +0 -0
- package/fonts/ttf/batang-400-normal.ttf +0 -0
- package/fonts/ttf/bauhaus-93-400-normal.ttf +0 -0
- package/fonts/ttf/big-caslon-400-normal.ttf +0 -0
- package/fonts/ttf/bookman-old-style-400-italic.ttf +0 -0
- package/fonts/ttf/bookman-old-style-400-normal.ttf +0 -0
- package/fonts/ttf/bookman-old-style-700-italic.ttf +0 -0
- package/fonts/ttf/bookman-old-style-700-normal.ttf +0 -0
- package/fonts/ttf/calibri-400-italic.ttf +0 -0
- package/fonts/ttf/calibri-400-normal.ttf +0 -0
- package/fonts/ttf/calibri-700-italic.ttf +0 -0
- package/fonts/ttf/calibri-700-normal.ttf +0 -0
- package/fonts/ttf/calibri-light-400-italic.ttf +0 -0
- package/fonts/ttf/calibri-light-400-normal.ttf +0 -0
- package/fonts/ttf/cambria-400-italic.ttf +0 -0
- package/fonts/ttf/cambria-400-normal.ttf +0 -0
- package/fonts/ttf/cambria-700-italic.ttf +0 -0
- package/fonts/ttf/cambria-700-normal.ttf +0 -0
- package/fonts/ttf/cambria-math-400-normal.ttf +0 -0
- package/fonts/ttf/candara-400-italic.ttf +0 -0
- package/fonts/ttf/candara-400-normal.ttf +0 -0
- package/fonts/ttf/candara-700-italic.ttf +0 -0
- package/fonts/ttf/candara-700-normal.ttf +0 -0
- package/fonts/ttf/century-400-normal.ttf +0 -0
- package/fonts/ttf/century-gothic-400-italic.ttf +0 -0
- package/fonts/ttf/century-gothic-400-normal.ttf +0 -0
- package/fonts/ttf/century-gothic-700-italic.ttf +0 -0
- package/fonts/ttf/century-gothic-700-normal.ttf +0 -0
- package/fonts/ttf/century-schoolbook-400-italic.ttf +0 -0
- package/fonts/ttf/century-schoolbook-400-normal.ttf +0 -0
- package/fonts/ttf/century-schoolbook-700-italic.ttf +0 -0
- package/fonts/ttf/century-schoolbook-700-normal.ttf +0 -0
- package/fonts/ttf/comic-sans-ms-400-normal.ttf +0 -0
- package/fonts/ttf/comic-sans-ms-700-normal.ttf +0 -0
- package/fonts/ttf/consolas-400-italic.ttf +0 -0
- package/fonts/ttf/consolas-400-normal.ttf +0 -0
- package/fonts/ttf/consolas-700-normal.ttf +0 -0
- package/fonts/ttf/corbel-400-italic.ttf +0 -0
- package/fonts/ttf/corbel-400-normal.ttf +0 -0
- package/fonts/ttf/corbel-700-italic.ttf +0 -0
- package/fonts/ttf/corbel-700-normal.ttf +0 -0
- package/fonts/ttf/cordia-new-400-italic.ttf +0 -0
- package/fonts/ttf/cordia-new-400-normal.ttf +0 -0
- package/fonts/ttf/cordia-new-700-italic.ttf +0 -0
- package/fonts/ttf/cordia-new-700-normal.ttf +0 -0
- package/fonts/ttf/courier-400-normal.ttf +0 -0
- package/fonts/ttf/courier-new-400-italic.ttf +0 -0
- package/fonts/ttf/courier-new-400-normal.ttf +0 -0
- package/fonts/ttf/courier-new-700-normal.ttf +0 -0
- package/fonts/ttf/dengxian-400-normal.ttf +0 -0
- package/fonts/ttf/dengxian-700-normal.ttf +0 -0
- package/fonts/ttf/dengxian-light-400-normal.ttf +0 -0
- package/fonts/ttf/didot-400-italic.ttf +0 -0
- package/fonts/ttf/didot-400-normal.ttf +0 -0
- package/fonts/ttf/didot-700-normal.ttf +0 -0
- package/fonts/ttf/edwardian-script-itc-400-normal.ttf +0 -0
- package/fonts/ttf/euphemia-ucas-400-italic.ttf +0 -0
- package/fonts/ttf/euphemia-ucas-400-normal.ttf +0 -0
- package/fonts/ttf/euphemia-ucas-700-normal.ttf +0 -0
- package/fonts/ttf/eurostile-400-normal.ttf +0 -0
- package/fonts/ttf/eurostile-700-normal.ttf +0 -0
- package/fonts/ttf/franklin-gothic-book-400-italic.ttf +0 -0
- package/fonts/ttf/franklin-gothic-book-400-normal.ttf +0 -0
- package/fonts/ttf/franklin-gothic-demi-400-italic.ttf +0 -0
- package/fonts/ttf/franklin-gothic-demi-400-normal.ttf +0 -0
- package/fonts/ttf/franklin-gothic-demi-cond-400-normal.ttf +0 -0
- package/fonts/ttf/franklin-gothic-medium-400-italic.ttf +0 -0
- package/fonts/ttf/franklin-gothic-medium-400-normal.ttf +0 -0
- package/fonts/ttf/franklin-gothic-medium-cond-400-normal.ttf +0 -0
- package/fonts/ttf/futura-400-italic.ttf +0 -0
- package/fonts/ttf/futura-400-normal.ttf +0 -0
- package/fonts/ttf/futura-700-normal.ttf +0 -0
- package/fonts/ttf/garamond-400-italic.ttf +0 -0
- package/fonts/ttf/garamond-400-normal.ttf +0 -0
- package/fonts/ttf/garamond-700-italic.ttf +0 -0
- package/fonts/ttf/garamond-700-normal.ttf +0 -0
- package/fonts/ttf/geneva-400-normal.ttf +0 -0
- package/fonts/ttf/georgia-400-italic.ttf +0 -0
- package/fonts/ttf/georgia-400-normal.ttf +0 -0
- package/fonts/ttf/georgia-700-normal.ttf +0 -0
- package/fonts/ttf/gill-sans-400-italic.ttf +0 -0
- package/fonts/ttf/gill-sans-400-normal.ttf +0 -0
- package/fonts/ttf/gill-sans-700-italic.ttf +0 -0
- package/fonts/ttf/gill-sans-700-normal.ttf +0 -0
- package/fonts/ttf/gill-sans-light-400-italic.ttf +0 -0
- package/fonts/ttf/gill-sans-light-400-normal.ttf +0 -0
- package/fonts/ttf/gill-sans-mt-400-italic.ttf +0 -0
- package/fonts/ttf/gill-sans-mt-400-normal.ttf +0 -0
- package/fonts/ttf/gill-sans-mt-700-italic.ttf +0 -0
- package/fonts/ttf/gill-sans-mt-700-normal.ttf +0 -0
- package/fonts/ttf/helvetica-400-italic.ttf +0 -0
- package/fonts/ttf/helvetica-400-normal.ttf +0 -0
- package/fonts/ttf/helvetica-700-italic.ttf +0 -0
- package/fonts/ttf/helvetica-700-normal.ttf +0 -0
- package/fonts/ttf/helvetica-neue-400-italic.ttf +0 -0
- package/fonts/ttf/helvetica-neue-400-normal.ttf +0 -0
- package/fonts/ttf/helvetica-neue-700-italic.ttf +0 -0
- package/fonts/ttf/helvetica-neue-700-normal.ttf +0 -0
- package/fonts/ttf/hoefler-text-400-italic.ttf +0 -0
- package/fonts/ttf/hoefler-text-400-normal.ttf +0 -0
- package/fonts/ttf/hoefler-text-700-italic.ttf +0 -0
- package/fonts/ttf/hoefler-text-700-normal.ttf +0 -0
- package/fonts/ttf/lucida-grande-400-normal.ttf +0 -0
- package/fonts/ttf/lucida-grande-700-normal.ttf +0 -0
- package/fonts/ttf/lucida-sans-400-italic.ttf +0 -0
- package/fonts/ttf/lucida-sans-400-normal.ttf +0 -0
- package/fonts/ttf/lucida-sans-700-italic.ttf +0 -0
- package/fonts/ttf/lucida-sans-700-normal.ttf +0 -0
- package/fonts/ttf/lucida-sans-unicode-400-normal.ttf +0 -0
- package/fonts/ttf/malgun-gothic-400-normal.ttf +0 -0
- package/fonts/ttf/malgun-gothic-700-normal.ttf +0 -0
- package/fonts/ttf/mangal-400-normal.ttf +0 -0
- package/fonts/ttf/mangal-700-normal.ttf +0 -0
- package/fonts/ttf/microsoft-sans-serif-400-normal.ttf +0 -0
- package/fonts/ttf/microsoft-yahei-400-normal.ttf +0 -0
- package/fonts/ttf/microsoft-yahei-700-normal.ttf +0 -0
- package/fonts/ttf/microsoft-yi-baiti-400-normal.ttf +0 -0
- package/fonts/ttf/monotype-sorts-400-normal.ttf +0 -0
- package/fonts/ttf/ms-gothic-400-normal.ttf +0 -0
- package/fonts/ttf/ms-mincho-400-normal.ttf +0 -0
- package/fonts/ttf/ms-ui-gothic-400-normal.ttf +0 -0
- package/fonts/ttf/new-york-400-italic.ttf +0 -0
- package/fonts/ttf/new-york-400-normal.ttf +0 -0
- package/fonts/ttf/news-gothic-mt-400-italic.ttf +0 -0
- package/fonts/ttf/news-gothic-mt-400-normal.ttf +0 -0
- package/fonts/ttf/news-gothic-mt-700-italic.ttf +0 -0
- package/fonts/ttf/news-gothic-mt-700-normal.ttf +0 -0
- package/fonts/ttf/nsimsun-400-normal.ttf +0 -0
- package/fonts/ttf/optima-400-italic.ttf +0 -0
- package/fonts/ttf/optima-400-normal.ttf +0 -0
- package/fonts/ttf/optima-700-italic.ttf +0 -0
- package/fonts/ttf/optima-700-normal.ttf +0 -0
- package/fonts/ttf/palatino-400-italic.ttf +0 -0
- package/fonts/ttf/palatino-400-normal.ttf +0 -0
- package/fonts/ttf/palatino-700-italic.ttf +0 -0
- package/fonts/ttf/palatino-700-normal.ttf +0 -0
- package/fonts/ttf/palatino-linotype-400-italic.ttf +0 -0
- package/fonts/ttf/palatino-linotype-400-normal.ttf +0 -0
- package/fonts/ttf/palatino-linotype-700-italic.ttf +0 -0
- package/fonts/ttf/palatino-linotype-700-normal.ttf +0 -0
- package/fonts/ttf/pmingliu-400-normal.ttf +0 -0
- package/fonts/ttf/pt-mono-400-normal.ttf +0 -0
- package/fonts/ttf/pt-mono-700-normal.ttf +0 -0
- package/fonts/ttf/segoe-ui-symbol-400-normal.ttf +0 -0
- package/fonts/ttf/simsun-400-normal.ttf +0 -0
- package/fonts/ttf/skia-400-normal.ttf +0 -0
- package/fonts/ttf/stencil-400-normal.ttf +0 -0
- package/fonts/ttf/symbol-400-normal.ttf +0 -0
- package/fonts/ttf/tahoma-400-normal.ttf +0 -0
- package/fonts/ttf/tahoma-700-normal.ttf +0 -0
- package/fonts/ttf/times-400-italic.ttf +0 -0
- package/fonts/ttf/times-400-normal.ttf +0 -0
- package/fonts/ttf/times-700-italic.ttf +0 -0
- package/fonts/ttf/times-700-normal.ttf +0 -0
- package/fonts/ttf/times-new-roman-400-italic.ttf +0 -0
- package/fonts/ttf/times-new-roman-400-normal.ttf +0 -0
- package/fonts/ttf/times-new-roman-700-italic.ttf +0 -0
- package/fonts/ttf/times-new-roman-700-normal.ttf +0 -0
- package/fonts/ttf/trebuchet-ms-400-italic.ttf +0 -0
- package/fonts/ttf/trebuchet-ms-400-normal.ttf +0 -0
- package/fonts/ttf/trebuchet-ms-700-italic.ttf +0 -0
- package/fonts/ttf/trebuchet-ms-700-normal.ttf +0 -0
- package/fonts/ttf/tw-cen-mt-400-normal.ttf +0 -0
- package/fonts/ttf/tw-cen-mt-700-normal.ttf +0 -0
- package/fonts/ttf/tw-cen-mt-condensed-400-normal.ttf +0 -0
- package/fonts/ttf/tw-cen-mt-condensed-700-normal.ttf +0 -0
- package/fonts/ttf/verdana-400-italic.ttf +0 -0
- package/fonts/ttf/verdana-400-normal.ttf +0 -0
- package/fonts/ttf/verdana-700-italic.ttf +0 -0
- package/fonts/ttf/verdana-700-normal.ttf +0 -0
- package/fonts/ttf/webdings-400-normal.ttf +0 -0
- package/fonts/ttf/wingdings-2-400-normal.ttf +0 -0
- package/fonts/ttf/wingdings-3-400-normal.ttf +0 -0
- package/fonts/ttf/wingdings-400-normal.ttf +0 -0
- package/fonts/ttf/yu-gothic-light-400-normal.ttf +0 -0
- package/fonts/ttf/yu-mincho-400-normal.ttf +0 -0
- package/fonts/ttf/yu-mincho-700-normal.ttf +0 -0
- package/package.json +63 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
import type { StyledParagraph, BodyBlock, TableInfo } from '../../docx-model/src/index';
|
|
2
|
+
/** Carte des images pré-chargées, indexée par chemin cible dans le .docx. */
|
|
3
|
+
export type ImageMap = Map<string, ImageBitmap>;
|
|
4
|
+
export declare const PT_PX: number;
|
|
5
|
+
/** Numéro de page courant et total, pour recalculer les champs PAGE/NUMPAGES. */
|
|
6
|
+
export interface PageNums {
|
|
7
|
+
page: number;
|
|
8
|
+
total: number;
|
|
9
|
+
/** `w:pgNumType w:fmt` — `decimal` par défaut, `numberInDash` écrit « - 3 - » */
|
|
10
|
+
fmt?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Tout ce dont un dessinateur a besoin, et qu'il fait avancer.
|
|
14
|
+
*
|
|
15
|
+
* `y` et `ctx` sont mutables et le RESTENT : après un saut de page, `ctx`
|
|
16
|
+
* désigne un autre canvas. Un dessinateur qui en garde une copie locale peint
|
|
17
|
+
* sur la page précédente — c'est le bug le plus coûteux qu'ait connu ce module.
|
|
18
|
+
*/
|
|
19
|
+
export interface DrawCtx {
|
|
20
|
+
/** on compose DÉJÀ l'intérieur d'un `w:framePr` — ne pas le re-sortir du fil */
|
|
21
|
+
inFrame?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Rien n'a encore été dessiné en haut de cette PAGE.
|
|
24
|
+
*
|
|
25
|
+
* Word y jette tout l'espacement vertical — l'« après » du paragraphe qui
|
|
26
|
+
* portait le saut comme l'« avant » de celui qui ouvre la page. Mesuré au
|
|
27
|
+
* banc, sondes `hautpage-*` : la première ligne de la page 2 tombe à y57,0
|
|
28
|
+
* dans les trois cas, avec ou sans 8 pt déclarés.
|
|
29
|
+
*
|
|
30
|
+
* En tête de COLONNE c'est l'inverse — sondes `hautcol-*` : y69,7 sans
|
|
31
|
+
* espacement, y77,6 avec, les 8 pt bien posés. D'où ce drapeau plutôt qu'une
|
|
32
|
+
* règle unique.
|
|
33
|
+
*/
|
|
34
|
+
atPageTop?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Bas atteint par les paragraphes ENCADRÉS dont le texte est habillé
|
|
37
|
+
* (`w:framePr` sans `w:wrap="none"`).
|
|
38
|
+
*
|
|
39
|
+
* Un cadre ne fait jamais avancer le fil — Word y fait passer le texte à
|
|
40
|
+
* côté, pas dessous. Mais la HAUTEUR D'UN EN-TÊTE ou d'un pied, elle, doit
|
|
41
|
+
* l'englober : sur Vanished, le numéro de page encadré de l'en-tête descend
|
|
42
|
+
* le corps de 12 pt sur chaque page. Le réserver dans le fil du CORPS, en
|
|
43
|
+
* revanche, coûtait 52 points à Andersons.
|
|
44
|
+
*/
|
|
45
|
+
frameBottom?: number;
|
|
46
|
+
ctx: CanvasRenderingContext2D;
|
|
47
|
+
def: {
|
|
48
|
+
font: string;
|
|
49
|
+
sizePt: number;
|
|
50
|
+
};
|
|
51
|
+
y: number;
|
|
52
|
+
contentLeft: number;
|
|
53
|
+
contentWidth: number;
|
|
54
|
+
pageBottom: number;
|
|
55
|
+
/**
|
|
56
|
+
* Passe à la page (ou colonne) suivante.
|
|
57
|
+
*
|
|
58
|
+
* `force` réclame une vraie PAGE : un `w:br w:type="page"` ne se contente pas
|
|
59
|
+
* de la colonne d'à côté.
|
|
60
|
+
*/
|
|
61
|
+
onPageBreak?: (force?: boolean, cause?: string) => void;
|
|
62
|
+
images?: ImageMap;
|
|
63
|
+
/** page courante, pour situer les rectangles remontés — 1 par défaut */
|
|
64
|
+
page?: number;
|
|
65
|
+
onMark?(rect: MarkRect): void;
|
|
66
|
+
/**
|
|
67
|
+
* Un appel de note vient d'être composé sur la page `page`.
|
|
68
|
+
*
|
|
69
|
+
* Le moteur s'en sert pour savoir quelles notes vont au bas de quelle page —
|
|
70
|
+
* ce qui décide de la place qu'il faut leur réserver, donc de tout ce qui
|
|
71
|
+
* tient sur la page.
|
|
72
|
+
*/
|
|
73
|
+
onFootnote?(n: number, page: number): void;
|
|
74
|
+
/**
|
|
75
|
+
* Bas utile de la page `page`, réserve des notes comprise.
|
|
76
|
+
*
|
|
77
|
+
* `pageBottom` est figé à la création du contexte, ce qui suffit au fil
|
|
78
|
+
* principal — il en refait un par bloc — mais pas à une CELLULE, qui traverse
|
|
79
|
+
* les pages avec le sien. Sans cette fonction, une cellule qui passe sur une
|
|
80
|
+
* page portant des notes ignorait leur réserve.
|
|
81
|
+
*/
|
|
82
|
+
bottomOf?(page: number): number;
|
|
83
|
+
/** On compose le contenu d'une CELLULE — Word y ignore le saut de page explicite. */
|
|
84
|
+
inCell?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Le bas atteint par un rang de tableau IMBRIQUÉ sur chaque page traversée.
|
|
87
|
+
*
|
|
88
|
+
* Un rang se ferme sous sa dernière ligne, et la cellule qui le porte ne sait
|
|
89
|
+
* où celle-ci est tombée que par son propre `onPageBreak` — qu'un tableau
|
|
90
|
+
* imbriqué ne déclenche JAMAIS, puisqu'il change de page tout seul. Sur
|
|
91
|
+
* « CREW CINE SKYLARK » page 18, le rang ANNEXE se refermait donc à 502,6 pt
|
|
92
|
+
* quand ses tableaux imbriqués descendaient à 519,2 : le filet passait
|
|
93
|
+
* PAR-DESSUS ses deux dernières lignes.
|
|
94
|
+
*/
|
|
95
|
+
onRowBottom?(page: number, y: number): void;
|
|
96
|
+
/**
|
|
97
|
+
* Densité de la surface, pour accrocher les FILETS à la grille de pixels.
|
|
98
|
+
*
|
|
99
|
+
* Un trait tracé est CENTRÉ sur son chemin : un filet de 0,5 pt posé sur une
|
|
100
|
+
* ligne de grille déborde d'un quart de point de chaque côté et tombe à cheval
|
|
101
|
+
* sur deux rangées de pixels, à n'importe quelle densité. Word ne les trace
|
|
102
|
+
* pas — son PDF les REMPLIT (108 opérateurs `f`, zéro `w` dans le flux de la
|
|
103
|
+
* page 1 de « Cascadeur BRIARCLIFF ») — et leurs arêtes tombent sur des
|
|
104
|
+
* pixels entiers. Connaître la densité ici permet d'en faire autant.
|
|
105
|
+
*/
|
|
106
|
+
dpr?: number;
|
|
107
|
+
/** trace de layout — publie chaque ligne dessinée pour comparaison avec Word */
|
|
108
|
+
onLine?(line: LineTrace): void;
|
|
109
|
+
/** publie le rectangle de chaque image dessinée — la souris n'a que ça */
|
|
110
|
+
onImage?(rect: ImageRect): void;
|
|
111
|
+
/** Chaque TRAIT dessiné — voir `RuleTrace`. */
|
|
112
|
+
onRule?(rule: RuleTrace): void;
|
|
113
|
+
/**
|
|
114
|
+
* Un RANG de tableau composé, avec la hauteur que nous lui donnons.
|
|
115
|
+
*
|
|
116
|
+
* Word publie la sienne dans son rendu (l'écart entre la première ligne d'un
|
|
117
|
+
* rang et celle du suivant) : sans ce rappel, les deux ne se comparaient
|
|
118
|
+
* qu'indirectement, en changeant une règle et en regardant le score bouger.
|
|
119
|
+
*/
|
|
120
|
+
onRow?(row: RowTrace): void;
|
|
121
|
+
/**
|
|
122
|
+
* Chaque changement de page ou de colonne, avec sa cause.
|
|
123
|
+
*
|
|
124
|
+
* Sans elle, un document qui fabrique des pages ne se diagnostique qu'à
|
|
125
|
+
* tâtons : le rendu tourne dans le navigateur, on ne voit que le résultat. Ce
|
|
126
|
+
* rapport dit QUI a coupé, et à quelle hauteur — c'est la moitié du travail.
|
|
127
|
+
*/
|
|
128
|
+
onBreak?(b: {
|
|
129
|
+
page: number;
|
|
130
|
+
y: number;
|
|
131
|
+
cause: string;
|
|
132
|
+
bloc?: number;
|
|
133
|
+
}): void;
|
|
134
|
+
/** Bloc en cours de composition, reporté sur chaque ligne publiée. */
|
|
135
|
+
blockIdx?: number;
|
|
136
|
+
/** zone dessinée — 'body' par défaut */
|
|
137
|
+
part?: 'body' | 'header' | 'footer';
|
|
138
|
+
/** w:defaultTabStop du document, en points (36 par défaut) */
|
|
139
|
+
defaultTabPt?: number;
|
|
140
|
+
/**
|
|
141
|
+
* `w:doNotExpandShiftReturn` — une ligne justifiée qui finit par un `w:br`
|
|
142
|
+
* n'est pas étirée à la colonne. 115 des 400 documents mesurés le posent.
|
|
143
|
+
*/
|
|
144
|
+
noExpandShiftReturn?: boolean;
|
|
145
|
+
/**
|
|
146
|
+
* compatibilityMode < 15 — Word 2010 and earlier never condense the blanks
|
|
147
|
+
* of a justified line to keep its last word; only Word 2013+ does (`keepsWord`).
|
|
148
|
+
* Measured on 4 400 of Word's own decisions in 39 such documents: the
|
|
149
|
+
* condensing rule agrees with 75.8 % of them, "send the word down whenever it
|
|
150
|
+
* overflows" with 98.7 %. 134 corpus documents are in a legacy mode.
|
|
151
|
+
*/
|
|
152
|
+
legacyWrap?: boolean;
|
|
153
|
+
/** `w:ulTrailSpace` — le soulignement couvre l'espace de fin de ligne */
|
|
154
|
+
ulTrailSpace?: boolean;
|
|
155
|
+
/** numéro de page courant et total, pour les champs PAGE/NUMPAGES */
|
|
156
|
+
nums?: PageNums;
|
|
157
|
+
/**
|
|
158
|
+
* Contexte de la page `idx` (0-based), créée au besoin.
|
|
159
|
+
*
|
|
160
|
+
* Un rang de tableau plus haut qu'une page doit continuer sur la suivante,
|
|
161
|
+
* colonne par colonne : chaque cellule a besoin de revenir sur la même page
|
|
162
|
+
* que ses voisines. Sans ça, tout ce qui dépassait était dessiné hors du
|
|
163
|
+
* canvas — donc perdu (mesuré à 680 pt hors page sur un contrat bilingue).
|
|
164
|
+
*/
|
|
165
|
+
pageAt?(idx: number): {
|
|
166
|
+
ctx: CanvasRenderingContext2D;
|
|
167
|
+
top: number;
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* Annonce le début d'un rang de tableau, et le rang du premier paragraphe
|
|
171
|
+
* qu'il porte. Un contrat de 42 pages ne compte que dix blocs — sans ce
|
|
172
|
+
* repère, la composition incrémentale n'aurait aucun point où reprendre.
|
|
173
|
+
*/
|
|
174
|
+
onRowStart?(row: number, para: number): void;
|
|
175
|
+
/**
|
|
176
|
+
* Publie le rectangle d'un TABLEAU, un par page qu'il occupe.
|
|
177
|
+
*
|
|
178
|
+
* Un tableau ne s'attrape pas par son texte : le curseur y tombe toujours
|
|
179
|
+
* dans une cellule. Sans ce rectangle, on ne peut ni le prendre comme un
|
|
180
|
+
* tout, ni lui poser une poignée. Le rang dans `tables()` est ajouté par le
|
|
181
|
+
* renderer, qui seul sait quel bloc il dessine.
|
|
182
|
+
*/
|
|
183
|
+
onTable?(rect: {
|
|
184
|
+
page: number;
|
|
185
|
+
x: number;
|
|
186
|
+
y: number;
|
|
187
|
+
width: number;
|
|
188
|
+
height: number;
|
|
189
|
+
}): void;
|
|
190
|
+
/**
|
|
191
|
+
* Le contrôle des orphelines s'applique-t-il dans ce flux ?
|
|
192
|
+
*
|
|
193
|
+
* Le renderer le décide pour le corps (il le désactive en multi-colonnes, où
|
|
194
|
+
* il se bat avec l'équilibrage) ; les cellules en héritent. Sans lui, tout
|
|
195
|
+
* document dont le corps tient dans un tableau n'avait aucun contrôle des
|
|
196
|
+
* orphelines — « Vanished » laissait une première ligne seule en bas de page
|
|
197
|
+
* et perdait une page entière de correspondance.
|
|
198
|
+
*/
|
|
199
|
+
widowControl?: boolean;
|
|
200
|
+
/**
|
|
201
|
+
* `w:spacing w:after` déjà appliqué par le paragraphe précédent.
|
|
202
|
+
*
|
|
203
|
+
* Word ne CUMULE pas l'espacement après un paragraphe et celui avant le
|
|
204
|
+
* suivant : il prend le plus grand des deux (mesuré au banc de sondes —
|
|
205
|
+
* before=6pt et after=6pt donnent 6 pt, pas 12). On garde donc ce qui a déjà
|
|
206
|
+
* été posé pour ne compléter que la différence.
|
|
207
|
+
*/
|
|
208
|
+
prevSpaceAfter?: number;
|
|
209
|
+
/**
|
|
210
|
+
* Haut du corps de page, en pixels.
|
|
211
|
+
*
|
|
212
|
+
* Sert à savoir ce qu'une page ENTIÈRE peut contenir, et donc si changer de
|
|
213
|
+
* page servirait à quelque chose : une ligne de tableau plus haute qu'une
|
|
214
|
+
* page ne tiendra pas mieux sur la suivante.
|
|
215
|
+
*/
|
|
216
|
+
bodyTop?: number;
|
|
217
|
+
/** style du paragraphe précédent — `w:contextualSpacing` ne joue qu'entre égaux */
|
|
218
|
+
prevStyleId?: string;
|
|
219
|
+
/** le paragraphe précédent déclarait-il `w:contextualSpacing` ? */
|
|
220
|
+
prevContextual?: boolean;
|
|
221
|
+
/**
|
|
222
|
+
* Rang du paragraphe en cours de dessin dans `paragraphs`.
|
|
223
|
+
*
|
|
224
|
+
* C'est la moitié de l'adresse qu'un curseur réclame — l'autre moitié est le
|
|
225
|
+
* rang du caractère, que le jeton porte. `undefined` pour ce qui ne vit pas
|
|
226
|
+
* dans le fil du corps : en-tête, pied, zone de texte ancrée. Ces
|
|
227
|
+
* paragraphes-là ne sont pas dans `paragraphs(doc)`, donc pas adressables.
|
|
228
|
+
*/
|
|
229
|
+
paraIndex?: number;
|
|
230
|
+
/**
|
|
231
|
+
* Fichier du zip où vit le paragraphe dessiné — `undefined` pour le corps.
|
|
232
|
+
*
|
|
233
|
+
* Un en-tête est fait des mêmes `w:p` dans un autre fichier. Sans ce chemin,
|
|
234
|
+
* son rang de paragraphe désignerait le corps, et le curseur écrirait dans
|
|
235
|
+
* un tout autre texte.
|
|
236
|
+
*/
|
|
237
|
+
partPath?: string;
|
|
238
|
+
/**
|
|
239
|
+
* Publier aussi les lignes SANS texte.
|
|
240
|
+
*
|
|
241
|
+
* Un paragraphe vide n'a rien à comparer au PDF de Word : le banc l'ignore, et
|
|
242
|
+
* l'ajouter à ses appariements fausserait ses mesures. L'éditeur, lui, en a
|
|
243
|
+
* besoin — sans sa géométrie, on ne peut pas poser un curseur sur une ligne
|
|
244
|
+
* vide, et ces matrices en comptent des centaines.
|
|
245
|
+
*/
|
|
246
|
+
traceEmpty?: boolean;
|
|
247
|
+
/**
|
|
248
|
+
* Facteur correctif Canvas→hmtx par police.
|
|
249
|
+
*
|
|
250
|
+
* Canvas (CoreText/macOS) mesure les glyphes ~1% plus large que les avances
|
|
251
|
+
* du TTF. Multiplier `measureText().width` par ce facteur corrige la mesure
|
|
252
|
+
* sans toucher au dessin — la justification étire/comprime ensuite.
|
|
253
|
+
*/
|
|
254
|
+
widthCorrections?: Record<string, number>;
|
|
255
|
+
}
|
|
256
|
+
/** Un rang de tableau composé, pour comparer sa hauteur à celle de Word. */
|
|
257
|
+
export interface RowTrace {
|
|
258
|
+
/** index du BLOC du corps qui porte ce tableau */
|
|
259
|
+
bloc?: number;
|
|
260
|
+
page: number;
|
|
261
|
+
/** haut du rang, en px CSS */
|
|
262
|
+
y: number;
|
|
263
|
+
/** hauteur du rang, en px CSS — trait compris, comme chez Word */
|
|
264
|
+
height: number;
|
|
265
|
+
rowIdx: number;
|
|
266
|
+
rows: number;
|
|
267
|
+
/** premier texte non vide du rang, pour l'apparier au rendu de Word */
|
|
268
|
+
text: string;
|
|
269
|
+
}
|
|
270
|
+
/** Une ligne dessinée sur le canvas, pour comparer avec pdftotext -bbox */
|
|
271
|
+
/**
|
|
272
|
+
* Un TRAIT dessiné — bordure de tableau, de paragraphe, de run, soulignement.
|
|
273
|
+
*
|
|
274
|
+
* Ni la bordure ni la fusion de cellules ne produisent de TEXTE : le banc de
|
|
275
|
+
* référence, qui apparie des lignes de texte, ne peut pas les voir. C'est le
|
|
276
|
+
* même angle mort que `w:w`, où 1 912 lignes illisibles laissaient le score
|
|
277
|
+
* inchangé au centième. Le PDF de Word publie ses traits en vectoriel
|
|
278
|
+
* (`mutool draw -F trace`) ; il fallait que nous publiions les nôtres.
|
|
279
|
+
*/
|
|
280
|
+
export interface RuleTrace {
|
|
281
|
+
page: number;
|
|
282
|
+
/** extrémités du trait, en px CSS, comme `LineTrace` */
|
|
283
|
+
x1: number;
|
|
284
|
+
y1: number;
|
|
285
|
+
x2: number;
|
|
286
|
+
y2: number;
|
|
287
|
+
/** épaisseur en px CSS */
|
|
288
|
+
widthPx: number;
|
|
289
|
+
kind: 'table' | 'para' | 'run' | 'underline' | 'strike' | 'footnote';
|
|
290
|
+
}
|
|
291
|
+
/** Les notes de bas de page d'un document, prêtes à composer. */
|
|
292
|
+
export interface Footnotes {
|
|
293
|
+
/** les paragraphes de toutes les notes, à la suite */
|
|
294
|
+
paragraphs: StyledParagraph[];
|
|
295
|
+
/** `[start, end)` dans `paragraphs`, indexé par NUMÉRO d'appel — 0 inutilisé */
|
|
296
|
+
ranges: Array<{
|
|
297
|
+
start: number;
|
|
298
|
+
end: number;
|
|
299
|
+
}>;
|
|
300
|
+
}
|
|
301
|
+
export interface LineTrace {
|
|
302
|
+
/**
|
|
303
|
+
* Index du BLOC dont vient cette ligne.
|
|
304
|
+
*
|
|
305
|
+
* Sans lui, `bench breaks` ne pouvait imputer un désaccord de page qu'à « la
|
|
306
|
+
* rupture publiée juste avant », heuristique qui a déjà fait lire deux fois
|
|
307
|
+
* de suite une cause pour une autre (voir mesure.md). Avec lui, on remonte de
|
|
308
|
+
* la dernière ligne d'une page de Word au bloc qui la porte, donc à la
|
|
309
|
+
* rupture qui décide vraiment.
|
|
310
|
+
*/
|
|
311
|
+
bloc?: number;
|
|
312
|
+
page: number;
|
|
313
|
+
/** position Y de la baseline, en px CSS */
|
|
314
|
+
y: number;
|
|
315
|
+
/** haut de la boîte de ligne, en px CSS — `pdftotext -bbox` donne un haut de
|
|
316
|
+
* glyphe, pas une baseline : comparer l'un à l'autre inventait 8 pt d'écart */
|
|
317
|
+
top: number;
|
|
318
|
+
/** hauteur de la boîte de ligne, en px CSS */
|
|
319
|
+
height: number;
|
|
320
|
+
/** position X de départ, en px CSS */
|
|
321
|
+
x: number;
|
|
322
|
+
/** largeur totale de la ligne */
|
|
323
|
+
width: number;
|
|
324
|
+
/**
|
|
325
|
+
* Largeur NATURELLE de la ligne, avant justification et hors tabulations.
|
|
326
|
+
*
|
|
327
|
+
* `width` est la largeur DESSINÉE : sur une ligne justifiée elle vaut la
|
|
328
|
+
* colonne, et sur une ligne tabulée elle comprend les blancs des taquets.
|
|
329
|
+
* Aucune des deux ne se compare à la somme des avances que Word publie dans
|
|
330
|
+
* son PDF — et c'est cette somme-là qui juge nos métriques.
|
|
331
|
+
*/
|
|
332
|
+
naturalWidth: number;
|
|
333
|
+
/**
|
|
334
|
+
* Échelle horizontale des glyphes (`w:rPr/w:w`), 1 par défaut.
|
|
335
|
+
*
|
|
336
|
+
* Publiée pour le banc : `mutool` rapporte pour chaque ligne une taille qui
|
|
337
|
+
* vaut `sqrt(sx × sy)` — la moyenne géométrique du matriciel de texte — donc
|
|
338
|
+
* PAS le corps composé dès que Word étire les glyphes. Sans elle, 990 lignes
|
|
339
|
+
* du « Contrat Runner Multilingue » passaient pour composées à 8 pt là où
|
|
340
|
+
* Word en annonçait 8,8, alors que les deux valent 8.
|
|
341
|
+
*/
|
|
342
|
+
scaleX?: number;
|
|
343
|
+
/** texte de la ligne */
|
|
344
|
+
text: string;
|
|
345
|
+
/** taille de police dominante */
|
|
346
|
+
fontPx: number;
|
|
347
|
+
/**
|
|
348
|
+
* Famille et couleur DOMINANTES de la ligne — celles du jeton le plus gros.
|
|
349
|
+
*
|
|
350
|
+
* Word publie dans son PDF la police qu'il a RÉELLEMENT composée, y compris
|
|
351
|
+
* quand il en a substitué une (Times y sort en TimesNewRomanPSMT). Sans ces
|
|
352
|
+
* deux champs de notre côté, la comparaison ne peut porter que sur des
|
|
353
|
+
* positions : une page rendue dans la mauvaise police, au bon endroit,
|
|
354
|
+
* marquait cent pour cent.
|
|
355
|
+
*/
|
|
356
|
+
fontFamily?: string;
|
|
357
|
+
color?: string;
|
|
358
|
+
/** zone de la page — `pdftotext` mélange les trois, il faut pouvoir trier */
|
|
359
|
+
part: 'body' | 'header' | 'footer';
|
|
360
|
+
/**
|
|
361
|
+
* Rang du paragraphe dessiné — `undefined` hors du fil du corps.
|
|
362
|
+
*
|
|
363
|
+
* Avec l'`off` des mots, c'est ce qui fait de la trace une carte cliquable :
|
|
364
|
+
* le renderer publie non seulement où il a dessiné, mais QUOI.
|
|
365
|
+
*/
|
|
366
|
+
para?: number;
|
|
367
|
+
/** fichier du zip d'où vient ce paragraphe — `undefined` pour le corps */
|
|
368
|
+
partPath?: string;
|
|
369
|
+
/**
|
|
370
|
+
* Position de chaque mot dessiné, en px CSS.
|
|
371
|
+
*
|
|
372
|
+
* `pdftotext -bbox` donne la boîte de chaque mot : comparer mot à mot plutôt
|
|
373
|
+
* que ligne à ligne, c'est la différence entre une mesure qui a un gradient et
|
|
374
|
+
* une qui n'en a pas. Une césure différente déplace deux ou trois mots, elle
|
|
375
|
+
* ne rend pas faux tout le paragraphe.
|
|
376
|
+
*
|
|
377
|
+
* `off` est le rang du premier caractère du mot dans le texte du paragraphe,
|
|
378
|
+
* et `font` la police avec laquelle il a été mesuré — de quoi retrouver un
|
|
379
|
+
* rang de caractère à l'intérieur du mot, sans le redemander au modèle.
|
|
380
|
+
*/
|
|
381
|
+
words: Array<{
|
|
382
|
+
x: number;
|
|
383
|
+
width: number;
|
|
384
|
+
text: string;
|
|
385
|
+
off?: number;
|
|
386
|
+
font?: string;
|
|
387
|
+
}>;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Rectangle d'une IMAGE dessinée, en px CSS relatifs à sa page.
|
|
391
|
+
*
|
|
392
|
+
* Une image n'occupe aucun caractère : elle n'a donc pas d'adresse où poser un
|
|
393
|
+
* curseur, et le hit-test du texte ne la trouvera jamais. Sans ce rectangle,
|
|
394
|
+
* elle est invisible à la souris — on ne peut ni la sélectionner ni la
|
|
395
|
+
* redimensionner. `index` est son rang parmi les images de son paragraphe,
|
|
396
|
+
* le même que celui du contexte.
|
|
397
|
+
*/
|
|
398
|
+
export interface ImageRect {
|
|
399
|
+
para: number;
|
|
400
|
+
index: number;
|
|
401
|
+
page: number;
|
|
402
|
+
x: number;
|
|
403
|
+
y: number;
|
|
404
|
+
width: number;
|
|
405
|
+
height: number;
|
|
406
|
+
/** posée hors du fil (`wp:anchor`) plutôt qu'entre deux mots */
|
|
407
|
+
anchored: boolean;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Rectangle d'un TABLEAU sur une page, en px CSS relatifs à elle.
|
|
411
|
+
*
|
|
412
|
+
* Un par page : un tableau qui enjambe trois feuilles en produit trois.
|
|
413
|
+
*/
|
|
414
|
+
export interface TableRect {
|
|
415
|
+
table: number;
|
|
416
|
+
page: number;
|
|
417
|
+
x: number;
|
|
418
|
+
y: number;
|
|
419
|
+
width: number;
|
|
420
|
+
height: number;
|
|
421
|
+
}
|
|
422
|
+
/** Rectangle dessiné pour un run marqué, en px CSS relatifs à sa page. */
|
|
423
|
+
export interface MarkRect {
|
|
424
|
+
mark: string;
|
|
425
|
+
page: number;
|
|
426
|
+
x: number;
|
|
427
|
+
y: number;
|
|
428
|
+
width: number;
|
|
429
|
+
height: number;
|
|
430
|
+
/** taille de police du run marqué — un calque peut s'y accorder */
|
|
431
|
+
fontPx: number;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Zone de texte ancrée, prête à dessiner.
|
|
435
|
+
*
|
|
436
|
+
* Posée à ses coordonnées quand on dessine le paragraphe qui porte son ancre :
|
|
437
|
+
* elle ne prend aucune place dans le fil et ne compte pas dans la pagination.
|
|
438
|
+
*/
|
|
439
|
+
export interface PlacedTextBox {
|
|
440
|
+
paraIndex: number;
|
|
441
|
+
xPt: number;
|
|
442
|
+
yPt: number;
|
|
443
|
+
relH: string;
|
|
444
|
+
relV: string;
|
|
445
|
+
widthPt: number;
|
|
446
|
+
heightPt: number;
|
|
447
|
+
/**
|
|
448
|
+
* Marges INTERNES du cadre (`a:bodyPr`), en points — 7,2 à gauche et à droite,
|
|
449
|
+
* 3,6 en haut chez Word par défaut. Elles décalent le texte DANS le cadre.
|
|
450
|
+
*/
|
|
451
|
+
insetLeftPt: number;
|
|
452
|
+
insetTopPt: number;
|
|
453
|
+
insetRightPt: number;
|
|
454
|
+
/** `none` = flotte sans prendre de place ; sinon Word réserve sa hauteur */
|
|
455
|
+
wrap: 'none' | 'square' | 'topAndBottom' | 'tight' | 'through';
|
|
456
|
+
paragraphs: StyledParagraph[];
|
|
457
|
+
/** `wp:inline` : la zone part du RETRAIT de son paragraphe, pas de la marge */
|
|
458
|
+
inline?: boolean;
|
|
459
|
+
}
|
|
460
|
+
/** Contenu d'une part composé comme un corps : blocs dans l'ordre, plus les tableaux. */
|
|
461
|
+
export interface PartBlocks {
|
|
462
|
+
blocks: BodyBlock[];
|
|
463
|
+
tables: TableInfo[];
|
|
464
|
+
}
|
|
465
|
+
/** En-têtes et pieds résolus pour une section, dans l'ordre de `sections`. */
|
|
466
|
+
export interface SectionParts {
|
|
467
|
+
/**
|
|
468
|
+
* En-tête de la PREMIÈRE page.
|
|
469
|
+
*
|
|
470
|
+
* Word ne le pose que si la section déclare `w:titlePg` ; c'est à l'appelant
|
|
471
|
+
* de le vérifier avant de le fournir. Le PIED de première page, lui, n'est
|
|
472
|
+
* pas encore posé — voir docs/boucle-fidelite.md, « Le pied de première
|
|
473
|
+
* page ».
|
|
474
|
+
*/
|
|
475
|
+
firstPageHeader?: StyledParagraph[];
|
|
476
|
+
defaultHeader?: StyledParagraph[];
|
|
477
|
+
defaultFooter?: StyledParagraph[];
|
|
478
|
+
/**
|
|
479
|
+
* Blocs et tableaux de chaque part, quand elle en porte.
|
|
480
|
+
*
|
|
481
|
+
* Un en-tête sans tableau se dessine très bien comme une suite de
|
|
482
|
+
* paragraphes ; un en-tête AVEC tableau, non — ses cellules s'empilent au
|
|
483
|
+
* lieu de se ranger côte à côte, et sa hauteur double. Ces champs ne sont
|
|
484
|
+
* donc renseignés que dans ce cas, et le dessinateur retombe sur la liste de
|
|
485
|
+
* paragraphes quand ils manquent.
|
|
486
|
+
*/
|
|
487
|
+
firstPageHeaderBlocks?: PartBlocks;
|
|
488
|
+
/** `w:titlePg` : la première page a ses PROPRES en-tête et pied — AUCUN s'ils ne sont pas déclarés. */
|
|
489
|
+
titlePg?: boolean;
|
|
490
|
+
firstPageFooter?: StyledParagraph[];
|
|
491
|
+
firstPageFooterBoxes?: PlacedTextBox[];
|
|
492
|
+
/** Parts des pages PAIRES — servies seulement si `w:evenAndOddHeaders`. */
|
|
493
|
+
evenHeader?: StyledParagraph[];
|
|
494
|
+
evenHeaderBlocks?: PartBlocks;
|
|
495
|
+
evenFooter?: StyledParagraph[];
|
|
496
|
+
evenFooterBoxes?: PlacedTextBox[];
|
|
497
|
+
defaultHeaderBlocks?: PartBlocks;
|
|
498
|
+
defaultFooterBlocks?: PartBlocks;
|
|
499
|
+
/**
|
|
500
|
+
* Zones de texte ancrées du PIED, posées à leurs coordonnées.
|
|
501
|
+
*
|
|
502
|
+
* Le paraphe des contrats en est une. Exclue du fil pour ne pas surgir à
|
|
503
|
+
* gauche, elle n'était dessinée nulle part et manquait à chaque page.
|
|
504
|
+
*/
|
|
505
|
+
defaultFooterBoxes?: PlacedTextBox[];
|
|
506
|
+
/**
|
|
507
|
+
* Chemins des parts d'en-tête et de pied dans le zip.
|
|
508
|
+
*
|
|
509
|
+
* Sans eux, un paragraphe d'en-tête n'a pas d'adresse : son rang désignerait
|
|
510
|
+
* le corps, et le curseur écrirait dans un tout autre texte.
|
|
511
|
+
*/
|
|
512
|
+
headerPath?: string;
|
|
513
|
+
footerPath?: string;
|
|
514
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DocxDocument } from '../../docx-model/src/index';
|
|
2
|
+
export interface DocxComment {
|
|
3
|
+
id: string;
|
|
4
|
+
author: string;
|
|
5
|
+
initials: string;
|
|
6
|
+
date: string;
|
|
7
|
+
text: string;
|
|
8
|
+
/** indices of the paragraphs the comment range covers */
|
|
9
|
+
paras: number[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Word comments live in `word/comments.xml`; the body carries the anchors
|
|
13
|
+
* (`w:commentRangeStart` / `w:commentRangeEnd` / `w:commentReference`).
|
|
14
|
+
*
|
|
15
|
+
* They are the only place in a matrix where you can write something the reader
|
|
16
|
+
* of the generated document will never see — which is exactly what the brief
|
|
17
|
+
* says is missing today.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readComments(doc: DocxDocument): DocxComment[];
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical LumiClone template grammar.
|
|
3
|
+
*
|
|
4
|
+
* Ported from `lumiclone/src/engine/pipeline/{canonical-tags,modifier-parser,tag-parser}.ts`.
|
|
5
|
+
* LumiClone is the engine that actually renders these matrices; the editor MUST
|
|
6
|
+
* read them the same way, or it shows the user something the generator will not do.
|
|
7
|
+
* Keep this file a faithful mirror — behaviour differences belong in a changelog,
|
|
8
|
+
* not in a silent divergence.
|
|
9
|
+
*
|
|
10
|
+
* ponytail: ported rather than imported — LumiClone is a server-side Fastify app
|
|
11
|
+
* (xmldom, better-sqlite3, exceljs). This is the browser-safe subset.
|
|
12
|
+
*/
|
|
13
|
+
/** Block directives, mapped to a structural role. */
|
|
14
|
+
export declare const DIRECTIVES: {
|
|
15
|
+
readonly 'conditional-section': "open";
|
|
16
|
+
readonly 'repeating-section': "open";
|
|
17
|
+
readonly 'signature-section': "open";
|
|
18
|
+
readonly 'inline-section': "open";
|
|
19
|
+
readonly 'style-section': "open";
|
|
20
|
+
readonly 'else-section': "middle";
|
|
21
|
+
readonly 'end-section': "close";
|
|
22
|
+
readonly 'table-start': "open";
|
|
23
|
+
readonly 'table-end': "close";
|
|
24
|
+
readonly 'grid-start': "open";
|
|
25
|
+
readonly 'grid-end': "close";
|
|
26
|
+
readonly 'repeating-columns': "open";
|
|
27
|
+
readonly 'end-columns': "close";
|
|
28
|
+
readonly 'line-break': "standalone";
|
|
29
|
+
readonly 'page-section': "standalone";
|
|
30
|
+
};
|
|
31
|
+
export type Directive = keyof typeof DIRECTIVES;
|
|
32
|
+
export type Role = (typeof DIRECTIVES)[Directive];
|
|
33
|
+
/** Which close directive terminates which open directive. */
|
|
34
|
+
export declare const CLOSED_BY: Partial<Record<Directive, Directive>>;
|
|
35
|
+
/** Value-tag modifiers. Longest names first — parsing peels from the right. */
|
|
36
|
+
export declare const MODIFIERS: readonly ["default-val", "discard-if-empty", "discard-row-if", "discard-if", "cell-extension", "char-style", "optional", "prefix", "size", "inline", "per-page", "eval", "css"];
|
|
37
|
+
export type ModifierName = (typeof MODIFIERS)[number];
|
|
38
|
+
export interface Modifier {
|
|
39
|
+
name: string;
|
|
40
|
+
args: string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Rich-text editors silently substitute ASCII with Unicode lookalikes.
|
|
44
|
+
* Word turns ' into ’ (JSONata then reads it as a *field name*, with no error,
|
|
45
|
+
* and the tag renders empty) and inserts NBSP before ? % : (the tokenizer
|
|
46
|
+
* rejects them).
|
|
47
|
+
*
|
|
48
|
+
* Applied to the whole raw content, string literals included — that is what
|
|
49
|
+
* LumiClone does, so a NBSP typed inside a literal does not survive generation.
|
|
50
|
+
*/
|
|
51
|
+
export declare function normalizeTagContent(raw: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Normalise a JSONata expression: stray spaces around dots, and `!` negation
|
|
54
|
+
* (which JSONata has no operator for) rewritten to `$not(...)`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function normalizeExpression(expr: string): string;
|
|
57
|
+
/** Peel `:modifier(args)` suffixes from the right of a tag body. */
|
|
58
|
+
export declare function parseModifiers(raw: string): {
|
|
59
|
+
expression: string;
|
|
60
|
+
modifiers: Modifier[];
|
|
61
|
+
};
|
|
62
|
+
export declare function parseValueTag(content: string): {
|
|
63
|
+
expression: string;
|
|
64
|
+
modifiers: Modifier[];
|
|
65
|
+
};
|
|
66
|
+
export declare function parseBlockTag(content: string): {
|
|
67
|
+
directive: string;
|
|
68
|
+
expression: string;
|
|
69
|
+
modifiers: Modifier[];
|
|
70
|
+
};
|
|
71
|
+
export declare const isDirective: (name: string) => name is Directive;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Tag } from './scan';
|
|
2
|
+
/**
|
|
3
|
+
* Surlignage des valeurs substituées — portage de
|
|
4
|
+
* `lumiclone/src/engine/highlight/highlight-config.ts`.
|
|
5
|
+
*
|
|
6
|
+
* Même palette et même règle de classement que le moteur : ce que l'éditeur
|
|
7
|
+
* colore en aperçu est exactement ce que la génération colorerait avec
|
|
8
|
+
* `highlight: { enabled: true }`.
|
|
9
|
+
*/
|
|
10
|
+
export type HighlightKind = 'text' | 'calcul' | 'conditional' | 'repeating' | 'signature';
|
|
11
|
+
/** Hex à 6 caractères, sans `#`, comme dans LumiClone. */
|
|
12
|
+
export declare const HIGHLIGHT_PALETTE: Record<HighlightKind, string>;
|
|
13
|
+
export declare const HIGHLIGHT_LABEL: Record<HighlightKind, string>;
|
|
14
|
+
export declare const cssColor: (kind: HighlightKind) => string;
|
|
15
|
+
export declare function categorizeByExpression(expression: string): HighlightKind;
|
|
16
|
+
/**
|
|
17
|
+
* Genre de surlignage de chaque tag de valeur.
|
|
18
|
+
*
|
|
19
|
+
* Le bloc englobant le plus proche l'emporte sur l'expression — c'est la pile
|
|
20
|
+
* `hlStack` du renderer LumiClone.
|
|
21
|
+
*/
|
|
22
|
+
export declare function highlightKinds(tags: Tag[]): Map<number, HighlightKind>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Role, type Modifier } from './grammar';
|
|
2
|
+
export type TagKind = 'value' | 'signature' | 'block';
|
|
3
|
+
export interface Tag {
|
|
4
|
+
id: number;
|
|
5
|
+
para: number;
|
|
6
|
+
start: number;
|
|
7
|
+
end: number;
|
|
8
|
+
raw: string;
|
|
9
|
+
kind: TagKind;
|
|
10
|
+
/** block tags only */
|
|
11
|
+
directive?: string;
|
|
12
|
+
role?: Role;
|
|
13
|
+
expression: string;
|
|
14
|
+
modifiers: Modifier[];
|
|
15
|
+
/** nesting depth of enclosing blocks */
|
|
16
|
+
depth: number;
|
|
17
|
+
/** open ↔ close, and open → else */
|
|
18
|
+
match?: number;
|
|
19
|
+
elseId?: number;
|
|
20
|
+
/** signature target, e.g. `EMPLOYEE` */
|
|
21
|
+
target?: string;
|
|
22
|
+
paths: string[];
|
|
23
|
+
functions: string[];
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Scan a document's paragraph texts into a flat, paired list of tags. */
|
|
27
|
+
export declare function scanTags(paragraphs: string[]): Tag[];
|