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,196 @@
|
|
|
1
|
+
import { type DocxDocument, type XmlNode } from './index';
|
|
2
|
+
/** Un élément de cellule : un paragraphe du fil, ou un tableau imbriqué. */
|
|
3
|
+
export type CellBlock = {
|
|
4
|
+
kind: 'p';
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'tbl';
|
|
7
|
+
table: TableInfo;
|
|
8
|
+
};
|
|
9
|
+
export interface CellInfo {
|
|
10
|
+
widthPt?: number;
|
|
11
|
+
/** nombre de colonnes fusionnées (1 = pas de fusion) */
|
|
12
|
+
gridSpan: number;
|
|
13
|
+
/** fusion verticale : `restart` = première cellule, `continue` = suite, absent = pas de fusion */
|
|
14
|
+
vMerge?: 'restart' | 'continue';
|
|
15
|
+
/** couleur de fond hex (sans #) */
|
|
16
|
+
fill?: string;
|
|
17
|
+
vAlign?: 'top' | 'center' | 'bottom';
|
|
18
|
+
/**
|
|
19
|
+
* Bordures propres à la cellule (`w:tcBorders`).
|
|
20
|
+
*
|
|
21
|
+
* Beaucoup de tableaux ne déclarent RIEN au niveau de la table et tout au
|
|
22
|
+
* niveau des cellules — la grille horaire de Colo 2 en est une. Les ignorer
|
|
23
|
+
* faisait disparaître ses traits, et privait chaque rang des 0,5 pt que Word
|
|
24
|
+
* compte pour eux.
|
|
25
|
+
*/
|
|
26
|
+
borders?: TableBorders;
|
|
27
|
+
/**
|
|
28
|
+
* Marges intérieures propres à la cellule (`w:tcPr/w:tcMar`).
|
|
29
|
+
*
|
|
30
|
+
* Elles remplacent celles du tableau et de son style, côté par côté. 55
|
|
31
|
+
* documents du corpus en déclarent, et sans elles ces cellules-là posaient
|
|
32
|
+
* leur texte à la marge du tableau au lieu de la leur.
|
|
33
|
+
*/
|
|
34
|
+
marginPt?: Partial<{
|
|
35
|
+
top: number;
|
|
36
|
+
left: number;
|
|
37
|
+
bottom: number;
|
|
38
|
+
right: number;
|
|
39
|
+
}>;
|
|
40
|
+
/** paragraphes bruts de la cellule — à passer à styledParagraphs ou paragraphText */
|
|
41
|
+
paragraphs: XmlNode[];
|
|
42
|
+
/**
|
|
43
|
+
* Contenu de la cellule dans l'ordre : ses paragraphes ET ses tableaux
|
|
44
|
+
* IMBRIQUÉS. `paragraphs` sert au décompte du fil, `content` au dessin.
|
|
45
|
+
*
|
|
46
|
+
* Un tableau imbriqué est courant dans ces matrices : sur « Vanished », tout
|
|
47
|
+
* le corps tient dans un tableau, et chaque formulaire d'état civil est un
|
|
48
|
+
* second tableau dans une de ses cellules. Les ignorer aplatissait le
|
|
49
|
+
* formulaire en une colonne — « Nom : » puis « Nom de Jeune Fille : » l'un
|
|
50
|
+
* sous l'autre, là où Word les met côte à côte.
|
|
51
|
+
*/
|
|
52
|
+
content: CellBlock[];
|
|
53
|
+
}
|
|
54
|
+
export interface RowInfo {
|
|
55
|
+
heightPt?: number;
|
|
56
|
+
/**
|
|
57
|
+
* `w:hRule` : comment lire `heightPt`.
|
|
58
|
+
*
|
|
59
|
+
* `atLeast` (défaut) en fait un minimum, `exact` une hauteur IMPOSÉE — Word
|
|
60
|
+
* y rogne ce qui dépasse — et `auto` l'ignore. Tout traiter en minimum
|
|
61
|
+
* gonflait chaque rang du formulaire de La Stagiaire de 1,7 pt : ses neuf
|
|
62
|
+
* rangs déclarent 372 twips exacts, soit 18,6 pt, et nous en composions 20,3.
|
|
63
|
+
*/
|
|
64
|
+
heightRule?: 'auto' | 'atLeast' | 'exact';
|
|
65
|
+
/**
|
|
66
|
+
* `w:tblPrEx` — propriétés du tableau redéfinies pour CE rang.
|
|
67
|
+
*
|
|
68
|
+
* Word garde ces exceptions quand deux tableaux ont été fusionnés ou qu'un
|
|
69
|
+
* rang a été collé d'ailleurs : le rang conserve alors les marges et les
|
|
70
|
+
* bordures de son tableau d'origine. 49 documents du corpus en portent, et
|
|
71
|
+
* l'exception la plus fréquente est `w:tblCellMar` (29 documents).
|
|
72
|
+
*
|
|
73
|
+
* Elle s'intercale entre le niveau TABLEAU et le niveau CELLULE.
|
|
74
|
+
*/
|
|
75
|
+
cellMarginPt?: Partial<{
|
|
76
|
+
top: number;
|
|
77
|
+
left: number;
|
|
78
|
+
bottom: number;
|
|
79
|
+
right: number;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* `w:gridBefore` — colonnes de la grille que ce rang SAUTE avant sa première
|
|
83
|
+
* cellule. Le rang commence alors décalé de leur largeur cumulée.
|
|
84
|
+
*
|
|
85
|
+
* Son symétrique `w:gridAfter` ne déplace rien — les abscisses sont posées
|
|
86
|
+
* depuis le début de la grille — mais il décide de la BORDURE : la dernière
|
|
87
|
+
* cellule d'un rang raccourci ne touche pas le bord droit du tableau.
|
|
88
|
+
*/
|
|
89
|
+
gridBefore?: number;
|
|
90
|
+
/**
|
|
91
|
+
* `w:cantSplit` — ce rang ne se coupe PAS en travers d'une page.
|
|
92
|
+
*
|
|
93
|
+
* 106 documents du corpus le posent, 302 rangs. Sans lui, généraliser la
|
|
94
|
+
* coupure de rang casse exactement ceux qui l'interdisent.
|
|
95
|
+
*/
|
|
96
|
+
cantSplit?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* `w:gridAfter` — colonnes de la grille que ce rang laisse VIDES après sa
|
|
99
|
+
* dernière cellule. Symétrique de `gridBefore` : le rang s'arrête avant le
|
|
100
|
+
* bord droit du tableau, et sa dernière cellule ne porte donc pas la bordure
|
|
101
|
+
* droite de la table.
|
|
102
|
+
*/
|
|
103
|
+
gridAfter?: number;
|
|
104
|
+
/**
|
|
105
|
+
* `w:tblHeader` — rang d'en-tête, REPÉTÉ en haut de chaque page que le
|
|
106
|
+
* tableau traverse. 17 documents du corpus, 118 rangs.
|
|
107
|
+
*/
|
|
108
|
+
header?: boolean;
|
|
109
|
+
/** `w:tblCellSpacing` du rang — écrase celui du tableau */
|
|
110
|
+
cellSpacingPt?: number;
|
|
111
|
+
cells: CellInfo[];
|
|
112
|
+
}
|
|
113
|
+
export interface BorderDef {
|
|
114
|
+
style: string;
|
|
115
|
+
sizePt: number;
|
|
116
|
+
color?: string;
|
|
117
|
+
}
|
|
118
|
+
export interface TableBorders {
|
|
119
|
+
top?: BorderDef;
|
|
120
|
+
bottom?: BorderDef;
|
|
121
|
+
left?: BorderDef;
|
|
122
|
+
right?: BorderDef;
|
|
123
|
+
insideH?: BorderDef;
|
|
124
|
+
insideV?: BorderDef;
|
|
125
|
+
}
|
|
126
|
+
export interface TableInfo {
|
|
127
|
+
widthPt?: number;
|
|
128
|
+
align?: 'left' | 'center' | 'right';
|
|
129
|
+
/**
|
|
130
|
+
* `w:tblLayout w:type="fixed"` — la grille est FIGÉE, pas ajustée au contenu.
|
|
131
|
+
*
|
|
132
|
+
* Sans effet mesurable sur ce corpus : Word écrit la grille qu'il a calculée
|
|
133
|
+
* dans le fichier, et la réutilise à l'ouverture même en autofit. Comparé sur
|
|
134
|
+
* les documents à tableau, l'écart horizontal médian vaut 0,05 pt des deux
|
|
135
|
+
* côtés (voir boucle-fidelite.md). Lu par exigence de couverture, et pour que
|
|
136
|
+
* l'écrivain puisse le préserver.
|
|
137
|
+
*/
|
|
138
|
+
layoutFixed?: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Retrait depuis la marge gauche, en points (`w:tblInd`).
|
|
141
|
+
*
|
|
142
|
+
* Word l'applique au bord du tableau, pas à son contenu. Il vaut souvent
|
|
143
|
+
* 108 twips — 5,4 pt — et l'ignorer décale toute la grille : mesuré à 12 px
|
|
144
|
+
* sur `template-77.docx` à 150 dpi.
|
|
145
|
+
*/
|
|
146
|
+
indentPt?: number;
|
|
147
|
+
/**
|
|
148
|
+
* Tableau FLOTTANT ancré VERTICALEMENT (`w:tblpPr w:vertAnchor` + `w:tblpY`).
|
|
149
|
+
*
|
|
150
|
+
* Le haut du tableau est posé à `floatTopPt` du bord de la feuille
|
|
151
|
+
* (`page`) ou de la marge haute (`margin`), et pas là où le fil en est.
|
|
152
|
+
* Word accepte que ce soit AU-DESSUS de la marge : « Avenant The Land »
|
|
153
|
+
* ancre sa grille à 27,2 pt d'une feuille dont la marge haute vaut 36, et
|
|
154
|
+
* tout le document y vit — 8,2 pt d'écart sur ses 91 lignes.
|
|
155
|
+
*
|
|
156
|
+
* L'ancrage `text`, qui est le défaut et compte 108 des 118 cas du corpus,
|
|
157
|
+
* n'est pas concerné : il ne déplace rien.
|
|
158
|
+
*/
|
|
159
|
+
floatTopPt?: number;
|
|
160
|
+
floatFrom?: 'page' | 'margin';
|
|
161
|
+
/**
|
|
162
|
+
* A SMALL floating table anchored to the text (`w:tblpPr` with
|
|
163
|
+
* `w:vertAnchor="text"` and a horizontal anchor on the page or the margin),
|
|
164
|
+
* no wider than an inch: Word draws it beside the flow, which goes on at
|
|
165
|
+
* the same height. The GAUMONT matrices put a 36 pt checkbox at the page's
|
|
166
|
+
* right edge before each « □ Vous refusez… » line; composing it in the flow
|
|
167
|
+
* cost 22 pt and a page break. 55 documents of the bench carry one, 48 of
|
|
168
|
+
* them broken.
|
|
169
|
+
*/
|
|
170
|
+
floatBeside?: boolean;
|
|
171
|
+
/** its left edge from the page's left edge, in points (page anchor only) */
|
|
172
|
+
floatXPt?: number;
|
|
173
|
+
/** largeur de chaque colonne de la grille, en points */
|
|
174
|
+
gridColsPt: number[];
|
|
175
|
+
/** bordures du tableau — absent = pas de tblBorders explicite */
|
|
176
|
+
borders?: TableBorders;
|
|
177
|
+
/** marges intérieures des cellules (w:tblCellMar), en points */
|
|
178
|
+
cellMarginPt?: {
|
|
179
|
+
top: number;
|
|
180
|
+
left: number;
|
|
181
|
+
bottom: number;
|
|
182
|
+
right: number;
|
|
183
|
+
};
|
|
184
|
+
/** `w:tblCellSpacing` du tableau — un rang peut le redéfinir */
|
|
185
|
+
cellSpacingPt?: number;
|
|
186
|
+
rows: RowInfo[];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Les tableaux de PREMIER NIVEAU, dans l'ordre du document.
|
|
190
|
+
*
|
|
191
|
+
* Les imbriqués n'y figurent pas : ils vivent dans le `content` de leur
|
|
192
|
+
* cellule. Les inclure ici décalait les index — `bodyBlocks` ne compte que les
|
|
193
|
+
* tableaux de premier niveau, si bien qu'après le premier tableau à imbriqué,
|
|
194
|
+
* chaque bloc désignait le mauvais tableau.
|
|
195
|
+
*/
|
|
196
|
+
export declare function tables(doc: DocxDocument): TableInfo[];
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type DocxDocument, type XmlNode } from './index';
|
|
2
|
+
/**
|
|
3
|
+
* Zones de texte ancrées du corps (`w:txbxContent`).
|
|
4
|
+
*
|
|
5
|
+
* Word les pose à des coordonnées, hors du fil : elles ne décalent pas le texte
|
|
6
|
+
* courant et ne comptent pas dans la pagination. On les excluait donc du fil
|
|
7
|
+
* (leurs paragraphes fausseraient tous les index) — mais on ne les dessinait pas
|
|
8
|
+
* pour autant, et leur contenu disparaissait. Sur Colo 2, un bloc de tarifs de
|
|
9
|
+
* 378 caractères manquait, et son absence décalait la frontière page 6/7 : les
|
|
10
|
+
* pages 7 à 9 n'avaient plus un seul mot à sa place.
|
|
11
|
+
*
|
|
12
|
+
* Une zone est rattachée au paragraphe du FIL qui porte son ancre — c'est lui
|
|
13
|
+
* qui décide sur quelle page elle atterrit.
|
|
14
|
+
*/
|
|
15
|
+
export interface TextBoxInfo {
|
|
16
|
+
/** index, dans `paragraphs(doc)`, du paragraphe qui porte l'ancre */
|
|
17
|
+
paraIndex: number;
|
|
18
|
+
/** décalage de l'ancre, en points */
|
|
19
|
+
xPt: number;
|
|
20
|
+
yPt: number;
|
|
21
|
+
/** repères de `wp:positionH` / `wp:positionV` : page, margin, column, paragraph */
|
|
22
|
+
relH: string;
|
|
23
|
+
relV: string;
|
|
24
|
+
widthPt: number;
|
|
25
|
+
heightPt: number;
|
|
26
|
+
/** marges internes du cadre (`a:bodyPr`), en points — voir `insets` */
|
|
27
|
+
insetLeftPt: number;
|
|
28
|
+
insetTopPt: number;
|
|
29
|
+
insetRightPt: number;
|
|
30
|
+
/**
|
|
31
|
+
* Mode d'habillage. `none` = l'objet flotte devant ou derrière le texte et ne
|
|
32
|
+
* prend aucune place ; tous les autres font que Word RÉSERVE sa hauteur dans
|
|
33
|
+
* le fil. Sur Colo 2, deux blocs en `wrapSquare` de 61 et 49 pt décidaient à
|
|
34
|
+
* eux seuls de la frontière entre les pages 6 et 7.
|
|
35
|
+
*/
|
|
36
|
+
wrap: 'none' | 'square' | 'topAndBottom' | 'tight' | 'through';
|
|
37
|
+
/** paragraphes bruts de la zone — à styler comme ceux d'un en-tête */
|
|
38
|
+
paragraphs: XmlNode[];
|
|
39
|
+
/** `wp:inline` : la zone part du RETRAIT de son paragraphe, pas de la marge */
|
|
40
|
+
inline?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Les cinq modes d'habillage de DrawingML, nommés.
|
|
44
|
+
*
|
|
45
|
+
* `wp:wrapNone` fait flotter l'objet devant ou derrière le texte : il ne prend
|
|
46
|
+
* aucune place. `wp:wrapTopAndBottom` lui donne sa propre bande — le texte
|
|
47
|
+
* reprend dessous, toute sa hauteur est réservée. `wp:wrapSquare`,
|
|
48
|
+
* `wp:wrapTight` et `wp:wrapThrough` font passer le texte À CÔTÉ.
|
|
49
|
+
*/
|
|
50
|
+
export declare const WRAP_TAGS: Record<string, TextBoxInfo['wrap']>;
|
|
51
|
+
export declare function cssPt(style: string, prop: string): number | undefined;
|
|
52
|
+
export declare function textBoxes(doc: DocxDocument): TextBoxInfo[];
|
|
53
|
+
/**
|
|
54
|
+
* Zones ancrées portées par une liste de paragraphes quelconque.
|
|
55
|
+
*
|
|
56
|
+
* Les en-têtes et pieds en ont aussi — le paraphe « Paraphes Salarié.e » de
|
|
57
|
+
* Colo 2 en est une. On les excluait du fil pour ne pas les voir surgir à
|
|
58
|
+
* gauche, mais rien ne les dessinait ensuite : elles disparaissaient purement
|
|
59
|
+
* et simplement du rendu.
|
|
60
|
+
*/
|
|
61
|
+
export declare function textBoxesIn(flow: XmlNode[]): TextBoxInfo[];
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Un style de bordure Word n'est pas toujours UN trait.
|
|
3
|
+
*
|
|
4
|
+
* `w:val="double"` en dessine deux, `triple` trois, `threeDEmboss` deux tons,
|
|
5
|
+
* et les pointillés un seul mais haché. Le moteur ne connaissait que le trait
|
|
6
|
+
* plein : `rules.ts` retrouvait 46 % des traits de Word, et le document qui en
|
|
7
|
+
* perdait le plus opposait trois filets parallèles chez Word à un seul chez
|
|
8
|
+
* nous.
|
|
9
|
+
*
|
|
10
|
+
* Ce que le corpus emploie, sur 400 documents :
|
|
11
|
+
*
|
|
12
|
+
* single 12846 (320 doc) · double 296 (10) · threeDEmboss/Engrave 302 (6)
|
|
13
|
+
* dotted 119 (5) · thickThinLargeGap 80 (1) · triple 16 (1)
|
|
14
|
+
*
|
|
15
|
+
* Les proportions viennent d'ECMA-376 : la LARGEUR DÉCLARÉE est celle de
|
|
16
|
+
* l'ensemble, filets et jours compris. Un `double` de 3 pt fait donc trois
|
|
17
|
+
* bandes d'un point — trait, jour, trait — et non deux traits de 3 pt.
|
|
18
|
+
*/
|
|
19
|
+
/** Un filet : son décalage par rapport à l'axe, et son épaisseur. */
|
|
20
|
+
export interface Stroke {
|
|
21
|
+
offset: number;
|
|
22
|
+
width: number;
|
|
23
|
+
}
|
|
24
|
+
/** Motif de tirets, en multiples de l'épaisseur. Vide = trait plein. */
|
|
25
|
+
export declare function dashPattern(style: string, w: number): number[];
|
|
26
|
+
/**
|
|
27
|
+
* Les filets d'un style, pour une largeur totale `w`.
|
|
28
|
+
*
|
|
29
|
+
* L'axe est le milieu de la bordure : un filet à l'offset 0 le recouvre.
|
|
30
|
+
*/
|
|
31
|
+
export declare function borderStrokes(style: string, w: number): Stroke[];
|
|
32
|
+
/**
|
|
33
|
+
* Hauteur totale occupée par un style, de son bord extérieur à l'autre — ce
|
|
34
|
+
* que Word RÉSERVE au-dessus ou au-dessous du texte, `w:space` non compris.
|
|
35
|
+
* Vaut `w` pour tout, sauf les styles 3D qui en prennent le double.
|
|
36
|
+
*/
|
|
37
|
+
export declare function borderExtent(style: string, w: number): number;
|
|
38
|
+
/** Contrôle : la somme des filets ne dépasse jamais la largeur déclarée — sauf les 3D, mesurés au double. */
|
|
39
|
+
export declare function borderSelfTest(): void;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A parsed .docx, turned into everything `render()` needs.
|
|
3
|
+
*
|
|
4
|
+
* This lived in the canvas app, which meant the only way to lay a document out
|
|
5
|
+
* was to load it in a browser. It is pure — no DOM, no fetch, no canvas — so
|
|
6
|
+
* moving it here lets Node compose the same document from the same inputs, and
|
|
7
|
+
* removes the risk of the two paths drifting apart.
|
|
8
|
+
*
|
|
9
|
+
* Images are the one thing it cannot resolve on its own: decoding a PNG needs
|
|
10
|
+
* a platform. The caller passes them in, or leaves them out.
|
|
11
|
+
*/
|
|
12
|
+
import { styledParagraphs, type DocxDocument, type XmlNode } from '../../docx-model/src/index';
|
|
13
|
+
import type { BodyBlock, TableInfo } from '../../docx-model/src/index';
|
|
14
|
+
import type { Footnotes } from './types';
|
|
15
|
+
import type { RenderInput } from './renderer';
|
|
16
|
+
/** Applies the document's full style cascade to paragraphs that are not in the flow. */
|
|
17
|
+
export declare function styleParagraphs(doc: DocxDocument, paras: XmlNode[]): import("../../docx-model/src/index").StyledParagraph[];
|
|
18
|
+
/**
|
|
19
|
+
* A header/footer part, laid out like a body — paragraphs AND tables.
|
|
20
|
+
*
|
|
21
|
+
* Flattening the part to a list of paragraphs stacks a table's cells one under
|
|
22
|
+
* the other instead of side by side. Word composes them as a grid, so the two
|
|
23
|
+
* columns of a letterhead share a baseline; we produced twice the height and
|
|
24
|
+
* the wrong x. And a header's height sets the body top on EVERY page, so the
|
|
25
|
+
* whole document shifted — 54.3 pt on "Avenant Désanchantées", constant to
|
|
26
|
+
* within 0.2 pt. 42 corpus documents carry a table in a header or a footer.
|
|
27
|
+
*
|
|
28
|
+
* The trick is to hand the part to the machinery that already knows how to do
|
|
29
|
+
* this: rebuild it as a virtual `word/document.xml` and call the very same
|
|
30
|
+
* `styledParagraphs`, `bodyBlocks` and `tables` the body uses. No second
|
|
31
|
+
* implementation to keep in step, and the paragraph indices that `bodyBlocks`
|
|
32
|
+
* emits line up with `styledParagraphs` by construction.
|
|
33
|
+
*/
|
|
34
|
+
export declare function partContent(doc: DocxDocument, partPath: string): {
|
|
35
|
+
paragraphs: ReturnType<typeof styledParagraphs>;
|
|
36
|
+
blocks: BodyBlock[];
|
|
37
|
+
tables: TableInfo[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Les notes de bas de page, composées comme des paragraphes du corps.
|
|
41
|
+
*
|
|
42
|
+
* `word/footnotes.xml` range les notes dans l'ordre de leurs renvois, après
|
|
43
|
+
* deux fausses notes (`w:type="separator"` et `"continuationSeparator"`) que
|
|
44
|
+
* Word réserve au filet. La n-ième vraie note est donc l'appel n° n du fil —
|
|
45
|
+
* ce que `w:footnoteReference` numérote de son côté.
|
|
46
|
+
*
|
|
47
|
+
* ponytail: paragraphes seulement. Une note qui contient un TABLEAU sortira
|
|
48
|
+
* aplatie ; aucun des quatre documents du corpus qui ont des notes n'en a.
|
|
49
|
+
*/
|
|
50
|
+
export declare function footnoteContent(doc: DocxDocument): Footnotes | undefined;
|
|
51
|
+
/** Paragraphs only — kept for callers that do not lay out tables. */
|
|
52
|
+
export declare function partParagraphs(doc: DocxDocument, partPath: string): import("../../docx-model/src/index").StyledParagraph[];
|
|
53
|
+
/** Everything `render()` needs, except the surface and the images. */
|
|
54
|
+
export type DocumentLayout = Omit<RenderInput, 'container' | 'newPage' | 'images'>;
|
|
55
|
+
export declare function buildRenderInput(doc: DocxDocument): DocumentLayout;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const FONT_MEASURERS: Record<string, (text: string) => number>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { LineTrace } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Du pixel à l'adresse, et retour.
|
|
4
|
+
*
|
|
5
|
+
* Le renderer publie déjà où il a dessiné chaque mot ; depuis que la trace
|
|
6
|
+
* porte aussi le rang du paragraphe et celui du premier caractère de chaque
|
|
7
|
+
* mot, elle est une **carte cliquable** du document. Ce fichier ne recalcule
|
|
8
|
+
* aucune mise en page : il lit ce qui a été dessiné. C'est ce qui rend le
|
|
9
|
+
* curseur indépendant de la fidélité — il se pose juste là où le texte est,
|
|
10
|
+
* même si ce n'est pas encore exactement là où Word le mettrait.
|
|
11
|
+
*
|
|
12
|
+
* ponytail: pas d'index spatial. Un document de 42 pages publie ~1 500 lignes,
|
|
13
|
+
* qu'un balayage traverse en moins d'une milliseconde. Un quadtree le jour où
|
|
14
|
+
* une mesure le réclame.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Adresse d'un point dans le document.
|
|
18
|
+
*
|
|
19
|
+
* `part` dit dans quel fichier du zip vit le paragraphe — `undefined` pour le
|
|
20
|
+
* corps. Sans lui, le paragraphe 0 d'un en-tête et celui du corps auraient la
|
|
21
|
+
* même adresse.
|
|
22
|
+
*/
|
|
23
|
+
export interface DocPos {
|
|
24
|
+
para: number;
|
|
25
|
+
off: number;
|
|
26
|
+
part?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Une adresse et le trait qui la matérialise, en px CSS relatifs à sa page. */
|
|
29
|
+
export interface CaretRect extends DocPos {
|
|
30
|
+
page: number;
|
|
31
|
+
x: number;
|
|
32
|
+
top: number;
|
|
33
|
+
height: number;
|
|
34
|
+
}
|
|
35
|
+
/** Un rectangle de sélection sur une ligne, en px CSS relatifs à sa page. */
|
|
36
|
+
export interface SelRect {
|
|
37
|
+
page: number;
|
|
38
|
+
x: number;
|
|
39
|
+
top: number;
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Lignes adressables : celles dont le renderer a publié le rang du paragraphe.
|
|
45
|
+
*
|
|
46
|
+
* Le corps, mais aussi les en-têtes et pieds depuis qu'ils portent le chemin de
|
|
47
|
+
* leur part. Ce qui reste dehors — les zones de texte ancrées — n'a pas
|
|
48
|
+
* d'adresse dans le modèle, et le curseur ne s'y pose pas.
|
|
49
|
+
*/
|
|
50
|
+
export declare function editableLines(lines: LineTrace[]): LineTrace[];
|
|
51
|
+
/**
|
|
52
|
+
* Comment traduire une abscisse en rang de caractère.
|
|
53
|
+
*
|
|
54
|
+
* `caret` cherche la FRONTIÈRE la plus proche — c'est là qu'on pose un curseur,
|
|
55
|
+
* et cliquer sur la moitié droite d'une lettre place le trait après elle.
|
|
56
|
+
* `char` cherche le CARACTÈRE survolé, ce que réclame un double-clic : cliquer
|
|
57
|
+
* sur la première lettre d'un mot doit prendre ce mot, pas celui d'avant parce
|
|
58
|
+
* que sa frontière était deux pixels plus près.
|
|
59
|
+
*/
|
|
60
|
+
export type HitMode = 'caret' | 'char';
|
|
61
|
+
/**
|
|
62
|
+
* Adresse éditable la plus proche d'un point de la page.
|
|
63
|
+
*
|
|
64
|
+
* Un clic dans une marge, entre deux paragraphes ou sous la dernière ligne ne
|
|
65
|
+
* doit pas être perdu : à défaut de ligne sous le curseur, on prend la plus
|
|
66
|
+
* proche verticalement — c'est ce que fait Word.
|
|
67
|
+
*/
|
|
68
|
+
export declare function hitTest(lines: LineTrace[], page: number, x: number, y: number, mode?: HitMode): CaretRect | null;
|
|
69
|
+
/** Trait du curseur pour une adresse — `null` si elle n'a pas été dessinée. */
|
|
70
|
+
export declare function caretAt(lines: LineTrace[], pos: DocPos, page?: number): CaretRect | null;
|
|
71
|
+
/** Ordonne deux adresses — une sélection se tire dans les deux sens. */
|
|
72
|
+
export declare function ordered(a: DocPos, b: DocPos): [DocPos, DocPos];
|
|
73
|
+
export declare const samePos: (a: DocPos | null, b: DocPos | null) => boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Rectangles à surligner pour une sélection, un par ligne traversée.
|
|
76
|
+
*
|
|
77
|
+
* Une ligne entièrement prise va du premier au dernier mot dessiné : on ne
|
|
78
|
+
* peint pas jusqu'à la marge. C'est un choix — Word prolonge légèrement — mais
|
|
79
|
+
* l'encre est ce que la trace connaît vraiment.
|
|
80
|
+
*/
|
|
81
|
+
export declare function selectionRects(lines: LineTrace[], a: DocPos, b: DocPos): SelRect[];
|
|
82
|
+
/** Bornes de caractères effectivement dessinées pour un paragraphe. */
|
|
83
|
+
export declare function paraRange(lines: LineTrace[], para: number, part?: string): {
|
|
84
|
+
from: number;
|
|
85
|
+
to: number;
|
|
86
|
+
} | null;
|
|
87
|
+
/**
|
|
88
|
+
* Ligne au-dessus ou au-dessous, à la même abscisse — les flèches verticales.
|
|
89
|
+
*
|
|
90
|
+
* Word garde l'abscisse VOULUE pendant une suite de flèches : passer sur une
|
|
91
|
+
* ligne courte puis revenir ne doit pas ramener le curseur au bord. L'appelant
|
|
92
|
+
* conserve donc `wantX` et nous le repasse.
|
|
93
|
+
*/
|
|
94
|
+
export declare function verticalStep(lines: LineTrace[], pos: DocPos, dir: -1 | 1, wantX: number): DocPos | null;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { render } from './renderer';
|
|
2
|
+
export { PT_PX } from './types';
|
|
3
|
+
export type { RenderInput, RenderOptions, ResumeState } from './renderer';
|
|
4
|
+
export type { ImageMap, ImageRect, LineTrace, MarkRect, PlacedTextBox, RowTrace, RuleTrace, SectionParts, TableRect, } from './types';
|
|
5
|
+
export { caretAt, editableLines, hitTest, ordered, paraRange, samePos, selectionRects, verticalStep, } from './hit';
|
|
6
|
+
export type { CaretRect, DocPos, HitMode, SelRect } from './hit';
|
|
7
|
+
export { buildRenderInput, footnoteContent, partParagraphs, styleParagraphs } from './document';
|
|
8
|
+
export type { DocumentLayout } from './document';
|
|
9
|
+
export { NodeRenderingContext, nodeSurface } from './node-ctx';
|
|
10
|
+
export type { FontLoader } from './node-ctx';
|
|
11
|
+
export { borderStrokes, borderSelfTest, dashPattern } from './border';
|
|
12
|
+
export { keepsWord, MAX_SHRINK, MIN_STRETCH, STRETCH_RATIO } from './text';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const FONT_LINE_RATIO: Record<string, number>;
|
|
2
|
+
/** Ratio par défaut quand la police est inconnue — celui d'Arial et de Times. */
|
|
3
|
+
export declare const DEFAULT_LINE_RATIO = 1.15;
|
|
4
|
+
export declare function setLineRatios(r: Record<string, number>): void;
|
|
5
|
+
/** Hauteur de ligne d'une police, en multiple de la taille de police. */
|
|
6
|
+
export declare function lineRatio(family: string | undefined): number;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Reads a TTF/OTF file. Node supplies `readFileSync`; a bundler, a fetch. */
|
|
2
|
+
export type FontLoader = (family: string, weight: number, italic: boolean) => ArrayBuffer | undefined;
|
|
3
|
+
export declare class NodeRenderingContext {
|
|
4
|
+
private load;
|
|
5
|
+
font: string;
|
|
6
|
+
letterSpacing: string;
|
|
7
|
+
fillStyle: string | CanvasGradient | CanvasPattern;
|
|
8
|
+
strokeStyle: string | CanvasGradient | CanvasPattern;
|
|
9
|
+
lineWidth: number;
|
|
10
|
+
globalAlpha: number;
|
|
11
|
+
textBaseline: CanvasTextBaseline;
|
|
12
|
+
fontKerning: CanvasFontKerning;
|
|
13
|
+
private faces;
|
|
14
|
+
private stack;
|
|
15
|
+
constructor(load: FontLoader);
|
|
16
|
+
private face;
|
|
17
|
+
measureText(text: string): TextMetrics;
|
|
18
|
+
save(): void;
|
|
19
|
+
restore(): void;
|
|
20
|
+
fillRect(): void;
|
|
21
|
+
fillText(): void;
|
|
22
|
+
strokeText(): void;
|
|
23
|
+
beginPath(): void;
|
|
24
|
+
moveTo(): void;
|
|
25
|
+
lineTo(): void;
|
|
26
|
+
stroke(): void;
|
|
27
|
+
closePath(): void;
|
|
28
|
+
rect(): void;
|
|
29
|
+
clip(): void;
|
|
30
|
+
drawImage(): void;
|
|
31
|
+
scale(): void;
|
|
32
|
+
translate(): void;
|
|
33
|
+
setLineDash(): void;
|
|
34
|
+
}
|
|
35
|
+
/** A `newPage` for `render()` that composes without a browser. */
|
|
36
|
+
export declare function nodeSurface(load: FontLoader): () => CanvasRenderingContext2D;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StyledParagraph, ListInfo } from '../../docx-model/src/index';
|
|
2
|
+
import { type DrawCtx } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Composition d'un paragraphe : encadrement, fond, césure, justification.
|
|
5
|
+
*
|
|
6
|
+
* Sert au corps, aux en-têtes et pieds, et au contenu des cellules — c'est le
|
|
7
|
+
* même texte, avec un `DrawCtx` différent.
|
|
8
|
+
*/
|
|
9
|
+
/** Signature d'encadrement — deux paragraphes qui la partagent forment un seul
|
|
10
|
+
* cadre chez Word, sans trait entre eux. */
|
|
11
|
+
export declare function borderKey(p: StyledParagraph | undefined): string;
|
|
12
|
+
/** Paragraphe fusionné avec son voisin : on saute le trait qui les séparerait. */
|
|
13
|
+
interface BorderMerge {
|
|
14
|
+
top?: boolean;
|
|
15
|
+
bottom?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function drawParagraph(dc: DrawCtx, para: StyledParagraph, listInfo?: ListInfo, merge?: BorderMerge): number;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { StyledParagraph, PageSetup } from '../../docx-model/src/index';
|
|
2
|
+
import { type ImageMap, type LineTrace, type PageNums, type PartBlocks, type PlacedTextBox, type RuleTrace } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* En-tête et pied de page. Word les pose dans les marges : l'en-tête grandit
|
|
5
|
+
* vers le bas depuis `w:header`, le pied vers le HAUT depuis `w:footer`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function drawHeader(ctx: CanvasRenderingContext2D, headerParas: StyledParagraph[], def: {
|
|
8
|
+
font: string;
|
|
9
|
+
sizePt: number;
|
|
10
|
+
}, page: PageSetup, headerDistPt: number, onLine?: (l: LineTrace) => void,
|
|
11
|
+
/** `onRule` : le filet de séparation d'un en-tête est un TRAIT, pas du texte */
|
|
12
|
+
onRule?: (r: RuleTrace) => void, pageNo?: number, defaultTabPt?: number, nums?: PageNums, images?: ImageMap, partPath?: string, blocks?: PartBlocks,
|
|
13
|
+
/** densité de la surface — les filets d'un tableau d'en-tête s'y accrochent */
|
|
14
|
+
dpr?: number): number;
|
|
15
|
+
/**
|
|
16
|
+
* Hauteur de FLUX d'un pied de page, en px.
|
|
17
|
+
*
|
|
18
|
+
* On le compose en transparent pour le mesurer — c'est ce que `drawFooter`
|
|
19
|
+
* faisait déjà pour savoir où le poser. Le renderer en a besoin AVANT de
|
|
20
|
+
* composer le corps : mesuré au banc de sondes (`pied-*`, `pieddist-*`), Word
|
|
21
|
+
* arrête le corps au plus haut des deux, la marge basse et le HAUT du pied :
|
|
22
|
+
*
|
|
23
|
+
* lignes de pied 0 1 2 4
|
|
24
|
+
* dernière ligne 790,6 777,9 765,2 740,0 (marge à 806,4)
|
|
25
|
+
*
|
|
26
|
+
* chaque ligne de pied recule le corps d'exactement une hauteur de ligne. Et en
|
|
27
|
+
* faisant varier `w:footer` seul, le corps ne bouge QUE lorsque le pied remonte
|
|
28
|
+
* au-dessus de la marge : distance 0 et 283 twips ne changent rien, 1134 recule
|
|
29
|
+
* le corps de 37,9 pt.
|
|
30
|
+
*/
|
|
31
|
+
export declare function footerFlowHeight(ctx: CanvasRenderingContext2D, footerParas: StyledParagraph[], def: {
|
|
32
|
+
font: string;
|
|
33
|
+
sizePt: number;
|
|
34
|
+
}, page: PageSetup, defaultTabPt?: number, images?: ImageMap): number;
|
|
35
|
+
export declare function drawFooter(ctx: CanvasRenderingContext2D, footerParas: StyledParagraph[], def: {
|
|
36
|
+
font: string;
|
|
37
|
+
sizePt: number;
|
|
38
|
+
}, page: PageSetup, footerDistPt: number, onLine?: (l: LineTrace) => void, onRule?: (r: RuleTrace) => void, pageNo?: number, defaultTabPt?: number, nums?: PageNums, images?: ImageMap, boxes?: PlacedTextBox[], partPath?: string,
|
|
39
|
+
/** densité de la surface — les filets d'un tableau de pied s'y accrochent */
|
|
40
|
+
dpr?: number): void;
|