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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/export/text.ts","../src/export/docx.ts"],"names":[],"mappings":"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","file":"chunk-QROUNVQK.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) docxModulePromise = import('docx');\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"]}