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,251 @@
|
|
|
1
|
+
import type { StyledParagraph, PageSetup, ListInfo, TableInfo, BodyBlock } from '../../docx-model/src/index';
|
|
2
|
+
import { type Footnotes, type ImageMap, type ImageRect, type LineTrace, type MarkRect, type PlacedTextBox, type RowTrace, type RuleTrace, type SectionParts, type TableRect } from './types';
|
|
3
|
+
export interface RenderInput extends RenderOptions {
|
|
4
|
+
/** Où accrocher les `<canvas>`. Inutile si `newPage` est fourni. */
|
|
5
|
+
container?: HTMLElement;
|
|
6
|
+
paragraphs: StyledParagraph[];
|
|
7
|
+
page: PageSetup;
|
|
8
|
+
blocks: BodyBlock[];
|
|
9
|
+
tables: TableInfo[];
|
|
10
|
+
numbering?: (ListInfo | undefined)[];
|
|
11
|
+
/**
|
|
12
|
+
* Sections du document. Sans elles, un document multi-sections se rend
|
|
13
|
+
* entièrement au format de la première — marges, orientation et colonnes des
|
|
14
|
+
* suivantes sont perdues.
|
|
15
|
+
*/
|
|
16
|
+
sections?: PageSetup[];
|
|
17
|
+
/** Les notes de bas de page, si le document en a. */
|
|
18
|
+
footnotes?: Footnotes;
|
|
19
|
+
/**
|
|
20
|
+
* Où chaque note atterrit, relevé par la PASSE DE MESURE.
|
|
21
|
+
*
|
|
22
|
+
* Une note se pose au bas de la page où tombe son renvoi, et cette place
|
|
23
|
+
* enlevée au corps déplace le renvoi lui-même : c'est un point fixe. On le
|
|
24
|
+
* résout en composant deux fois — la première dit les pages, la seconde
|
|
25
|
+
* réserve la place. Une seule itération : c'est ce que fait Word dans les
|
|
26
|
+
* cas simples, et les quatre documents à notes du corpus en sont.
|
|
27
|
+
*/
|
|
28
|
+
notesOnPage?: Map<number, number[]>;
|
|
29
|
+
}
|
|
30
|
+
export interface RenderOptions {
|
|
31
|
+
/** Chaque changement de page ou de colonne, avec sa cause — voir `DrawCtx.onBreak`. */
|
|
32
|
+
onBreak?(b: {
|
|
33
|
+
page: number;
|
|
34
|
+
y: number;
|
|
35
|
+
cause: string;
|
|
36
|
+
bloc?: number;
|
|
37
|
+
}): void;
|
|
38
|
+
headerDistPt?: number;
|
|
39
|
+
footerDistPt?: number;
|
|
40
|
+
firstPageHeader?: StyledParagraph[];
|
|
41
|
+
defaultHeader?: StyledParagraph[];
|
|
42
|
+
defaultFooter?: StyledParagraph[];
|
|
43
|
+
/**
|
|
44
|
+
* En-têtes/pieds par section, indexés comme `sections`.
|
|
45
|
+
*
|
|
46
|
+
* Word laisse chaque section déclarer les siens, et une section muette hérite
|
|
47
|
+
* de la précédente. N'utiliser que ceux de la première section coûtait 30 pt
|
|
48
|
+
* en haut de chaque page dès la deuxième sur Colo 2 : sa section 1 pose son
|
|
49
|
+
* en-tête à 0 pt du bord, les suivantes à 36 pt.
|
|
50
|
+
*/
|
|
51
|
+
sectionParts?: SectionParts[];
|
|
52
|
+
images?: ImageMap;
|
|
53
|
+
/**
|
|
54
|
+
* Appelé pour chaque morceau dessiné d'un run marqué.
|
|
55
|
+
*
|
|
56
|
+
* Un run coupé par un retour à la ligne produit plusieurs rectangles ; c'est
|
|
57
|
+
* à l'appelant de les réunir. Le renderer ne sait pas ce que le marqueur
|
|
58
|
+
* désigne et n'a pas à le savoir.
|
|
59
|
+
*/
|
|
60
|
+
onMark?(rect: MarkRect): void;
|
|
61
|
+
/**
|
|
62
|
+
* Trace de layout — appelé pour chaque ligne dessinée.
|
|
63
|
+
*
|
|
64
|
+
* Permet de comparer les positions calculées par le renderer avec celles
|
|
65
|
+
* extraites du PDF Word (pdftotext -bbox), sans passer par le pixel diff.
|
|
66
|
+
*/
|
|
67
|
+
onLine?(line: LineTrace): void;
|
|
68
|
+
/**
|
|
69
|
+
* Appelé pour chaque image dessinée, avec son rectangle.
|
|
70
|
+
*
|
|
71
|
+
* Une image n'occupe aucun caractère : le hit-test du texte ne la trouvera
|
|
72
|
+
* jamais. Sans ce rectangle elle est invisible à la souris.
|
|
73
|
+
*/
|
|
74
|
+
onImage?(rect: ImageRect): void;
|
|
75
|
+
/**
|
|
76
|
+
* Appelé pour chaque page qu'un tableau occupe, avec son rectangle.
|
|
77
|
+
*
|
|
78
|
+
* Un tableau ne s'attrape pas par son texte — le curseur y tombe toujours
|
|
79
|
+
* dans une cellule. C'est ce rectangle qui permet de le prendre comme un tout.
|
|
80
|
+
*/
|
|
81
|
+
onTable?(rect: TableRect): void;
|
|
82
|
+
/**
|
|
83
|
+
* Publier aussi les lignes vides dans la trace.
|
|
84
|
+
*
|
|
85
|
+
* L'éditeur en a besoin pour poser un curseur sur une ligne vide ; le banc de
|
|
86
|
+
* mesure ne doit PAS les voir, il apparie ses lignes par le texte.
|
|
87
|
+
*/
|
|
88
|
+
traceEmpty?: boolean;
|
|
89
|
+
/** Chaque TRAIT dessiné — voir `RuleTrace`. */
|
|
90
|
+
onRule?(rule: RuleTrace): void;
|
|
91
|
+
onRow?(row: RowTrace): void;
|
|
92
|
+
/** Passe de MESURE seulement : sur quelle page tombe le renvoi de la note n. */
|
|
93
|
+
onFootnoteAt?(n: number, page: number): void;
|
|
94
|
+
/** w:defaultTabStop du document, en points */
|
|
95
|
+
defaultTabPt?: number;
|
|
96
|
+
/** `w:doNotExpandShiftReturn` — voir `DrawCtx` */
|
|
97
|
+
noExpandShiftReturn?: boolean;
|
|
98
|
+
/** compatibilityMode < 15 — voir `DrawCtx` */
|
|
99
|
+
legacyWrap?: boolean;
|
|
100
|
+
/** `w:ulTrailSpace` — voir `DrawCtx` */
|
|
101
|
+
ulTrailSpace?: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Zones de texte ancrées, indexées par le paragraphe qui les porte.
|
|
104
|
+
*
|
|
105
|
+
* Word les pose à leurs coordonnées, hors du fil. Les ignorer perdait leur
|
|
106
|
+
* contenu — et sur un contrat, l'absence d'un bloc décalait la frontière de
|
|
107
|
+
* page qui suit, donc tout le reste du document.
|
|
108
|
+
*/
|
|
109
|
+
textBoxes?: PlacedTextBox[];
|
|
110
|
+
/**
|
|
111
|
+
* Hauteurs de ligne par police, lues dans les fichiers réellement servis.
|
|
112
|
+
*
|
|
113
|
+
* Une table écrite à la main laisse toujours une police dehors, et celle-là
|
|
114
|
+
* compose 6 % trop court sans que rien ne le signale.
|
|
115
|
+
*/
|
|
116
|
+
lineRatios?: Record<string, number>;
|
|
117
|
+
/**
|
|
118
|
+
* Première page à REPEINDRE, 1-based. Les précédentes gardent leurs pixels.
|
|
119
|
+
*
|
|
120
|
+
* Une frappe au milieu d'un document ne change rien à ce qui la précède : la
|
|
121
|
+
* mise en page y est déterministe et ne dépend que du contenu d'avant. On la
|
|
122
|
+
* calcule donc quand même — il faut bien savoir où l'on en est — mais on ne
|
|
123
|
+
* la peint pas.
|
|
124
|
+
*
|
|
125
|
+
* Mesuré sur une trace de session réelle : `fillText` pesait 915 ms et le
|
|
126
|
+
* téléversement des textures 680 ms de plus, pour neuf pages redessinées à
|
|
127
|
+
* chaque lettre.
|
|
128
|
+
*
|
|
129
|
+
* L'appelant est responsable de n'en profiter que quand c'est vrai : la page
|
|
130
|
+
* doit être celle où commence le paragraphe modifié, et un changement du
|
|
131
|
+
* NOMBRE de pages oblige à tout repeindre (les pieds portent « page X sur Y »).
|
|
132
|
+
*/
|
|
133
|
+
paintFrom?: number;
|
|
134
|
+
/**
|
|
135
|
+
* Reprise incrémentale : ne recomposer qu'à partir de la page modifiée.
|
|
136
|
+
*
|
|
137
|
+
* L'appelant crée l'objet une fois et le REND tel quel à chaque composition —
|
|
138
|
+
* le renderer y range ses points de reprise et y écrit ce qu'il a refait.
|
|
139
|
+
*/
|
|
140
|
+
resume?: ResumeState;
|
|
141
|
+
/**
|
|
142
|
+
* Facteur correctif Canvas→hmtx par police.
|
|
143
|
+
*
|
|
144
|
+
* Canvas mesure les glyphes ~1% plus large que les avances du TTF. Ce
|
|
145
|
+
* facteur corrige la mesure des tokens pour la césure.
|
|
146
|
+
*/
|
|
147
|
+
widthCorrections?: Record<string, number>;
|
|
148
|
+
/**
|
|
149
|
+
* Nombre de pages maximal. Quand le renderer veut créer une page de plus,
|
|
150
|
+
* il la saute et continue sur la page courante (le contenu peut déborder
|
|
151
|
+
* dans la marge basse).
|
|
152
|
+
*
|
|
153
|
+
* C'est un GARDE-FOU, pas un alignement : le régler sur le compte de pages
|
|
154
|
+
* de Word rendait toute erreur de pagination invisible, le surplus étant
|
|
155
|
+
* peint par-dessus la dernière page au lieu d'en ouvrir une. Le banc y met
|
|
156
|
+
* le double plus cinq.
|
|
157
|
+
*/
|
|
158
|
+
maxPages?: number;
|
|
159
|
+
/**
|
|
160
|
+
* Fabrique la surface d'une page, à la place d'un `<canvas>` du DOM.
|
|
161
|
+
*
|
|
162
|
+
* Le moteur n'a besoin du navigateur que pour DESSINER ; toutes ses décisions
|
|
163
|
+
* de mise en page passent par `measureText`. En laissant l'appelant fournir
|
|
164
|
+
* la surface, le même code compose un document dans Node — sans Vite, sans
|
|
165
|
+
* Chrome, sans capture d'écran — contre une surface qui mesure les glyphes
|
|
166
|
+
* dans les TTF servis et jette la peinture.
|
|
167
|
+
*
|
|
168
|
+
* Mesuré : 200 documents du corpus, 63 ms chacun contre 730 ms par le
|
|
169
|
+
* navigateur, pour une mise en page identique à 0,225 pt près en médiane —
|
|
170
|
+
* cent pour cent des lignes dans la tolérance de 2 pt du banc.
|
|
171
|
+
*/
|
|
172
|
+
newPage?(wPx: number, hPx: number, dpr: number): CanvasRenderingContext2D;
|
|
173
|
+
/** Densité de la surface. `window.devicePixelRatio` par défaut. */
|
|
174
|
+
devicePixelRatio?: number;
|
|
175
|
+
}
|
|
176
|
+
/** Tout ce qu'il faut pour reprendre — ou reconnaître — une mise en page. */
|
|
177
|
+
interface LayoutState {
|
|
178
|
+
y: number;
|
|
179
|
+
page: number;
|
|
180
|
+
block: number;
|
|
181
|
+
/** Rang de tableau où l'on en est — 0 hors tableau. */
|
|
182
|
+
row: number;
|
|
183
|
+
/** Premier paragraphe qui reste à composer. */
|
|
184
|
+
para: number;
|
|
185
|
+
bodyStart: number;
|
|
186
|
+
sectionIdx: number;
|
|
187
|
+
/**
|
|
188
|
+
* Section sous laquelle la PAGE a été ouverte — pas forcément la section
|
|
189
|
+
* courante : une rupture continue peut changer de section au milieu d'une
|
|
190
|
+
* feuille, et c'est l'en-tête et le pied de l'OUVERTURE qui y sont posés.
|
|
191
|
+
*/
|
|
192
|
+
pageSect: number;
|
|
193
|
+
/**
|
|
194
|
+
* Première page de la section — `applySection` la recalcule depuis
|
|
195
|
+
* `pageCount`, ce qui est FAUX à la reprise : on reprend au milieu d'une
|
|
196
|
+
* section et sa vraie première page est plus haut. `balanceFrom` s'en sert
|
|
197
|
+
* (`pageCount > sectionStartPage`), donc l'équilibrage des colonnes changeait
|
|
198
|
+
* et le document rendait deux lignes de moins qu'en composition complète.
|
|
199
|
+
*/
|
|
200
|
+
sectionStartPage: number;
|
|
201
|
+
balancedBottom: number | undefined;
|
|
202
|
+
wrapFloor: number | undefined;
|
|
203
|
+
prevSpaceAfter: number | undefined;
|
|
204
|
+
prevStyleId: string | undefined;
|
|
205
|
+
prevContextual: boolean | undefined;
|
|
206
|
+
}
|
|
207
|
+
export interface ResumeState {
|
|
208
|
+
/** Paragraphe modifié. La composition reprend juste avant lui. */
|
|
209
|
+
at?: number;
|
|
210
|
+
/**
|
|
211
|
+
* Points de REPRISE : paragraphe → état au SOMMET de la page qu'il ouvre.
|
|
212
|
+
*
|
|
213
|
+
* Indexés par PARAGRAPHE et non par bloc : un contrat de 42 pages ne compte
|
|
214
|
+
* que dix blocs, ses tableaux enjambant les pages par dizaines. Un rang de
|
|
215
|
+
* tableau est un point de reprise comme un autre.
|
|
216
|
+
*
|
|
217
|
+
* Seuls les sommets de page en sont : reprendre à mi-page voudrait dire
|
|
218
|
+
* effacer ce qui vient dessous, et un rectangle ne sait pas distinguer la
|
|
219
|
+
* queue d'un jambage de l'encre qu'on remplace — la rangée du point de reprise
|
|
220
|
+
* n'était jamais tout à fait la bonne. Une page se reprend donc entière,
|
|
221
|
+
* en-tête compris.
|
|
222
|
+
*/
|
|
223
|
+
snaps?: Map<number, LayoutState>;
|
|
224
|
+
/**
|
|
225
|
+
* Points de CONVERGENCE : page → état juste avant de l'ouvrir. Y retomber
|
|
226
|
+
* signifie que cette page et toutes les suivantes sont déjà à l'écran.
|
|
227
|
+
*/
|
|
228
|
+
bounds?: Map<number, LayoutState>;
|
|
229
|
+
/** Nombre de blocs et de pages de la composition précédente. */
|
|
230
|
+
blocks?: number;
|
|
231
|
+
pages?: number;
|
|
232
|
+
/**
|
|
233
|
+
* Première et dernière page réellement recomposées — écrites par le renderer.
|
|
234
|
+
*
|
|
235
|
+
* Les pages de cet intervalle sont refaites ENTIÈREMENT, en-tête et pied
|
|
236
|
+
* compris ; celles d'avant et d'après gardent leurs pixels et leur trace.
|
|
237
|
+
*/
|
|
238
|
+
from?: number;
|
|
239
|
+
to?: number;
|
|
240
|
+
}
|
|
241
|
+
/** Compose le document dans le conteneur et renvoie le nombre de pages. */
|
|
242
|
+
/**
|
|
243
|
+
* Compose le document dans le conteneur et renvoie le nombre de pages.
|
|
244
|
+
*
|
|
245
|
+
* Un document À NOTES est composé DEUX FOIS : la première pour savoir sur
|
|
246
|
+
* quelle page tombe chaque renvoi, la seconde pour réserver la place des notes
|
|
247
|
+
* au bas de ces pages-là. Un document sans notes — 1332 des 1336 du corpus —
|
|
248
|
+
* ne passe pas par là et ne paie rien.
|
|
249
|
+
*/
|
|
250
|
+
export declare function render(input: RenderInput): number;
|
|
251
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ListInfo, StyledParagraph, TableInfo } from '../../docx-model/src/index';
|
|
2
|
+
import { type DrawCtx } from './types';
|
|
3
|
+
export declare function drawTable(dc: DrawCtx, table: TableInfo, paras: StyledParagraph[], paraStart: number,
|
|
4
|
+
/** Reprise : premier rang à composer, et le paragraphe où il commence. */
|
|
5
|
+
fromRow?: number, fromPara?: number,
|
|
6
|
+
/**
|
|
7
|
+
* Marqueurs de liste du document, indexés comme `paras`.
|
|
8
|
+
*
|
|
9
|
+
* Une cellule contient des paragraphes comme les autres, et rien n'empêche
|
|
10
|
+
* qu'ils soient numérotés. Ne pas les transmettre coûtait la puce ET le
|
|
11
|
+
* décalage du texte qu'elle entraîne : sur « Vanished », dont tout le corps
|
|
12
|
+
* tient dans une cellule, cinq « a) » manquaient et chaque paragraphe
|
|
13
|
+
* numéroté partait un mot en avance sur celui de Word jusqu'à sa fin.
|
|
14
|
+
*/
|
|
15
|
+
numbering?: Array<ListInfo | undefined>): void;
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { type RunStyle, type StyledParagraph, type ListInfo } from '../../docx-model/src/index';
|
|
2
|
+
import { type ImageMap, type PageNums } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Composition d'une ligne : mesure des glyphes, découpage en unités
|
|
5
|
+
* insécables, et les quelques règles de Word qui s'y appliquent.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Échelle horizontale d'un run (`w:rPr/w:w`), en facteur.
|
|
9
|
+
*
|
|
10
|
+
* Word resserre ou étire chaque glyphe SANS toucher à sa hauteur. Le canvas ne
|
|
11
|
+
* l'exprime pas directement : on corrige les largeurs mesurées, ce qui suffit
|
|
12
|
+
* à la césure et au placement — le DESSIN reste à l'échelle 1, faute de quoi
|
|
13
|
+
* il faudrait une transformation par jeton.
|
|
14
|
+
*/
|
|
15
|
+
export declare const scaleOf: (style: Partial<RunStyle>) => number;
|
|
16
|
+
export declare function canvasFont(style: Partial<RunStyle>, def: {
|
|
17
|
+
font: string;
|
|
18
|
+
sizePt: number;
|
|
19
|
+
}): string;
|
|
20
|
+
/**
|
|
21
|
+
* Pose police ET interlettrage d'un coup.
|
|
22
|
+
*
|
|
23
|
+
* `ctx.letterSpacing` est rémanent : le laisser d'un jeton à l'autre teintait
|
|
24
|
+
* tout le reste de la ligne. On le remet donc à zéro par défaut.
|
|
25
|
+
*/
|
|
26
|
+
export declare function setFont(ctx: CanvasRenderingContext2D, font: string, ls?: string): void;
|
|
27
|
+
export declare function alignX(align: string | undefined, left: number, avail: number, w: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Les seize valeurs de `w:highlight`, plus `white`.
|
|
30
|
+
*
|
|
31
|
+
* `white` et `none` ne sont pas des absences : ce sont des valeurs légales que
|
|
32
|
+
* Word peint (ou non) sans rien changer à l'œil. Une valeur inconnue ne peint
|
|
33
|
+
* rien non plus — inventer une couleur, c'est afficher une information que le
|
|
34
|
+
* document ne porte pas. `dev-fixture.docx` porte `white` sur 194 de ses 202
|
|
35
|
+
* runs : avec un défaut jaune, la page entière était surlignée.
|
|
36
|
+
*/
|
|
37
|
+
export declare const HL_COLORS: Record<string, string>;
|
|
38
|
+
export interface Tok {
|
|
39
|
+
/**
|
|
40
|
+
* Largeur sans l'espace finale.
|
|
41
|
+
*
|
|
42
|
+
* Word ne compte pas l'espace de fin de ligne quand il décide du retour :
|
|
43
|
+
* « mot » suivi d'une espace tient là où « mot␣ » déborderait.
|
|
44
|
+
*/
|
|
45
|
+
inkWidth?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Ce jeton prolonge le précédent au sein d'un même mot : aucune coupure
|
|
48
|
+
* n'est permise entre les deux.
|
|
49
|
+
*
|
|
50
|
+
* Word découpe ses runs où il veut — au gré des révisions et du correcteur
|
|
51
|
+
* orthographique — et une frontière de run tombe au milieu d'un mot une fois
|
|
52
|
+
* sur quatre dans ces matrices : « Sal|a|rié.e », « l|’|exploitation »,
|
|
53
|
+
* « stipul|e ». Chacune était pour nous une occasion de couper la ligne là
|
|
54
|
+
* où Word ne le ferait jamais.
|
|
55
|
+
*/
|
|
56
|
+
noBreakBefore?: boolean;
|
|
57
|
+
text: string;
|
|
58
|
+
width: number;
|
|
59
|
+
font: string;
|
|
60
|
+
color: string;
|
|
61
|
+
/**
|
|
62
|
+
* `w:rPr/w:w` — l'échelle HORIZONTALE des glyphes, en fraction.
|
|
63
|
+
*
|
|
64
|
+
* Elle était appliquée à la MESURE (`scaleOf` dans `corr`) et pas au DESSIN :
|
|
65
|
+
* l'avance valait 90 % de la largeur naturelle, les glyphes 100 %, et les
|
|
66
|
+
* mots se recouvraient. 268 documents du corpus la posent, 97 433 fois, et
|
|
67
|
+
* `MATRICES QUAD ETE 36` en avait 209 lignes sur 304 illisibles — que le banc
|
|
68
|
+
* de référence comptait PLACÉES, puisqu'il ne lit que le texte et l'abscisse
|
|
69
|
+
* de départ.
|
|
70
|
+
*/
|
|
71
|
+
scaleX?: number;
|
|
72
|
+
sizePx: number;
|
|
73
|
+
underline: boolean;
|
|
74
|
+
strike: boolean;
|
|
75
|
+
highlight?: string;
|
|
76
|
+
/** `w:lvlPicBulletId` — puce IMAGE : on peint le bitmap au lieu du glyphe */
|
|
77
|
+
markerBitmap?: CanvasImageSource;
|
|
78
|
+
markerImageSize?: {
|
|
79
|
+
w: number;
|
|
80
|
+
h: number;
|
|
81
|
+
};
|
|
82
|
+
/** `w:bdr` — cadre autour du run ; les jetons voisins qui le partagent n'en font qu'un */
|
|
83
|
+
border?: RunStyle['border'];
|
|
84
|
+
lineBreak?: boolean;
|
|
85
|
+
/** `w:br w:type="page"` ou `"column"` — force une nouvelle page/colonne */
|
|
86
|
+
pageBreak?: boolean;
|
|
87
|
+
/** `w:br w:type="column"` — passe à la colonne suivante, pas à la page */
|
|
88
|
+
columnBreak?: boolean;
|
|
89
|
+
/** puce ou numéro de liste — un mot à part, jamais collé au texte qui suit */
|
|
90
|
+
isListMarker?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Texte réellement DESSINÉ, s'il diffère de la source.
|
|
93
|
+
*
|
|
94
|
+
* En petites capitales, Word compose des CAPITALES à deux corps : c'est cela
|
|
95
|
+
* qu'un lecteur voit et que `pdftotext` extrait. Publier la source dans la
|
|
96
|
+
* trace faisait compter chaque titre comme absent — dix lignes sur soixante
|
|
97
|
+
* rien qu'en page 6 de Colo 2 — alors qu'il était dessiné au bon endroit.
|
|
98
|
+
* On garde la source pour MESURER (elle seule dit quelles lettres sont
|
|
99
|
+
* petites) et on publie la forme dessinée.
|
|
100
|
+
*/
|
|
101
|
+
drawnText?: string;
|
|
102
|
+
/** rang de l'image dans son paragraphe — le même que celui du contexte */
|
|
103
|
+
imgIndex?: number;
|
|
104
|
+
/**
|
|
105
|
+
* Image EN LIGNE : occupe sa place dans le fil, qu'on sache la peindre ou non.
|
|
106
|
+
*
|
|
107
|
+
* `bitmap` est FACULTATIF, et c'est tout l'intérêt. Ses dimensions viennent
|
|
108
|
+
* de `wp:extent`, donc du document — pas du fichier image. Ne poser le jeton
|
|
109
|
+
* que lorsqu'on avait su décoder les pixels faisait qu'une image illisible
|
|
110
|
+
* (EMF et WMF, que Word sème partout, et toute image sur un chemin sans
|
|
111
|
+
* décodeur) ne réservait AUCUNE place : le logo d'un en-tête disparaissait et
|
|
112
|
+
* le corps remontait de sa hauteur — sur toutes les pages du document.
|
|
113
|
+
*/
|
|
114
|
+
image?: {
|
|
115
|
+
bitmap?: ImageBitmap;
|
|
116
|
+
widthPx: number;
|
|
117
|
+
heightPx: number;
|
|
118
|
+
crop?: {
|
|
119
|
+
l: number;
|
|
120
|
+
t: number;
|
|
121
|
+
r: number;
|
|
122
|
+
b: number;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
/** boîte réservée pour un affichage tiers : occupe la place, ne peint rien */
|
|
126
|
+
box?: boolean;
|
|
127
|
+
/** tabulation : largeur calculée à la position de dessin (prochain tab stop) */
|
|
128
|
+
isTab?: boolean;
|
|
129
|
+
/** `w:ptab` — la position du taquet est ABSOLUE, pas cherchée dans la liste */
|
|
130
|
+
ptabAlign?: 'center' | 'right';
|
|
131
|
+
/** marqueur du run d'origine, recopié tel quel */
|
|
132
|
+
mark?: string;
|
|
133
|
+
/** petites capitales : police réduite pour les lettres qui étaient minuscules */
|
|
134
|
+
fontSmall?: string;
|
|
135
|
+
/** exposant/indice : décalage vertical en px (négatif = vers le haut) */
|
|
136
|
+
rise?: number;
|
|
137
|
+
/**
|
|
138
|
+
* Rang du premier caractère de ce jeton dans le TEXTE du paragraphe.
|
|
139
|
+
*
|
|
140
|
+
* C'est l'adresse du modèle (`runSpans`), pas un rang de jeton : elle survit
|
|
141
|
+
* au découpage en mots, à la césure et aux frontières de run. C'est elle qui
|
|
142
|
+
* permet de rendre un clic sous forme de position éditable — sans elle, le
|
|
143
|
+
* renderer sait où il a dessiné, mais pas QUOI.
|
|
144
|
+
*
|
|
145
|
+
* `undefined` quand le jeton ne correspond à aucun caractère du modèle : le
|
|
146
|
+
* marqueur d'une liste, un champ dont on a recalculé la valeur, une boîte
|
|
147
|
+
* d'extension. Un curseur ne s'y pose pas.
|
|
148
|
+
*/
|
|
149
|
+
off?: number;
|
|
150
|
+
/** interlettrage CSS (`w:rPr/w:spacing`), ex. `0.13px` */
|
|
151
|
+
letterSpacing?: string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Word compose exposants et indices à 65 % du corps, l'exposant remonté d'un
|
|
155
|
+
* tiers du corps et l'indice descendu d'un sixième. Les rendre en taille pleine
|
|
156
|
+
* élargit la ligne — « L1242-3ᵉ » débordait et cassait la césure une syllabe
|
|
157
|
+
* trop tôt, décalant tout le paragraphe.
|
|
158
|
+
*/
|
|
159
|
+
export declare const VERT_ALIGN_RATIO = 0.65;
|
|
160
|
+
export declare const SUPER_RISE: number;
|
|
161
|
+
export declare const SUB_RISE: number;
|
|
162
|
+
/**
|
|
163
|
+
* Resserrement des espaces qu'on refuse quoi qu'il arrive.
|
|
164
|
+
*
|
|
165
|
+
* Le choix du moindre mal (voir `keepsWord`) suffit presque toujours ; ce
|
|
166
|
+
* plafond n'est là que pour les lignes à deux ou trois espaces, où le rapport
|
|
167
|
+
* des distorsions n'a plus de sens et où Word renvoie le mot sans discuter.
|
|
168
|
+
*/
|
|
169
|
+
export declare const MAX_SHRINK = 0.25;
|
|
170
|
+
/**
|
|
171
|
+
* Débordement TOLÉRÉ sur une ligne non justifiée, en points.
|
|
172
|
+
*
|
|
173
|
+
* Le texte aligné à gauche coupe au dernier mot qui tient, sans marchander —
|
|
174
|
+
* mais « tient » se juge avec NOS largeurs, qui s'écartent de celles de Word de
|
|
175
|
+
* quelques dixièmes de pour cent (`widthtail.ts` : q05 0,9997, q95 1,0005).
|
|
176
|
+
* Un mot qui déborde de deux points sur une colonne de 550 déborde de 0,4 %,
|
|
177
|
+
* c'est-à-dire de rien. L'hypothèse était donc qu'une tolérance ABSOLUE
|
|
178
|
+
* absorberait l'écart de mesure sans marchander comme le fait le justifié.
|
|
179
|
+
*
|
|
180
|
+
* MESURÉE ET PERDANTE, sur les 400 documents :
|
|
181
|
+
*
|
|
182
|
+
* DEUX FORMES essayées, les deux perdantes sur les 400 documents.
|
|
183
|
+
*
|
|
184
|
+
* En POINTS : 0 -> 39,15 · 1 -> 38,97 · 2 -> 38,96 · 3 -> 38,55 (pondéré ligne)
|
|
185
|
+
* En EM : 0 -> 39,15 · 0,10 -> 38,91 · 0,20 -> 38,75 · 0,30 -> 38,53
|
|
186
|
+
*
|
|
187
|
+
* Décroissance monotone dans les deux cas. Et on sait maintenant POURQUOI, ce
|
|
188
|
+
* qui est plus utile que le chiffre.
|
|
189
|
+
*
|
|
190
|
+
* Sur la ligne qui a lancé l'enquête — « CONTRAT CASCADEURS », douze blocs
|
|
191
|
+
* cassés un mot trop tôt :
|
|
192
|
+
*
|
|
193
|
+
* somme des avances de Word 554,31 pt
|
|
194
|
+
* la même chaîne chez nous 554,41 pt (0,02 % d'écart : nos métriques
|
|
195
|
+
* sont exactes, voir `advdiff.ts`)
|
|
196
|
+
* colonne de la cellule 551,70 pt
|
|
197
|
+
* ENCRE de la ligne chez Word 551,70 pt
|
|
198
|
+
*
|
|
199
|
+
* Word dépasse sa colonne de 2,61 pt en AVANCE et la remplit exactement en
|
|
200
|
+
* ENCRE. **Il coupe donc sur l'encre, nous sur l'avance** — la différence est
|
|
201
|
+
* l'approche du premier et du dernier glyphe, qui pend dans la marge.
|
|
202
|
+
*
|
|
203
|
+
* Une tolérance, plate ou proportionnelle, accorde cette permission à TOUTES
|
|
204
|
+
* les lignes ; Word ne l'accorde qu'à celles dont le dernier glyphe a vraiment
|
|
205
|
+
* une approche à donner. D'où la décroissance monotone : on garde plus de mots
|
|
206
|
+
* à tort qu'à raison.
|
|
207
|
+
*
|
|
208
|
+
* Le correctif juste demanderait la BOÎTE D'ENCRE du dernier glyphe —
|
|
209
|
+
* `glyf`/`CFF` dans `advances.ts`, que le mesureur ne lit pas. Gardé à zéro
|
|
210
|
+
* avec sa mesure, et la piste nommée.
|
|
211
|
+
*/
|
|
212
|
+
export declare const TOL_MESURE_EM = 0;
|
|
213
|
+
/**
|
|
214
|
+
* Resserrement toléré sur la DERNIÈRE ligne d'un paragraphe.
|
|
215
|
+
*
|
|
216
|
+
* Elle n'est pas justifiée : rien ne viendra rattraper un dépassement, il
|
|
217
|
+
* sortira tel quel dans la marge. Le budget y est donc bien plus étroit
|
|
218
|
+
* qu'ailleurs — mais pas nul, car nos largeurs naturelles s'écartent de celles
|
|
219
|
+
* de Word de quelques dixièmes de point sur une ligne pleine.
|
|
220
|
+
*
|
|
221
|
+
* La valeur venait de DEUX observations : Colo 2, « Additionnels »). » demande
|
|
222
|
+
* 24 % et Word le renvoie ; l'Avenant, « d'essai. » demande 8 % et Word le
|
|
223
|
+
* garde. Deux points ne font pas une courbe, et le 0,15 qu'ils suggéraient
|
|
224
|
+
* était loin de l'optimum.
|
|
225
|
+
*
|
|
226
|
+
* BALAYÉ sur les 400 documents du banc :
|
|
227
|
+
*
|
|
228
|
+
* valeur par document pondéré ligne
|
|
229
|
+
* 0,05 41,82 34,94
|
|
230
|
+
* 0,15 43,47 36,84 ← les deux observations
|
|
231
|
+
* 0,20 44,61 37,89
|
|
232
|
+
* 0,23 45,30 38,96
|
|
233
|
+
* 0,25 45,26 39,08 ← pic
|
|
234
|
+
* 0,26 44,69 38,56
|
|
235
|
+
* 0,28 43,47 37,41
|
|
236
|
+
* 0,32 42,38 36,00
|
|
237
|
+
* 0,40 40,48 34,07
|
|
238
|
+
*
|
|
239
|
+
* Word tolère donc BEAUCOUP plus de resserrement sur une dernière ligne qu'on
|
|
240
|
+
* ne le croyait — un quart, pas un septième. Et les deux constantes
|
|
241
|
+
* interagissent : `STRETCH_RATIO` a été rebalayé à cette valeur et reste à
|
|
242
|
+
* 0,50 (0,45 donne 38,35, 0,55 donne 38,34). Le couple est un optimum conjoint.
|
|
243
|
+
*
|
|
244
|
+
* 60 documents en hausse, 33 en baisse, et AUCUN des 33 ne change de
|
|
245
|
+
* pagination — ce sont des déplacements de lignes, pas des ruptures. Les
|
|
246
|
+
* documents au bon nombre de pages passent de 306 à 308.
|
|
247
|
+
*/
|
|
248
|
+
export declare const FINAL_LINE_SHRINK = 0.25;
|
|
249
|
+
/**
|
|
250
|
+
* Découpage GLOBAL des paragraphes justifiés — voir `optimalBreaks`.
|
|
251
|
+
*
|
|
252
|
+
* MESURÉ, ET PERDANT. `optimalBreaks` est vérifié correct (test synthétique) et
|
|
253
|
+
* ses coupures sont plausibles, mais il reproduit Word NETTEMENT moins bien que
|
|
254
|
+
* le glouton `keepsWord`, et pour toute pénalité :
|
|
255
|
+
*
|
|
256
|
+
* glouton pén. 0,1 pén. 1,0 pén. 4,5
|
|
257
|
+
* Colo 2 95,95 37,6 38,2 45,1
|
|
258
|
+
* FIEF 96,42 66,6 72,5 80,3
|
|
259
|
+
* Stagiaire 95,54 71,4 71,4 79,7
|
|
260
|
+
*
|
|
261
|
+
* L'écart est structurel : le modèle global échange une bonne ligne contre une
|
|
262
|
+
* meilleure suivante, Word non — il coupe au dernier mot qui tient et ne
|
|
263
|
+
* marchande QUE le resserrement de la ligne courante. Les brevets décrivent un
|
|
264
|
+
* optimiseur global ; ce Word-là ne l'applique pas au découpage des lignes.
|
|
265
|
+
*
|
|
266
|
+
* REVÉRIFIÉ sur les 400 documents du banc, avec les constantes recalibrées —
|
|
267
|
+
* les trois chiffres ci-dessus venaient de TROIS documents :
|
|
268
|
+
*
|
|
269
|
+
* glouton 45,27 par document, 39,15 pondéré ligne
|
|
270
|
+
* global, pénalité 1,0 37,05 30,50
|
|
271
|
+
* global, pénalité 4,5 39,44 32,50
|
|
272
|
+
* global, pénalité 12 38,16 31,51
|
|
273
|
+
*
|
|
274
|
+
* Six points et demi d'écart à l'optimum du global. La réfutation tient, et
|
|
275
|
+
* elle tient maintenant sur le corpus.
|
|
276
|
+
*
|
|
277
|
+
* Gardé désactivé plutôt que supprimé : c'est la TROISIÈME tentative de modèle
|
|
278
|
+
* global, et sans cette mesure il y en aura une quatrième.
|
|
279
|
+
*/
|
|
280
|
+
export declare const OPTIMAL_WRAP = false;
|
|
281
|
+
export declare const SHRINK_PENALTY = 4.5;
|
|
282
|
+
/**
|
|
283
|
+
* Étirement en deçà duquel Word ne resserre jamais.
|
|
284
|
+
*
|
|
285
|
+
* Une ligne justifiée trop courte s'étire, une ligne trop longue se resserre.
|
|
286
|
+
* Word ne marchande pas : il coupe au dernier mot qui tient et étire. Il ne
|
|
287
|
+
* resserre que lorsque l'étirement deviendrait grotesque.
|
|
288
|
+
*
|
|
289
|
+
* Deux décisions de Word sur Colo 2, au resserrement quasi identique et
|
|
290
|
+
* pourtant opposées, situent la frontière sur l'ÉTIREMENT et non sur le
|
|
291
|
+
* resserrement :
|
|
292
|
+
*
|
|
293
|
+
* « L7124- » resserrer 13,7 % ou étirer 159,6 % → Word garde
|
|
294
|
+
* « ceux » resserrer 15,1 % ou étirer 22,9 % → Word renvoie
|
|
295
|
+
*/
|
|
296
|
+
export declare const MIN_STRETCH = 0;
|
|
297
|
+
/**
|
|
298
|
+
* Part de l'étirement en deçà de laquelle le resserrement l'emporte.
|
|
299
|
+
*
|
|
300
|
+
* `bench trace --rule` balayait la famille « plafond × ratio » sur les 116
|
|
301
|
+
* décisions de Colo 2 : le maximum y était à 0,75 (87,1 % de bonne
|
|
302
|
+
* classification) contre 1,00 (86,2 %). Word penche donc du côté du renvoi.
|
|
303
|
+
*
|
|
304
|
+
* REBALAYÉ sur les 400 documents du banc, ce qui est un tout autre échantillon
|
|
305
|
+
* que 116 décisions d'un seul contrat :
|
|
306
|
+
*
|
|
307
|
+
* ratio par document pondéré ligne
|
|
308
|
+
* 0,40 41,41 34,88
|
|
309
|
+
* 0,47 42,79 36,41 ← la valeur précédente
|
|
310
|
+
* 0,49 43,10 36,62
|
|
311
|
+
* 0,50 43,47 36,84 ← pic, les deux axes d'accord
|
|
312
|
+
* 0,51 43,37 36,76
|
|
313
|
+
* 0,52 43,20 36,52
|
|
314
|
+
* 0,55 42,95 36,24
|
|
315
|
+
* 0,65 42,04 35,34
|
|
316
|
+
*
|
|
317
|
+
* Courbe lisse, pic unique, voisins immédiats en dessous : c'est un optimum et
|
|
318
|
+
* non un accident de grille. 83 documents en hausse, 6 en baisse.
|
|
319
|
+
*
|
|
320
|
+
* Son voisin `MAX_SHRINK` a été balayé du même coup et reste à 0,25 : 0,20
|
|
321
|
+
* donne 33,33 et 0,30 donne 34,69 en pondéré ligne, contre 36,84. Le plafond
|
|
322
|
+
* est déjà juste, et il est RAIDE — un vingtième coûte un à trois points.
|
|
323
|
+
*/
|
|
324
|
+
export declare const STRETCH_RATIO = 0.5;
|
|
325
|
+
/**
|
|
326
|
+
* Word garde-t-il ce mot sur la ligne, au prix d'un resserrement ?
|
|
327
|
+
*
|
|
328
|
+
* Oui si le resserrement demandé est PLUS FAIBLE que l'étirement qu'imposerait
|
|
329
|
+
* son renvoi — mais seulement lorsque cet étirement dépasse `MIN_STRETCH` : en
|
|
330
|
+
* deçà, Word se contente d'étirer, même si resserrer déformerait moins.
|
|
331
|
+
*
|
|
332
|
+
* @param over dépassement si l'on garde le mot
|
|
333
|
+
* @param under creux si on le renvoie
|
|
334
|
+
* @param gapsIn largeur totale des espaces, le mot gardé
|
|
335
|
+
* @param gapsOut largeur totale des espaces, le mot renvoyé
|
|
336
|
+
*/
|
|
337
|
+
/**
|
|
338
|
+
* `ratio` est paramétrable pour un balayage séparé — celui des CELLULES a été
|
|
339
|
+
* fait le 28 août et donne le MÊME optimum que le fil : 0,40 → 48,04 ·
|
|
340
|
+
* **0,50 → 48,11** · 0,60 → 48,03 · 0,70 → 47,94 par document. La colonne
|
|
341
|
+
* étroite d'un tableau ne demande donc pas d'autre réglage que le fil ; c'est
|
|
342
|
+
* le NOMBRE de décisions qui l'expose, pas leur seuil.
|
|
343
|
+
*/
|
|
344
|
+
export declare function keepsWord(over: number, under: number, gapsIn: number, gapsOut: number, ratio?: number): boolean;
|
|
345
|
+
/** Word compose les petites capitales à ~80 % du corps. */
|
|
346
|
+
export declare const SMALL_CAPS_RATIO = 0.8;
|
|
347
|
+
/**
|
|
348
|
+
* Coupe un mot après ses traits d'union : ce sont des points de césure.
|
|
349
|
+
*
|
|
350
|
+
* Word passe à la ligne après le tiret de « rendez-vous », pas nous — un mot
|
|
351
|
+
* composé de trop repoussait tout un paragraphe d'une ligne, et ces contrats en
|
|
352
|
+
* sont pleins (« Primo-Diffuseur », « post-synchronisation »). Sur les 1047
|
|
353
|
+
* lignes du rendu Word de Colo 2, treize finissent par un tiret.
|
|
354
|
+
*
|
|
355
|
+
* On exige au moins deux caractères avant et un après, pour ne pas isoler le
|
|
356
|
+
* tiret d'un « -113 » ou d'une puce.
|
|
357
|
+
*
|
|
358
|
+
* ponytail: la barre oblique est aussi une coupure possible chez Word (quatre
|
|
359
|
+
* lignes sur ce document), mais en DERNIER recours — il préfère renvoyer tout
|
|
360
|
+
* « interdiction/restriction/incapacité » à la ligne suivante. Notre césure
|
|
361
|
+
* gloutonne traite toutes les coupures à égalité et couperait trop tôt : à
|
|
362
|
+
* reprendre quand la césure saura hiérarchiser ses opportunités.
|
|
363
|
+
*/
|
|
364
|
+
export declare function hyphenPieces(word: string): string[];
|
|
365
|
+
/** Découpe un texte en segments « était minuscule » / « était déjà capitale ». */
|
|
366
|
+
export declare function scSegments(text: string): Array<{
|
|
367
|
+
text: string;
|
|
368
|
+
small: boolean;
|
|
369
|
+
}>;
|
|
370
|
+
/**
|
|
371
|
+
* Découpage GLOBAL d'un paragraphe justifié — le modèle des brevets de Word
|
|
372
|
+
* (US 7444586, US 7783969) : au lieu de décider mot à mot, on choisit
|
|
373
|
+
* l'ensemble des coupures qui minimise la somme des carrés de l'ajustement.
|
|
374
|
+
*
|
|
375
|
+
* Pourquoi y revenir : sur 9 381 décisions réelles de Word, AUCUN trait local
|
|
376
|
+
* ne sépare les cas où il garde un mot de ceux où il le renvoie — resserrement,
|
|
377
|
+
* étirement, intervalles, largeur du mot, corps, interligne sont tous au niveau
|
|
378
|
+
* du témoin trivial. La décision dépend donc de ce qui vient APRÈS dans le
|
|
379
|
+
* paragraphe, ce qui est la définition d'un optimum global.
|
|
380
|
+
*
|
|
381
|
+
* Renvoie l'ensemble des index de jetons qui OUVRENT une ligne, ou `undefined`
|
|
382
|
+
* quand le paragraphe ne s'y prête pas — tabulation, saut, image, puce : leur
|
|
383
|
+
* largeur dépend de la position et le calcul n'a plus de sens.
|
|
384
|
+
*/
|
|
385
|
+
export declare function optimalBreaks(toks: Tok[], availPremiere: number, availSuite: number, opts: {
|
|
386
|
+
maxShrink: number;
|
|
387
|
+
shrinkPenalty: number;
|
|
388
|
+
finalShrink: number;
|
|
389
|
+
}): Set<number> | undefined;
|
|
390
|
+
export declare function tokenize(ctx: CanvasRenderingContext2D, para: StyledParagraph, def: {
|
|
391
|
+
font: string;
|
|
392
|
+
sizePt: number;
|
|
393
|
+
}, listInfo?: ListInfo, images?: ImageMap, nums?: PageNums,
|
|
394
|
+
/** Facteur correctif Canvas→hmtx par police. `ctx.measureText` × ce ratio =
|
|
395
|
+
* largeur que Word utiliserait. Voir `canvasCorrection` dans @myrole/fonts. */
|
|
396
|
+
widthCorrections?: Record<string, number>): Tok[];
|