react-next-editor-js 0.1.0 → 0.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/README.md +16 -0
- package/dist/{chunk-QROUNVQK.js → chunk-65YACENL.js} +16 -3
- package/dist/chunk-65YACENL.js.map +1 -0
- package/dist/{chunk-IG2YLUFW.js → chunk-ABNK7F64.js} +3 -3
- package/dist/{chunk-IG2YLUFW.js.map → chunk-ABNK7F64.js.map} +1 -1
- package/dist/{chunk-GFNFJ3FL.cjs → chunk-G7ELDC53.cjs} +5 -5
- package/dist/{chunk-GFNFJ3FL.cjs.map → chunk-G7ELDC53.cjs.map} +1 -1
- package/dist/{chunk-NJCEHQV3.cjs → chunk-OESUMEV7.cjs} +16 -3
- package/dist/chunk-OESUMEV7.cjs.map +1 -0
- package/dist/export/index.cjs +9 -9
- package/dist/export/index.js +2 -2
- package/dist/index.cjs +51 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -2
- package/dist/index.d.ts +26 -2
- package/dist/index.js +45 -6
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +3 -3
- package/dist/server/index.js +1 -1
- package/dist/styles.css +37 -0
- package/package.json +1 -1
- package/dist/chunk-NJCEHQV3.cjs.map +0 -1
- package/dist/chunk-QROUNVQK.js.map +0 -1
package/README.md
CHANGED
|
@@ -195,6 +195,22 @@ content is unchanged.
|
|
|
195
195
|
<Editor initialContent={docJson} readOnly /> // or mode="readonly"
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
+
**Display-only (no editor) — `DocumentView`.** To merely *show* a document —
|
|
199
|
+
in a card, a list, a preview — use `DocumentView` instead of a read-only
|
|
200
|
+
`Editor`. It renders the document to HTML with the shared serializer and does
|
|
201
|
+
**not** mount a ProseMirror `EditorView`, so it is dramatically cheaper per
|
|
202
|
+
instance (ideal when many documents appear on one screen). Its HTML is produced
|
|
203
|
+
by the package's sanitizing serializer and DOMPurify-hardened, so it is safe even
|
|
204
|
+
for untrusted stored JSON.
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
import { DocumentView } from 'react-next-editor-js';
|
|
208
|
+
import 'react-next-editor-js/styles.css';
|
|
209
|
+
|
|
210
|
+
<DocumentView value={docJson} /> // DocumentJSON, a JSON string, or null
|
|
211
|
+
<DocumentView value={jsonString} className="my-doc" />
|
|
212
|
+
```
|
|
213
|
+
|
|
198
214
|
**Plain-text or empty start.** `initialContent` also accepts a plain string
|
|
199
215
|
(split into paragraphs) or `null` (empty document).
|
|
200
216
|
|
|
@@ -103,7 +103,20 @@ function serializeInline(content, opts) {
|
|
|
103
103
|
// src/export/docx.ts
|
|
104
104
|
var docxModulePromise = null;
|
|
105
105
|
async function loadDocx() {
|
|
106
|
-
if (!docxModulePromise)
|
|
106
|
+
if (!docxModulePromise) {
|
|
107
|
+
const specifier = "docx";
|
|
108
|
+
docxModulePromise = import(
|
|
109
|
+
/* webpackIgnore: true */
|
|
110
|
+
/* @vite-ignore */
|
|
111
|
+
specifier
|
|
112
|
+
).catch(
|
|
113
|
+
() => {
|
|
114
|
+
throw new Error(
|
|
115
|
+
"react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx)."
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
107
120
|
return docxModulePromise;
|
|
108
121
|
}
|
|
109
122
|
var HALF_POINT = 2;
|
|
@@ -446,5 +459,5 @@ async function documentToDocxBuffer(doc, options = {}) {
|
|
|
446
459
|
}
|
|
447
460
|
|
|
448
461
|
export { documentToDocxBlob, documentToDocxBuffer, documentToText };
|
|
449
|
-
//# sourceMappingURL=chunk-
|
|
450
|
-
//# sourceMappingURL=chunk-
|
|
462
|
+
//# sourceMappingURL=chunk-65YACENL.js.map
|
|
463
|
+
//# sourceMappingURL=chunk-65YACENL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/export/text.ts","../src/export/docx.ts"],"names":[],"mappings":"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","file":"chunk-65YACENL.js","sourcesContent":["import type { DocumentJSON } from '../config/types';\n\n/**\n * Options governing plain-text conversion (F-6.20). Defaults follow the\n * documented structure rules: blocks separated by blank lines, list items on\n * their own lines, table cells tab-delimited, images replaced by alt text,\n * links rendered as their text.\n */\nexport interface TextConversionOptions {\n /** Append the URL after link text as \" (url)\". Default false. */\n includeLinkUrls?: boolean;\n /** Replacement for images: 'alt' uses alt text, 'omit' drops them. Default 'alt'. */\n images?: 'alt' | 'omit';\n /** Newline sequence. Default '\\n'. */\n newline?: string;\n}\n\ninterface ResolvedOptions {\n includeLinkUrls: boolean;\n images: 'alt' | 'omit';\n newline: string;\n}\n\n/**\n * Convert a ProseMirror document (JSON) to plain text (F-6.18). Pure and\n * isomorphic: identical output in the browser and on the server (F-6.19).\n */\nexport function documentToText(doc: DocumentJSON, options: TextConversionOptions = {}): string {\n const opts: ResolvedOptions = {\n includeLinkUrls: options.includeLinkUrls ?? false,\n images: options.images ?? 'alt',\n newline: options.newline ?? '\\n',\n };\n const blocks = (doc.content ?? []).map((node) => serializeBlock(node, opts, 0));\n return blocks\n .filter((b) => b !== null)\n .join(opts.newline + opts.newline)\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction serializeBlock(node: DocumentJSON, opts: ResolvedOptions, depth: number): string | null {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return serializeInline(node.content ?? [], opts);\n case 'blockquote':\n return (node.content ?? [])\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .map((line) => `> ${line}`)\n .join(opts.newline);\n case 'bullet_list':\n case 'ordered_list':\n return serializeList(node, opts, depth);\n case 'horizontal_rule':\n return '---';\n case 'page_break':\n return '\\f';\n case 'table':\n return serializeTable(node, opts);\n default:\n // Unknown block: best-effort recurse so custom nodes still contribute text.\n if (node.content) {\n return node.content\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .join(opts.newline);\n }\n return node.text ?? null;\n }\n}\n\nfunction serializeList(node: DocumentJSON, opts: ResolvedOptions, depth: number): string {\n const ordered = node.type === 'ordered_list';\n const start = ordered ? Number(node.attrs?.order ?? 1) : 0;\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n let index = start;\n\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const checked = item.attrs?.checked;\n let marker: string;\n if (checked === true) marker = '[x]';\n else if (checked === false) marker = '[ ]';\n else if (ordered) marker = `${index}.`;\n else marker = '-';\n\n const children = item.content ?? [];\n const firstBlock = children[0];\n const firstText = firstBlock ? (serializeBlock(firstBlock, opts, depth) ?? '') : '';\n lines.push(`${indent}${marker} ${firstText}`.trimEnd());\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i]!;\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n lines.push(serializeList(child, opts, depth + 1));\n } else {\n const text = serializeBlock(child, opts, depth + 1);\n if (text) lines.push(`${indent} ${text}`);\n }\n }\n if (ordered) index++;\n }\n return lines.join(opts.newline);\n}\n\nfunction serializeTable(node: DocumentJSON, opts: ResolvedOptions): string {\n const rows: string[] = [];\n for (const row of node.content ?? []) {\n if (row.type !== 'table_row') continue;\n const cells = (row.content ?? []).map((cell) =>\n (cell.content ?? [])\n .map((block) => serializeBlock(block, opts, 0))\n .filter((b) => b !== null)\n .join(' ')\n .replace(/\\t/g, ' '),\n );\n rows.push(cells.join('\\t'));\n }\n return rows.join(opts.newline);\n}\n\nfunction serializeInline(content: DocumentJSON[], opts: ResolvedOptions): string {\n let out = '';\n for (const node of content) {\n if (node.type === 'text') {\n let text = node.text ?? '';\n if (opts.includeLinkUrls && node.marks) {\n const link = node.marks.find((m) => m.type === 'link');\n if (link?.attrs?.href) text = `${text} (${String(link.attrs.href)})`;\n }\n out += text;\n } else if (node.type === 'hard_break') {\n out += opts.newline;\n } else if (node.type === 'image') {\n if (opts.images === 'alt') {\n const alt = node.attrs?.alt;\n if (alt) out += String(alt);\n }\n } else if (node.content) {\n out += serializeInline(node.content, opts);\n }\n }\n return out;\n}\n","import type * as DocxNamespace from 'docx';\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE, resolvePageDimensions } from '../config/defaults';\nimport { sanitizeUrl } from '../security/sanitize';\n\n/**\n * Isomorphic DOCX serializer (§8.3). Walks the document JSON and emits OOXML via\n * the `docx` library, which runs in both the browser (Blob) and Node\n * (Buffer/Stream). A per-node mapping is used so custom nodes can register their\n * own conversion (F-6.16, F-10.14). The `docx` module is imported lazily so it\n * stays out of the initial bundle (NF-2) and remains optional.\n */\n\n/** A converter for a custom node type, returning docx block elements. */\nexport type DocxNodeConverter = (\n node: DocumentJSON,\n ctx: DocxContext,\n) => unknown[];\n\nexport interface DocxExportOptions {\n page?: PageConfig;\n title?: string;\n /** Custom node converters keyed by node type name (extension mapping). */\n nodeConverters?: Record<string, DocxNodeConverter>;\n}\n\nexport interface DocxContext {\n serializeBlocks: (nodes: DocumentJSON[]) => unknown[];\n docx: DocxModule;\n}\n\ntype DocxModule = typeof DocxNamespace;\n\nlet docxModulePromise: Promise<DocxModule> | null = null;\nasync function loadDocx(): Promise<DocxModule> {\n if (!docxModulePromise) {\n // Load `docx` through a variable specifier (with bundler-ignore hints) so\n // webpack/Vite/Next don't statically resolve it at build time. Consumers who\n // never export DOCX therefore don't need `docx` installed just to bundle the\n // editor — it is loaded on demand, and throws a clear error only if a DOCX\n // export is actually attempted without it.\n const specifier = 'docx';\n docxModulePromise = import(/* webpackIgnore: true */ /* @vite-ignore */ specifier).catch(\n () => {\n throw new Error(\n \"react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx).\",\n );\n },\n ) as Promise<DocxModule>;\n }\n return docxModulePromise;\n}\n\nconst HALF_POINT = 2; // docx font sizes are in half-points\nconst INDENT_TWIP_PER_LEVEL = 720; // 0.5 inch\n\nfunction toHex(value: unknown): string | null {\n const v = String(value ?? '').trim();\n const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);\n if (!m) return null;\n const hex = m[1]!;\n return hex.length === 3\n ? hex\n .split('')\n .map((c) => c + c)\n .join('')\n : hex;\n}\n\ninterface MarkJSON {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nclass DocxSerializer {\n private docx!: DocxModule;\n private numberingConfigs: unknown[] = [];\n private refCounter = 0;\n private converters: Record<string, DocxNodeConverter>;\n\n constructor(converters: Record<string, DocxNodeConverter> = {}) {\n this.converters = converters;\n }\n\n private allocListRef(ordered: boolean): string {\n const d = this.docx;\n const reference = `rne-list-${this.refCounter++}`;\n const levels = Array.from({ length: 9 }, (_, level) => {\n if (ordered) {\n const formats = [\n d.LevelFormat.DECIMAL,\n d.LevelFormat.LOWER_LETTER,\n d.LevelFormat.LOWER_ROMAN,\n ];\n return {\n level,\n format: formats[level % 3]!,\n text: `%${level + 1}.`,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n }\n const bullets = ['•', '◦', '▪'];\n return {\n level,\n format: d.LevelFormat.BULLET,\n text: bullets[level % 3]!,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n });\n this.numberingConfigs.push({ reference, levels });\n return reference;\n }\n\n /** Build run options from a text node's marks. */\n private runOptions(marks: MarkJSON[]): Record<string, unknown> {\n const d = this.docx;\n const o: Record<string, unknown> = {};\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n o.bold = true;\n break;\n case 'em':\n o.italics = true;\n break;\n case 'underline':\n o.underline = {};\n break;\n case 'strikethrough':\n o.strike = true;\n break;\n case 'superscript':\n o.superScript = true;\n break;\n case 'subscript':\n o.subScript = true;\n break;\n case 'code':\n o.font = 'Courier New';\n break;\n case 'fontFamily':\n o.font = String(mark.attrs?.family ?? '');\n break;\n case 'fontSize': {\n const size = Number(mark.attrs?.size);\n if (Number.isFinite(size) && size > 0) o.size = Math.round(size * HALF_POINT);\n break;\n }\n case 'textColor': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.color = hex;\n break;\n }\n case 'highlight': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.shading = { type: d.ShadingType.CLEAR, fill: hex };\n break;\n }\n default:\n break;\n }\n }\n return o;\n }\n\n /** Serialize inline content into docx runs / hyperlinks. */\n private inlineChildren(content: DocumentJSON[] | undefined): unknown[] {\n const d = this.docx;\n if (!content) return [];\n const out: unknown[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const marks = (node.marks ?? []) as MarkJSON[];\n const link = marks.find((m) => m.type === 'link');\n const runOpts = this.runOptions(marks.filter((m) => m.type !== 'link'));\n const run = new d.TextRun({ text: node.text ?? '', ...runOpts });\n if (link?.attrs?.href) {\n const href = sanitizeUrl(String(link.attrs.href));\n if (href) {\n out.push(new d.ExternalHyperlink({ children: [run], link: href }));\n continue;\n }\n }\n out.push(run);\n } else if (node.type === 'hard_break') {\n out.push(new d.TextRun({ break: 1 }));\n } else if (node.type === 'image') {\n const img = this.imageRun(node);\n if (img) {\n out.push(img);\n } else {\n // Remote images can't be embedded synchronously; preserve the alt text\n // (or a placeholder) so information is not silently lost (F-6.17).\n const alt = node.attrs?.alt ? String(node.attrs.alt) : '[image]';\n out.push(new d.TextRun({ text: alt, italics: true }));\n }\n }\n }\n return out;\n }\n\n private imageRun(node: DocumentJSON): unknown | null {\n const d = this.docx;\n const src = String(node.attrs?.src ?? '');\n const match = /^data:image\\/(png|jpe?g|gif|bmp);base64,([A-Za-z0-9+/=]+)$/.exec(src);\n if (!match) return null; // remote images can't be fetched synchronously; skipped\n const raw = match[1]!;\n const type = raw === 'jpeg' ? 'jpg' : raw;\n const data = base64ToUint8(match[2]!);\n const width = Number(node.attrs?.width) || 300;\n const height = Math.round(width * 0.75);\n try {\n return new d.ImageRun({\n data,\n type: type as 'png' | 'jpg' | 'gif' | 'bmp',\n transformation: { width, height },\n });\n } catch {\n return null;\n }\n }\n\n private alignment(attrs: Record<string, unknown> | undefined): unknown {\n const d = this.docx;\n switch (attrs?.align) {\n case 'center':\n return d.AlignmentType.CENTER;\n case 'right':\n return d.AlignmentType.RIGHT;\n case 'justify':\n return d.AlignmentType.JUSTIFIED;\n case 'left':\n return d.AlignmentType.LEFT;\n default:\n return undefined;\n }\n }\n\n private paragraphProps(node: DocumentJSON): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const align = this.alignment(node.attrs);\n if (align !== undefined) props.alignment = align;\n const indent = Number(node.attrs?.indent ?? 0);\n if (indent > 0) props.indent = { left: indent * INDENT_TWIP_PER_LEVEL };\n const lineHeight = Number(node.attrs?.lineHeight);\n if (Number.isFinite(lineHeight) && lineHeight > 0) {\n props.spacing = { line: Math.round(lineHeight * 240), lineRule: 'auto' };\n }\n return props;\n }\n\n private headingLevel(level: number): unknown {\n const d = this.docx;\n const map = [\n d.HeadingLevel.HEADING_1,\n d.HeadingLevel.HEADING_2,\n d.HeadingLevel.HEADING_3,\n d.HeadingLevel.HEADING_4,\n d.HeadingLevel.HEADING_5,\n d.HeadingLevel.HEADING_6,\n ];\n return map[Math.min(5, Math.max(0, level - 1))];\n }\n\n serializeBlocks(nodes: DocumentJSON[]): unknown[] {\n const out: unknown[] = [];\n for (const node of nodes) out.push(...this.serializeBlock(node));\n return out;\n }\n\n private serializeBlock(node: DocumentJSON): unknown[] {\n const d = this.docx;\n const custom = this.converters[node.type];\n if (custom) {\n return custom(node, { serializeBlocks: (n) => this.serializeBlocks(n), docx: this.docx });\n }\n switch (node.type) {\n case 'paragraph':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'heading':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n heading: this.headingLevel(Number(node.attrs?.level ?? 1)) as never,\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'blockquote':\n return (node.content ?? []).flatMap((child) => {\n const blocks = this.serializeBlock(child);\n return blocks;\n });\n case 'horizontal_rule':\n return [\n new d.Paragraph({\n border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, space: 1, color: '999999' } },\n children: [],\n }),\n ];\n case 'page_break':\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case 'bullet_list':\n case 'ordered_list':\n return this.serializeList(node, node.type === 'ordered_list', 0);\n case 'table':\n return [this.serializeTable(node)];\n default:\n if (node.content) return this.serializeBlocks(node.content);\n return [];\n }\n }\n\n private serializeList(node: DocumentJSON, ordered: boolean, level: number): unknown[] {\n const d = this.docx;\n const reference = this.allocListRef(ordered);\n const out: unknown[] = [];\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const children = item.content ?? [];\n const checked = item.attrs?.checked;\n const prefix =\n checked === true ? '☑ ' : checked === false ? '☐ ' : '';\n\n children.forEach((child, idx) => {\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n out.push(...this.serializeList(child, child.type === 'ordered_list', level + 1));\n } else if (idx === 0) {\n const runs = this.inlineChildren(child.content);\n const first = prefix ? [new d.TextRun({ text: prefix }), ...runs] : runs;\n out.push(\n new d.Paragraph({\n numbering: { reference, level },\n children: first as never,\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n indent: { left: (level + 1) * INDENT_TWIP_PER_LEVEL },\n children: this.inlineChildren(child.content) as never,\n }),\n );\n }\n });\n }\n return out;\n }\n\n private serializeTable(node: DocumentJSON): unknown {\n const d = this.docx;\n const rows = (node.content ?? [])\n .filter((row) => row.type === 'table_row')\n .map((row) => {\n const cells = (row.content ?? []).map((cell) => {\n const fill = toHex(cell.attrs?.background);\n return new d.TableCell({\n children: this.serializeBlocks(cell.content ?? []) as never,\n columnSpan: Number(cell.attrs?.colspan ?? 1) || 1,\n rowSpan: Number(cell.attrs?.rowspan ?? 1) || 1,\n ...(fill ? { shading: { type: d.ShadingType.CLEAR, fill } } : {}),\n });\n });\n return new d.TableRow({ children: cells });\n });\n return new d.Table({\n rows,\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n });\n }\n\n async build(doc: DocumentJSON, options: DocxExportOptions): Promise<unknown> {\n this.docx = await loadDocx();\n const d = this.docx;\n const page = options.page ?? DEFAULT_PAGE;\n const { width, height } = resolvePageDimensions(page);\n const children = this.serializeBlocks(doc.content ?? []);\n const mmToTwip = (mm: number) => Math.round((mm / 25.4) * 1440);\n\n return new d.Document({\n numbering: { config: this.numberingConfigs as never },\n sections: [\n {\n properties: {\n page: {\n size: { width: mmToTwip(width), height: mmToTwip(height) },\n margin: {\n top: mmToTwip(page.margins.top),\n right: mmToTwip(page.margins.right),\n bottom: mmToTwip(page.margins.bottom),\n left: mmToTwip(page.margins.left),\n },\n },\n },\n children: children as never,\n },\n ],\n });\n }\n}\n\nfunction base64ToUint8(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n }\n // Node fallback.\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Serialize a document to a DOCX Blob for client-side download (F-6.1, F-6.6). */\nexport async function documentToDocxBlob(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Blob> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBlob(document as never);\n}\n\n/** Serialize a document to a DOCX Buffer for server-side storage (F-6.10). */\nexport async function documentToDocxBuffer(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Buffer> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBuffer(document as never);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { documentToText, documentToDocxBlob } from './chunk-
|
|
1
|
+
import { documentToText, documentToDocxBlob } from './chunk-65YACENL.js';
|
|
2
2
|
import { buildPrintDocument } from './chunk-7VYJDBH7.js';
|
|
3
3
|
import { DEFAULT_PAGE } from './chunk-JQXTWLHL.js';
|
|
4
4
|
|
|
@@ -110,5 +110,5 @@ function ensureExt(name, ext) {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
export { downloadBlob, downloadText, exportDocument, printDocumentToPdf };
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
114
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-ABNK7F64.js.map
|
|
114
|
+
//# sourceMappingURL=chunk-ABNK7F64.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["buildPrintDocument"],"mappings":";;;;;AAkBO,SAAS,kBAAA,CAAmB,GAAA,EAAmB,OAAA,GAA2B,EAAC,EAAkB;AAClG,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,oDAAoD,CAAC,CAAA;AAAA,EACvF;AACA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,YAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,GAAA,EAAK,IAAA,EAAM,QAAQ,KAAK,CAAA;AAExD,EAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,YAAA,CAAa,eAAe,MAAM,CAAA;AACzC,MAAA,MAAA,CAAO,MAAM,QAAA,GAAW,OAAA;AACxB,MAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,GAAA;AACrB,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,GAAA;AACtB,MAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,GAAA;AACrB,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,GAAA;AACtB,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,GAAA;AACtB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAEhC,MAAA,MAAM,UAAU,MAAM;AAEpB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,YAAY,MAAM,CAAA;AAAA,QAC7D,GAAG,GAAI,CAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,MAAM,MAAA,CAAO,aAAA;AACnB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,eAAA,IAAmB,GAAA,EAAK,QAAA;AAC5C,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM;AACjB,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,wCAAwC,CAAC,CAAA;AAC1D,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,MAAA,IAAA,CAAK,KAAA,EAAM;AAEX,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAI;AACF,UAAA,GAAA,CAAI,KAAA,EAAM;AACV,UAAA,GAAA,CAAI,KAAA,EAAM;AACV,UAAA,OAAA,EAAQ;AAAA,QACV,SAAS,GAAA,EAAK;AACZ,UAAA,MAAA,CAAO,GAAY,CAAA;AAAA,QACrB,CAAA,SAAE;AACA,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAGA,MAAA,IAAI,IAAA,CAAK,eAAe,UAAA,EAAY;AAClC,QAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,gBAAA,CAAiB,MAAA,EAAQ,MAAM,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,MAC/E;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,GAAY,CAAA;AAAA,IACrB;AAAA,EACF,CAAC,CAAA;AACH;;;AC1EO,SAAS,YAAA,CAAa,MAAY,QAAA,EAAwB;AAC/D,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,QAAQ,WAAA,EAAa;AACjE,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AACd,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,EAAA,MAAA,CAAO,GAAA,GAAM,UAAA;AACb,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAEhC,EAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,GAAG,GAAG,GAAI,CAAA;AACjD;AAGO,SAAS,YAAA,CAAa,IAAA,EAAc,QAAA,EAAkB,IAAA,GAAO,YAAA,EAAoB;AACtF,EAAA,YAAA,CAAa,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,cAAA,CAAA,EAAkB,CAAA,EAAG,QAAQ,CAAA;AAC5E;;;ACWA,eAAsB,cAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,GAKI,EAAC,EACU;AACf,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,KAAA,IAAS,UAAA;AAClD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AACvF,MAAA,YAAA,CAAa,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AAC1C,MAAA;AAAA,IACF;AAAA,IACA,KAAK,KAAA;AACH,MAAA,MAAM,kBAAA,CAAmB,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAC1E,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,YAAA,CAAa,cAAA,CAAe,KAAK,OAAA,CAAQ,IAAI,GAAG,SAAA,CAAU,IAAA,EAAM,KAAK,CAAC,CAAA;AACtE,MAAA;AAAA,IACF,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,EAAE,kBAAA,EAAAA,mBAAAA,EAAmB,GAAI,MAAM,OAAO,oBAAQ,CAAA;AACpD,MAAA,YAAA;AAAA,QACEA,mBAAAA,CAAmB,GAAA,EAAK,OAAA,CAAQ,IAAA,IAAA,CAAS,MAAM,OAAO,wBAAoB,CAAA,EAAG,YAAA,EAAc,OAAA,CAAQ,KAAK,CAAA;AAAA,QACxG,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,QACtB;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAAA,IACA;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA;AAEpE;AAEA,SAAS,SAAA,CAAU,MAAc,GAAA,EAAqB;AACpD,EAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACvE","file":"chunk-IG2YLUFW.js","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["buildPrintDocument"],"mappings":"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","file":"chunk-ABNK7F64.js","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkOESUMEV7_cjs = require('./chunk-OESUMEV7.cjs');
|
|
4
4
|
var chunkTI44I654_cjs = require('./chunk-TI44I654.cjs');
|
|
5
5
|
var chunkU3O54IYI_cjs = require('./chunk-U3O54IYI.cjs');
|
|
6
6
|
|
|
@@ -84,7 +84,7 @@ async function exportDocument(doc, format, options = {}) {
|
|
|
84
84
|
const base = options.filename ?? options.title ?? "document";
|
|
85
85
|
switch (format) {
|
|
86
86
|
case "docx": {
|
|
87
|
-
const blob = await
|
|
87
|
+
const blob = await chunkOESUMEV7_cjs.documentToDocxBlob(doc, { page: options.page, title: options.title });
|
|
88
88
|
downloadBlob(blob, ensureExt(base, "docx"));
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
@@ -92,7 +92,7 @@ async function exportDocument(doc, format, options = {}) {
|
|
|
92
92
|
await printDocumentToPdf(doc, { page: options.page, title: options.title });
|
|
93
93
|
return;
|
|
94
94
|
case "txt":
|
|
95
|
-
downloadText(
|
|
95
|
+
downloadText(chunkOESUMEV7_cjs.documentToText(doc, options.text), ensureExt(base, "txt"));
|
|
96
96
|
return;
|
|
97
97
|
case "html": {
|
|
98
98
|
const { buildPrintDocument: buildPrintDocument2 } = await import('./html-KU2KHLRF.cjs');
|
|
@@ -115,5 +115,5 @@ exports.downloadBlob = downloadBlob;
|
|
|
115
115
|
exports.downloadText = downloadText;
|
|
116
116
|
exports.exportDocument = exportDocument;
|
|
117
117
|
exports.printDocumentToPdf = printDocumentToPdf;
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
119
|
-
//# sourceMappingURL=chunk-
|
|
118
|
+
//# sourceMappingURL=chunk-G7ELDC53.cjs.map
|
|
119
|
+
//# sourceMappingURL=chunk-G7ELDC53.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["DEFAULT_PAGE","buildPrintDocument","documentToDocxBlob","documentToText"],"mappings":"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","file":"chunk-GFNFJ3FL.cjs","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["DEFAULT_PAGE","buildPrintDocument","documentToDocxBlob","documentToText"],"mappings":"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","file":"chunk-G7ELDC53.cjs","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
|
|
@@ -105,7 +105,20 @@ function serializeInline(content, opts) {
|
|
|
105
105
|
// src/export/docx.ts
|
|
106
106
|
var docxModulePromise = null;
|
|
107
107
|
async function loadDocx() {
|
|
108
|
-
if (!docxModulePromise)
|
|
108
|
+
if (!docxModulePromise) {
|
|
109
|
+
const specifier = "docx";
|
|
110
|
+
docxModulePromise = import(
|
|
111
|
+
/* webpackIgnore: true */
|
|
112
|
+
/* @vite-ignore */
|
|
113
|
+
specifier
|
|
114
|
+
).catch(
|
|
115
|
+
() => {
|
|
116
|
+
throw new Error(
|
|
117
|
+
"react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx)."
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
109
122
|
return docxModulePromise;
|
|
110
123
|
}
|
|
111
124
|
var HALF_POINT = 2;
|
|
@@ -450,5 +463,5 @@ async function documentToDocxBuffer(doc, options = {}) {
|
|
|
450
463
|
exports.documentToDocxBlob = documentToDocxBlob;
|
|
451
464
|
exports.documentToDocxBuffer = documentToDocxBuffer;
|
|
452
465
|
exports.documentToText = documentToText;
|
|
453
|
-
//# sourceMappingURL=chunk-
|
|
454
|
-
//# sourceMappingURL=chunk-
|
|
466
|
+
//# sourceMappingURL=chunk-OESUMEV7.cjs.map
|
|
467
|
+
//# sourceMappingURL=chunk-OESUMEV7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/export/text.ts","../src/export/docx.ts"],"names":["sanitizeUrl","DEFAULT_PAGE","resolvePageDimensions"],"mappings":";;;;;;AA2BO,SAAS,cAAA,CAAe,GAAA,EAAmB,OAAA,GAAiC,EAAC,EAAW;AAC7F,EAAA,MAAM,IAAA,GAAwB;AAAA,IAC5B,eAAA,EAAiB,QAAQ,eAAA,IAAmB,KAAA;AAAA,IAC5C,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,IAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC9B;AACA,EAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9E,EAAA,OAAO,OACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,CACxB,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,KAAK,OAAO,CAAA,CAChC,QAAQ,SAAA,EAAW,MAAM,EACzB,IAAA,EAAK;AACV;AAEA,SAAS,cAAA,CAAe,IAAA,EAAoB,IAAA,EAAuB,KAAA,EAA8B;AAC/F,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,WAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,OAAA,IAAW,IAAI,IAAI,CAAA;AAAA,IACjD,KAAK,YAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,IAAW,EAAC,EACtB,GAAA,CAAI,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK,CAAC,CAAA,CACjD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,CACxB,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,CACzB,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAAA,IACtB,KAAK,aAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACxC,KAAK,iBAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,IAClC;AAEE,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,OAAO,KAAK,OAAA,CACT,GAAA,CAAI,CAAC,KAAA,KAAU,cAAA,CAAe,OAAO,IAAA,EAAM,KAAK,CAAC,CAAA,CACjD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,CACxB,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,MACtB;AACA,MAAA,OAAO,KAAK,IAAA,IAAQ,IAAA;AAAA;AAE1B;AAEA,SAAS,aAAA,CAAc,IAAA,EAAoB,IAAA,EAAuB,KAAA,EAAuB;AACvF,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,KAAS,cAAA;AAC9B,EAAA,MAAM,QAAQ,OAAA,GAAU,MAAA,CAAO,KAAK,KAAA,EAAO,KAAA,IAAS,CAAC,CAAA,GAAI,CAAA;AACzD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,KAAA,GAAQ,KAAA;AAEZ,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG;AACrC,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,EAAO,OAAA;AAC5B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,OAAA,KAAY,MAAM,MAAA,GAAS,KAAA;AAAA,SAAA,IACtB,OAAA,KAAY,OAAO,MAAA,GAAS,KAAA;AAAA,SAAA,IAC5B,OAAA,EAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAAA,SAC9B,MAAA,GAAS,GAAA;AAEd,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,EAAC;AAClC,IAAA,MAAM,UAAA,GAAa,SAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YAAY,UAAA,GAAc,cAAA,CAAe,YAAY,IAAA,EAAM,KAAK,KAAK,EAAA,GAAM,EAAA;AACjF,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,OAAA,EAAS,CAAA;AAEtD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjE,QAAA,KAAA,CAAM,KAAK,aAAA,CAAc,KAAA,EAAO,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,MAClD,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAC,CAAA;AAClD,QAAA,IAAI,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,KAAA,EAAA;AAAA,EACf;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAChC;AAEA,SAAS,cAAA,CAAe,MAAoB,IAAA,EAA+B;AACzE,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG;AACpC,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC9B,IAAA,MAAM,KAAA,GAAA,CAAS,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,GAAA;AAAA,MAAI,CAAC,IAAA,KAAA,CACpC,IAAA,CAAK,OAAA,IAAW,EAAC,EACf,GAAA,CAAI,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA,CAC7C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,CACxB,IAAA,CAAK,GAAG,CAAA,CACR,OAAA,CAAQ,KAAA,EAAO,GAAG;AAAA,KACvB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAI,CAAC,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC/B;AAEA,SAAS,eAAA,CAAgB,SAAyB,IAAA,EAA+B;AAC/E,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,IAAI,IAAA,GAAO,KAAK,IAAA,IAAQ,EAAA;AACxB,MAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,KAAA,EAAO;AACtC,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AACrD,QAAA,IAAI,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACnE;AACA,MAAA,GAAA,IAAO,IAAA;AAAA,IACT,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,YAAA,EAAc;AACrC,MAAA,GAAA,IAAO,IAAA,CAAK,OAAA;AAAA,IACd,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,MAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;AACzB,QAAA,MAAM,GAAA,GAAM,KAAK,KAAA,EAAO,GAAA;AACxB,QAAA,IAAI,GAAA,EAAK,GAAA,IAAO,MAAA,CAAO,GAAG,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA,MAAA,IAAW,KAAK,OAAA,EAAS;AACvB,MAAA,GAAA,IAAO,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;ACjHA,IAAI,iBAAA,GAAgD,IAAA;AACpD,eAAe,QAAA,GAAgC;AAC7C,EAAA,IAAI,CAAC,iBAAA,EAAmB;AAMtB,IAAA,MAAM,SAAA,GAAY,MAAA;AAClB,IAAA,iBAAA,GAAoB;AAAA;AAAA;AAAA,MAAoD;AAAA,KAAA,CAAW,KAAA;AAAA,MACjF,MAAM;AACJ,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,iBAAA;AACT;AAEA,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,qBAAA,GAAwB,GAAA;AAE9B,SAAS,MAAM,KAAA,EAA+B;AAC5C,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AACnC,EAAA,MAAM,CAAA,GAAI,oCAAA,CAAqC,IAAA,CAAK,CAAC,CAAA;AACrD,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA;AACf,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAClB,GAAA,CACG,MAAM,EAAE,CAAA,CACR,GAAA,CAAI,CAAC,MAAM,CAAA,GAAI,CAAC,CAAA,CAChB,IAAA,CAAK,EAAE,CAAA,GACV,GAAA;AACN;AAOA,IAAM,iBAAN,MAAqB;AAAA,EAMnB,WAAA,CAAY,UAAA,GAAgD,EAAC,EAAG;AAJhE,IAAA,IAAA,CAAQ,mBAA8B,EAAC;AACvC,IAAA,IAAA,CAAQ,UAAA,GAAa,CAAA;AAInB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEQ,aAAa,OAAA,EAA0B;AAC7C,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,SAAA,GAAY,CAAA,SAAA,EAAY,IAAA,CAAK,UAAA,EAAY,CAAA,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,KAAA,KAAU;AACrD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,EAAE,WAAA,CAAY,OAAA;AAAA,UACd,EAAE,WAAA,CAAY,YAAA;AAAA,UACd,EAAE,WAAA,CAAY;AAAA,SAChB;AACA,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,MAAA,EAAQ,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,UACzB,IAAA,EAAM,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,UACnB,SAAA,EAAW,EAAE,aAAA,CAAc,KAAA;AAAA,UAC3B,KAAA,EAAO,EAAE,SAAA,EAAW,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,GAAA,EAAK,OAAA,EAAS,GAAA,IAAM;AAAE,SAC5E;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,CAAC,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAC9B,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,IAAA,EAAM,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,aAAA,CAAc,KAAA;AAAA,QAC3B,KAAA,EAAO,EAAE,SAAA,EAAW,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,GAAA,EAAK,OAAA,EAAS,GAAA,IAAM;AAAE,OAC5E;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,EAAE,SAAA,EAAW,QAAQ,CAAA;AAChD,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA,EAGQ,WAAW,KAAA,EAA4C;AAC7D,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,IAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,QAAA;AACH,UAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,UAAA;AAAA,QACF,KAAK,IAAA;AACH,UAAA,CAAA,CAAE,OAAA,GAAU,IAAA;AACZ,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,YAAY,EAAC;AACf,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,CAAA,CAAE,MAAA,GAAS,IAAA;AACX,UAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,CAAA,CAAE,IAAA,GAAO,aAAA;AACT,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,CAAA,CAAE,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,UAAU,EAAE,CAAA;AACxC,UAAA;AAAA,QACF,KAAK,UAAA,EAAY;AACf,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AACpC,UAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,UAAU,CAAA;AAC5E,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACnC,UAAA,IAAI,GAAA,IAAO,KAAA,GAAQ,GAAA;AACnB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACnC,UAAA,IAAI,GAAA,IAAO,OAAA,GAAU,EAAE,MAAM,CAAA,CAAE,WAAA,CAAY,KAAA,EAAO,IAAA,EAAM,GAAA,EAAI;AAC5D,UAAA;AAAA,QACF;AAEE;AACJ,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA,EAGQ,eAAe,OAAA,EAAgD;AACrE,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,QAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,IAAS,EAAC;AAC9B,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAChD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAC,CAAA;AACtE,QAAA,MAAM,GAAA,GAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,GAAG,OAAA,EAAS,CAAA;AAC/D,QAAA,IAAI,IAAA,EAAM,OAAO,IAAA,EAAM;AACrB,UAAA,MAAM,OAAOA,6BAAA,CAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAChD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAE,iBAAA,CAAkB,EAAE,QAAA,EAAU,CAAC,GAAG,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AACjE,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACd,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,YAAA,EAAc;AACrC,QAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,CAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,MACtC,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC9B,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,QACd,CAAA,MAAO;AAGL,UAAA,MAAM,GAAA,GAAM,KAAK,KAAA,EAAO,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,SAAA;AACvD,UAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,SAAS,IAAA,EAAoC;AACnD,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,OAAO,EAAE,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,4DAAA,CAA6D,IAAA,CAAK,GAAG,CAAA;AACnF,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,GAAA,KAAQ,MAAA,GAAS,KAAA,GAAQ,GAAA;AACtC,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,CAAC,CAAE,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA,IAAK,GAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,EAAE,QAAA,CAAS;AAAA,QACpB,IAAA;AAAA,QACA,IAAA;AAAA,QACA,cAAA,EAAgB,EAAE,KAAA,EAAO,MAAA;AAAO,OACjC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,UAAU,KAAA,EAAqD;AACrE,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,QAAQ,OAAO,KAAA;AAAO,MACpB,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,aAAA,CAAc,MAAA;AAAA,MACzB,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,aAAA,CAAc,KAAA;AAAA,MACzB,KAAK,SAAA;AACH,QAAA,OAAO,EAAE,aAAA,CAAc,SAAA;AAAA,MACzB,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,aAAA,CAAc,IAAA;AAAA,MACzB;AACE,QAAA,OAAO,MAAA;AAAA;AACX,EACF;AAAA,EAEQ,eAAe,IAAA,EAA6C;AAClE,IAAA,MAAM,QAAiC,EAAC;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,SAAA,GAAY,KAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,UAAU,CAAC,CAAA;AAC7C,IAAA,IAAI,SAAS,CAAA,EAAG,KAAA,CAAM,SAAS,EAAE,IAAA,EAAM,SAAS,qBAAA,EAAsB;AACtE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,UAAU,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,aAAa,CAAA,EAAG;AACjD,MAAA,KAAA,CAAM,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,UAAA,GAAa,GAAG,CAAA,EAAG,QAAA,EAAU,MAAA,EAAO;AAAA,IACzE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAa,KAAA,EAAwB;AAC3C,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,EAAE,YAAA,CAAa,SAAA;AAAA,MACf,EAAE,YAAA,CAAa,SAAA;AAAA,MACf,EAAE,YAAA,CAAa,SAAA;AAAA,MACf,EAAE,YAAA,CAAa,SAAA;AAAA,MACf,EAAE,YAAA,CAAa,SAAA;AAAA,MACf,EAAE,YAAA,CAAa;AAAA,KACjB;AACA,IAAA,OAAO,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,gBAAgB,KAAA,EAAkC;AAChD,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,cAAA,CAAe,IAAI,CAAC,CAAA;AAC/D,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,eAAe,IAAA,EAA+B;AACpD,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,EAAE,eAAA,EAAiB,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1F;AACA,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,WAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAI,EAAE,SAAA,CAAU;AAAA,YACd,GAAG,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,YAC3B,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,OAAO;AAAA,WAC3C;AAAA,SACH;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAI,EAAE,SAAA,CAAU;AAAA,YACd,GAAG,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,YAC3B,OAAA,EAAS,KAAK,YAAA,CAAa,MAAA,CAAO,KAAK,KAAA,EAAO,KAAA,IAAS,CAAC,CAAC,CAAA;AAAA,YACzD,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,OAAO;AAAA,WAC3C;AAAA,SACH;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAA,CAAQ,KAAK,OAAA,IAAW,EAAC,EAAG,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC7C,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACxC,UAAA,OAAO,MAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,KAAK,iBAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAI,EAAE,SAAA,CAAU;AAAA,YACd,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAE,OAAO,CAAA,CAAE,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,UAAS,EAAE;AAAA,YACtF,UAAU;AAAC,WACZ;AAAA,SACH;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAO,CAAC,IAAI,CAAA,CAAE,SAAA,CAAU,EAAE,QAAA,EAAU,CAAC,IAAI,CAAA,CAAE,SAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AAAA,MAC5D,KAAK,aAAA;AAAA,MACL,KAAK,cAAA;AACH,QAAA,OAAO,KAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,IAAA,KAAS,gBAAgB,CAAC,CAAA;AAAA,MACjE,KAAK,OAAA;AACH,QAAA,OAAO,CAAC,IAAA,CAAK,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,MACnC;AACE,QAAA,IAAI,KAAK,OAAA,EAAS,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAK,OAAO,CAAA;AAC1D,QAAA,OAAO,EAAC;AAAA;AACZ,EACF;AAAA,EAEQ,aAAA,CAAc,IAAA,EAAoB,OAAA,EAAkB,KAAA,EAA0B;AACpF,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG;AACrC,MAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC/B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,EAAC;AAClC,MAAA,MAAM,OAAA,GAAU,KAAK,KAAA,EAAO,OAAA;AAC5B,MAAA,MAAM,SACJ,OAAA,KAAY,IAAA,GAAO,SAAA,GAAO,OAAA,KAAY,QAAQ,SAAA,GAAO,EAAA;AAEvD,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC/B,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjE,UAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,MAAM,IAAA,KAAS,cAAA,EAAgB,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,QACjF,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAC9C,UAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAC,IAAI,CAAA,CAAE,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,GAAG,IAAI,CAAA,GAAI,IAAA;AACpE,UAAA,GAAA,CAAI,IAAA;AAAA,YACF,IAAI,EAAE,SAAA,CAAU;AAAA,cACd,SAAA,EAAW,EAAE,SAAA,EAAW,KAAA,EAAM;AAAA,cAC9B,QAAA,EAAU;AAAA,aACX;AAAA,WACH;AAAA,QACF,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,IAAA;AAAA,YACF,IAAI,EAAE,SAAA,CAAU;AAAA,cACd,MAAA,EAAQ,EAAE,IAAA,EAAA,CAAO,KAAA,GAAQ,KAAK,qBAAA,EAAsB;AAAA,cACpD,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAO;AAAA,aAC5C;AAAA,WACH;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,eAAe,IAAA,EAA6B;AAClD,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,OAAA,IAAW,IAC3B,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,KAAS,WAAW,CAAA,CACxC,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,SAAS,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS;AAC9C,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,UAAU,CAAA;AACzC,QAAA,OAAO,IAAI,EAAE,SAAA,CAAU;AAAA,UACrB,UAAU,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAAA,UACjD,YAAY,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,OAAA,IAAW,CAAC,CAAA,IAAK,CAAA;AAAA,UAChD,SAAS,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,OAAA,IAAW,CAAC,CAAA,IAAK,CAAA;AAAA,UAC7C,GAAI,IAAA,GAAO,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,CAAA,CAAE,WAAA,CAAY,KAAA,EAAO,IAAA,EAAK,EAAE,GAAI;AAAC,SAChE,CAAA;AAAA,MACH,CAAC,CAAA;AACD,MAAA,OAAO,IAAI,CAAA,CAAE,QAAA,CAAS,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,IAC3C,CAAC,CAAA;AACH,IAAA,OAAO,IAAI,EAAE,KAAA,CAAM;AAAA,MACjB,IAAA;AAAA,MACA,OAAO,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,CAAA,CAAE,UAAU,UAAA;AAAW,KAClD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,CAAM,GAAA,EAAmB,OAAA,EAA8C;AAC3E,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,QAAA,EAAS;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQC,8BAAA;AAC7B,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAIC,wCAAsB,IAAI,CAAA;AACpD,IAAA,MAAM,WAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA;AACvD,IAAA,MAAM,WAAW,CAAC,EAAA,KAAe,KAAK,KAAA,CAAO,EAAA,GAAK,OAAQ,IAAI,CAAA;AAE9D,IAAA,OAAO,IAAI,EAAE,QAAA,CAAS;AAAA,MACpB,SAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,gBAAA,EAA0B;AAAA,MACpD,QAAA,EAAU;AAAA,QACR;AAAA,UACE,UAAA,EAAY;AAAA,YACV,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,CAAS,KAAK,CAAA,EAAG,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAE;AAAA,cACzD,MAAA,EAAQ;AAAA,gBACN,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAAA,gBAC9B,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,gBAClC,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,gBACpC,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,IAAI;AAAA;AAClC;AACF,WACF;AAAA,UACA;AAAA;AACF;AACF,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,SAAS,cAAc,GAAA,EAAyB;AAC9C,EAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAK,GAAG,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AACtE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAC,CAAA;AAClD;AAGA,eAAsB,kBAAA,CACpB,GAAA,EACA,OAAA,GAA6B,EAAC,EACf;AACf,EAAA,MAAM,UAAA,GAAa,IAAI,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,KAAA,CAAM,KAAK,OAAO,CAAA;AACpD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,QAAA,EAAS;AAClC,EAAA,OAAO,MAAA,CAAO,OAAO,QAAiB,CAAA;AACxC;AAGA,eAAsB,oBAAA,CACpB,GAAA,EACA,OAAA,GAA6B,EAAC,EACb;AACjB,EAAA,MAAM,UAAA,GAAa,IAAI,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,KAAA,CAAM,KAAK,OAAO,CAAA;AACpD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,QAAA,EAAS;AAClC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAiB,CAAA;AAC1C","file":"chunk-OESUMEV7.cjs","sourcesContent":["import type { DocumentJSON } from '../config/types';\n\n/**\n * Options governing plain-text conversion (F-6.20). Defaults follow the\n * documented structure rules: blocks separated by blank lines, list items on\n * their own lines, table cells tab-delimited, images replaced by alt text,\n * links rendered as their text.\n */\nexport interface TextConversionOptions {\n /** Append the URL after link text as \" (url)\". Default false. */\n includeLinkUrls?: boolean;\n /** Replacement for images: 'alt' uses alt text, 'omit' drops them. Default 'alt'. */\n images?: 'alt' | 'omit';\n /** Newline sequence. Default '\\n'. */\n newline?: string;\n}\n\ninterface ResolvedOptions {\n includeLinkUrls: boolean;\n images: 'alt' | 'omit';\n newline: string;\n}\n\n/**\n * Convert a ProseMirror document (JSON) to plain text (F-6.18). Pure and\n * isomorphic: identical output in the browser and on the server (F-6.19).\n */\nexport function documentToText(doc: DocumentJSON, options: TextConversionOptions = {}): string {\n const opts: ResolvedOptions = {\n includeLinkUrls: options.includeLinkUrls ?? false,\n images: options.images ?? 'alt',\n newline: options.newline ?? '\\n',\n };\n const blocks = (doc.content ?? []).map((node) => serializeBlock(node, opts, 0));\n return blocks\n .filter((b) => b !== null)\n .join(opts.newline + opts.newline)\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction serializeBlock(node: DocumentJSON, opts: ResolvedOptions, depth: number): string | null {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return serializeInline(node.content ?? [], opts);\n case 'blockquote':\n return (node.content ?? [])\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .map((line) => `> ${line}`)\n .join(opts.newline);\n case 'bullet_list':\n case 'ordered_list':\n return serializeList(node, opts, depth);\n case 'horizontal_rule':\n return '---';\n case 'page_break':\n return '\\f';\n case 'table':\n return serializeTable(node, opts);\n default:\n // Unknown block: best-effort recurse so custom nodes still contribute text.\n if (node.content) {\n return node.content\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .join(opts.newline);\n }\n return node.text ?? null;\n }\n}\n\nfunction serializeList(node: DocumentJSON, opts: ResolvedOptions, depth: number): string {\n const ordered = node.type === 'ordered_list';\n const start = ordered ? Number(node.attrs?.order ?? 1) : 0;\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n let index = start;\n\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const checked = item.attrs?.checked;\n let marker: string;\n if (checked === true) marker = '[x]';\n else if (checked === false) marker = '[ ]';\n else if (ordered) marker = `${index}.`;\n else marker = '-';\n\n const children = item.content ?? [];\n const firstBlock = children[0];\n const firstText = firstBlock ? (serializeBlock(firstBlock, opts, depth) ?? '') : '';\n lines.push(`${indent}${marker} ${firstText}`.trimEnd());\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i]!;\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n lines.push(serializeList(child, opts, depth + 1));\n } else {\n const text = serializeBlock(child, opts, depth + 1);\n if (text) lines.push(`${indent} ${text}`);\n }\n }\n if (ordered) index++;\n }\n return lines.join(opts.newline);\n}\n\nfunction serializeTable(node: DocumentJSON, opts: ResolvedOptions): string {\n const rows: string[] = [];\n for (const row of node.content ?? []) {\n if (row.type !== 'table_row') continue;\n const cells = (row.content ?? []).map((cell) =>\n (cell.content ?? [])\n .map((block) => serializeBlock(block, opts, 0))\n .filter((b) => b !== null)\n .join(' ')\n .replace(/\\t/g, ' '),\n );\n rows.push(cells.join('\\t'));\n }\n return rows.join(opts.newline);\n}\n\nfunction serializeInline(content: DocumentJSON[], opts: ResolvedOptions): string {\n let out = '';\n for (const node of content) {\n if (node.type === 'text') {\n let text = node.text ?? '';\n if (opts.includeLinkUrls && node.marks) {\n const link = node.marks.find((m) => m.type === 'link');\n if (link?.attrs?.href) text = `${text} (${String(link.attrs.href)})`;\n }\n out += text;\n } else if (node.type === 'hard_break') {\n out += opts.newline;\n } else if (node.type === 'image') {\n if (opts.images === 'alt') {\n const alt = node.attrs?.alt;\n if (alt) out += String(alt);\n }\n } else if (node.content) {\n out += serializeInline(node.content, opts);\n }\n }\n return out;\n}\n","import type * as DocxNamespace from 'docx';\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE, resolvePageDimensions } from '../config/defaults';\nimport { sanitizeUrl } from '../security/sanitize';\n\n/**\n * Isomorphic DOCX serializer (§8.3). Walks the document JSON and emits OOXML via\n * the `docx` library, which runs in both the browser (Blob) and Node\n * (Buffer/Stream). A per-node mapping is used so custom nodes can register their\n * own conversion (F-6.16, F-10.14). The `docx` module is imported lazily so it\n * stays out of the initial bundle (NF-2) and remains optional.\n */\n\n/** A converter for a custom node type, returning docx block elements. */\nexport type DocxNodeConverter = (\n node: DocumentJSON,\n ctx: DocxContext,\n) => unknown[];\n\nexport interface DocxExportOptions {\n page?: PageConfig;\n title?: string;\n /** Custom node converters keyed by node type name (extension mapping). */\n nodeConverters?: Record<string, DocxNodeConverter>;\n}\n\nexport interface DocxContext {\n serializeBlocks: (nodes: DocumentJSON[]) => unknown[];\n docx: DocxModule;\n}\n\ntype DocxModule = typeof DocxNamespace;\n\nlet docxModulePromise: Promise<DocxModule> | null = null;\nasync function loadDocx(): Promise<DocxModule> {\n if (!docxModulePromise) {\n // Load `docx` through a variable specifier (with bundler-ignore hints) so\n // webpack/Vite/Next don't statically resolve it at build time. Consumers who\n // never export DOCX therefore don't need `docx` installed just to bundle the\n // editor — it is loaded on demand, and throws a clear error only if a DOCX\n // export is actually attempted without it.\n const specifier = 'docx';\n docxModulePromise = import(/* webpackIgnore: true */ /* @vite-ignore */ specifier).catch(\n () => {\n throw new Error(\n \"react-next-editor: DOCX export requires the optional 'docx' dependency. Install it (npm i docx).\",\n );\n },\n ) as Promise<DocxModule>;\n }\n return docxModulePromise;\n}\n\nconst HALF_POINT = 2; // docx font sizes are in half-points\nconst INDENT_TWIP_PER_LEVEL = 720; // 0.5 inch\n\nfunction toHex(value: unknown): string | null {\n const v = String(value ?? '').trim();\n const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);\n if (!m) return null;\n const hex = m[1]!;\n return hex.length === 3\n ? hex\n .split('')\n .map((c) => c + c)\n .join('')\n : hex;\n}\n\ninterface MarkJSON {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nclass DocxSerializer {\n private docx!: DocxModule;\n private numberingConfigs: unknown[] = [];\n private refCounter = 0;\n private converters: Record<string, DocxNodeConverter>;\n\n constructor(converters: Record<string, DocxNodeConverter> = {}) {\n this.converters = converters;\n }\n\n private allocListRef(ordered: boolean): string {\n const d = this.docx;\n const reference = `rne-list-${this.refCounter++}`;\n const levels = Array.from({ length: 9 }, (_, level) => {\n if (ordered) {\n const formats = [\n d.LevelFormat.DECIMAL,\n d.LevelFormat.LOWER_LETTER,\n d.LevelFormat.LOWER_ROMAN,\n ];\n return {\n level,\n format: formats[level % 3]!,\n text: `%${level + 1}.`,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n }\n const bullets = ['•', '◦', '▪'];\n return {\n level,\n format: d.LevelFormat.BULLET,\n text: bullets[level % 3]!,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n });\n this.numberingConfigs.push({ reference, levels });\n return reference;\n }\n\n /** Build run options from a text node's marks. */\n private runOptions(marks: MarkJSON[]): Record<string, unknown> {\n const d = this.docx;\n const o: Record<string, unknown> = {};\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n o.bold = true;\n break;\n case 'em':\n o.italics = true;\n break;\n case 'underline':\n o.underline = {};\n break;\n case 'strikethrough':\n o.strike = true;\n break;\n case 'superscript':\n o.superScript = true;\n break;\n case 'subscript':\n o.subScript = true;\n break;\n case 'code':\n o.font = 'Courier New';\n break;\n case 'fontFamily':\n o.font = String(mark.attrs?.family ?? '');\n break;\n case 'fontSize': {\n const size = Number(mark.attrs?.size);\n if (Number.isFinite(size) && size > 0) o.size = Math.round(size * HALF_POINT);\n break;\n }\n case 'textColor': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.color = hex;\n break;\n }\n case 'highlight': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.shading = { type: d.ShadingType.CLEAR, fill: hex };\n break;\n }\n default:\n break;\n }\n }\n return o;\n }\n\n /** Serialize inline content into docx runs / hyperlinks. */\n private inlineChildren(content: DocumentJSON[] | undefined): unknown[] {\n const d = this.docx;\n if (!content) return [];\n const out: unknown[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const marks = (node.marks ?? []) as MarkJSON[];\n const link = marks.find((m) => m.type === 'link');\n const runOpts = this.runOptions(marks.filter((m) => m.type !== 'link'));\n const run = new d.TextRun({ text: node.text ?? '', ...runOpts });\n if (link?.attrs?.href) {\n const href = sanitizeUrl(String(link.attrs.href));\n if (href) {\n out.push(new d.ExternalHyperlink({ children: [run], link: href }));\n continue;\n }\n }\n out.push(run);\n } else if (node.type === 'hard_break') {\n out.push(new d.TextRun({ break: 1 }));\n } else if (node.type === 'image') {\n const img = this.imageRun(node);\n if (img) {\n out.push(img);\n } else {\n // Remote images can't be embedded synchronously; preserve the alt text\n // (or a placeholder) so information is not silently lost (F-6.17).\n const alt = node.attrs?.alt ? String(node.attrs.alt) : '[image]';\n out.push(new d.TextRun({ text: alt, italics: true }));\n }\n }\n }\n return out;\n }\n\n private imageRun(node: DocumentJSON): unknown | null {\n const d = this.docx;\n const src = String(node.attrs?.src ?? '');\n const match = /^data:image\\/(png|jpe?g|gif|bmp);base64,([A-Za-z0-9+/=]+)$/.exec(src);\n if (!match) return null; // remote images can't be fetched synchronously; skipped\n const raw = match[1]!;\n const type = raw === 'jpeg' ? 'jpg' : raw;\n const data = base64ToUint8(match[2]!);\n const width = Number(node.attrs?.width) || 300;\n const height = Math.round(width * 0.75);\n try {\n return new d.ImageRun({\n data,\n type: type as 'png' | 'jpg' | 'gif' | 'bmp',\n transformation: { width, height },\n });\n } catch {\n return null;\n }\n }\n\n private alignment(attrs: Record<string, unknown> | undefined): unknown {\n const d = this.docx;\n switch (attrs?.align) {\n case 'center':\n return d.AlignmentType.CENTER;\n case 'right':\n return d.AlignmentType.RIGHT;\n case 'justify':\n return d.AlignmentType.JUSTIFIED;\n case 'left':\n return d.AlignmentType.LEFT;\n default:\n return undefined;\n }\n }\n\n private paragraphProps(node: DocumentJSON): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const align = this.alignment(node.attrs);\n if (align !== undefined) props.alignment = align;\n const indent = Number(node.attrs?.indent ?? 0);\n if (indent > 0) props.indent = { left: indent * INDENT_TWIP_PER_LEVEL };\n const lineHeight = Number(node.attrs?.lineHeight);\n if (Number.isFinite(lineHeight) && lineHeight > 0) {\n props.spacing = { line: Math.round(lineHeight * 240), lineRule: 'auto' };\n }\n return props;\n }\n\n private headingLevel(level: number): unknown {\n const d = this.docx;\n const map = [\n d.HeadingLevel.HEADING_1,\n d.HeadingLevel.HEADING_2,\n d.HeadingLevel.HEADING_3,\n d.HeadingLevel.HEADING_4,\n d.HeadingLevel.HEADING_5,\n d.HeadingLevel.HEADING_6,\n ];\n return map[Math.min(5, Math.max(0, level - 1))];\n }\n\n serializeBlocks(nodes: DocumentJSON[]): unknown[] {\n const out: unknown[] = [];\n for (const node of nodes) out.push(...this.serializeBlock(node));\n return out;\n }\n\n private serializeBlock(node: DocumentJSON): unknown[] {\n const d = this.docx;\n const custom = this.converters[node.type];\n if (custom) {\n return custom(node, { serializeBlocks: (n) => this.serializeBlocks(n), docx: this.docx });\n }\n switch (node.type) {\n case 'paragraph':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'heading':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n heading: this.headingLevel(Number(node.attrs?.level ?? 1)) as never,\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'blockquote':\n return (node.content ?? []).flatMap((child) => {\n const blocks = this.serializeBlock(child);\n return blocks;\n });\n case 'horizontal_rule':\n return [\n new d.Paragraph({\n border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, space: 1, color: '999999' } },\n children: [],\n }),\n ];\n case 'page_break':\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case 'bullet_list':\n case 'ordered_list':\n return this.serializeList(node, node.type === 'ordered_list', 0);\n case 'table':\n return [this.serializeTable(node)];\n default:\n if (node.content) return this.serializeBlocks(node.content);\n return [];\n }\n }\n\n private serializeList(node: DocumentJSON, ordered: boolean, level: number): unknown[] {\n const d = this.docx;\n const reference = this.allocListRef(ordered);\n const out: unknown[] = [];\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const children = item.content ?? [];\n const checked = item.attrs?.checked;\n const prefix =\n checked === true ? '☑ ' : checked === false ? '☐ ' : '';\n\n children.forEach((child, idx) => {\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n out.push(...this.serializeList(child, child.type === 'ordered_list', level + 1));\n } else if (idx === 0) {\n const runs = this.inlineChildren(child.content);\n const first = prefix ? [new d.TextRun({ text: prefix }), ...runs] : runs;\n out.push(\n new d.Paragraph({\n numbering: { reference, level },\n children: first as never,\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n indent: { left: (level + 1) * INDENT_TWIP_PER_LEVEL },\n children: this.inlineChildren(child.content) as never,\n }),\n );\n }\n });\n }\n return out;\n }\n\n private serializeTable(node: DocumentJSON): unknown {\n const d = this.docx;\n const rows = (node.content ?? [])\n .filter((row) => row.type === 'table_row')\n .map((row) => {\n const cells = (row.content ?? []).map((cell) => {\n const fill = toHex(cell.attrs?.background);\n return new d.TableCell({\n children: this.serializeBlocks(cell.content ?? []) as never,\n columnSpan: Number(cell.attrs?.colspan ?? 1) || 1,\n rowSpan: Number(cell.attrs?.rowspan ?? 1) || 1,\n ...(fill ? { shading: { type: d.ShadingType.CLEAR, fill } } : {}),\n });\n });\n return new d.TableRow({ children: cells });\n });\n return new d.Table({\n rows,\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n });\n }\n\n async build(doc: DocumentJSON, options: DocxExportOptions): Promise<unknown> {\n this.docx = await loadDocx();\n const d = this.docx;\n const page = options.page ?? DEFAULT_PAGE;\n const { width, height } = resolvePageDimensions(page);\n const children = this.serializeBlocks(doc.content ?? []);\n const mmToTwip = (mm: number) => Math.round((mm / 25.4) * 1440);\n\n return new d.Document({\n numbering: { config: this.numberingConfigs as never },\n sections: [\n {\n properties: {\n page: {\n size: { width: mmToTwip(width), height: mmToTwip(height) },\n margin: {\n top: mmToTwip(page.margins.top),\n right: mmToTwip(page.margins.right),\n bottom: mmToTwip(page.margins.bottom),\n left: mmToTwip(page.margins.left),\n },\n },\n },\n children: children as never,\n },\n ],\n });\n }\n}\n\nfunction base64ToUint8(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n }\n // Node fallback.\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Serialize a document to a DOCX Blob for client-side download (F-6.1, F-6.6). */\nexport async function documentToDocxBlob(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Blob> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBlob(document as never);\n}\n\n/** Serialize a document to a DOCX Buffer for server-side storage (F-6.10). */\nexport async function documentToDocxBuffer(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Buffer> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBuffer(document as never);\n}\n"]}
|
package/dist/export/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkG7ELDC53_cjs = require('../chunk-G7ELDC53.cjs');
|
|
4
|
+
var chunkOESUMEV7_cjs = require('../chunk-OESUMEV7.cjs');
|
|
5
5
|
var chunkTI44I654_cjs = require('../chunk-TI44I654.cjs');
|
|
6
6
|
require('../chunk-TXPLBAH5.cjs');
|
|
7
7
|
require('../chunk-5F6SPYCN.cjs');
|
|
@@ -12,31 +12,31 @@ require('../chunk-Q7SFCCGT.cjs');
|
|
|
12
12
|
|
|
13
13
|
Object.defineProperty(exports, "downloadBlob", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkG7ELDC53_cjs.downloadBlob; }
|
|
16
16
|
});
|
|
17
17
|
Object.defineProperty(exports, "downloadText", {
|
|
18
18
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkG7ELDC53_cjs.downloadText; }
|
|
20
20
|
});
|
|
21
21
|
Object.defineProperty(exports, "exportDocument", {
|
|
22
22
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkG7ELDC53_cjs.exportDocument; }
|
|
24
24
|
});
|
|
25
25
|
Object.defineProperty(exports, "printDocumentToPdf", {
|
|
26
26
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkG7ELDC53_cjs.printDocumentToPdf; }
|
|
28
28
|
});
|
|
29
29
|
Object.defineProperty(exports, "documentToDocxBlob", {
|
|
30
30
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkOESUMEV7_cjs.documentToDocxBlob; }
|
|
32
32
|
});
|
|
33
33
|
Object.defineProperty(exports, "documentToDocxBuffer", {
|
|
34
34
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkOESUMEV7_cjs.documentToDocxBuffer; }
|
|
36
36
|
});
|
|
37
37
|
Object.defineProperty(exports, "documentToText", {
|
|
38
38
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
39
|
+
get: function () { return chunkOESUMEV7_cjs.documentToText; }
|
|
40
40
|
});
|
|
41
41
|
Object.defineProperty(exports, "buildPrintDocument", {
|
|
42
42
|
enumerable: true,
|
package/dist/export/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { downloadBlob, downloadText, exportDocument, printDocumentToPdf } from '../chunk-
|
|
2
|
-
export { documentToDocxBlob, documentToDocxBuffer, documentToText } from '../chunk-
|
|
1
|
+
export { downloadBlob, downloadText, exportDocument, printDocumentToPdf } from '../chunk-ABNK7F64.js';
|
|
2
|
+
export { documentToDocxBlob, documentToDocxBuffer, documentToText } from '../chunk-65YACENL.js';
|
|
3
3
|
export { buildPrintDocument, documentToHtml, printStylesheet } from '../chunk-7VYJDBH7.js';
|
|
4
4
|
import '../chunk-T6FR37IC.js';
|
|
5
5
|
import '../chunk-6NTSXJX4.js';
|
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkDBSFCCBG_cjs = require('./chunk-DBSFCCBG.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkG7ELDC53_cjs = require('./chunk-G7ELDC53.cjs');
|
|
5
5
|
var chunk3QWXTDLY_cjs = require('./chunk-3QWXTDLY.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkOESUMEV7_cjs = require('./chunk-OESUMEV7.cjs');
|
|
7
7
|
require('./chunk-EFE6RHDL.cjs');
|
|
8
8
|
var chunkODHABIIC_cjs = require('./chunk-ODHABIIC.cjs');
|
|
9
9
|
var chunkTI44I654_cjs = require('./chunk-TI44I654.cjs');
|
|
@@ -612,7 +612,7 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
|
|
|
612
612
|
const handle = react.useMemo(
|
|
613
613
|
() => ({
|
|
614
614
|
getJSON,
|
|
615
|
-
getText: (options) =>
|
|
615
|
+
getText: (options) => chunkOESUMEV7_cjs.documentToText(getJSON(), options),
|
|
616
616
|
getHTML: () => chunkTI44I654_cjs.documentToHtml(getJSON()),
|
|
617
617
|
setContent,
|
|
618
618
|
importDocx: importDocxIntoEditor,
|
|
@@ -624,7 +624,7 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
|
|
|
624
624
|
clearLocalData: async () => {
|
|
625
625
|
await persistenceRef.current?.clearLocal();
|
|
626
626
|
},
|
|
627
|
-
exportAs: (format, filename) =>
|
|
627
|
+
exportAs: (format, filename) => chunkG7ELDC53_cjs.exportDocument(getJSON(), format, {
|
|
628
628
|
filename: filename ?? propsRef.current.documentId,
|
|
629
629
|
page: cfgRef.current.page,
|
|
630
630
|
title: filename ?? propsRef.current.documentId
|
|
@@ -769,6 +769,7 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
|
|
|
769
769
|
react.useEffect(() => {
|
|
770
770
|
const view = viewRef.current;
|
|
771
771
|
if (!view || props.value == null) return;
|
|
772
|
+
if (view.hasFocus()) return;
|
|
772
773
|
const current = JSON.stringify(view.state.doc.toJSON());
|
|
773
774
|
const next = JSON.stringify(props.value);
|
|
774
775
|
if (current === next) return;
|
|
@@ -874,6 +875,44 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
|
|
|
874
875
|
var Editor = react.forwardRef(function Editor2(props, ref) {
|
|
875
876
|
return /* @__PURE__ */ jsxRuntime.jsx(EditorErrorBoundary, { onError: props.onError, children: /* @__PURE__ */ jsxRuntime.jsx(EditorInner, { ...props, ref }) });
|
|
876
877
|
});
|
|
878
|
+
function toDoc(value) {
|
|
879
|
+
if (!value) return null;
|
|
880
|
+
if (typeof value === "string") {
|
|
881
|
+
try {
|
|
882
|
+
const parsed = JSON.parse(value);
|
|
883
|
+
return parsed?.type === "doc" ? parsed : null;
|
|
884
|
+
} catch {
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
return value.type === "doc" ? value : null;
|
|
889
|
+
}
|
|
890
|
+
function DocumentView({ value, className, style }) {
|
|
891
|
+
const [sanitizerReady, setSanitizerReady] = react.useState(false);
|
|
892
|
+
react.useEffect(() => {
|
|
893
|
+
let alive = true;
|
|
894
|
+
void chunk5F6SPYCN_cjs.preloadSanitizer().then(() => {
|
|
895
|
+
if (alive) setSanitizerReady(true);
|
|
896
|
+
});
|
|
897
|
+
return () => {
|
|
898
|
+
alive = false;
|
|
899
|
+
};
|
|
900
|
+
}, []);
|
|
901
|
+
const html = react.useMemo(() => {
|
|
902
|
+
const doc = toDoc(value);
|
|
903
|
+
if (!doc) return "";
|
|
904
|
+
const raw = chunkTI44I654_cjs.documentToHtml(doc);
|
|
905
|
+
return sanitizerReady ? chunk5F6SPYCN_cjs.sanitizeHtmlSync(raw) : raw;
|
|
906
|
+
}, [value, sanitizerReady]);
|
|
907
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
908
|
+
"div",
|
|
909
|
+
{
|
|
910
|
+
className: `rne-root rne-document-view${className ? ` ${className}` : ""}`,
|
|
911
|
+
style,
|
|
912
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
913
|
+
}
|
|
914
|
+
);
|
|
915
|
+
}
|
|
877
916
|
|
|
878
917
|
Object.defineProperty(exports, "buildPlugins", {
|
|
879
918
|
enumerable: true,
|
|
@@ -905,19 +944,19 @@ Object.defineProperty(exports, "defaultSchema", {
|
|
|
905
944
|
});
|
|
906
945
|
Object.defineProperty(exports, "downloadBlob", {
|
|
907
946
|
enumerable: true,
|
|
908
|
-
get: function () { return
|
|
947
|
+
get: function () { return chunkG7ELDC53_cjs.downloadBlob; }
|
|
909
948
|
});
|
|
910
949
|
Object.defineProperty(exports, "downloadText", {
|
|
911
950
|
enumerable: true,
|
|
912
|
-
get: function () { return
|
|
951
|
+
get: function () { return chunkG7ELDC53_cjs.downloadText; }
|
|
913
952
|
});
|
|
914
953
|
Object.defineProperty(exports, "exportDocument", {
|
|
915
954
|
enumerable: true,
|
|
916
|
-
get: function () { return
|
|
955
|
+
get: function () { return chunkG7ELDC53_cjs.exportDocument; }
|
|
917
956
|
});
|
|
918
957
|
Object.defineProperty(exports, "printDocumentToPdf", {
|
|
919
958
|
enumerable: true,
|
|
920
|
-
get: function () { return
|
|
959
|
+
get: function () { return chunkG7ELDC53_cjs.printDocumentToPdf; }
|
|
921
960
|
});
|
|
922
961
|
Object.defineProperty(exports, "ConflictError", {
|
|
923
962
|
enumerable: true,
|
|
@@ -949,15 +988,15 @@ Object.defineProperty(exports, "requestPersistentStorage", {
|
|
|
949
988
|
});
|
|
950
989
|
Object.defineProperty(exports, "documentToDocxBlob", {
|
|
951
990
|
enumerable: true,
|
|
952
|
-
get: function () { return
|
|
991
|
+
get: function () { return chunkOESUMEV7_cjs.documentToDocxBlob; }
|
|
953
992
|
});
|
|
954
993
|
Object.defineProperty(exports, "documentToDocxBuffer", {
|
|
955
994
|
enumerable: true,
|
|
956
|
-
get: function () { return
|
|
995
|
+
get: function () { return chunkOESUMEV7_cjs.documentToDocxBuffer; }
|
|
957
996
|
});
|
|
958
997
|
Object.defineProperty(exports, "documentToText", {
|
|
959
998
|
enumerable: true,
|
|
960
|
-
get: function () { return
|
|
999
|
+
get: function () { return chunkOESUMEV7_cjs.documentToText; }
|
|
961
1000
|
});
|
|
962
1001
|
Object.defineProperty(exports, "importDocx", {
|
|
963
1002
|
enumerable: true,
|
|
@@ -1023,6 +1062,7 @@ Object.defineProperty(exports, "themeToCssVars", {
|
|
|
1023
1062
|
enumerable: true,
|
|
1024
1063
|
get: function () { return chunkU3O54IYI_cjs.themeToCssVars; }
|
|
1025
1064
|
});
|
|
1065
|
+
exports.DocumentView = DocumentView;
|
|
1026
1066
|
exports.Editor = Editor;
|
|
1027
1067
|
exports.EditorContext = EditorContext;
|
|
1028
1068
|
exports.EditorErrorBoundary = EditorErrorBoundary;
|