wysiwygido 1.2.0 → 1.2.1
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/CHANGELOG.md +10 -0
- package/README.md +2 -0
- package/dist/adapter.js +1 -1
- package/dist/docx.js +12 -9
- package/dist/docx.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/picture-styles.d.ts +17 -0
- package/dist/react.js +1 -1
- package/dist/ribbon.d.ts +19 -0
- package/dist/{src-BNH7F1TH.js → src-BRq1hjtj.js} +281 -12
- package/dist/src-BRq1hjtj.js.map +1 -0
- package/dist/style.css +19 -0
- package/dist/vue.js +1 -1
- package/dist/wysiwygido.js +2 -2
- package/package.json +1 -1
- package/dist/src-BNH7F1TH.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses [Semantic Versioning](https://semver.org/). Before 1.0.0 minor versions could contain breaking changes. From 1.0.0 on, only a major version may break the public API (see "Stability and versioning" in the README); changes are listed under "Changed" or "Removed".
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
- Added: **picture styles**, like the gallery in Word: 28 looks for an image (frames, shadows, rounded and oval shapes, soft edges, diagonal corners, tilt and perspective, reflections, metal frames) in a gallery in the Picture tab and in the right-click menu, with Clear Style. Command `pictureStyle(id | null)`; `PICTURE_STYLES` lists them. Only the id is stored (`data-picture-style`), the CSS comes from a fixed table. Word and Markdown export write the picture without the effects; Firefox does not draw the reflections.
|
|
8
|
+
- Fixed: the number or bullet of a list item that starts with a heading was as small as body text; it now takes the heading's size and weight.
|
|
9
|
+
- Changed: a long ribbon menu (such as the gallery) scrolls inside the editor instead of being cut off by its edge.
|
|
10
|
+
|
|
11
|
+
## 1.2.1
|
|
12
|
+
|
|
13
|
+
- Fixed: bullets and numbering did nothing on a heading (the "Bulleted list" and "Numbered list" buttons, and the commands). A list item had to start with a paragraph, so a heading could not be wrapped. An item may now start with a heading, which keeps its heading style and gets the bullet or number (numbered headings, as in Word); turning the list off gives the heading back, and switching between bullets and numbers works. Word export writes such an item with the heading style and the numbering.
|
|
14
|
+
|
|
5
15
|
## 1.2.0
|
|
6
16
|
|
|
7
17
|
- Added: **collapsible headings** (`CollapsibleHeadings`, in `defaultPlugins`): an arrow in the margin of every top-level heading hides the text under it up to the next heading of the same or a higher level, like Word. Commands `toggleHeadingFold`, `collapseHeadings`, `expandHeadings`, `showHeadingLevel(n)`; right-click menu, ribbon (View → Headings) and shortcuts included. The document is not changed and the pages are laid out again without the hidden text.
|
package/README.md
CHANGED
|
@@ -161,6 +161,8 @@ Markdown), so exports show it. A reference to a deleted caption says "Missing re
|
|
|
161
161
|
|
|
162
162
|
**Columns**: `Columns()` flows blocks into 2–4 newspaper columns (`insertColumns(n)` wraps the selection, `setColumns({ count, rule, gap })`, `removeColumns`). `setDocumentColumns(count)` puts the whole page (below a leading heading) in columns and `insertColumnBreak` starts the next column. Columns collapse to one on narrow screens. Word export writes every top-level columns block as its own continuous **section** with the real column count, gap and rule (text before and after stays single-column; headers and footers stay on the first section); Markdown flows the text in one column. Columns nested inside columns are flattened in Word.
|
|
163
163
|
|
|
164
|
+
**Picture styles**: select an image and open Picture → Picture Styles for a gallery of 28 looks (frames, offset and soft shadows, rounded and oval shapes, soft edges, diagonal corners, tilt and perspective, reflections, metal frames), plus Clear Style; the right-click menu on an image has the same list. `pictureStyle(id)` applies one to the selected image and `pictureStyle(null)` clears it; `PICTURE_STYLES` from `wysiwygido` lists the ids and labels. The image stores only the id (`data-picture-style`); the CSS comes from a fixed table, so a document cannot inject styles, and it is written inline so the look also shows in exported HTML. Reflections use `-webkit-box-reflect`, which Firefox does not draw (the picture is shown without the reflection there), and the Word and Markdown exports write the picture without the effects.
|
|
165
|
+
|
|
164
166
|
**Collapsible headings**: `CollapsibleHeadings` (in `defaultPlugins`) puts a small arrow in the margin left of every top-level heading, as in Word: a click hides everything up to the next heading of the same or a higher level and shows "…" after the title, and a click again opens it. Commands: `toggleHeadingFold` (the heading at the cursor, or the nearest one above it), `collapseHeadings`, `expandHeadings` and `showHeadingLevel(n)` (only the headings down to level `n` stay open); they are also in the right-click menu on a heading and in the ribbon under View → Headings. Shortcuts: Ctrl/Cmd + Alt + Up collapses, Ctrl/Cmd + Alt + Down expands everything. Nothing is removed from the document: the HTML, undo, export and print are unchanged, the pages are laid out again without the hidden text, and a cursor that moves into hidden text (search, undo, the outline) opens that section. Which headings are collapsed is view state: it is not saved with the document.
|
|
165
167
|
|
|
166
168
|
**Charts**: `Charts()` draws bar, line and pie charts as SVG. With the cursor in a table, `insertChart('bar' | 'line' | 'pie')` uses the first row as series and the first column as labels (numbers like `1,200`, `$40` or `12%` are understood); `insertChart(type, { labels, series })` takes data directly and `setChart` changes the selected chart. The chart is saved as validated data (never markup) and redrawn on load; Word export writes it as a picture (needs a browser canvas) and Markdown as a table.
|
package/dist/adapter.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createEditor } from "./src-
|
|
1
|
+
import { t as createEditor } from "./src-BRq1hjtj.js";
|
|
2
2
|
//#region src/adapter.ts
|
|
3
3
|
/**
|
|
4
4
|
* Framework-neutral binding for anything that needs a "value in, value out" control: Angular's `ControlValueAccessor`, Svelte, Solid,
|
package/dist/docx.js
CHANGED
|
@@ -783,15 +783,18 @@ function listBlocks(list, ctx, depth) {
|
|
|
783
783
|
let first = true;
|
|
784
784
|
const taskRef = name === "task_list" ? newNumbering(ctx, "bullet", item.attrs.checked ? "☑" : "☐") : null;
|
|
785
785
|
item.forEach((child) => {
|
|
786
|
-
if (child.type.name === "paragraph" && first)
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
786
|
+
if ((child.type.name === "paragraph" || child.type.name === "heading") && first) {
|
|
787
|
+
const heading = child.type.name === "heading" ? { heading: D.HeadingLevel[`HEADING_${Math.min(6, child.attrs.level)}`] } : {};
|
|
788
|
+
out.push(new D.Paragraph({
|
|
789
|
+
...heading,
|
|
790
|
+
children: inlineChildren(child, ctx),
|
|
791
|
+
numbering: {
|
|
792
|
+
reference: ref ?? taskRef,
|
|
793
|
+
level: depth
|
|
794
|
+
},
|
|
795
|
+
...paragraphOptions(child, ctx)
|
|
796
|
+
}));
|
|
797
|
+
} else if (/_list$/.test(child.type.name)) out.push(...listBlocks(child, ctx, depth + 1));
|
|
795
798
|
else out.push(...blocks(child, ctx).map((b) => b));
|
|
796
799
|
first = false;
|
|
797
800
|
});
|
package/dist/docx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docx.js","names":["cleanDataTable","formatDataCell"],"sources":["../src/latex-docx.ts","../src/svg-raster.ts","../src/docx.ts"],"sourcesContent":["import * as D from 'docx';\n\n/** A node of Word's equation tree. */\nexport type MathNode = InstanceType<typeof D.MathRun> | InstanceType<typeof D.MathFraction> | InstanceType<typeof D.MathRadical> | InstanceType<typeof D.MathSuperScript> | InstanceType<typeof D.MathSubScript> | InstanceType<typeof D.MathSubSuperScript> | InstanceType<typeof D.MathSum> | InstanceType<typeof D.MathIntegral> | InstanceType<typeof D.MathRoundBrackets> | InstanceType<typeof D.MathSquareBrackets> | InstanceType<typeof D.MathCurlyBrackets> | InstanceType<typeof D.MathLimitLower>;\n\nconst SYMBOLS: Record<string, string> = {\n alpha: 'α', beta: 'β', gamma: 'γ', delta: 'δ', epsilon: 'ε', varepsilon: 'ε', zeta: 'ζ', eta: 'η', theta: 'θ', vartheta: 'ϑ', iota: 'ι', kappa: 'κ', lambda: 'λ', mu: 'μ', nu: 'ν', xi: 'ξ', pi: 'π', rho: 'ρ', sigma: 'σ', tau: 'τ', upsilon: 'υ', phi: 'φ', varphi: 'φ', chi: 'χ', psi: 'ψ', omega: 'ω',\n Gamma: 'Γ', Delta: 'Δ', Theta: 'Θ', Lambda: 'Λ', Xi: 'Ξ', Pi: 'Π', Sigma: 'Σ', Phi: 'Φ', Psi: 'Ψ', Omega: 'Ω',\n pm: '±', mp: '∓', times: '×', cdot: '·', div: '÷', le: '≤', leq: '≤', ge: '≥', geq: '≥', ne: '≠', neq: '≠', approx: '≈', equiv: '≡', sim: '∼', propto: '∝', infty: '∞', partial: '∂', nabla: '∇',\n to: '→', rightarrow: '→', leftarrow: '←', Rightarrow: '⇒', Leftarrow: '⇐', leftrightarrow: '↔', Leftrightarrow: '⇔', in: '∈', notin: '∉', subset: '⊂', subseteq: '⊆', cup: '∪', cap: '∩', forall: '∀', exists: '∃', emptyset: '∅', ldots: '…', cdots: '⋯', dots: '…', degree: '°',\n prime: '′', angle: '∠', perp: '⊥', parallel: '∥', neg: '¬', land: '∧', lor: '∨', circ: '∘', bullet: '•', star: '⋆', ',': ' ', ';': ' ', ':': ' ', '!': '', quad: ' ', qquad: ' ',\n};\nconst FUNCTIONS = new Set(['sin', 'cos', 'tan', 'cot', 'sec', 'csc', 'arcsin', 'arccos', 'arctan', 'sinh', 'cosh', 'tanh', 'log', 'ln', 'exp', 'det', 'max', 'min', 'gcd', 'lg', 'sup', 'inf', 'lim']);\nconst BLACKBOARD: Record<string, string> = { R: 'ℝ', N: 'ℕ', Z: 'ℤ', Q: 'ℚ', C: 'ℂ', P: 'ℙ' };\n\ntype Tok = { t: 'cmd' | 'ch' | '{' | '}' | '^' | '_' | '[' | ']'; v: string };\nclass Unsupported extends Error {}\n\nfunction tokenize(src: string): Tok[] {\n const out: Tok[] = [];\n for (let i = 0; i < src.length; i++) {\n const c = src[i];\n if (c === '\\\\') {\n const m = /^[A-Za-z]+/.exec(src.slice(i + 1));\n if (m) { out.push({ t: 'cmd', v: m[0] }); i += m[0].length; }\n else if (i + 1 < src.length) { out.push({ t: 'cmd', v: src[i + 1] }); i++; } // \\, \\; \\{ \\} \\\\\n } else if (c === '{' || c === '}' || c === '^' || c === '_' || c === '[' || c === ']') out.push({ t: c as Tok['t'], v: c });\n else if (!/\\s/.test(c)) out.push({ t: 'ch', v: c });\n }\n return out;\n}\n\n/**\n * Convert LaTeX to Word's native equation objects (fractions, roots, scripts, sums, integrals, limits, brackets, Greek letters\n * and common operators). Returns null when the formula uses something outside this subset (matrices, aligned environments,\n * custom macros), so the caller can fall back to the LaTeX text instead of writing a wrong equation.\n */\nexport function latexToDocx(tex: string): MathNode[] | null {\n let toks: Tok[];\n try { toks = tokenize(tex.slice(0, 5000)); } catch { return null; }\n let i = 0;\n let depth = 0; // nesting guard: a hostile formula must not overflow the stack\n const peek = () => toks[i];\n const run = (text: string) => new D.MathRun(text);\n\n const group = (): MathNode[] => {\n if (peek()?.t !== '{') { // a single token: x^2, \\frac12\n const a = atom();\n if (!a) throw new Unsupported(); // \"x^\" with nothing after it\n return [a];\n }\n i++;\n const out = sequence((t) => t.t === '}');\n if (peek()?.t !== '}') throw new Unsupported();\n i++;\n return out;\n };\n const optional = (): MathNode[] | null => {\n if (peek()?.t !== '[') return null;\n i++;\n const out = sequence((t) => t.t === ']');\n if (peek()?.t !== ']') throw new Unsupported();\n i++;\n return out;\n };\n const text = (): string => { // \\text{...}: raw characters up to the closing brace\n if (peek()?.t !== '{') throw new Unsupported();\n i++;\n let s = '';\n while (peek() && peek().t !== '}') { const t = toks[i++]; s += t.t === 'cmd' ? (SYMBOLS[t.v] ?? ` ${t.v}`) : t.v; }\n if (peek()?.t !== '}') throw new Unsupported();\n i++;\n return s;\n };\n\n /** One atom plus any ^ _ that follow it. */\n const withScripts = (base: MathNode[]): MathNode[] => {\n let sub: MathNode[] | null = null;\n let sup: MathNode[] | null = null;\n for (let n = 0; n < 2 && (peek()?.t === '^' || peek()?.t === '_'); n++) {\n const which = toks[i++].t;\n const arg = group();\n if (which === '^') sup = arg; else sub = arg;\n }\n if (sub && sup) return [new D.MathSubSuperScript({ children: base, subScript: sub, superScript: sup })];\n if (sup) return [new D.MathSuperScript({ children: base, superScript: sup })];\n if (sub) return [new D.MathSubScript({ children: base, subScript: sub })];\n return base;\n };\n\n const atom = (): MathNode | null => {\n if (++depth > 60) throw new Unsupported();\n try { return atomInner(); } finally { depth--; }\n };\n const atomInner = (): MathNode | null => {\n const t = toks[i];\n if (!t) return null;\n if (t.t === '{') return (i++, wrap(sequence((x) => x.t === '}', true)));\n if (t.t === 'ch') { i++; return run(t.v); }\n if (t.t === 'cmd') {\n i++;\n const c = t.v;\n if (c === 'frac' || c === 'dfrac' || c === 'tfrac') { const n = group(); const d = group(); return new D.MathFraction({ numerator: n, denominator: d }); }\n if (c === 'sqrt') { const deg = optional(); const body = group(); return new D.MathRadical(deg ? { children: body, degree: deg } : { children: body }); }\n if (c === 'text' || c === 'mathrm' || c === 'operatorname') return run(text());\n if (c === 'mathbb') { const s = text(); return run([...s].map((ch) => BLACKBOARD[ch] ?? ch).join('')); }\n if (c === 'left' || c === 'right') throw new Unsupported(); // handled in sequence()\n if (SYMBOLS[c] !== undefined) return run(SYMBOLS[c]);\n if (FUNCTIONS.has(c)) return run(c);\n if (['{', '}', '#', '%', '&', '$', '_'].includes(c)) return run(c);\n throw new Unsupported(); // \\begin, \\matrix, macros ...\n }\n throw new Unsupported(); // a stray ^ _ ] }\n };\n const wrap = (nodes: MathNode[]): MathNode => (nodes.length === 1 ? nodes[0] : new D.MathRoundBrackets({ children: nodes })); // only used for {…} used as one atom\n\n /** Words after \\sum / \\int / \\lim limits: the operand is the next atom with its scripts. */\n const operand = (): MathNode[] => {\n const a = atom();\n return a ? withScripts([a]) : [];\n };\n\n function sequence(stop: (t: Tok) => boolean, flatten = false): MathNode[] {\n if (++depth > 60) throw new Unsupported();\n try { return sequenceInner(stop, flatten); } finally { depth--; }\n }\n function sequenceInner(stop: (t: Tok) => boolean, flatten: boolean): MathNode[] {\n const out: MathNode[] = [];\n while (peek() && !stop(peek())) {\n const t = peek();\n if (t.t === 'cmd' && (t.v === 'sum' || t.v === 'int' || t.v === 'prod' || t.v === 'lim' || t.v === 'limits')) {\n i++;\n if (t.v === 'limits') continue;\n let sub: MathNode[] | undefined;\n let sup: MathNode[] | undefined;\n for (let n = 0; n < 2 && (peek()?.t === '^' || peek()?.t === '_'); n++) { const w = toks[i++].t; const g = group(); if (w === '^') sup = g; else sub = g; }\n if (t.v === 'lim') { out.push(new D.MathLimitLower({ children: [run('lim')], limit: sub ?? [] })); continue; }\n const body = operand();\n if (t.v === 'int') out.push(new D.MathIntegral({ children: body, subScript: sub, superScript: sup }));\n else out.push(new D.MathSum({ children: body, subScript: sub, superScript: sup })); // \\prod is written as a sum sign when Word lacks a product class\n continue;\n }\n if (t.t === 'cmd' && t.v === 'left') {\n i++;\n const open = toks[i++];\n const inner = sequence((x) => x.t === 'cmd' && x.v === 'right');\n i++; // \\right\n const close = toks[i++];\n if (!open || !close) throw new Unsupported();\n const o = open.v;\n out.push(o === '[' ? new D.MathSquareBrackets({ children: inner }) : o === '{' || (open.t === 'cmd' && open.v === '{') ? new D.MathCurlyBrackets({ children: inner }) : new D.MathRoundBrackets({ children: inner }));\n continue;\n }\n const a = atom();\n if (!a) break;\n out.push(...withScripts([a]));\n }\n return flatten && out.length === 1 ? out : out;\n }\n\n try {\n const result = sequence(() => false);\n return i >= toks.length && result.length ? result : null;\n } catch (e) {\n if (e instanceof Unsupported) return null;\n throw e;\n }\n}\n","/** Draw SVG markup to PNG bytes in the browser (no network, no external references). Null where there is no canvas or the SVG has no size. */\nexport async function rasterizeSVG(svg: string, scale = 2, maxSide = 4000): Promise<{ data: Uint8Array; width: number; height: number } | null> {\n try {\n // real browsers have createImageBitmap; environments without a canvas (tests, servers) skip drawing\n if (typeof document === 'undefined' || typeof createImageBitmap !== 'function') return null;\n const parsed = new DOMParser().parseFromString(svg, 'image/svg+xml');\n const root = parsed.documentElement;\n if (!root || root.nodeName.toLowerCase() !== 'svg' || parsed.querySelector('parsererror')) return null;\n const vb = root.getAttribute('viewBox')?.trim().split(/[\\s,]+/).map(Number);\n const attr = (n: string) => { const v = parseFloat(root.getAttribute(n) ?? ''); return Number.isFinite(v) && !(root.getAttribute(n) ?? '').includes('%') ? v : NaN; };\n let w = vb && vb.length === 4 ? vb[2] : attr('width');\n let h = vb && vb.length === 4 ? vb[3] : attr('height');\n if (!(w > 0) || !(h > 0)) return null;\n const k = Math.min(scale, maxSide / w, maxSide / h);\n root.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n root.removeAttribute('style');\n const xml = new XMLSerializer().serializeToString(root);\n const url = URL.createObjectURL(new Blob([xml], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = new Image();\n await new Promise<void>((ok, fail) => { const t = setTimeout(() => fail(new Error('svg timeout')), 10000); img.onload = () => (clearTimeout(t), ok()); img.onerror = () => (clearTimeout(t), fail(new Error('svg'))); img.src = url; });\n const pw = Math.max(1, Math.round(w * k));\n const ph = Math.max(1, Math.round(h * k));\n const canvas = Object.assign(document.createElement('canvas'), { width: pw, height: ph });\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n ctx.fillStyle = '#fff'; // Word pages are white: a transparent background would show dark text on dark in some viewers\n ctx.fillRect(0, 0, pw, ph);\n ctx.drawImage(img, 0, 0, pw, ph);\n const blob = await new Promise<Blob | null>((r) => canvas.toBlob(r, 'image/png'));\n w = pw; h = ph;\n return blob ? { data: new Uint8Array(await blob.arrayBuffer()), width: w, height: h } : null;\n } finally {\n URL.revokeObjectURL(url);\n }\n } catch {\n return null;\n }\n}\n","/**\n * .docx import/export. Lives in its own entry point (`wysiwygido/docx`) so the `docx` and `mammoth`\n * libraries are only loaded by apps that need them.\n */\nimport * as D from 'docx';\nimport type { Mark, Node as PMNode } from 'prosemirror-model';\nimport { cropBytes, cropToString, type Crop } from './crop';\nimport { latexToDocx } from './latex-docx';\nimport { rasterizeSVG } from './svg-raster';\nimport { chartSVG, cleanChart } from './chart';\nimport { cleanSpec as cleanDataTable, formatCell as formatDataCell } from './data-table';\nimport type { Editor } from './editor';\nimport type { PageSettings } from './plugins/pages';\nimport type { CommentsPlugin, CommentThread } from './plugins/comments';\n\nexport interface ExportOptions {\n /** Include comments (defaults to the editor's Comments plugin store, if installed). */\n comments?: CommentThread[];\n /** Title in the document properties. */\n title?: string;\n /** Fetch remote images to embed them. Default true; failures fall back to the alt text. */\n fetchImages?: boolean;\n}\n\ninterface ImageData { data: Uint8Array; type: 'png' | 'jpg' | 'gif'; width: number; height: number }\n\nconst PX_TO_TWIP = 15;\nconst px = (n: number) => Math.round(n * PX_TO_TWIP);\nconst hex = (c: string) => c.replace('#', '').toUpperCase();\n\n/** Largest image (bytes) the exporter will embed or fetch, and the largest `.docx` the importer will open. */\nconst MAX_IMAGE_BYTES = 15 * 1024 * 1024;\nconst MAX_DOCX_BYTES = 50 * 1024 * 1024;\nconst MAX_DIMENSION = 20000;\n\n/** Read width/height and format from PNG, JPEG or GIF bytes. Null for unknown formats and for zero or absurd sizes. */\nexport function imageInfo(b: Uint8Array): { type: 'png' | 'jpg' | 'gif'; width: number; height: number } | null {\n const info = rawImageInfo(b);\n return info && info.width > 0 && info.height > 0 && info.width <= MAX_DIMENSION && info.height <= MAX_DIMENSION ? info : null;\n}\n\nfunction rawImageInfo(b: Uint8Array): { type: 'png' | 'jpg' | 'gif'; width: number; height: number } | null {\n if (b.length > 24 && b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) {\n const v = new DataView(b.buffer, b.byteOffset, b.byteLength);\n return { type: 'png', width: v.getUint32(16), height: v.getUint32(20) };\n }\n if (b.length > 10 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46) {\n return { type: 'gif', width: b[6] | (b[7] << 8), height: b[8] | (b[9] << 8) };\n }\n if (b.length > 4 && b[0] === 0xff && b[1] === 0xd8) {\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) { i++; continue; }\n const marker = b[i + 1];\n if (marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker)) {\n return { type: 'jpg', height: (b[i + 5] << 8) | b[i + 6], width: (b[i + 7] << 8) | b[i + 8] };\n }\n i += 2 + ((b[i + 2] << 8) | b[i + 3]);\n }\n }\n return null;\n}\n\n/** Read a response body, giving up (null) as soon as it exceeds `max` bytes, whatever Content-Length claimed. */\nasync function readCapped(res: Response, max: number): Promise<Uint8Array | null> {\n if (!res.body) {\n const buf = new Uint8Array(await res.arrayBuffer());\n return buf.length > max ? null : buf;\n }\n const reader = res.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.length;\n if (total > max) { await reader.cancel(); return null; }\n chunks.push(value);\n }\n const out = new Uint8Array(total);\n let at = 0;\n for (const c of chunks) { out.set(c, at); at += c.length; }\n return out;\n}\n\nasync function loadImage(src: string, fetchRemote: boolean): Promise<ImageData | null> {\n try {\n let bytes: Uint8Array;\n if (src.startsWith('data:')) {\n const comma = src.indexOf(',');\n if (comma < 0 || !/;base64$/i.test(src.slice(0, comma))) return null;\n if (src.length - comma > MAX_IMAGE_BYTES * 1.4) return null; // base64 is ~4/3 of the bytes\n const bin = atob(src.slice(comma + 1));\n bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));\n } else if (fetchRemote && /^https?:/i.test(src)) {\n const res = await fetch(src, { signal: AbortSignal.timeout(15000), credentials: 'omit', referrerPolicy: 'no-referrer' });\n if (!res.ok) return null;\n const declared = Number(res.headers.get('content-length'));\n if (declared > MAX_IMAGE_BYTES) return null;\n const body = await readCapped(res, MAX_IMAGE_BYTES);\n if (!body) return null;\n bytes = body;\n } else return null;\n const info = imageInfo(bytes);\n return info ? { data: bytes, ...info } : null;\n } catch {\n return null;\n }\n}\n\nconst imageKey = (attrs: { src: string; crop?: Crop | null }) => (attrs.crop ? `${attrs.src}|${cropToString(attrs.crop)}` : attrs.src);\n\nfunction collectImages(doc: PMNode): { key: string; src: string; crop: Crop | null }[] {\n const out = new Map<string, { key: string; src: string; crop: Crop | null }>();\n doc.descendants((n) => {\n if (n.type.name === 'cover_page') {\n const key = imageKey({ src: n.attrs.src });\n out.set(key, { key, src: n.attrs.src, crop: null });\n return;\n }\n if (n.type.name !== 'image') return;\n const key = imageKey(n.attrs as { src: string; crop?: Crop | null });\n out.set(key, { key, src: n.attrs.src, crop: n.attrs.crop ?? null });\n });\n return [...out.values()];\n}\n\ninterface Ctx {\n images: Map<string, ImageData | null>;\n /** Mermaid diagrams drawn to PNG, by source. */\n diagrams: Map<string, ImageData | null>;\n footnotes: Record<number, { children: D.Paragraph[] }>;\n numbering: D.ILevelsOptions[][];\n numberingRefs: string[];\n revision: number;\n author: string;\n commentIds: Map<string, number>;\n referenced: Set<string>;\n quote: number;\n /** Page size in px, for the cover picture. */\n pageSize: { w: number; h: number };\n}\n\nconst ALIGN: Record<string, (typeof D.AlignmentType)[keyof typeof D.AlignmentType]> = {\n left: D.AlignmentType.LEFT,\n center: D.AlignmentType.CENTER,\n right: D.AlignmentType.RIGHT,\n justify: D.AlignmentType.JUSTIFIED,\n};\n\ntype ListFormat = 'decimal' | 'lowerLetter' | 'upperLetter' | 'lowerRoman' | 'upperRoman' | 'bullet';\nconst FORMATS: Record<ListFormat, (typeof D.LevelFormat)[keyof typeof D.LevelFormat]> = { decimal: D.LevelFormat.DECIMAL, lowerLetter: D.LevelFormat.LOWER_LETTER, upperLetter: D.LevelFormat.UPPER_LETTER, lowerRoman: D.LevelFormat.LOWER_ROMAN, upperRoman: D.LevelFormat.UPPER_ROMAN, bullet: D.LevelFormat.BULLET };\nconst TYPE_FORMAT: Record<string, ListFormat> = { '1': 'decimal', a: 'lowerLetter', A: 'upperLetter', i: 'lowerRoman', I: 'upperRoman' };\n\nfunction levels(format: ListFormat, text?: string, start = 1): D.ILevelsOptions[] {\n return Array.from({ length: 9 }, (_, level) => ({\n level,\n format: FORMATS[format],\n start: format === 'bullet' ? undefined : start,\n text: format !== 'bullet' ? `%${level + 1}.` : text ?? (level % 2 ? '◦' : '•'),\n alignment: D.AlignmentType.START,\n style: { paragraph: { indent: { left: 720 * (level + 1), hanging: 360 } } },\n }));\n}\n\nfunction newNumbering(ctx: Ctx, format: ListFormat, text?: string, start = 1): string {\n const ref = `list-${ctx.numberingRefs.length}`;\n ctx.numberingRefs.push(ref);\n ctx.numbering.push(levels(format, text, start));\n return ref;\n}\n\nfunction runOptions(marks: readonly Mark[]) {\n const o: Record<string, unknown> = {};\n let link: string | null = null;\n let revision: 'insertion' | 'deletion' | null = null;\n for (const m of marks) {\n switch (m.type.name) {\n case 'bold': o.bold = true; break;\n case 'italic': o.italics = true; break;\n case 'underline': o.underline = {}; break;\n case 'strike': o.strike = true; break;\n case 'code': o.font = 'Courier New'; o.shading = { type: D.ShadingType.CLEAR, fill: 'F0F0F0', color: 'auto' }; break;\n case 'text_color': o.color = hex(m.attrs.color); break;\n case 'highlight': o.shading = { type: D.ShadingType.CLEAR, fill: hex(m.attrs.color), color: 'auto' }; break;\n case 'font_family': o.font = m.attrs.value; break;\n case 'font_size': o.size = Math.round(Number(m.attrs.value) * 1.5); break; // px -> half-points\n case 'link': link = m.attrs.href; o.color ??= '1D4ED8'; o.underline ??= {}; break;\n case 'insertion': revision = 'insertion'; break;\n case 'deletion': revision = 'deletion'; break;\n }\n }\n return { o, link, revision };\n}\n\nfunction footnoteText(ctx: Ctx, text: string): number {\n const id = Object.keys(ctx.footnotes).length + 1;\n ctx.footnotes[id] = { children: [new D.Paragraph({ children: [new D.TextRun(text)] })] };\n return id;\n}\n\nfunction inlineChildren(node: PMNode, ctx: Ctx): D.ParagraphChild[] {\n const out: D.ParagraphChild[] = [];\n // Comment ranges: open before the first run carrying a comment, close after the last one in this paragraph.\n const lastIndexOf = new Map<string, number>();\n node.forEach((child, _o, i) => child.marks.forEach((m) => m.type.name === 'comment' && lastIndexOf.set(m.attrs.id, i)));\n const open = new Set<string>();\n\n node.forEach((child, _offset, index) => {\n const ids = child.marks.filter((m) => m.type.name === 'comment').map((m) => m.attrs.id as string);\n for (const id of ids) {\n if (!open.has(id) && ctx.commentIds.has(id)) {\n open.add(id);\n out.push(new D.CommentRangeStart(ctx.commentIds.get(id)!));\n }\n }\n\n const { o, link, revision } = runOptions(child.marks);\n let run: D.ParagraphChild | null = null;\n if (child.isText) {\n const text = child.text!;\n if (revision === 'insertion') run = new D.InsertedTextRun({ id: ctx.revision++, author: ctx.author, date: new Date().toISOString(), text, ...o });\n else if (revision === 'deletion') run = new D.DeletedTextRun({ id: ctx.revision++, author: ctx.author, date: new Date().toISOString(), text, ...o });\n else run = new D.TextRun({ text, ...o });\n } else if (child.type.name === 'mention') {\n run = new D.TextRun({ text: `@${child.attrs.label}`, color: '1D4ED8', ...o });\n } else if (child.type.name === 'math_inline') {\n const eq = latexToDocx(child.attrs.tex); // a native Word equation; the LaTeX text when the formula is outside what we convert\n run = eq ? (new D.Math({ children: eq }) as unknown as D.ParagraphChild) : new D.TextRun({ text: child.attrs.tex, font: 'Cambria Math', italics: true, ...o });\n } else if (child.type.name === 'xref') {\n run = new D.TextRun({ text: String(child.attrs.text), ...o });\n } else if (child.type.name === 'form_field') {\n const a = child.attrs;\n run = new D.TextRun({ text: `${a.label ? `${a.label}: ` : ''}${a.kind === 'checkbox' ? (a.value === 'true' ? '☒' : '☐') : a.value || '________'}`, underline: a.kind === 'checkbox' ? undefined : {}, ...o });\n } else if (child.type.name === 'attachment') {\n run = new D.TextRun({ text: `[${child.attrs.name}]`, color: '1D4ED8', ...o });\n } else if (child.type.name === 'hard_break') {\n run = new D.TextRun({ break: 1 });\n } else if (child.type.name === 'footnote') {\n run = new D.FootnoteReferenceRun(footnoteText(ctx, child.attrs.text));\n } else if (child.type.name === 'image') {\n const img = ctx.images.get(imageKey(child.attrs as { src: string; crop?: Crop | null }));\n if (img) {\n const w = child.attrs.width ?? Math.min(img.width, 600);\n run = new D.ImageRun({\n type: img.type,\n data: img.data,\n transformation: { width: w, height: Math.max(1, Math.round((w * img.height) / img.width)) },\n altText: { name: 'image', title: child.attrs.alt ?? 'image', description: child.attrs.alt ?? '' },\n });\n } else run = new D.TextRun({ text: child.attrs.alt ? `[${child.attrs.alt}]` : '[image]', italics: true });\n }\n if (run) out.push(link ? new D.ExternalHyperlink({ link, children: [run as D.TextRun] }) : run);\n\n for (const id of ids) {\n if (open.has(id) && lastIndexOf.get(id) === index) {\n open.delete(id);\n const n = ctx.commentIds.get(id)!;\n out.push(new D.CommentRangeEnd(n));\n if (!ctx.referenced.has(id)) {\n ctx.referenced.add(id);\n out.push(new D.TextRun({ children: [new D.CommentReference(n)] }));\n }\n }\n }\n });\n return out;\n}\n\nfunction paragraphOptions(node: PMNode, ctx: Ctx) {\n const o: Record<string, unknown> = {};\n if (node.attrs.align && ALIGN[node.attrs.align]) o.alignment = ALIGN[node.attrs.align];\n if (node.attrs.lineHeight) o.spacing = { line: Math.round(Number(node.attrs.lineHeight) * 240), lineRule: D.LineRuleType.AUTO };\n if (ctx.quote) {\n o.indent = { left: 720 * ctx.quote };\n o.border = { left: { style: D.BorderStyle.SINGLE, size: 12, color: 'D4D4D4', space: 8 } };\n }\n return o;\n}\n\ntype Block = D.Paragraph | D.Table | D.TableOfContents;\n\nfunction listBlocks(list: PMNode, ctx: Ctx, depth: number): Block[] {\n const out: Block[] = [];\n const name = list.type.name;\n const ref = name === 'ordered_list' ? newNumbering(ctx, TYPE_FORMAT[list.attrs.type] ?? 'decimal', undefined, Math.max(1, Number(list.attrs.order) || 1)) : name === 'bullet_list' ? newNumbering(ctx, 'bullet') : null;\n list.forEach((item) => {\n let first = true;\n const taskRef = name === 'task_list' ? newNumbering(ctx, 'bullet', item.attrs.checked ? '☑' : '☐') : null;\n item.forEach((child) => {\n if (child.type.name === 'paragraph' && first) {\n out.push(new D.Paragraph({ children: inlineChildren(child, ctx), numbering: { reference: (ref ?? taskRef)!, level: depth }, ...paragraphOptions(child, ctx) }));\n } else if (/_list$/.test(child.type.name)) {\n out.push(...listBlocks(child, ctx, depth + 1));\n } else {\n out.push(...blocks(child, ctx).map((b) => b));\n }\n first = false;\n });\n });\n return out;\n}\n\nfunction tableBlock(table: PMNode, ctx: Ctx): D.Table {\n const rows: D.TableRow[] = [];\n table.forEach((row) => {\n const cells: D.TableCell[] = [];\n let header = true;\n row.forEach((cell) => {\n if (cell.type.name !== 'table_header') header = false;\n const children: Block[] = [];\n cell.forEach((c) => children.push(...blocks(c, ctx)));\n if (!children.length) children.push(new D.Paragraph(''));\n const bg = cell.attrs.background as string | null;\n cells.push(\n new D.TableCell({\n children: children as D.Paragraph[],\n columnSpan: cell.attrs.colspan > 1 ? cell.attrs.colspan : undefined,\n rowSpan: cell.attrs.rowspan > 1 ? cell.attrs.rowspan : undefined,\n shading: bg ? { type: D.ShadingType.CLEAR, fill: hex(bg), color: 'auto' } : undefined,\n }),\n );\n });\n rows.push(new D.TableRow({ children: cells, tableHeader: header }));\n });\n return new D.Table({ rows, width: { size: 100, type: D.WidthType.PERCENTAGE } });\n}\n\nfunction blocks(node: PMNode, ctx: Ctx): Block[] {\n switch (node.type.name) {\n case 'paragraph':\n return [new D.Paragraph({ children: inlineChildren(node, ctx), ...paragraphOptions(node, ctx) })];\n case 'heading':\n return [new D.Paragraph({ heading: D.HeadingLevel[`HEADING_${Math.min(6, node.attrs.level)}` as 'HEADING_1'], children: inlineChildren(node, ctx), ...paragraphOptions(node, ctx) })];\n case 'bullet_list':\n case 'ordered_list':\n case 'task_list':\n return listBlocks(node, ctx, 0);\n case 'locked_section':\n case 'editable_region': {\n // Locking is an editing concern; in Word the content is simply part of the document.\n const out: Block[] = [];\n node.forEach((c) => out.push(...blocks(c, ctx)));\n return out;\n }\n case 'blockquote': {\n ctx.quote++;\n const out: Block[] = [];\n node.forEach((c) => out.push(...blocks(c, ctx)));\n ctx.quote--;\n return out;\n }\n case 'code_block':\n return node.textContent.split('\\n').map((line) => new D.Paragraph({ children: [new D.TextRun({ text: line, font: 'Courier New', size: 20 })], shading: { type: D.ShadingType.CLEAR, fill: 'F0F0F0', color: 'auto' } }));\n case 'clip':\n return [new D.Paragraph({ children: [new D.TextRun({ text: `${node.attrs.kind === 'video' ? 'Screen' : 'Audio'} recording: `, color: '6B7280' }), ...(/^https?:/i.test(String(node.attrs.src)) ? [new D.ExternalHyperlink({ link: String(node.attrs.src), children: [new D.TextRun({ text: String(node.attrs.name || node.attrs.src), style: 'Hyperlink', color: '1D4ED8', underline: {} })] })] : [new D.TextRun({ text: String(node.attrs.name || '(embedded in the online document)') })])] })];\n case 'chart': {\n const png = ctx.diagrams.get(`chart:${node.attrs.spec}`);\n const spec = cleanChart(node.attrs.spec);\n if (png) {\n const w = Math.min(png.width / 2, 520);\n return [new D.Paragraph({ alignment: D.AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: [new D.ImageRun({ type: 'png', data: png.data, transformation: { width: w, height: Math.max(1, Math.round((w * png.height) / png.width)) }, altText: { name: 'chart', title: spec?.title || 'Chart', description: spec ? `${spec.type} chart: ${spec.labels.join(', ')}` : 'Chart' } })] })];\n }\n return spec ? [new D.Paragraph({ children: [new D.TextRun({ text: `Chart: ${spec.title || spec.type}`, italics: true, color: '6B7280' })] })] : [];\n }\n case 'column_break':\n return [new D.Paragraph({ children: [new D.ColumnBreak()] })];\n case 'columns': {\n const out: Block[] = [];\n node.forEach((c) => out.push(...blocks(c, ctx)));\n return out;\n }\n case 'caption': {\n const label = String(node.attrs.kind).replace(/^./, (c: string) => c.toUpperCase());\n return [new D.Paragraph({ spacing: { before: 60, after: 160 }, children: [new D.TextRun({ text: `${label} ${node.attrs.n}. `, bold: true, italics: true, size: 20 }), ...inlineChildren(node, ctx)] })];\n }\n case 'caption_list': {\n let items: { n: number; text: string }[] = [];\n try { items = JSON.parse(node.attrs.items); } catch { /* none */ }\n const label = String(node.attrs.kind).replace(/^./, (c: string) => c.toUpperCase());\n return [new D.Paragraph({ children: [new D.TextRun({ text: `List of ${label.toLowerCase()}s`, bold: true })] }), ...items.map((it) => new D.Paragraph({ children: [new D.TextRun({ text: `${label} ${it.n}. ${it.text}` })] }))];\n }\n case 'embed':\n return [new D.Paragraph({ children: [new D.TextRun({ text: 'Media: ', color: '6B7280' }), new D.ExternalHyperlink({ link: String(node.attrs.url), children: [new D.TextRun({ text: String(node.attrs.url), style: 'Hyperlink', color: '1D4ED8', underline: {} })] })] })];\n case 'math_block': {\n const eq = latexToDocx(node.attrs.tex);\n return [new D.Paragraph({ alignment: D.AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: eq ? [new D.Math({ children: eq }) as unknown as D.ParagraphChild] : [new D.TextRun({ text: node.attrs.tex, font: 'Cambria Math', italics: true })] })];\n }\n case 'mermaid_diagram': {\n const png = ctx.diagrams.get(node.attrs.code);\n if (png) {\n const w = Math.min(png.width / 2, 600); // drawn at 2x for sharpness\n return [new D.Paragraph({ alignment: D.AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: [new D.ImageRun({ type: 'png', data: png.data, transformation: { width: w, height: Math.max(1, Math.round((w * png.height) / png.width)) }, altText: { name: 'diagram', title: 'Diagram', description: String(node.attrs.code).slice(0, 200) } })] })];\n }\n // no canvas (or an invalid diagram): keep the source, clearly labelled\n return [\n new D.Paragraph({ children: [new D.TextRun({ text: 'Diagram (Mermaid source)', italics: true, color: '6B7280', size: 18 })] }),\n ...String(node.attrs.code).split('\\n').map((line) => new D.Paragraph({ children: [new D.TextRun({ text: line, font: 'Courier New', size: 20 })], shading: { type: D.ShadingType.CLEAR, fill: 'F0F0F0', color: 'auto' } })),\n ];\n }\n case 'horizontal_rule':\n return [new D.Paragraph({ border: { bottom: { style: D.BorderStyle.SINGLE, size: 6, color: '999999', space: 1 } } })];\n case 'cover_page': {\n const img = ctx.images.get(imageKey({ src: node.attrs.src }));\n const after = new D.Paragraph({ children: [new D.PageBreak()] });\n if (!img) return [after];\n // anchored to the page itself, so the picture runs edge to edge whatever the margins are\n const run = new D.ImageRun({\n type: img.type,\n data: img.data,\n transformation: { width: ctx.pageSize.w, height: ctx.pageSize.h },\n floating: { horizontalPosition: { relative: D.HorizontalPositionRelativeFrom.PAGE, offset: 0 }, verticalPosition: { relative: D.VerticalPositionRelativeFrom.PAGE, offset: 0 }, behindDocument: true, allowOverlap: true },\n altText: { name: 'cover', title: 'Cover', description: String(node.attrs.alt || 'Cover page') },\n });\n return [new D.Paragraph({ children: [run] }), after];\n }\n case 'page_break':\n return [new D.Paragraph({ children: [new D.PageBreak()] })];\n case 'toc':\n return [new D.TableOfContents('Table of Contents', { hyperlink: true, headingStyleRange: '1-4' })];\n case 'table':\n return [tableBlock(node, ctx), new D.Paragraph('')]; // Word needs a paragraph after a table\n case 'data_table': {\n // A data table is written as an ordinary Word table: the heading row (repeated on each page) and every row, in the shown columns.\n const spec = cleanDataTable(node.attrs.spec);\n if (!spec) return [];\n const cols = spec.columns.map((c, i) => ({ c, i })).filter(({ c }) => !c.hidden);\n const align = (c: (typeof cols)[number]['c']) => ((c.align ?? (c.type === 'number' || c.type === 'currency' ? 'right' : 'left')) === 'right' ? D.AlignmentType.RIGHT : c.align === 'center' ? D.AlignmentType.CENTER : D.AlignmentType.LEFT);\n const cell = (text: string, c: (typeof cols)[number]['c'], bold = false, fill?: string) => new D.TableCell({ shading: fill ? { type: D.ShadingType.CLEAR, fill, color: 'auto' } : undefined, children: [new D.Paragraph({ alignment: align(c), children: [new D.TextRun({ text, bold })] })] });\n const rows = [\n new D.TableRow({ tableHeader: true, children: cols.map(({ c }) => cell(c.title, c, true, 'E7ECF3')) }),\n ...spec.rows.map((r) => new D.TableRow({ children: cols.map(({ c, i }) => cell(formatDataCell(c, r[i]), c)) })),\n ];\n const out: Block[] = [];\n if (spec.options.title) out.push(new D.Paragraph({ spacing: { after: 60 }, children: [new D.TextRun({ text: spec.options.title, bold: true })] }));\n out.push(new D.Table({ rows, width: { size: 100, type: D.WidthType.PERCENTAGE } }), new D.Paragraph(''));\n return out;\n }\n default:\n return node.isTextblock ? [new D.Paragraph({ children: inlineChildren(node, ctx) })] : [];\n }\n}\n\nfunction headerFooterParagraph(template: string): D.Paragraph {\n const parts = template.split(/(\\{page\\}|\\{pages\\})/);\n const run: (string | (typeof D.PageNumber)[keyof typeof D.PageNumber])[] = parts\n .filter(Boolean)\n .map((p) => (p === '{page}' ? D.PageNumber.CURRENT : p === '{pages}' ? D.PageNumber.TOTAL_PAGES : p));\n return new D.Paragraph({ alignment: D.AlignmentType.CENTER, children: [new D.TextRun({ children: run, color: '9CA3AF', size: 18 })] });\n}\n\n/** Build a docx `Document` from the editor's content, page setup, footnotes, comments and tracked changes. */\nexport async function buildDocx(editor: Editor, options: ExportOptions = {}): Promise<D.Document> {\n const doc = editor.view.state.doc;\n const page = (editor.extensions.pageSettings as (() => PageSettings) | undefined)?.();\n const store = (editor.config.plugins.find((p) => p.name === 'comments') as CommentsPlugin | undefined)?.store;\n const threads = options.comments ?? store?.list() ?? [];\n const used = new Set<string>();\n doc.descendants((n) => void n.marks.forEach((m) => m.type.name === 'comment' && used.add(m.attrs.id)));\n const exported = threads.filter((t) => used.has(t.id));\n\n const images = new Map<string, ImageData | null>();\n await Promise.all(\n collectImages(doc).map(async ({ key, src, crop }) => {\n let img = await loadImage(src, options.fetchImages !== false);\n if (img && crop) {\n // Word needs the cropped pixels; render them with canvas. Without canvas the full image is exported.\n const cropped = await cropBytes(img.data, crop);\n if (cropped) img = { data: cropped.data, type: 'png', width: cropped.width, height: cropped.height };\n }\n images.set(key, img);\n }),\n );\n\n // Diagrams: render each Mermaid source to SVG with the editor's plugin, then to PNG (needs a browser canvas).\n const diagrams = new Map<string, ImageData | null>();\n const renderSVG = (editor.extensions.mermaid as { renderSVG?: (code: string, dark?: boolean) => Promise<string> } | undefined)?.renderSVG;\n const codes = new Set<string>();\n const codesCharts = new Set<string>();\n doc.descendants((n) => void (n.type.name === 'mermaid_diagram' && codes.add(n.attrs.code)));\n if (renderSVG) {\n await Promise.all([...codes].map(async (code) => {\n try {\n const png = await rasterizeSVG(await renderSVG(code, false));\n diagrams.set(code, png ? { data: png.data, type: 'png', width: png.width, height: png.height } : null);\n } catch {\n diagrams.set(code, null); // an invalid diagram: its source is written instead\n }\n }));\n }\n\n // Charts: the SVG is drawn from the data here, then rasterised like a diagram\n doc.descendants((n) => {\n if (n.type.name === 'chart') codesCharts.add(String(n.attrs.spec));\n });\n await Promise.all([...codesCharts].map(async (raw) => {\n const spec = cleanChart(raw);\n const png = spec ? await rasterizeSVG(chartSVG(spec)) : null;\n diagrams.set(`chart:${raw}`, png ? { data: png.data, type: 'png', width: png.width, height: png.height } : null);\n }));\n\n const ctx: Ctx = {\n images,\n diagrams,\n footnotes: {},\n numbering: [],\n numberingRefs: [],\n revision: 1,\n author: 'Author',\n commentIds: new Map(exported.map((t, i) => [t.id, i])),\n referenced: new Set(),\n quote: 0,\n pageSize: { w: page?.width ?? 794, h: page?.height ?? 1123 },\n };\n // Top-level `columns` blocks become their own continuous Word sections with the right column count; the text around them is single-column.\n type Segment = { count: number; gap: number; rule: boolean; children: Block[] };\n const segments: Segment[] = [];\n doc.forEach((n) => {\n if (n.type.name === 'columns') {\n const kids: Block[] = [];\n n.forEach((c) => kids.push(...blocks(c, ctx)));\n if (kids.length) segments.push({ count: Number(n.attrs.count) || 2, gap: Number(n.attrs.gap) || 28, rule: n.attrs.rule === 'solid', children: kids });\n return;\n }\n const last = segments[segments.length - 1];\n const out = blocks(n, ctx);\n if (last && last.count === 1) last.children.push(...out);\n else segments.push({ count: 1, gap: 0, rule: false, children: out });\n });\n if (!segments.some((s) => s.children.length)) segments.splice(0, segments.length, { count: 1, gap: 0, rule: false, children: [new D.Paragraph('')] });\n\n const w = page?.width ?? 794;\n const h = page?.height ?? 1123;\n const landscape = page?.orientation === 'landscape';\n const m = page?.margins ?? { top: 96, right: 96, bottom: 96, left: 96 };\n const headerTpl = page?.header ?? '';\n const footerTpl = page ? page.footer : '';\n\n return new D.Document({\n creator: 'wysiwygido',\n title: options.title,\n features: { updateFields: doc.content.content.some((n) => n.type.name === 'toc') },\n numbering: { config: ctx.numbering.map((lv, i) => ({ reference: ctx.numberingRefs[i], levels: lv })) },\n footnotes: ctx.footnotes,\n comments: {\n children: exported.map((t, i) => ({\n id: i,\n author: t.author,\n date: new Date(t.createdAt),\n children: [t.text, ...t.replies.map((r) => `${r.author}: ${r.text}`)].map((text) => new D.Paragraph(text)),\n })),\n },\n sections: segments.map((seg, i) => ({\n properties: {\n ...(i === 0 ? { titlePage: page?.differentFirstPage } : { type: D.SectionType.CONTINUOUS }),\n ...(seg.count > 1 ? { column: { count: seg.count, space: seg.gap * 15, separate: seg.rule, equalWidth: true } } : {}),\n page: {\n size: { width: px(Math.min(w, h)), height: px(Math.max(w, h)), orientation: landscape ? D.PageOrientation.LANDSCAPE : D.PageOrientation.PORTRAIT },\n margin: { top: px(m.top), right: px(m.right), bottom: px(m.bottom), left: px(m.left) },\n },\n },\n // headers and footers belong to the first section; later continuous sections carry on with them\n ...(i === 0\n ? {\n headers: {\n default: new D.Header({ children: [headerFooterParagraph(headerTpl)] }),\n ...(page?.differentFirstPage ? { first: new D.Header({ children: [headerFooterParagraph(page.firstHeader)] }) } : {}),\n },\n footers: {\n default: new D.Footer({ children: [headerFooterParagraph(footerTpl)] }),\n ...(page?.differentFirstPage ? { first: new D.Footer({ children: [headerFooterParagraph(page.firstFooter)] }) } : {}),\n },\n }\n : {}),\n children: (seg.children.length ? seg.children : [new D.Paragraph('')]) as D.Paragraph[],\n })),\n });\n}\n\n/** Export the document as a .docx `Blob`. */\nexport async function exportDocx(editor: Editor, options: ExportOptions = {}): Promise<Blob> {\n return D.Packer.toBlob(await buildDocx(editor, options));\n}\n\nfunction blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n if (typeof blob.arrayBuffer === 'function') return blob.arrayBuffer();\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(r.result as ArrayBuffer);\n r.onerror = () => reject(r.error);\n r.readAsArrayBuffer(blob);\n });\n}\n\n/** Replace the editor content with a .docx file's content (undoable). Returns mammoth's conversion warnings. */\nexport async function importDocx(editor: Editor, source: Blob | ArrayBuffer): Promise<string[]> {\n const mammoth = (await import('mammoth')).default ?? (await import('mammoth'));\n const size = source instanceof ArrayBuffer ? source.byteLength : source.size;\n if (size > MAX_DOCX_BYTES) throw new Error(`The .docx file is too large (${Math.round(size / 1048576)} MB; the limit is ${MAX_DOCX_BYTES / 1048576} MB).`);\n const arrayBuffer = source instanceof ArrayBuffer ? source : await blobToArrayBuffer(source);\n // mammoth's browser build reads `arrayBuffer`, its Node build reads `buffer`; pass what the runtime has.\n const input = { arrayBuffer, ...(typeof Buffer !== 'undefined' ? { buffer: Buffer.from(arrayBuffer) } : {}) };\n const result = await mammoth.convertToHtml(\n input as { arrayBuffer: ArrayBuffer },\n { styleMap: ['u => u', 'strike => s', \"p[style-name='Quote'] => blockquote:fresh\"] },\n );\n editor.replaceHTML(result.value);\n return result.messages.map((m: { message: string }) => m.message);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docx.js","names":["cleanDataTable","formatDataCell"],"sources":["../src/latex-docx.ts","../src/svg-raster.ts","../src/docx.ts"],"sourcesContent":["import * as D from 'docx';\n\n/** A node of Word's equation tree. */\nexport type MathNode = InstanceType<typeof D.MathRun> | InstanceType<typeof D.MathFraction> | InstanceType<typeof D.MathRadical> | InstanceType<typeof D.MathSuperScript> | InstanceType<typeof D.MathSubScript> | InstanceType<typeof D.MathSubSuperScript> | InstanceType<typeof D.MathSum> | InstanceType<typeof D.MathIntegral> | InstanceType<typeof D.MathRoundBrackets> | InstanceType<typeof D.MathSquareBrackets> | InstanceType<typeof D.MathCurlyBrackets> | InstanceType<typeof D.MathLimitLower>;\n\nconst SYMBOLS: Record<string, string> = {\n alpha: 'α', beta: 'β', gamma: 'γ', delta: 'δ', epsilon: 'ε', varepsilon: 'ε', zeta: 'ζ', eta: 'η', theta: 'θ', vartheta: 'ϑ', iota: 'ι', kappa: 'κ', lambda: 'λ', mu: 'μ', nu: 'ν', xi: 'ξ', pi: 'π', rho: 'ρ', sigma: 'σ', tau: 'τ', upsilon: 'υ', phi: 'φ', varphi: 'φ', chi: 'χ', psi: 'ψ', omega: 'ω',\n Gamma: 'Γ', Delta: 'Δ', Theta: 'Θ', Lambda: 'Λ', Xi: 'Ξ', Pi: 'Π', Sigma: 'Σ', Phi: 'Φ', Psi: 'Ψ', Omega: 'Ω',\n pm: '±', mp: '∓', times: '×', cdot: '·', div: '÷', le: '≤', leq: '≤', ge: '≥', geq: '≥', ne: '≠', neq: '≠', approx: '≈', equiv: '≡', sim: '∼', propto: '∝', infty: '∞', partial: '∂', nabla: '∇',\n to: '→', rightarrow: '→', leftarrow: '←', Rightarrow: '⇒', Leftarrow: '⇐', leftrightarrow: '↔', Leftrightarrow: '⇔', in: '∈', notin: '∉', subset: '⊂', subseteq: '⊆', cup: '∪', cap: '∩', forall: '∀', exists: '∃', emptyset: '∅', ldots: '…', cdots: '⋯', dots: '…', degree: '°',\n prime: '′', angle: '∠', perp: '⊥', parallel: '∥', neg: '¬', land: '∧', lor: '∨', circ: '∘', bullet: '•', star: '⋆', ',': ' ', ';': ' ', ':': ' ', '!': '', quad: ' ', qquad: ' ',\n};\nconst FUNCTIONS = new Set(['sin', 'cos', 'tan', 'cot', 'sec', 'csc', 'arcsin', 'arccos', 'arctan', 'sinh', 'cosh', 'tanh', 'log', 'ln', 'exp', 'det', 'max', 'min', 'gcd', 'lg', 'sup', 'inf', 'lim']);\nconst BLACKBOARD: Record<string, string> = { R: 'ℝ', N: 'ℕ', Z: 'ℤ', Q: 'ℚ', C: 'ℂ', P: 'ℙ' };\n\ntype Tok = { t: 'cmd' | 'ch' | '{' | '}' | '^' | '_' | '[' | ']'; v: string };\nclass Unsupported extends Error {}\n\nfunction tokenize(src: string): Tok[] {\n const out: Tok[] = [];\n for (let i = 0; i < src.length; i++) {\n const c = src[i];\n if (c === '\\\\') {\n const m = /^[A-Za-z]+/.exec(src.slice(i + 1));\n if (m) { out.push({ t: 'cmd', v: m[0] }); i += m[0].length; }\n else if (i + 1 < src.length) { out.push({ t: 'cmd', v: src[i + 1] }); i++; } // \\, \\; \\{ \\} \\\\\n } else if (c === '{' || c === '}' || c === '^' || c === '_' || c === '[' || c === ']') out.push({ t: c as Tok['t'], v: c });\n else if (!/\\s/.test(c)) out.push({ t: 'ch', v: c });\n }\n return out;\n}\n\n/**\n * Convert LaTeX to Word's native equation objects (fractions, roots, scripts, sums, integrals, limits, brackets, Greek letters\n * and common operators). Returns null when the formula uses something outside this subset (matrices, aligned environments,\n * custom macros), so the caller can fall back to the LaTeX text instead of writing a wrong equation.\n */\nexport function latexToDocx(tex: string): MathNode[] | null {\n let toks: Tok[];\n try { toks = tokenize(tex.slice(0, 5000)); } catch { return null; }\n let i = 0;\n let depth = 0; // nesting guard: a hostile formula must not overflow the stack\n const peek = () => toks[i];\n const run = (text: string) => new D.MathRun(text);\n\n const group = (): MathNode[] => {\n if (peek()?.t !== '{') { // a single token: x^2, \\frac12\n const a = atom();\n if (!a) throw new Unsupported(); // \"x^\" with nothing after it\n return [a];\n }\n i++;\n const out = sequence((t) => t.t === '}');\n if (peek()?.t !== '}') throw new Unsupported();\n i++;\n return out;\n };\n const optional = (): MathNode[] | null => {\n if (peek()?.t !== '[') return null;\n i++;\n const out = sequence((t) => t.t === ']');\n if (peek()?.t !== ']') throw new Unsupported();\n i++;\n return out;\n };\n const text = (): string => { // \\text{...}: raw characters up to the closing brace\n if (peek()?.t !== '{') throw new Unsupported();\n i++;\n let s = '';\n while (peek() && peek().t !== '}') { const t = toks[i++]; s += t.t === 'cmd' ? (SYMBOLS[t.v] ?? ` ${t.v}`) : t.v; }\n if (peek()?.t !== '}') throw new Unsupported();\n i++;\n return s;\n };\n\n /** One atom plus any ^ _ that follow it. */\n const withScripts = (base: MathNode[]): MathNode[] => {\n let sub: MathNode[] | null = null;\n let sup: MathNode[] | null = null;\n for (let n = 0; n < 2 && (peek()?.t === '^' || peek()?.t === '_'); n++) {\n const which = toks[i++].t;\n const arg = group();\n if (which === '^') sup = arg; else sub = arg;\n }\n if (sub && sup) return [new D.MathSubSuperScript({ children: base, subScript: sub, superScript: sup })];\n if (sup) return [new D.MathSuperScript({ children: base, superScript: sup })];\n if (sub) return [new D.MathSubScript({ children: base, subScript: sub })];\n return base;\n };\n\n const atom = (): MathNode | null => {\n if (++depth > 60) throw new Unsupported();\n try { return atomInner(); } finally { depth--; }\n };\n const atomInner = (): MathNode | null => {\n const t = toks[i];\n if (!t) return null;\n if (t.t === '{') return (i++, wrap(sequence((x) => x.t === '}', true)));\n if (t.t === 'ch') { i++; return run(t.v); }\n if (t.t === 'cmd') {\n i++;\n const c = t.v;\n if (c === 'frac' || c === 'dfrac' || c === 'tfrac') { const n = group(); const d = group(); return new D.MathFraction({ numerator: n, denominator: d }); }\n if (c === 'sqrt') { const deg = optional(); const body = group(); return new D.MathRadical(deg ? { children: body, degree: deg } : { children: body }); }\n if (c === 'text' || c === 'mathrm' || c === 'operatorname') return run(text());\n if (c === 'mathbb') { const s = text(); return run([...s].map((ch) => BLACKBOARD[ch] ?? ch).join('')); }\n if (c === 'left' || c === 'right') throw new Unsupported(); // handled in sequence()\n if (SYMBOLS[c] !== undefined) return run(SYMBOLS[c]);\n if (FUNCTIONS.has(c)) return run(c);\n if (['{', '}', '#', '%', '&', '$', '_'].includes(c)) return run(c);\n throw new Unsupported(); // \\begin, \\matrix, macros ...\n }\n throw new Unsupported(); // a stray ^ _ ] }\n };\n const wrap = (nodes: MathNode[]): MathNode => (nodes.length === 1 ? nodes[0] : new D.MathRoundBrackets({ children: nodes })); // only used for {…} used as one atom\n\n /** Words after \\sum / \\int / \\lim limits: the operand is the next atom with its scripts. */\n const operand = (): MathNode[] => {\n const a = atom();\n return a ? withScripts([a]) : [];\n };\n\n function sequence(stop: (t: Tok) => boolean, flatten = false): MathNode[] {\n if (++depth > 60) throw new Unsupported();\n try { return sequenceInner(stop, flatten); } finally { depth--; }\n }\n function sequenceInner(stop: (t: Tok) => boolean, flatten: boolean): MathNode[] {\n const out: MathNode[] = [];\n while (peek() && !stop(peek())) {\n const t = peek();\n if (t.t === 'cmd' && (t.v === 'sum' || t.v === 'int' || t.v === 'prod' || t.v === 'lim' || t.v === 'limits')) {\n i++;\n if (t.v === 'limits') continue;\n let sub: MathNode[] | undefined;\n let sup: MathNode[] | undefined;\n for (let n = 0; n < 2 && (peek()?.t === '^' || peek()?.t === '_'); n++) { const w = toks[i++].t; const g = group(); if (w === '^') sup = g; else sub = g; }\n if (t.v === 'lim') { out.push(new D.MathLimitLower({ children: [run('lim')], limit: sub ?? [] })); continue; }\n const body = operand();\n if (t.v === 'int') out.push(new D.MathIntegral({ children: body, subScript: sub, superScript: sup }));\n else out.push(new D.MathSum({ children: body, subScript: sub, superScript: sup })); // \\prod is written as a sum sign when Word lacks a product class\n continue;\n }\n if (t.t === 'cmd' && t.v === 'left') {\n i++;\n const open = toks[i++];\n const inner = sequence((x) => x.t === 'cmd' && x.v === 'right');\n i++; // \\right\n const close = toks[i++];\n if (!open || !close) throw new Unsupported();\n const o = open.v;\n out.push(o === '[' ? new D.MathSquareBrackets({ children: inner }) : o === '{' || (open.t === 'cmd' && open.v === '{') ? new D.MathCurlyBrackets({ children: inner }) : new D.MathRoundBrackets({ children: inner }));\n continue;\n }\n const a = atom();\n if (!a) break;\n out.push(...withScripts([a]));\n }\n return flatten && out.length === 1 ? out : out;\n }\n\n try {\n const result = sequence(() => false);\n return i >= toks.length && result.length ? result : null;\n } catch (e) {\n if (e instanceof Unsupported) return null;\n throw e;\n }\n}\n","/** Draw SVG markup to PNG bytes in the browser (no network, no external references). Null where there is no canvas or the SVG has no size. */\nexport async function rasterizeSVG(svg: string, scale = 2, maxSide = 4000): Promise<{ data: Uint8Array; width: number; height: number } | null> {\n try {\n // real browsers have createImageBitmap; environments without a canvas (tests, servers) skip drawing\n if (typeof document === 'undefined' || typeof createImageBitmap !== 'function') return null;\n const parsed = new DOMParser().parseFromString(svg, 'image/svg+xml');\n const root = parsed.documentElement;\n if (!root || root.nodeName.toLowerCase() !== 'svg' || parsed.querySelector('parsererror')) return null;\n const vb = root.getAttribute('viewBox')?.trim().split(/[\\s,]+/).map(Number);\n const attr = (n: string) => { const v = parseFloat(root.getAttribute(n) ?? ''); return Number.isFinite(v) && !(root.getAttribute(n) ?? '').includes('%') ? v : NaN; };\n let w = vb && vb.length === 4 ? vb[2] : attr('width');\n let h = vb && vb.length === 4 ? vb[3] : attr('height');\n if (!(w > 0) || !(h > 0)) return null;\n const k = Math.min(scale, maxSide / w, maxSide / h);\n root.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n root.removeAttribute('style');\n const xml = new XMLSerializer().serializeToString(root);\n const url = URL.createObjectURL(new Blob([xml], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = new Image();\n await new Promise<void>((ok, fail) => { const t = setTimeout(() => fail(new Error('svg timeout')), 10000); img.onload = () => (clearTimeout(t), ok()); img.onerror = () => (clearTimeout(t), fail(new Error('svg'))); img.src = url; });\n const pw = Math.max(1, Math.round(w * k));\n const ph = Math.max(1, Math.round(h * k));\n const canvas = Object.assign(document.createElement('canvas'), { width: pw, height: ph });\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n ctx.fillStyle = '#fff'; // Word pages are white: a transparent background would show dark text on dark in some viewers\n ctx.fillRect(0, 0, pw, ph);\n ctx.drawImage(img, 0, 0, pw, ph);\n const blob = await new Promise<Blob | null>((r) => canvas.toBlob(r, 'image/png'));\n w = pw; h = ph;\n return blob ? { data: new Uint8Array(await blob.arrayBuffer()), width: w, height: h } : null;\n } finally {\n URL.revokeObjectURL(url);\n }\n } catch {\n return null;\n }\n}\n","/**\n * .docx import/export. Lives in its own entry point (`wysiwygido/docx`) so the `docx` and `mammoth`\n * libraries are only loaded by apps that need them.\n */\nimport * as D from 'docx';\nimport type { Mark, Node as PMNode } from 'prosemirror-model';\nimport { cropBytes, cropToString, type Crop } from './crop';\nimport { latexToDocx } from './latex-docx';\nimport { rasterizeSVG } from './svg-raster';\nimport { chartSVG, cleanChart } from './chart';\nimport { cleanSpec as cleanDataTable, formatCell as formatDataCell } from './data-table';\nimport type { Editor } from './editor';\nimport type { PageSettings } from './plugins/pages';\nimport type { CommentsPlugin, CommentThread } from './plugins/comments';\n\nexport interface ExportOptions {\n /** Include comments (defaults to the editor's Comments plugin store, if installed). */\n comments?: CommentThread[];\n /** Title in the document properties. */\n title?: string;\n /** Fetch remote images to embed them. Default true; failures fall back to the alt text. */\n fetchImages?: boolean;\n}\n\ninterface ImageData { data: Uint8Array; type: 'png' | 'jpg' | 'gif'; width: number; height: number }\n\nconst PX_TO_TWIP = 15;\nconst px = (n: number) => Math.round(n * PX_TO_TWIP);\nconst hex = (c: string) => c.replace('#', '').toUpperCase();\n\n/** Largest image (bytes) the exporter will embed or fetch, and the largest `.docx` the importer will open. */\nconst MAX_IMAGE_BYTES = 15 * 1024 * 1024;\nconst MAX_DOCX_BYTES = 50 * 1024 * 1024;\nconst MAX_DIMENSION = 20000;\n\n/** Read width/height and format from PNG, JPEG or GIF bytes. Null for unknown formats and for zero or absurd sizes. */\nexport function imageInfo(b: Uint8Array): { type: 'png' | 'jpg' | 'gif'; width: number; height: number } | null {\n const info = rawImageInfo(b);\n return info && info.width > 0 && info.height > 0 && info.width <= MAX_DIMENSION && info.height <= MAX_DIMENSION ? info : null;\n}\n\nfunction rawImageInfo(b: Uint8Array): { type: 'png' | 'jpg' | 'gif'; width: number; height: number } | null {\n if (b.length > 24 && b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) {\n const v = new DataView(b.buffer, b.byteOffset, b.byteLength);\n return { type: 'png', width: v.getUint32(16), height: v.getUint32(20) };\n }\n if (b.length > 10 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46) {\n return { type: 'gif', width: b[6] | (b[7] << 8), height: b[8] | (b[9] << 8) };\n }\n if (b.length > 4 && b[0] === 0xff && b[1] === 0xd8) {\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) { i++; continue; }\n const marker = b[i + 1];\n if (marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker)) {\n return { type: 'jpg', height: (b[i + 5] << 8) | b[i + 6], width: (b[i + 7] << 8) | b[i + 8] };\n }\n i += 2 + ((b[i + 2] << 8) | b[i + 3]);\n }\n }\n return null;\n}\n\n/** Read a response body, giving up (null) as soon as it exceeds `max` bytes, whatever Content-Length claimed. */\nasync function readCapped(res: Response, max: number): Promise<Uint8Array | null> {\n if (!res.body) {\n const buf = new Uint8Array(await res.arrayBuffer());\n return buf.length > max ? null : buf;\n }\n const reader = res.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.length;\n if (total > max) { await reader.cancel(); return null; }\n chunks.push(value);\n }\n const out = new Uint8Array(total);\n let at = 0;\n for (const c of chunks) { out.set(c, at); at += c.length; }\n return out;\n}\n\nasync function loadImage(src: string, fetchRemote: boolean): Promise<ImageData | null> {\n try {\n let bytes: Uint8Array;\n if (src.startsWith('data:')) {\n const comma = src.indexOf(',');\n if (comma < 0 || !/;base64$/i.test(src.slice(0, comma))) return null;\n if (src.length - comma > MAX_IMAGE_BYTES * 1.4) return null; // base64 is ~4/3 of the bytes\n const bin = atob(src.slice(comma + 1));\n bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));\n } else if (fetchRemote && /^https?:/i.test(src)) {\n const res = await fetch(src, { signal: AbortSignal.timeout(15000), credentials: 'omit', referrerPolicy: 'no-referrer' });\n if (!res.ok) return null;\n const declared = Number(res.headers.get('content-length'));\n if (declared > MAX_IMAGE_BYTES) return null;\n const body = await readCapped(res, MAX_IMAGE_BYTES);\n if (!body) return null;\n bytes = body;\n } else return null;\n const info = imageInfo(bytes);\n return info ? { data: bytes, ...info } : null;\n } catch {\n return null;\n }\n}\n\nconst imageKey = (attrs: { src: string; crop?: Crop | null }) => (attrs.crop ? `${attrs.src}|${cropToString(attrs.crop)}` : attrs.src);\n\nfunction collectImages(doc: PMNode): { key: string; src: string; crop: Crop | null }[] {\n const out = new Map<string, { key: string; src: string; crop: Crop | null }>();\n doc.descendants((n) => {\n if (n.type.name === 'cover_page') {\n const key = imageKey({ src: n.attrs.src });\n out.set(key, { key, src: n.attrs.src, crop: null });\n return;\n }\n if (n.type.name !== 'image') return;\n const key = imageKey(n.attrs as { src: string; crop?: Crop | null });\n out.set(key, { key, src: n.attrs.src, crop: n.attrs.crop ?? null });\n });\n return [...out.values()];\n}\n\ninterface Ctx {\n images: Map<string, ImageData | null>;\n /** Mermaid diagrams drawn to PNG, by source. */\n diagrams: Map<string, ImageData | null>;\n footnotes: Record<number, { children: D.Paragraph[] }>;\n numbering: D.ILevelsOptions[][];\n numberingRefs: string[];\n revision: number;\n author: string;\n commentIds: Map<string, number>;\n referenced: Set<string>;\n quote: number;\n /** Page size in px, for the cover picture. */\n pageSize: { w: number; h: number };\n}\n\nconst ALIGN: Record<string, (typeof D.AlignmentType)[keyof typeof D.AlignmentType]> = {\n left: D.AlignmentType.LEFT,\n center: D.AlignmentType.CENTER,\n right: D.AlignmentType.RIGHT,\n justify: D.AlignmentType.JUSTIFIED,\n};\n\ntype ListFormat = 'decimal' | 'lowerLetter' | 'upperLetter' | 'lowerRoman' | 'upperRoman' | 'bullet';\nconst FORMATS: Record<ListFormat, (typeof D.LevelFormat)[keyof typeof D.LevelFormat]> = { decimal: D.LevelFormat.DECIMAL, lowerLetter: D.LevelFormat.LOWER_LETTER, upperLetter: D.LevelFormat.UPPER_LETTER, lowerRoman: D.LevelFormat.LOWER_ROMAN, upperRoman: D.LevelFormat.UPPER_ROMAN, bullet: D.LevelFormat.BULLET };\nconst TYPE_FORMAT: Record<string, ListFormat> = { '1': 'decimal', a: 'lowerLetter', A: 'upperLetter', i: 'lowerRoman', I: 'upperRoman' };\n\nfunction levels(format: ListFormat, text?: string, start = 1): D.ILevelsOptions[] {\n return Array.from({ length: 9 }, (_, level) => ({\n level,\n format: FORMATS[format],\n start: format === 'bullet' ? undefined : start,\n text: format !== 'bullet' ? `%${level + 1}.` : text ?? (level % 2 ? '◦' : '•'),\n alignment: D.AlignmentType.START,\n style: { paragraph: { indent: { left: 720 * (level + 1), hanging: 360 } } },\n }));\n}\n\nfunction newNumbering(ctx: Ctx, format: ListFormat, text?: string, start = 1): string {\n const ref = `list-${ctx.numberingRefs.length}`;\n ctx.numberingRefs.push(ref);\n ctx.numbering.push(levels(format, text, start));\n return ref;\n}\n\nfunction runOptions(marks: readonly Mark[]) {\n const o: Record<string, unknown> = {};\n let link: string | null = null;\n let revision: 'insertion' | 'deletion' | null = null;\n for (const m of marks) {\n switch (m.type.name) {\n case 'bold': o.bold = true; break;\n case 'italic': o.italics = true; break;\n case 'underline': o.underline = {}; break;\n case 'strike': o.strike = true; break;\n case 'code': o.font = 'Courier New'; o.shading = { type: D.ShadingType.CLEAR, fill: 'F0F0F0', color: 'auto' }; break;\n case 'text_color': o.color = hex(m.attrs.color); break;\n case 'highlight': o.shading = { type: D.ShadingType.CLEAR, fill: hex(m.attrs.color), color: 'auto' }; break;\n case 'font_family': o.font = m.attrs.value; break;\n case 'font_size': o.size = Math.round(Number(m.attrs.value) * 1.5); break; // px -> half-points\n case 'link': link = m.attrs.href; o.color ??= '1D4ED8'; o.underline ??= {}; break;\n case 'insertion': revision = 'insertion'; break;\n case 'deletion': revision = 'deletion'; break;\n }\n }\n return { o, link, revision };\n}\n\nfunction footnoteText(ctx: Ctx, text: string): number {\n const id = Object.keys(ctx.footnotes).length + 1;\n ctx.footnotes[id] = { children: [new D.Paragraph({ children: [new D.TextRun(text)] })] };\n return id;\n}\n\nfunction inlineChildren(node: PMNode, ctx: Ctx): D.ParagraphChild[] {\n const out: D.ParagraphChild[] = [];\n // Comment ranges: open before the first run carrying a comment, close after the last one in this paragraph.\n const lastIndexOf = new Map<string, number>();\n node.forEach((child, _o, i) => child.marks.forEach((m) => m.type.name === 'comment' && lastIndexOf.set(m.attrs.id, i)));\n const open = new Set<string>();\n\n node.forEach((child, _offset, index) => {\n const ids = child.marks.filter((m) => m.type.name === 'comment').map((m) => m.attrs.id as string);\n for (const id of ids) {\n if (!open.has(id) && ctx.commentIds.has(id)) {\n open.add(id);\n out.push(new D.CommentRangeStart(ctx.commentIds.get(id)!));\n }\n }\n\n const { o, link, revision } = runOptions(child.marks);\n let run: D.ParagraphChild | null = null;\n if (child.isText) {\n const text = child.text!;\n if (revision === 'insertion') run = new D.InsertedTextRun({ id: ctx.revision++, author: ctx.author, date: new Date().toISOString(), text, ...o });\n else if (revision === 'deletion') run = new D.DeletedTextRun({ id: ctx.revision++, author: ctx.author, date: new Date().toISOString(), text, ...o });\n else run = new D.TextRun({ text, ...o });\n } else if (child.type.name === 'mention') {\n run = new D.TextRun({ text: `@${child.attrs.label}`, color: '1D4ED8', ...o });\n } else if (child.type.name === 'math_inline') {\n const eq = latexToDocx(child.attrs.tex); // a native Word equation; the LaTeX text when the formula is outside what we convert\n run = eq ? (new D.Math({ children: eq }) as unknown as D.ParagraphChild) : new D.TextRun({ text: child.attrs.tex, font: 'Cambria Math', italics: true, ...o });\n } else if (child.type.name === 'xref') {\n run = new D.TextRun({ text: String(child.attrs.text), ...o });\n } else if (child.type.name === 'form_field') {\n const a = child.attrs;\n run = new D.TextRun({ text: `${a.label ? `${a.label}: ` : ''}${a.kind === 'checkbox' ? (a.value === 'true' ? '☒' : '☐') : a.value || '________'}`, underline: a.kind === 'checkbox' ? undefined : {}, ...o });\n } else if (child.type.name === 'attachment') {\n run = new D.TextRun({ text: `[${child.attrs.name}]`, color: '1D4ED8', ...o });\n } else if (child.type.name === 'hard_break') {\n run = new D.TextRun({ break: 1 });\n } else if (child.type.name === 'footnote') {\n run = new D.FootnoteReferenceRun(footnoteText(ctx, child.attrs.text));\n } else if (child.type.name === 'image') {\n const img = ctx.images.get(imageKey(child.attrs as { src: string; crop?: Crop | null }));\n if (img) {\n const w = child.attrs.width ?? Math.min(img.width, 600);\n run = new D.ImageRun({\n type: img.type,\n data: img.data,\n transformation: { width: w, height: Math.max(1, Math.round((w * img.height) / img.width)) },\n altText: { name: 'image', title: child.attrs.alt ?? 'image', description: child.attrs.alt ?? '' },\n });\n } else run = new D.TextRun({ text: child.attrs.alt ? `[${child.attrs.alt}]` : '[image]', italics: true });\n }\n if (run) out.push(link ? new D.ExternalHyperlink({ link, children: [run as D.TextRun] }) : run);\n\n for (const id of ids) {\n if (open.has(id) && lastIndexOf.get(id) === index) {\n open.delete(id);\n const n = ctx.commentIds.get(id)!;\n out.push(new D.CommentRangeEnd(n));\n if (!ctx.referenced.has(id)) {\n ctx.referenced.add(id);\n out.push(new D.TextRun({ children: [new D.CommentReference(n)] }));\n }\n }\n }\n });\n return out;\n}\n\nfunction paragraphOptions(node: PMNode, ctx: Ctx) {\n const o: Record<string, unknown> = {};\n if (node.attrs.align && ALIGN[node.attrs.align]) o.alignment = ALIGN[node.attrs.align];\n if (node.attrs.lineHeight) o.spacing = { line: Math.round(Number(node.attrs.lineHeight) * 240), lineRule: D.LineRuleType.AUTO };\n if (ctx.quote) {\n o.indent = { left: 720 * ctx.quote };\n o.border = { left: { style: D.BorderStyle.SINGLE, size: 12, color: 'D4D4D4', space: 8 } };\n }\n return o;\n}\n\ntype Block = D.Paragraph | D.Table | D.TableOfContents;\n\nfunction listBlocks(list: PMNode, ctx: Ctx, depth: number): Block[] {\n const out: Block[] = [];\n const name = list.type.name;\n const ref = name === 'ordered_list' ? newNumbering(ctx, TYPE_FORMAT[list.attrs.type] ?? 'decimal', undefined, Math.max(1, Number(list.attrs.order) || 1)) : name === 'bullet_list' ? newNumbering(ctx, 'bullet') : null;\n list.forEach((item) => {\n let first = true;\n const taskRef = name === 'task_list' ? newNumbering(ctx, 'bullet', item.attrs.checked ? '☑' : '☐') : null;\n item.forEach((child) => {\n if ((child.type.name === 'paragraph' || child.type.name === 'heading') && first) {\n // a heading in a list keeps its Word heading style and gets the bullet or number (numbered headings)\n const heading = child.type.name === 'heading' ? { heading: D.HeadingLevel[`HEADING_${Math.min(6, child.attrs.level)}` as 'HEADING_1'] } : {};\n out.push(new D.Paragraph({ ...heading, children: inlineChildren(child, ctx), numbering: { reference: (ref ?? taskRef)!, level: depth }, ...paragraphOptions(child, ctx) }));\n } else if (/_list$/.test(child.type.name)) {\n out.push(...listBlocks(child, ctx, depth + 1));\n } else {\n out.push(...blocks(child, ctx).map((b) => b));\n }\n first = false;\n });\n });\n return out;\n}\n\nfunction tableBlock(table: PMNode, ctx: Ctx): D.Table {\n const rows: D.TableRow[] = [];\n table.forEach((row) => {\n const cells: D.TableCell[] = [];\n let header = true;\n row.forEach((cell) => {\n if (cell.type.name !== 'table_header') header = false;\n const children: Block[] = [];\n cell.forEach((c) => children.push(...blocks(c, ctx)));\n if (!children.length) children.push(new D.Paragraph(''));\n const bg = cell.attrs.background as string | null;\n cells.push(\n new D.TableCell({\n children: children as D.Paragraph[],\n columnSpan: cell.attrs.colspan > 1 ? cell.attrs.colspan : undefined,\n rowSpan: cell.attrs.rowspan > 1 ? cell.attrs.rowspan : undefined,\n shading: bg ? { type: D.ShadingType.CLEAR, fill: hex(bg), color: 'auto' } : undefined,\n }),\n );\n });\n rows.push(new D.TableRow({ children: cells, tableHeader: header }));\n });\n return new D.Table({ rows, width: { size: 100, type: D.WidthType.PERCENTAGE } });\n}\n\nfunction blocks(node: PMNode, ctx: Ctx): Block[] {\n switch (node.type.name) {\n case 'paragraph':\n return [new D.Paragraph({ children: inlineChildren(node, ctx), ...paragraphOptions(node, ctx) })];\n case 'heading':\n return [new D.Paragraph({ heading: D.HeadingLevel[`HEADING_${Math.min(6, node.attrs.level)}` as 'HEADING_1'], children: inlineChildren(node, ctx), ...paragraphOptions(node, ctx) })];\n case 'bullet_list':\n case 'ordered_list':\n case 'task_list':\n return listBlocks(node, ctx, 0);\n case 'locked_section':\n case 'editable_region': {\n // Locking is an editing concern; in Word the content is simply part of the document.\n const out: Block[] = [];\n node.forEach((c) => out.push(...blocks(c, ctx)));\n return out;\n }\n case 'blockquote': {\n ctx.quote++;\n const out: Block[] = [];\n node.forEach((c) => out.push(...blocks(c, ctx)));\n ctx.quote--;\n return out;\n }\n case 'code_block':\n return node.textContent.split('\\n').map((line) => new D.Paragraph({ children: [new D.TextRun({ text: line, font: 'Courier New', size: 20 })], shading: { type: D.ShadingType.CLEAR, fill: 'F0F0F0', color: 'auto' } }));\n case 'clip':\n return [new D.Paragraph({ children: [new D.TextRun({ text: `${node.attrs.kind === 'video' ? 'Screen' : 'Audio'} recording: `, color: '6B7280' }), ...(/^https?:/i.test(String(node.attrs.src)) ? [new D.ExternalHyperlink({ link: String(node.attrs.src), children: [new D.TextRun({ text: String(node.attrs.name || node.attrs.src), style: 'Hyperlink', color: '1D4ED8', underline: {} })] })] : [new D.TextRun({ text: String(node.attrs.name || '(embedded in the online document)') })])] })];\n case 'chart': {\n const png = ctx.diagrams.get(`chart:${node.attrs.spec}`);\n const spec = cleanChart(node.attrs.spec);\n if (png) {\n const w = Math.min(png.width / 2, 520);\n return [new D.Paragraph({ alignment: D.AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: [new D.ImageRun({ type: 'png', data: png.data, transformation: { width: w, height: Math.max(1, Math.round((w * png.height) / png.width)) }, altText: { name: 'chart', title: spec?.title || 'Chart', description: spec ? `${spec.type} chart: ${spec.labels.join(', ')}` : 'Chart' } })] })];\n }\n return spec ? [new D.Paragraph({ children: [new D.TextRun({ text: `Chart: ${spec.title || spec.type}`, italics: true, color: '6B7280' })] })] : [];\n }\n case 'column_break':\n return [new D.Paragraph({ children: [new D.ColumnBreak()] })];\n case 'columns': {\n const out: Block[] = [];\n node.forEach((c) => out.push(...blocks(c, ctx)));\n return out;\n }\n case 'caption': {\n const label = String(node.attrs.kind).replace(/^./, (c: string) => c.toUpperCase());\n return [new D.Paragraph({ spacing: { before: 60, after: 160 }, children: [new D.TextRun({ text: `${label} ${node.attrs.n}. `, bold: true, italics: true, size: 20 }), ...inlineChildren(node, ctx)] })];\n }\n case 'caption_list': {\n let items: { n: number; text: string }[] = [];\n try { items = JSON.parse(node.attrs.items); } catch { /* none */ }\n const label = String(node.attrs.kind).replace(/^./, (c: string) => c.toUpperCase());\n return [new D.Paragraph({ children: [new D.TextRun({ text: `List of ${label.toLowerCase()}s`, bold: true })] }), ...items.map((it) => new D.Paragraph({ children: [new D.TextRun({ text: `${label} ${it.n}. ${it.text}` })] }))];\n }\n case 'embed':\n return [new D.Paragraph({ children: [new D.TextRun({ text: 'Media: ', color: '6B7280' }), new D.ExternalHyperlink({ link: String(node.attrs.url), children: [new D.TextRun({ text: String(node.attrs.url), style: 'Hyperlink', color: '1D4ED8', underline: {} })] })] })];\n case 'math_block': {\n const eq = latexToDocx(node.attrs.tex);\n return [new D.Paragraph({ alignment: D.AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: eq ? [new D.Math({ children: eq }) as unknown as D.ParagraphChild] : [new D.TextRun({ text: node.attrs.tex, font: 'Cambria Math', italics: true })] })];\n }\n case 'mermaid_diagram': {\n const png = ctx.diagrams.get(node.attrs.code);\n if (png) {\n const w = Math.min(png.width / 2, 600); // drawn at 2x for sharpness\n return [new D.Paragraph({ alignment: D.AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: [new D.ImageRun({ type: 'png', data: png.data, transformation: { width: w, height: Math.max(1, Math.round((w * png.height) / png.width)) }, altText: { name: 'diagram', title: 'Diagram', description: String(node.attrs.code).slice(0, 200) } })] })];\n }\n // no canvas (or an invalid diagram): keep the source, clearly labelled\n return [\n new D.Paragraph({ children: [new D.TextRun({ text: 'Diagram (Mermaid source)', italics: true, color: '6B7280', size: 18 })] }),\n ...String(node.attrs.code).split('\\n').map((line) => new D.Paragraph({ children: [new D.TextRun({ text: line, font: 'Courier New', size: 20 })], shading: { type: D.ShadingType.CLEAR, fill: 'F0F0F0', color: 'auto' } })),\n ];\n }\n case 'horizontal_rule':\n return [new D.Paragraph({ border: { bottom: { style: D.BorderStyle.SINGLE, size: 6, color: '999999', space: 1 } } })];\n case 'cover_page': {\n const img = ctx.images.get(imageKey({ src: node.attrs.src }));\n const after = new D.Paragraph({ children: [new D.PageBreak()] });\n if (!img) return [after];\n // anchored to the page itself, so the picture runs edge to edge whatever the margins are\n const run = new D.ImageRun({\n type: img.type,\n data: img.data,\n transformation: { width: ctx.pageSize.w, height: ctx.pageSize.h },\n floating: { horizontalPosition: { relative: D.HorizontalPositionRelativeFrom.PAGE, offset: 0 }, verticalPosition: { relative: D.VerticalPositionRelativeFrom.PAGE, offset: 0 }, behindDocument: true, allowOverlap: true },\n altText: { name: 'cover', title: 'Cover', description: String(node.attrs.alt || 'Cover page') },\n });\n return [new D.Paragraph({ children: [run] }), after];\n }\n case 'page_break':\n return [new D.Paragraph({ children: [new D.PageBreak()] })];\n case 'toc':\n return [new D.TableOfContents('Table of Contents', { hyperlink: true, headingStyleRange: '1-4' })];\n case 'table':\n return [tableBlock(node, ctx), new D.Paragraph('')]; // Word needs a paragraph after a table\n case 'data_table': {\n // A data table is written as an ordinary Word table: the heading row (repeated on each page) and every row, in the shown columns.\n const spec = cleanDataTable(node.attrs.spec);\n if (!spec) return [];\n const cols = spec.columns.map((c, i) => ({ c, i })).filter(({ c }) => !c.hidden);\n const align = (c: (typeof cols)[number]['c']) => ((c.align ?? (c.type === 'number' || c.type === 'currency' ? 'right' : 'left')) === 'right' ? D.AlignmentType.RIGHT : c.align === 'center' ? D.AlignmentType.CENTER : D.AlignmentType.LEFT);\n const cell = (text: string, c: (typeof cols)[number]['c'], bold = false, fill?: string) => new D.TableCell({ shading: fill ? { type: D.ShadingType.CLEAR, fill, color: 'auto' } : undefined, children: [new D.Paragraph({ alignment: align(c), children: [new D.TextRun({ text, bold })] })] });\n const rows = [\n new D.TableRow({ tableHeader: true, children: cols.map(({ c }) => cell(c.title, c, true, 'E7ECF3')) }),\n ...spec.rows.map((r) => new D.TableRow({ children: cols.map(({ c, i }) => cell(formatDataCell(c, r[i]), c)) })),\n ];\n const out: Block[] = [];\n if (spec.options.title) out.push(new D.Paragraph({ spacing: { after: 60 }, children: [new D.TextRun({ text: spec.options.title, bold: true })] }));\n out.push(new D.Table({ rows, width: { size: 100, type: D.WidthType.PERCENTAGE } }), new D.Paragraph(''));\n return out;\n }\n default:\n return node.isTextblock ? [new D.Paragraph({ children: inlineChildren(node, ctx) })] : [];\n }\n}\n\nfunction headerFooterParagraph(template: string): D.Paragraph {\n const parts = template.split(/(\\{page\\}|\\{pages\\})/);\n const run: (string | (typeof D.PageNumber)[keyof typeof D.PageNumber])[] = parts\n .filter(Boolean)\n .map((p) => (p === '{page}' ? D.PageNumber.CURRENT : p === '{pages}' ? D.PageNumber.TOTAL_PAGES : p));\n return new D.Paragraph({ alignment: D.AlignmentType.CENTER, children: [new D.TextRun({ children: run, color: '9CA3AF', size: 18 })] });\n}\n\n/** Build a docx `Document` from the editor's content, page setup, footnotes, comments and tracked changes. */\nexport async function buildDocx(editor: Editor, options: ExportOptions = {}): Promise<D.Document> {\n const doc = editor.view.state.doc;\n const page = (editor.extensions.pageSettings as (() => PageSettings) | undefined)?.();\n const store = (editor.config.plugins.find((p) => p.name === 'comments') as CommentsPlugin | undefined)?.store;\n const threads = options.comments ?? store?.list() ?? [];\n const used = new Set<string>();\n doc.descendants((n) => void n.marks.forEach((m) => m.type.name === 'comment' && used.add(m.attrs.id)));\n const exported = threads.filter((t) => used.has(t.id));\n\n const images = new Map<string, ImageData | null>();\n await Promise.all(\n collectImages(doc).map(async ({ key, src, crop }) => {\n let img = await loadImage(src, options.fetchImages !== false);\n if (img && crop) {\n // Word needs the cropped pixels; render them with canvas. Without canvas the full image is exported.\n const cropped = await cropBytes(img.data, crop);\n if (cropped) img = { data: cropped.data, type: 'png', width: cropped.width, height: cropped.height };\n }\n images.set(key, img);\n }),\n );\n\n // Diagrams: render each Mermaid source to SVG with the editor's plugin, then to PNG (needs a browser canvas).\n const diagrams = new Map<string, ImageData | null>();\n const renderSVG = (editor.extensions.mermaid as { renderSVG?: (code: string, dark?: boolean) => Promise<string> } | undefined)?.renderSVG;\n const codes = new Set<string>();\n const codesCharts = new Set<string>();\n doc.descendants((n) => void (n.type.name === 'mermaid_diagram' && codes.add(n.attrs.code)));\n if (renderSVG) {\n await Promise.all([...codes].map(async (code) => {\n try {\n const png = await rasterizeSVG(await renderSVG(code, false));\n diagrams.set(code, png ? { data: png.data, type: 'png', width: png.width, height: png.height } : null);\n } catch {\n diagrams.set(code, null); // an invalid diagram: its source is written instead\n }\n }));\n }\n\n // Charts: the SVG is drawn from the data here, then rasterised like a diagram\n doc.descendants((n) => {\n if (n.type.name === 'chart') codesCharts.add(String(n.attrs.spec));\n });\n await Promise.all([...codesCharts].map(async (raw) => {\n const spec = cleanChart(raw);\n const png = spec ? await rasterizeSVG(chartSVG(spec)) : null;\n diagrams.set(`chart:${raw}`, png ? { data: png.data, type: 'png', width: png.width, height: png.height } : null);\n }));\n\n const ctx: Ctx = {\n images,\n diagrams,\n footnotes: {},\n numbering: [],\n numberingRefs: [],\n revision: 1,\n author: 'Author',\n commentIds: new Map(exported.map((t, i) => [t.id, i])),\n referenced: new Set(),\n quote: 0,\n pageSize: { w: page?.width ?? 794, h: page?.height ?? 1123 },\n };\n // Top-level `columns` blocks become their own continuous Word sections with the right column count; the text around them is single-column.\n type Segment = { count: number; gap: number; rule: boolean; children: Block[] };\n const segments: Segment[] = [];\n doc.forEach((n) => {\n if (n.type.name === 'columns') {\n const kids: Block[] = [];\n n.forEach((c) => kids.push(...blocks(c, ctx)));\n if (kids.length) segments.push({ count: Number(n.attrs.count) || 2, gap: Number(n.attrs.gap) || 28, rule: n.attrs.rule === 'solid', children: kids });\n return;\n }\n const last = segments[segments.length - 1];\n const out = blocks(n, ctx);\n if (last && last.count === 1) last.children.push(...out);\n else segments.push({ count: 1, gap: 0, rule: false, children: out });\n });\n if (!segments.some((s) => s.children.length)) segments.splice(0, segments.length, { count: 1, gap: 0, rule: false, children: [new D.Paragraph('')] });\n\n const w = page?.width ?? 794;\n const h = page?.height ?? 1123;\n const landscape = page?.orientation === 'landscape';\n const m = page?.margins ?? { top: 96, right: 96, bottom: 96, left: 96 };\n const headerTpl = page?.header ?? '';\n const footerTpl = page ? page.footer : '';\n\n return new D.Document({\n creator: 'wysiwygido',\n title: options.title,\n features: { updateFields: doc.content.content.some((n) => n.type.name === 'toc') },\n numbering: { config: ctx.numbering.map((lv, i) => ({ reference: ctx.numberingRefs[i], levels: lv })) },\n footnotes: ctx.footnotes,\n comments: {\n children: exported.map((t, i) => ({\n id: i,\n author: t.author,\n date: new Date(t.createdAt),\n children: [t.text, ...t.replies.map((r) => `${r.author}: ${r.text}`)].map((text) => new D.Paragraph(text)),\n })),\n },\n sections: segments.map((seg, i) => ({\n properties: {\n ...(i === 0 ? { titlePage: page?.differentFirstPage } : { type: D.SectionType.CONTINUOUS }),\n ...(seg.count > 1 ? { column: { count: seg.count, space: seg.gap * 15, separate: seg.rule, equalWidth: true } } : {}),\n page: {\n size: { width: px(Math.min(w, h)), height: px(Math.max(w, h)), orientation: landscape ? D.PageOrientation.LANDSCAPE : D.PageOrientation.PORTRAIT },\n margin: { top: px(m.top), right: px(m.right), bottom: px(m.bottom), left: px(m.left) },\n },\n },\n // headers and footers belong to the first section; later continuous sections carry on with them\n ...(i === 0\n ? {\n headers: {\n default: new D.Header({ children: [headerFooterParagraph(headerTpl)] }),\n ...(page?.differentFirstPage ? { first: new D.Header({ children: [headerFooterParagraph(page.firstHeader)] }) } : {}),\n },\n footers: {\n default: new D.Footer({ children: [headerFooterParagraph(footerTpl)] }),\n ...(page?.differentFirstPage ? { first: new D.Footer({ children: [headerFooterParagraph(page.firstFooter)] }) } : {}),\n },\n }\n : {}),\n children: (seg.children.length ? seg.children : [new D.Paragraph('')]) as D.Paragraph[],\n })),\n });\n}\n\n/** Export the document as a .docx `Blob`. */\nexport async function exportDocx(editor: Editor, options: ExportOptions = {}): Promise<Blob> {\n return D.Packer.toBlob(await buildDocx(editor, options));\n}\n\nfunction blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n if (typeof blob.arrayBuffer === 'function') return blob.arrayBuffer();\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(r.result as ArrayBuffer);\n r.onerror = () => reject(r.error);\n r.readAsArrayBuffer(blob);\n });\n}\n\n/** Replace the editor content with a .docx file's content (undoable). Returns mammoth's conversion warnings. */\nexport async function importDocx(editor: Editor, source: Blob | ArrayBuffer): Promise<string[]> {\n const mammoth = (await import('mammoth')).default ?? (await import('mammoth'));\n const size = source instanceof ArrayBuffer ? source.byteLength : source.size;\n if (size > MAX_DOCX_BYTES) throw new Error(`The .docx file is too large (${Math.round(size / 1048576)} MB; the limit is ${MAX_DOCX_BYTES / 1048576} MB).`);\n const arrayBuffer = source instanceof ArrayBuffer ? source : await blobToArrayBuffer(source);\n // mammoth's browser build reads `arrayBuffer`, its Node build reads `buffer`; pass what the runtime has.\n const input = { arrayBuffer, ...(typeof Buffer !== 'undefined' ? { buffer: Buffer.from(arrayBuffer) } : {}) };\n const result = await mammoth.convertToHtml(\n input as { arrayBuffer: ArrayBuffer },\n { styleMap: ['u => u', 'strike => s', \"p[style-name='Quote'] => blockquote:fresh\"] },\n );\n editor.replaceHTML(result.value);\n return result.messages.map((m: { message: string }) => m.message);\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export declare function createEditor(config: Omit<EditorConfig, 'plugins'> & {
|
|
|
15
15
|
outline?: boolean;
|
|
16
16
|
}): Editor;
|
|
17
17
|
export { exportHTML, download } from './export.js';
|
|
18
|
+
export { PICTURE_STYLES } from './picture-styles.js';
|
|
19
|
+
export type { PictureStyle } from './picture-styles.js';
|
|
18
20
|
export { createDataTable, defineDataTableElement, hasDataTableAccess } from './data-table-app.js';
|
|
19
21
|
export type { DataTableAccessRule, DataTableApp, DataTableAppOptions, DataTableCrud, DataTableCrudAction, DataTableElement, DataTableUser } from './data-table-app.js';
|
|
20
22
|
export type { PageSettings } from './plugins/pages.js';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Picture styles: ready-made looks for an image (frames, shadows, rounded and oval shapes, soft edges, reflections, perspective), like the
|
|
3
|
+
* gallery in Word. A style is stored on the image as its id only; the CSS comes from this fixed table (never from the document), so a
|
|
4
|
+
* document cannot inject styles, and the look is written inline so it also shows in exported HTML.
|
|
5
|
+
*/
|
|
6
|
+
export interface PictureStyle {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
/** Declarations for the image's `style` attribute. */
|
|
10
|
+
css: string;
|
|
11
|
+
}
|
|
12
|
+
/** In the order of the gallery (five to a row). */
|
|
13
|
+
export declare const PICTURE_STYLES: PictureStyle[];
|
|
14
|
+
/** The id if it names a known style, else null (a document can say anything; only the table is trusted). */
|
|
15
|
+
export declare const pictureStyleId: (value: unknown) => string | null;
|
|
16
|
+
/** The declarations for a style id, or an empty string. */
|
|
17
|
+
export declare const pictureStyleCss: (id: unknown) => string;
|
package/dist/react.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createEditor } from "./src-
|
|
1
|
+
import { t as createEditor } from "./src-BRq1hjtj.js";
|
|
2
2
|
import { createElement, forwardRef, useEffect, useImperativeHandle, useLayoutEffect, useRef } from "react";
|
|
3
3
|
//#region src/react.ts
|
|
4
4
|
/** React wrapper (needs the optional `react` peer dependency). */
|
package/dist/ribbon.d.ts
CHANGED
|
@@ -2,6 +2,11 @@ import { type EditorState } from 'prosemirror-state';
|
|
|
2
2
|
import type { Editor } from './editor.js';
|
|
3
3
|
import type { RibbonContribution } from './types.js';
|
|
4
4
|
type Size = 'large' | 'small';
|
|
5
|
+
export interface GalleryItem {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
css: string;
|
|
9
|
+
}
|
|
5
10
|
export interface MenuEntry {
|
|
6
11
|
label: string;
|
|
7
12
|
command?: string;
|
|
@@ -49,6 +54,19 @@ export type RibbonControl =
|
|
|
49
54
|
none: string;
|
|
50
55
|
size?: Size;
|
|
51
56
|
iconOnly?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/** A grid of look-alike thumbnails (picture styles): each item's `css` is applied to a small copy of the `preview` picture. */
|
|
59
|
+
| {
|
|
60
|
+
kind: 'gallery';
|
|
61
|
+
id: string;
|
|
62
|
+
label: string;
|
|
63
|
+
icon: string;
|
|
64
|
+
command: string;
|
|
65
|
+
items: (e: Editor) => GalleryItem[];
|
|
66
|
+
current: (s: EditorState) => string | null;
|
|
67
|
+
preview: (s: EditorState) => string | null;
|
|
68
|
+
clear: string;
|
|
69
|
+
size?: Size;
|
|
52
70
|
} | {
|
|
53
71
|
kind: 'chars';
|
|
54
72
|
id: string;
|
|
@@ -147,6 +165,7 @@ export declare class Ribbon {
|
|
|
147
165
|
private available;
|
|
148
166
|
private menuBody;
|
|
149
167
|
private paletteBody;
|
|
168
|
+
private galleryBody;
|
|
150
169
|
private charsBody;
|
|
151
170
|
}
|
|
152
171
|
export {};
|