@4399ywkf/editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -0
- package/dist/DocView-5KS7B4DA.js +18 -0
- package/dist/DocView-5KS7B4DA.js.map +1 -0
- package/dist/PdfView-JDCHTG7Y.js +3 -0
- package/dist/PdfView-JDCHTG7Y.js.map +1 -0
- package/dist/SheetView-2EID6B2I.js +3 -0
- package/dist/SheetView-2EID6B2I.js.map +1 -0
- package/dist/chunk-G6WM2PSU.js +21838 -0
- package/dist/chunk-G6WM2PSU.js.map +1 -0
- package/dist/chunk-IRALXCLP.js +55 -0
- package/dist/chunk-IRALXCLP.js.map +1 -0
- package/dist/chunk-RJUDOUEZ.js +56 -0
- package/dist/chunk-RJUDOUEZ.js.map +1 -0
- package/dist/doc.d.ts +1108 -0
- package/dist/doc.js +39 -0
- package/dist/doc.js.map +1 -0
- package/dist/docx.d.ts +184 -0
- package/dist/docx.js +1181 -0
- package/dist/docx.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/pdf.d.ts +13 -0
- package/dist/pdf.js +3 -0
- package/dist/pdf.js.map +1 -0
- package/dist/registry-CvGg65s9.d.ts +68 -0
- package/dist/sheet.d.ts +16 -0
- package/dist/sheet.js +3 -0
- package/dist/sheet.js.map +1 -0
- package/dist/style.css +5689 -0
- package/package.json +125 -0
package/dist/docx.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/docx/nodes/field.ts","../src/docx/nodes/ink.ts","../src/docx/parse.ts","../src/docx/serialize.ts","../src/docx/export.ts","../src/docx/index.ts"],"names":["Node","mergeAttributes","EMU_PER_PX","Extension"],"mappings":"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","file":"docx.js","sourcesContent":["import { Node, mergeAttributes } from '@tiptap/core'\n\n/**\n * DocxField —— Word 的域(`w:fldSimple` / `fldChar`),比如 `SEQ Figure \\* ARABIC`、\n * `PAGE`、`TOC`、`DATE`。\n *\n * 域是「代码 + Word 算好的缓存显示值」两部分。mammoth 遇到不认识的元素整个跳过,\n * 连缓存值一起丢 —— 这就是为什么 \"Figure 1\" 变成了 \"Figure\"。\n *\n * 这个节点的做法:\n * - 渲染缓存值(用户看到 `1`,和 Word 里一样)\n * - 域代码留在 `code` attr 里,导出时能原样写回\n *\n * 它是 **atom**:AI 和用户可以整体移动、删除,但改不了内部 —— 这是对的语义,\n * 因为域的值是算出来的,不该被手改。想改内容应该改域代码。\n */\nexport interface DocxFieldAttrs {\n /** 域代码原文,如 `SEQ Figure \\* ARABIC` */\n code: string | null\n /** Word 算好并缓存在文件里的显示值 */\n cached: string\n}\n\nexport const DocxField = Node.create({\n name: 'docxField',\n group: 'inline',\n inline: true,\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n code: { default: null, parseHTML: (el) => el.getAttribute('data-field-code') },\n cached: { default: '', parseHTML: (el) => el.textContent ?? '' },\n }\n },\n\n parseHTML() {\n return [{ tag: 'span[data-docx-field]' }]\n },\n\n renderHTML({ HTMLAttributes, node }) {\n const a = node.attrs as unknown as DocxFieldAttrs\n return [\n 'span',\n mergeAttributes(HTMLAttributes, {\n 'data-docx-field': '',\n 'data-field-code': a.code ?? '',\n class: 'docx-field',\n title: a.code ? `Word 域:${a.code}` : 'Word 域',\n }),\n a.cached || '',\n ]\n },\n})\n","import { Node, mergeAttributes } from '@tiptap/core'\n\n/**\n * DocxInk —— Word 的手写墨迹(`w14:contentPart`)。\n *\n * 两件事 ProseMirror 的语义树本来表达不了,这个节点把它们接住:\n *\n * 1. **矢量墨迹数据**。渲染用 Word 自带的 PNG 回退(`src`),但原始\n * `ink/inkN.xml` 的引用留在 `strokes` 里,导出时能原样写回,不丢。\n *\n * 2. **浮动定位**。Word 的 `wp:anchor` + `wrapNone` 语义是「浮于文字上方,\n * 不参与布局」。如果按普通图片渲染成块级,它会把正文挤下去 —— 那就不是\n * 原文的样子了。所以这里是 **inline atom + position:absolute**:\n * 不占据行内宽度、不影响文字排布,只是叠在上面。\n *\n * 坐标来自 `wp:posOffset`(EMU),由 parse 层换算成 px 后存进 attrs。\n * `relativeV=\"paragraph\"` 意味着 y 是相对**所在段落**的,所以承载它的段落\n * 需要 `position: relative` —— 见 addGlobalAttributes 之外的注入样式。\n */\nexport interface DocxInkAttrs {\n /** Word 自带的位图回退,用来渲染 */\n src: string | null\n /** 原始矢量数据在 docx 包内的路径,如 `ink/ink1.xml` */\n strokes: string | null\n /** 原始矢量 XML 内容,导出时写回,保证往返不丢 */\n strokesXml: string | null\n /** 相对锚点的横向偏移(px) */\n x: number\n /** 相对所在段落的纵向偏移(px),可以为负(浮到段落上方) */\n y: number\n width: number\n height: number\n /** OOXML 的环绕方式:none / square / tight / through / topandbottom */\n wrap: string\n /** true = 浮在文字下方(水印那种) */\n behindDoc: boolean\n}\n\nexport const DocxInk = Node.create({\n name: 'docxInk',\n group: 'inline',\n inline: true,\n atom: true,\n draggable: false,\n selectable: true,\n\n addAttributes() {\n return {\n src: { default: null },\n strokes: { default: null },\n /** 矢量墨迹的原始 XML 内容。存内容而非路径,才能脱离原始 .docx 往返 */\n strokesXml: { default: null },\n x: { default: 0, parseHTML: (el) => Number(el.getAttribute('data-x')) || 0 },\n y: { default: 0, parseHTML: (el) => Number(el.getAttribute('data-y')) || 0 },\n width: { default: 0, parseHTML: (el) => Number(el.getAttribute('data-w')) || 0 },\n height: { default: 0, parseHTML: (el) => Number(el.getAttribute('data-h')) || 0 },\n wrap: { default: 'none' },\n behindDoc: { default: false },\n }\n },\n\n parseHTML() {\n return [{ tag: 'span[data-docx-ink]' }]\n },\n\n renderHTML({ HTMLAttributes, node }) {\n const a = node.attrs as unknown as DocxInkAttrs\n const floating = a.wrap === 'none'\n\n // wrapNone → 绝对定位,完全脱离文档流;其它环绕方式退化成 float,\n // 至少让文字绕着走而不是被整块推开。\n const style = floating\n ? [\n 'position:absolute',\n `left:${a.x}px`,\n `top:${a.y}px`,\n a.width ? `width:${a.width}px` : '',\n a.height ? `height:${a.height}px` : '',\n `z-index:${a.behindDoc ? -1 : 1}`,\n 'pointer-events:none',\n ]\n .filter(Boolean)\n .join(';')\n : [`float:${a.x > 0 ? 'right' : 'left'}`, a.width ? `width:${a.width}px` : ''].filter(Boolean).join(';')\n\n return [\n 'span',\n mergeAttributes(HTMLAttributes, {\n 'data-docx-ink': '',\n 'data-x': String(a.x),\n 'data-y': String(a.y),\n 'data-w': String(a.width),\n 'data-h': String(a.height),\n 'data-strokes': a.strokes ?? '',\n class: 'docx-ink',\n style,\n }),\n a.src\n ? ['img', { src: a.src, alt: '手写墨迹', style: 'width:100%;height:100%;display:block' }]\n : ['span', { class: 'docx-ink-placeholder' }, '✍︎'],\n ]\n },\n})\n","/**\n * OOXML → tiptap JSONContent。\n *\n * 同构:解压和 XML 解析都由调用方注入,所以浏览器(fflate + 原生 DOMParser)\n * 和 Node(任意 zip 库 + @xmldom/xmldom)共用这一份实现,不存在两份真相。\n *\n * 覆盖范围刻意窄 —— 只做「通用转换器会丢、而我们在意」的那几类:\n * · 样式定义里的字符格式(大多数 Word 文档的视觉身份住在这里,不在 run 上)\n * · 域(保代码 + 缓存值)\n * · 墨迹(保位图回退 + 矢量引用 + 浮动定位)\n * · 浮动锚定的几何信息\n *\n * 常规内容(段落/标题/列表/表格/图片)本来就有成熟方案,这里做的是最小可用版本。\n */\n\nconst EMU_PER_PX = 9525\n\nexport interface DocxEntries {\n /** 读取 docx 包内某个条目;不存在返回 null */\n read(entryPath: string): Uint8Array | null\n}\n\nexport interface ParseDocxOptions {\n /** 浏览器传原生 DOMParser,Node 传 @xmldom/xmldom 的 */\n DOMParser: { new (): { parseFromString(s: string, t: string): Document } }\n /**\n * 把包内的图片交给宿主落盘/上传,返回可访问的 URL。\n * 不提供则退化成 data: URI(小文档可以,大文档会撑爆)。\n */\n resolveMedia?: (bytes: Uint8Array, entryPath: string) => string\n /**\n * 重命名导入产出的节点类型,对齐官方 `prosemirrorNodes`。\n * 例:`{ image: 'customImage' }` —— 宿主 schema 里叫别的名字时用。\n */\n prosemirrorNodes?: Record<string, string>\n /** 重命名产出的标记类型,对齐官方 `prosemirrorMarks` */\n prosemirrorMarks?: Record<string, string>\n /** 抽取文档默认样式为 CSS 字符串,对齐官方 `cssStyles` */\n cssStyles?: boolean\n}\n\nexport interface ParseDocxResult {\n doc: Record<string, unknown>\n /** 各类恢复项的计数,用于量化「补这一层救回了多少」 */\n recovered: Record<string, number>\n warnings: string[]\n /** `cssStyles: true` 时给出的文档默认样式 */\n css?: string\n}\n\ntype El = Element\n\nconst decoder = new TextDecoder('utf-8')\n\nexport function parseDocx(entries: DocxEntries, opts: ParseDocxOptions): ParseDocxResult {\n const { DOMParser } = opts\n const recovered: Record<string, number> = {\n styleFormat: 0,\n directFormat: 0,\n fields: 0,\n ink: 0,\n floatImages: 0,\n inlineImages: 0,\n trackedIns: 0,\n trackedDel: 0,\n tables: 0,\n tableCells: 0,\n mergedCells: 0,\n cellShading: 0,\n lists: 0,\n listItems: 0,\n }\n const warnings: string[] = []\n\n const text = (p: string): string | null => {\n const b = entries.read(p)\n return b ? decoder.decode(b) : null\n }\n const xml = (p: string): Document | null => {\n const t = text(p)\n return t ? new DOMParser().parseFromString(t, 'text/xml') : null\n }\n\n /* ------------------------------ 关系 ------------------------------ */\n const REL: Record<string, string> = {}\n const relsDoc = xml('word/_rels/document.xml.rels')\n if (relsDoc) {\n for (const r of Array.from(relsDoc.getElementsByTagName('Relationship'))) {\n const id = r.getAttribute('Id')\n const target = r.getAttribute('Target')\n if (id && target) REL[id] = target\n }\n }\n\n /* ------------------------------ 样式 ------------------------------ */\n interface Fmt {\n b?: boolean\n i?: boolean\n u?: boolean\n strike?: boolean\n color?: string\n }\n const STYLE_NAME: Record<string, string> = {}\n const STYLE_FMT: Record<string, Fmt> = {}\n const STYLE_BASE: Record<string, string | null> = {}\n\n const stylesDoc = xml('word/styles.xml')\n if (stylesDoc) {\n for (const s of Array.from(stylesDoc.getElementsByTagName('w:style'))) {\n const id = s.getAttribute('w:styleId')\n if (!id) continue\n const name = s.getElementsByTagName('w:name')[0]?.getAttribute('w:val')\n if (name) STYLE_NAME[id] = name\n STYLE_BASE[id] = s.getElementsByTagName('w:basedOn')[0]?.getAttribute('w:val') ?? null\n const rPr = Array.from(s.childNodes).find(\n (c) => c.nodeType === 1 && (c as El).nodeName === 'w:rPr',\n ) as El | undefined\n if (!rPr) continue\n STYLE_FMT[id] = readFmt(rPr)\n }\n }\n\n function readFmt(rPr: El): Fmt {\n const on = (t: string) => {\n const e = rPr.getElementsByTagName(t)[0]\n if (!e) return undefined\n const v = e.getAttribute('w:val')\n return v !== '0' && v !== 'false' && v !== 'none' ? true : undefined\n }\n const color = rPr.getElementsByTagName('w:color')[0]?.getAttribute('w:val')\n return {\n b: on('w:b'),\n i: on('w:i'),\n u: on('w:u'),\n strike: on('w:strike'),\n color: color && color !== 'auto' ? `#${color}` : undefined,\n }\n }\n\n /** 顺 w:basedOn 链合并,子样式覆盖父样式 */\n function resolveStyleFmt(id: string | null, seen = new Set<string>()): Fmt {\n if (!id || seen.has(id)) return {}\n seen.add(id)\n const merged: Fmt = { ...resolveStyleFmt(STYLE_BASE[id] ?? null, seen) }\n for (const [k, v] of Object.entries(STYLE_FMT[id] ?? {})) {\n if (v !== undefined) (merged as Record<string, unknown>)[k] = v\n }\n return merged\n }\n\n function fmtToMarks(f: Fmt) {\n const marks: Record<string, unknown>[] = []\n if (f.b) marks.push({ type: 'bold' })\n if (f.i) marks.push({ type: 'italic' })\n if (f.u) marks.push({ type: 'underline' })\n if (f.strike) marks.push({ type: 'strike' })\n if (f.color) marks.push({ type: 'textStyle', attrs: { color: f.color } })\n return marks\n }\n\n /* ------------------------------ 媒体 ------------------------------ */\n const mediaCache = new Map<string, string | null>()\n function mediaUrl(target: string | undefined): string | null {\n if (!target) return null\n const entry = `word/${target.replace(/^\\.\\//, '')}`\n if (mediaCache.has(entry)) return mediaCache.get(entry) ?? null\n const bytes = entries.read(entry)\n if (!bytes) {\n warnings.push(`找不到媒体条目 ${entry}`)\n mediaCache.set(entry, null)\n return null\n }\n const url = opts.resolveMedia\n ? opts.resolveMedia(bytes, entry)\n : `data:image/png;base64,${bytesToBase64(bytes)}`\n mediaCache.set(entry, url)\n return url\n }\n\n /* ------------------------------ 遍历 ------------------------------ */\n const docXml = xml('word/document.xml')\n if (!docXml) throw new Error('这不是一个有效的 .docx:缺少 word/document.xml')\n\n const kids = (n: Node): El[] =>\n Array.from(n.childNodes).filter((c) => c.nodeType === 1) as El[]\n const first = (n: El, name: string): El | null => n.getElementsByTagName(name)[0] ?? null\n\n /** wp:anchor / wp:inline → 几何 + 图片 URL */\n function readDrawing(dr: El) {\n const anchor = first(dr, 'wp:anchor')\n const inline = first(dr, 'wp:inline')\n const holder = anchor ?? inline\n if (!holder) return null\n const blip = first(holder, 'a:blip')\n const rid = blip?.getAttribute('r:embed') ?? blip?.getAttribute('r:link') ?? undefined\n const src = mediaUrl(rid ? REL[rid] : undefined)\n const ext = first(holder, 'wp:extent')\n const width = Math.round(Number(ext?.getAttribute('cx') ?? 0) / EMU_PER_PX)\n const height = Math.round(Number(ext?.getAttribute('cy') ?? 0) / EMU_PER_PX)\n const alt = first(holder, 'wp:docPr')?.getAttribute('descr') ?? null\n\n if (!anchor) return { src, width, height, alt, floating: false as const }\n\n const offset = (axis: 'wp:positionH' | 'wp:positionV') => {\n const p = first(anchor, axis)\n const off = p ? first(p, 'wp:posOffset') : null\n return off ? Math.round(Number(off.textContent) / EMU_PER_PX) : 0\n }\n const wrapEl = ['wp:wrapNone', 'wp:wrapSquare', 'wp:wrapTight', 'wp:wrapThrough', 'wp:wrapTopAndBottom'].find(\n (w) => first(anchor, w),\n )\n return {\n src,\n width,\n height,\n alt,\n floating: true as const,\n x: offset('wp:positionH'),\n y: offset('wp:positionV'),\n wrap: wrapEl ? wrapEl.replace('wp:wrap', '').toLowerCase() : 'none',\n behindDoc: anchor.getAttribute('behindDoc') === '1',\n }\n }\n\n /** mc:AlternateContent:Choice 里是墨迹就走墨迹,几何从 Fallback 的 anchor 拿 */\n function readAlternate(alt: El) {\n const choice = first(alt, 'mc:Choice')\n const fallback = first(alt, 'mc:Fallback')\n const cp = choice ? first(choice, 'w14:contentPart') : null\n const fbDrawing = fallback ? first(fallback, 'w:drawing') : null\n const geo = fbDrawing ? readDrawing(fbDrawing) : null\n\n if (cp) {\n recovered.ink += 1\n const rid = cp.getAttribute('r:id')\n const strokesPath = rid ? (REL[rid] ?? null) : null\n // 把矢量数据**内容**也带上,而不只是包内路径 ——\n // 只存路径的话,一旦离开原始 .docx 就没法往返了(导出时无从取回)。\n // ink XML 通常只有几 KB,内联是划算的。\n const strokesXml = strokesPath ? text(`word/${strokesPath.replace(/^\\.\\//, '')}`) : null\n return {\n type: 'docxInk',\n attrs: {\n src: geo?.src ?? null,\n strokes: strokesPath,\n strokesXml,\n x: geo && geo.floating ? geo.x : 0,\n y: geo && geo.floating ? geo.y : 0,\n width: geo?.width ?? 0,\n height: geo?.height ?? 0,\n wrap: geo && geo.floating ? geo.wrap : 'none',\n behindDoc: geo && geo.floating ? geo.behindDoc : false,\n },\n }\n }\n if (geo?.src) {\n if (geo.floating) recovered.floatImages += 1\n else recovered.inlineImages += 1\n return { type: 'image', attrs: { src: geo.src, alt: geo.alt } }\n }\n return null\n }\n\n type Out = { inline: Record<string, unknown>[]; blocks: Record<string, unknown>[] }\n\n function runInto(r: El, out: Out, inherited: Fmt) {\n const rPr = first(r, 'w:rPr')\n const direct = rPr ? readFmt(rPr) : {}\n if (rPr && Object.values(direct).some((v) => v !== undefined)) recovered.directFormat += 1\n const marks = fmtToMarks({ ...inherited, ...stripUndefined(direct) })\n\n for (const c of kids(r)) {\n const t = c.nodeName\n if (t === 'w:t') {\n const s = c.textContent ?? ''\n if (s) out.inline.push(marks.length ? { type: 'text', text: s, marks } : { type: 'text', text: s })\n } else if (t === 'w:br') {\n out.inline.push({ type: 'hardBreak' })\n } else if (t === 'w:tab') {\n out.inline.push({ type: 'text', text: '\\t' })\n } else if (t === 'w:drawing') {\n const g = readDrawing(c)\n if (!g?.src) continue\n if (g.floating) {\n // 浮动图片和墨迹同样处理:不占布局,叠在段落上\n recovered.floatImages += 1\n out.inline.push({\n type: 'docxInk',\n attrs: {\n src: g.src,\n strokes: null,\n x: g.x,\n y: g.y,\n width: g.width,\n height: g.height,\n wrap: g.wrap,\n behindDoc: g.behindDoc,\n },\n })\n } else {\n recovered.inlineImages += 1\n // image 在本编辑器里是块级 → 提到段落外面\n out.blocks.push({ type: 'image', attrs: { src: g.src, alt: g.alt } })\n }\n } else if (t === 'mc:AlternateContent') {\n const n = readAlternate(c)\n if (!n) continue\n if (n.type === 'image') out.blocks.push(n)\n else out.inline.push(n)\n } else if (t === 'w:pict') {\n warnings.push('遇到 VML 图形(w:pict),未处理')\n }\n }\n }\n\n function childrenInto(node: El, out: Out, inherited: Fmt) {\n for (const c of kids(node)) {\n const t = c.nodeName\n if (t === 'w:r') runInto(c, out, inherited)\n else if (t === 'w:hyperlink') {\n const rid = c.getAttribute('r:id')\n const anchorName = c.getAttribute('w:anchor')\n const href = rid ? (REL[rid] ?? '') : anchorName ? `#${anchorName}` : ''\n const sub: Out = { inline: [], blocks: [] }\n childrenInto(c, sub, inherited)\n for (const n of sub.inline) {\n if ((n as { type: string }).type === 'text') {\n const marks = ((n as { marks?: unknown[] }).marks ?? []) as unknown[]\n ;(n as { marks: unknown[] }).marks = [...marks, { type: 'link', attrs: { href } }]\n }\n out.inline.push(n)\n }\n out.blocks.push(...sub.blocks)\n } else if (t === 'w:fldSimple') {\n recovered.fields += 1\n const code = (c.getAttribute('w:instr') ?? '').trim()\n const cached = Array.from(c.getElementsByTagName('w:t'))\n .map((n) => n.textContent ?? '')\n .join('')\n out.inline.push({ type: 'docxField', attrs: { code, cached } })\n } else if (t === 'w:ins') {\n recovered.trackedIns += 1\n childrenInto(c, out, inherited)\n } else if (t === 'w:del') {\n recovered.trackedDel += 1\n // 删除的内容不进正文(Word 的显示行为取决于修订视图,这里按「已接受」处理)\n } else if (t === 'mc:AlternateContent') {\n const n = readAlternate(c)\n if (n) (n.type === 'image' ? out.blocks : out.inline).push(n)\n }\n }\n }\n\n function paragraph(p: El): Record<string, unknown>[] {\n const pPr = first(p, 'w:pPr')\n const styleId = pPr ? (first(pPr, 'w:pStyle')?.getAttribute('w:val') ?? null) : null\n const styleName = styleId ? (STYLE_NAME[styleId] ?? styleId) : null\n const jc = pPr ? first(pPr, 'w:jc')?.getAttribute('w:val') : null\n\n const styleFmt = resolveStyleFmt(styleId)\n if (Object.values(styleFmt).some((v) => v !== undefined)) recovered.styleFormat += 1\n\n const out: Out = { inline: [], blocks: [] }\n childrenInto(p, out, styleFmt)\n\n const attrs: Record<string, unknown> = {}\n if (jc) attrs.textAlign = jc\n\n const heading = /^heading\\s*(\\d)$/i.exec(styleName ?? '')\n const blocks: Record<string, unknown>[] = []\n const hasContent = out.inline.length > 0\n\n if (heading) {\n blocks.push({\n type: 'heading',\n attrs: { ...attrs, level: Number(heading[1]) },\n ...(hasContent ? { content: out.inline } : {}),\n })\n } else {\n blocks.push({ type: 'paragraph', attrs, ...(hasContent ? { content: out.inline } : {}) })\n }\n blocks.push(...out.blocks)\n return blocks\n }\n\n /* ------------------------------ 表格 ------------------------------ */\n\n /** dxa(1/20 磅)→ px */\n const dxaToPx = (v: string | null | undefined) =>\n v ? Math.round(Number(v) / 15) : null\n\n interface RawCell {\n el: El\n colStart: number\n colSpan: number\n /** restart = 纵向合并的起点;continue = 被合并掉的续接格;null = 普通格 */\n vMerge: 'restart' | 'continue' | null\n }\n\n /**\n * Word 用「续接单元格」表示跨行合并(`<w:vMerge/>` 无 val),而 ProseMirror 是\n * 在起始格上标 rowspan 并**省略**续接格。这里做的就是这个转换:\n * 先按网格列号把每行摊平,再从起点往下数有多少个续接格。\n */\n function readRows(tbl: El): RawCell[][] {\n const rows: RawCell[][] = []\n for (const tr of kids(tbl)) {\n if (tr.nodeName !== 'w:tr') continue\n const cells: RawCell[] = []\n let col = 0\n for (const tc of kids(tr)) {\n if (tc.nodeName !== 'w:tc') continue\n const tcPr = first(tc, 'w:tcPr')\n const span = Number(tcPr ? (first(tcPr, 'w:gridSpan')?.getAttribute('w:val') ?? 1) : 1) || 1\n const vm = tcPr ? first(tcPr, 'w:vMerge') : null\n const vMerge = vm ? (vm.getAttribute('w:val') === 'restart' ? 'restart' : 'continue') : null\n cells.push({ el: tc, colStart: col, colSpan: span, vMerge })\n col += span\n }\n rows.push(cells)\n }\n return rows\n }\n\n function rowSpanOf(rows: RawCell[][], rowIdx: number, colStart: number): number {\n let n = 1\n for (let r = rowIdx + 1; r < rows.length; r++) {\n const hit = rows[r].find((c) => c.colStart === colStart)\n if (hit?.vMerge === 'continue') n += 1\n else break\n }\n return n\n }\n\n function table(tbl: El): Record<string, unknown> {\n recovered.tables += 1\n const tblPr = first(tbl, 'w:tblPr')\n // tblLook firstRow=\"1\" 表示样式对首行做特殊处理 → 当表头\n const firstRowIsHeader =\n tblPr ? first(tblPr, 'w:tblLook')?.getAttribute('w:firstRow') === '1' : false\n\n /**\n * 列宽只在表格用**绝对宽度**(tblW type=dxa)时才采信。\n *\n * 坑:`w:type=\"pct\"` 的表格里,`<w:gridCol w:w=\"100\"/>` 是**按比例分配的相对值**,\n * 不是 dxa。按 dxa 换算会得到 7px,表格被压成一条竖线。实测某些工具生成的\n * docx 就是这种(tblW=100% + gridCol 全是 100)。\n * 而 `type=\"auto\"` 的 gridCol 仍然是真实 dxa(实测游戏文档里是 2010/3675 dxa),\n * 所以只排除 pct,再用尺寸下限兜底。\n * 拿不准时宁可不给 colwidth —— 让 tiptap 自动分配,至少是可读的。\n */\n const tblWType = tblPr ? first(tblPr, 'w:tblW')?.getAttribute('w:type') : null\n // dxa 和 auto 的 gridCol 都是真实 dxa 值;只有 pct 是按比例的相对值\n const useAbsoluteWidths = tblWType !== 'pct'\n const grid = first(tbl, 'w:tblGrid')\n const rawWidths = grid\n ? kids(grid)\n .filter((g) => g.nodeName === 'w:gridCol')\n .map((g) => dxaToPx(g.getAttribute('w:w')))\n : []\n // 再加一道下限:换算出来小于 20px 的几乎不可能是真实列宽\n const sane = rawWidths.length > 0 && rawWidths.every((w) => w != null && w >= 20)\n const colWidths: (number | null)[] = useAbsoluteWidths && sane ? rawWidths : []\n if (rawWidths.length > 0 && colWidths.length === 0) {\n warnings.push(\n `表格列宽未采信(tblW type=${tblWType ?? '未指定'}),改为自动分配 —— ` +\n `gridCol 原值 ${rawWidths.slice(0, 4).join('/')}`,\n )\n }\n\n const rows = readRows(tbl)\n const rowNodes: Record<string, unknown>[] = []\n\n rows.forEach((cells, rowIdx) => {\n const tr = kids(tbl).filter((n) => n.nodeName === 'w:tr')[rowIdx]\n const trPr = tr ? first(tr, 'w:trPr') : null\n const isHeaderRow = Boolean(trPr && first(trPr, 'w:tblHeader')) || (rowIdx === 0 && firstRowIsHeader)\n\n const cellNodes: Record<string, unknown>[] = []\n for (const c of cells) {\n // 续接格不落地 —— 它的存在已经体现在起始格的 rowspan 上\n if (c.vMerge === 'continue') continue\n recovered.tableCells += 1\n\n const tcPr = first(c.el, 'w:tcPr')\n const attrs: Record<string, unknown> = {}\n if (c.colSpan > 1) {\n attrs.colspan = c.colSpan\n recovered.mergedCells += 1\n }\n const rs = c.vMerge === 'restart' ? rowSpanOf(rows, rowIdx, c.colStart) : 1\n if (rs > 1) {\n attrs.rowspan = rs\n recovered.mergedCells += 1\n }\n const widths = colWidths.slice(c.colStart, c.colStart + c.colSpan).filter((w): w is number => w != null)\n if (widths.length) attrs.colwidth = widths\n\n // 单元格底色 → packages/editor 的 NodeBackground 全局属性\n const fill = tcPr ? first(tcPr, 'w:shd')?.getAttribute('w:fill') : null\n if (fill && fill !== 'auto') {\n attrs.backgroundColor = `#${fill}`\n recovered.cellShading += 1\n }\n const vAlign = tcPr ? first(tcPr, 'w:vAlign')?.getAttribute('w:val') : null\n if (vAlign) attrs.nodeVerticalAlign = vAlign\n\n // 单元格内容走同一套 blocksOf —— 表格里嵌列表很常见,不能只认段落\n const inner = blocksOf(c.el)\n // tiptap 的单元格必须有块内容,空格子补一个空段落\n if (inner.length === 0) inner.push({ type: 'paragraph', attrs: {} })\n\n cellNodes.push({\n type: isHeaderRow ? 'tableHeader' : 'tableCell',\n attrs,\n content: inner,\n })\n }\n if (cellNodes.length) rowNodes.push({ type: 'tableRow', content: cellNodes })\n })\n\n return { type: 'table', content: rowNodes }\n }\n\n /* ------------------------------ 列表 ------------------------------ *\n * OOXML 没有「列表」这个容器 —— 列表项就是带 `w:numPr` 标记的普通段落,\n * 层级靠 `w:ilvl`、编号格式靠 numbering.xml 里 numId → abstractNumId → lvl。\n * 而 ProseMirror 要的是真正的嵌套树(bulletList > listItem > ...)。\n * 所以这里做两件事:把连续的列表段落聚成一段,再按 ilvl 序列还原成树。\n * ------------------------------------------------------------------ */\n\n /** numId → 每层的 { fmt, start } */\n const NUM: Record<string, { fmt: string; start: number }[]> = {}\n const numberingDoc = xml('word/numbering.xml')\n if (numberingDoc) {\n const abstract: Record<string, { fmt: string; start: number }[]> = {}\n for (const an of Array.from(numberingDoc.getElementsByTagName('w:abstractNum'))) {\n const id = an.getAttribute('w:abstractNumId')\n if (!id) continue\n const levels: { fmt: string; start: number }[] = []\n for (const lvl of Array.from(an.getElementsByTagName('w:lvl'))) {\n const i = Number(lvl.getAttribute('w:ilvl') ?? 0)\n levels[i] = {\n fmt: lvl.getElementsByTagName('w:numFmt')[0]?.getAttribute('w:val') ?? 'bullet',\n start: Number(lvl.getElementsByTagName('w:start')[0]?.getAttribute('w:val') ?? 1),\n }\n }\n abstract[id] = levels\n }\n for (const n of Array.from(numberingDoc.getElementsByTagName('w:num'))) {\n const numId = n.getAttribute('w:numId')\n const aid = n.getElementsByTagName('w:abstractNumId')[0]?.getAttribute('w:val')\n if (numId && aid && abstract[aid]) NUM[numId] = abstract[aid]\n }\n }\n\n function numPrOf(p: El): { ilvl: number; numId: string } | null {\n const pPr = first(p, 'w:pPr')\n const numPr = pPr ? first(pPr, 'w:numPr') : null\n if (!numPr) return null\n const numId = first(numPr, 'w:numId')?.getAttribute('w:val')\n if (!numId || numId === '0') return null\n return { ilvl: Number(first(numPr, 'w:ilvl')?.getAttribute('w:val') ?? 0), numId }\n }\n\n const levelSpec = (numId: string, ilvl: number) =>\n NUM[numId]?.[ilvl] ?? NUM[numId]?.[0] ?? { fmt: 'bullet', start: 1 }\n\n interface ListItem {\n level: number\n numId: string\n blocks: Record<string, unknown>[]\n }\n\n /** 按 ilvl 序列递归还原嵌套树。深一层的项挂进上一个同级项里。 */\n function buildList(items: ListItem[], from: number, level: number): [Record<string, unknown>, number] {\n const spec = levelSpec(items[from].numId, level)\n const ordered = spec.fmt !== 'bullet' && spec.fmt !== 'none'\n const listNode: Record<string, unknown> = {\n type: ordered ? 'orderedList' : 'bulletList',\n attrs: ordered && spec.start !== 1 ? { start: spec.start } : {},\n content: [] as Record<string, unknown>[],\n }\n const children = listNode.content as Record<string, unknown>[]\n let i = from\n while (i < items.length && items[i].level >= level) {\n if (items[i].level === level) {\n recovered.listItems += 1\n children.push({ type: 'listItem', content: items[i].blocks })\n i += 1\n } else {\n // 更深的层级:挂进上一个 listItem\n const [sub, next] = buildList(items, i, items[i].level)\n const last = children[children.length - 1] as { content?: Record<string, unknown>[] } | undefined\n if (last?.content) last.content.push(sub)\n else children.push({ type: 'listItem', content: [sub] })\n i = next\n }\n }\n return [listNode, i]\n }\n\n function flushList(items: ListItem[], out: Record<string, unknown>[]) {\n let i = 0\n while (i < items.length) {\n recovered.lists += 1\n const [node, next] = buildList(items, i, items[i].level)\n out.push(node)\n i = next\n }\n items.length = 0\n }\n\n /** 统一入口:把 body / 单元格里的块序列转成 tiptap 节点,顺带聚合列表 */\n function blocksOf(container: El): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = []\n const pending: ListItem[] = []\n for (const c of kids(container)) {\n if (c.nodeName === 'w:p') {\n const np = numPrOf(c)\n if (np) {\n pending.push({ level: np.ilvl, numId: np.numId, blocks: paragraph(c) })\n continue\n }\n if (pending.length) flushList(pending, out)\n out.push(...paragraph(c))\n } else if (c.nodeName === 'w:tbl') {\n if (pending.length) flushList(pending, out)\n out.push(table(c))\n }\n }\n if (pending.length) flushList(pending, out)\n return out\n }\n\n const body = docXml.getElementsByTagName('w:body')[0]\n if (!body) throw new Error('docx 缺少 w:body')\n\n const content = blocksOf(body)\n\n const doc = remapTypes({ type: 'doc', content }, opts.prosemirrorNodes, opts.prosemirrorMarks)\n\n return {\n doc,\n recovered,\n warnings,\n ...(opts.cssStyles ? { css: extractCss(stylesDoc) } : {}),\n }\n\n /** 抽文档默认样式(docDefaults + Normal)成 CSS,对齐官方 cssStyles */\n function extractCss(sd: Document | null): string {\n if (!sd) return ''\n const defRPr = sd.getElementsByTagName('w:rPrDefault')[0]?.getElementsByTagName('w:rPr')[0]\n const rules: string[] = []\n if (defRPr) {\n const font = defRPr.getElementsByTagName('w:rFonts')[0]?.getAttribute('w:ascii')\n const sz = defRPr.getElementsByTagName('w:sz')[0]?.getAttribute('w:val')\n const decl = [\n font ? `font-family:\"${font}\"` : '',\n sz ? `font-size:${Number(sz) / 2}pt` : '',\n ].filter(Boolean)\n if (decl.length) rules.push(`.tiptap{${decl.join(';')}}`)\n }\n for (const [id, f] of Object.entries(STYLE_FMT)) {\n const name = STYLE_NAME[id]\n if (!name || !f.color) continue\n const sel = /^heading\\s*(\\d)$/i.exec(name)\n if (sel) rules.push(`.tiptap h${sel[1]}{color:${f.color}}`)\n }\n return rules.join('\\n')\n }\n}\n\n/** 递归改写节点 / 标记的 type 名,让产出能落进宿主自己的 schema 命名 */\nfunction remapTypes(\n node: Record<string, unknown>,\n nodeMap?: Record<string, string>,\n markMap?: Record<string, string>,\n): Record<string, unknown> {\n if (!nodeMap && !markMap) return node\n const t = node.type as string | undefined\n const out: Record<string, unknown> = { ...node }\n if (t && nodeMap?.[t]) out.type = nodeMap[t]\n if (Array.isArray(node.marks) && markMap) {\n out.marks = (node.marks as Record<string, unknown>[]).map((m) => {\n const mt = m.type as string\n return markMap[mt] ? { ...m, type: markMap[mt] } : m\n })\n }\n if (Array.isArray(node.content)) {\n out.content = (node.content as Record<string, unknown>[]).map((c) =>\n remapTypes(c, nodeMap, markMap),\n )\n }\n return out\n}\n\nfunction stripUndefined<T extends object>(o: T): Partial<T> {\n return Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as Partial<T>\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let bin = ''\n for (let i = 0; i < bytes.length; i += 0x8000) {\n bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n }\n return typeof btoa === 'function' ? btoa(bin) : Buffer.from(bytes).toString('base64')\n}\n","/**\n * tiptap JSONContent → .docx(OOXML)。\n *\n * 和 parse.ts 对称:同构、纯函数、不碰 DOM。zip 由调用方注入,\n * 所以浏览器(fflate)和 Node(任意 zip 库)共用同一份。\n *\n * 往返是这里的主要价值:`docxField` 写回真正的 `w:fldSimple`(域代码 + 缓存值),\n * `docxInk` 写回 `w14:contentPart` + 位图回退 —— 这两样在导入时被保住,\n * 导出时才有东西可写。\n */\n\nconst EMU_PER_PX = 9525\nconst PX_TO_DXA = 15\n\nexport interface SerializeOptions {\n /** 把图片 src 换成字节。返回 null 则该图片跳过并记警告 */\n resolveImage?: (src: string) => Uint8Array | null\n /** 文档级样式覆盖,对齐官方 styleOverrides */\n styleOverrides?: { defaultFont?: string; defaultSizePt?: number }\n /** 逐段落覆盖,对齐官方 paragraphOverrides */\n paragraphOverrides?: (node: Node_) => Record<string, string> | undefined\n}\n\nexport interface SerializeResult {\n /** docx 包内的所有条目,交给 zip 打包 */\n files: Record<string, Uint8Array>\n warnings: string[]\n stats: Record<string, number>\n}\n\ntype Node_ = Record<string, any>\n\nconst enc = new TextEncoder()\nconst esc = (s: unknown) =>\n String(s ?? '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\nconst NS = [\n 'xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"',\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"',\n 'xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"',\n 'xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"',\n 'xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"',\n 'xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"',\n 'xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"',\n 'mc:Ignorable=\"w14\"',\n].join(' ')\n\nexport function serializeDocx(doc: Node_, opts: SerializeOptions = {}): SerializeResult {\n const warnings: string[] = []\n const stats: Record<string, number> = {\n paragraphs: 0, headings: 0, tables: 0, lists: 0, listItems: 0,\n images: 0, fields: 0, ink: 0,\n }\n\n /* --------------------------- 关系与媒体 --------------------------- */\n const rels: string[] = [\n `<Relationship Id=\"rStyles\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`,\n `<Relationship Id=\"rNumbering\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>`,\n ]\n const files: Record<string, Uint8Array> = {}\n const mediaExts = new Set<string>()\n let relSeq = 0\n const imageCache = new Map<string, string | null>()\n\n function addImage(src: string): string | null {\n if (imageCache.has(src)) return imageCache.get(src) ?? null\n const bytes = opts.resolveImage?.(src) ?? null\n if (!bytes) {\n warnings.push(`图片无法取字节,已跳过:${src.slice(0, 60)}`)\n imageCache.set(src, null)\n return null\n }\n const ext = sniffExt(bytes)\n mediaExts.add(ext)\n const id = `rImg${++relSeq}`\n const name = `image${relSeq}.${ext}`\n files[`word/media/${name}`] = bytes\n rels.push(\n `<Relationship Id=\"${id}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/${name}\"/>`,\n )\n imageCache.set(src, id)\n return id\n }\n\n function addInkPart(xmlText: string): string {\n const id = `rInk${++relSeq}`\n const name = `ink${relSeq}.xml`\n files[`word/ink/${name}`] = enc.encode(xmlText)\n rels.push(\n `<Relationship Id=\"${id}\" Type=\"http://schemas.microsoft.com/office/2010/relationships/customXml\" Target=\"ink/${name}\"/>`,\n )\n return id\n }\n\n /* ------------------------------ 编号 ------------------------------ */\n // 每个 (类型, start) 组合一份 abstractNum;同一份列表的各层复用同一个 numId\n const numDefs: { ordered: boolean; start: number }[] = []\n function numIdFor(ordered: boolean, start: number): number {\n const i = numDefs.findIndex((d) => d.ordered === ordered && d.start === start)\n if (i !== -1) return i + 1\n numDefs.push({ ordered, start })\n return numDefs.length\n }\n\n /* ------------------------------ 内联 ------------------------------ */\n\n function runProps(marks: Node_[] = []): string {\n const p: string[] = []\n const has = (t: string) => marks.some((m) => m.type === t)\n if (has('bold')) p.push('<w:b/>')\n if (has('italic')) p.push('<w:i/>')\n if (has('underline')) p.push('<w:u w:val=\"single\"/>')\n if (has('strike')) p.push('<w:strike/>')\n if (has('superscript')) p.push('<w:vertAlign w:val=\"superscript\"/>')\n if (has('subscript')) p.push('<w:vertAlign w:val=\"subscript\"/>')\n const color = marks.find((m) => m.type === 'textStyle')?.attrs?.color\n if (color) p.push(`<w:color w:val=\"${String(color).replace('#', '')}\"/>`)\n const hl = marks.find((m) => m.type === 'highlight')?.attrs?.color\n if (hl) p.push(`<w:shd w:val=\"clear\" w:fill=\"${String(hl).replace('#', '')}\"/>`)\n return p.length ? `<w:rPr>${p.join('')}</w:rPr>` : ''\n }\n\n /** 图片 → 内联或浮动的 w:drawing */\n function drawing(relId: string, wPx: number, hPx: number, alt: string, float?: { x: number; y: number; behind: boolean }) {\n const cx = Math.max(1, Math.round(wPx * EMU_PER_PX))\n const cy = Math.max(1, Math.round(hPx * EMU_PER_PX))\n const docPr = `<wp:docPr id=\"${++relSeq}\" name=\"img${relSeq}\" descr=\"${esc(alt)}\"/>`\n const graphic =\n `<a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">` +\n `<pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"\"/><pic:cNvPicPr/></pic:nvPicPr>` +\n `<pic:blipFill><a:blip r:embed=\"${relId}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill>` +\n `<pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm>` +\n `<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic>`\n\n if (!float) {\n return `<w:drawing><wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"${cx}\" cy=\"${cy}\"/>${docPr}${graphic}</wp:inline></w:drawing>`\n }\n return (\n `<w:drawing><wp:anchor distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\" simplePos=\"0\" relativeHeight=\"1\" ` +\n `behindDoc=\"${float.behind ? 1 : 0}\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">` +\n `<wp:simplePos x=\"0\" y=\"0\"/>` +\n `<wp:positionH relativeFrom=\"column\"><wp:posOffset>${Math.round(float.x * EMU_PER_PX)}</wp:posOffset></wp:positionH>` +\n `<wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>${Math.round(float.y * EMU_PER_PX)}</wp:posOffset></wp:positionV>` +\n `<wp:extent cx=\"${cx}\" cy=\"${cy}\"/><wp:wrapNone/>${docPr}${graphic}</wp:anchor></w:drawing>`\n )\n }\n\n function inlineToRuns(nodes: Node_[] = []): string {\n let out = ''\n for (const n of nodes) {\n if (n.type === 'text') {\n const link = (n.marks ?? []).find((m: Node_) => m.type === 'link')\n const run = `<w:r>${runProps(n.marks)}<w:t xml:space=\"preserve\">${esc(n.text)}</w:t></w:r>`\n // 简化:超链接写成带下划线的普通 run + 外部关系太重,这里用 w:hyperlink 的锚点形式\n out += link?.attrs?.href\n ? `<w:hyperlink w:tooltip=\"${esc(link.attrs.href)}\">${run}</w:hyperlink>`\n : run\n continue\n }\n if (n.type === 'hardBreak') {\n out += '<w:r><w:br/></w:r>'\n continue\n }\n if (n.type === 'docxField') {\n // ★ 往返:域代码原样写回,Word 会重算,缓存值也带上\n stats.fields += 1\n out += `<w:fldSimple w:instr=\" ${esc(n.attrs?.code ?? '')} \"><w:r><w:t>${esc(n.attrs?.cached ?? '')}</w:t></w:r></w:fldSimple>`\n continue\n }\n if (n.type === 'docxInk') {\n stats.ink += 1\n const relImg = n.attrs?.src ? addImage(n.attrs.src) : null\n const fallback = relImg\n ? drawing(relImg, n.attrs.width || 100, n.attrs.height || 100, '手写墨迹', {\n x: n.attrs.x ?? 0,\n y: n.attrs.y ?? 0,\n behind: Boolean(n.attrs.behindDoc),\n })\n : ''\n if (n.attrs?.strokesXml) {\n // ★ 往返:矢量墨迹写回 contentPart,位图放进 Fallback\n const inkRel = addInkPart(n.attrs.strokesXml)\n out +=\n `<mc:AlternateContent>` +\n `<mc:Choice Requires=\"w14\"><w:r><w14:contentPart r:id=\"${inkRel}\"/></w:r></mc:Choice>` +\n `<mc:Fallback><w:r>${fallback}</w:r></mc:Fallback>` +\n `</mc:AlternateContent>`\n } else if (fallback) {\n warnings.push('墨迹缺少矢量数据(strokesXml),只写回了位图')\n out += `<w:r>${fallback}</w:r>`\n }\n continue\n }\n if (n.type === 'image') {\n const rel = n.attrs?.src ? addImage(n.attrs.src) : null\n if (rel) {\n stats.images += 1\n out += `<w:r>${drawing(rel, n.attrs.width || 400, n.attrs.height || 300, n.attrs.alt ?? '')}</w:r>`\n }\n continue\n }\n // 未知内联节点:退化成它的文字,别静默丢\n const t = collectText(n)\n if (t) out += `<w:r><w:t xml:space=\"preserve\">${esc(t)}</w:t></w:r>`\n else warnings.push(`未知内联节点 \"${n.type}\",已跳过`)\n }\n return out\n }\n\n /* ------------------------------ 块级 ------------------------------ */\n\n function paraProps(node: Node_, extra: string[] = []): string {\n const p = [...extra]\n const align = node.attrs?.textAlign ?? node.attrs?.nodeTextAlign\n if (align && align !== 'left') p.push(`<w:jc w:val=\"${esc(align)}\"/>`)\n const bg = node.attrs?.backgroundColor\n if (bg) p.push(`<w:shd w:val=\"clear\" w:fill=\"${String(bg).replace('#', '')}\"/>`)\n const ind = Number(node.attrs?.indent ?? 0)\n if (ind > 0) p.push(`<w:ind w:left=\"${ind * 420}\"/>`)\n const ov = opts.paragraphOverrides?.(node)\n for (const [k, v] of Object.entries(ov ?? {})) p.push(`<w:${k} w:val=\"${esc(v)}\"/>`)\n return p.length ? `<w:pPr>${p.join('')}</w:pPr>` : ''\n }\n\n function paragraph(node: Node_, extraProps: string[] = []): string {\n stats.paragraphs += 1\n return `<w:p>${paraProps(node, extraProps)}${inlineToRuns(node.content)}</w:p>`\n }\n\n function heading(node: Node_): string {\n stats.headings += 1\n const lv = Math.min(9, Math.max(1, Number(node.attrs?.level ?? 1)))\n return `<w:p>${paraProps(node, [`<w:pStyle w:val=\"Heading${lv}\"/>`])}${inlineToRuns(node.content)}</w:p>`\n }\n\n /** 列表:展平成带 numPr 的段落序列 —— OOXML 里没有列表容器 */\n function list(node: Node_, level: number, out: string[]): void {\n const ordered = node.type === 'orderedList'\n if (level === 0) stats.lists += 1\n const numId = numIdFor(ordered, Number(node.attrs?.start ?? 1))\n for (const item of node.content ?? []) {\n if (item.type !== 'listItem') continue\n stats.listItems += 1\n let firstDone = false\n for (const child of item.content ?? []) {\n if (child.type === 'bulletList' || child.type === 'orderedList') {\n list(child, level + 1, out)\n continue\n }\n // 列表项的第一段带 numPr,同项内后续段落只缩进不再编号\n const props = firstDone\n ? [`<w:ind w:left=\"${(level + 1) * 720}\"/>`]\n : [`<w:numPr><w:ilvl w:val=\"${level}\"/><w:numId w:val=\"${numId}\"/></w:numPr>`]\n out.push(`<w:p>${paraProps(child, props)}${inlineToRuns(child.content)}</w:p>`)\n firstDone = true\n }\n if (!firstDone) {\n out.push(`<w:p><w:pPr><w:numPr><w:ilvl w:val=\"${level}\"/><w:numId w:val=\"${numId}\"/></w:numPr></w:pPr></w:p>`)\n }\n }\n }\n\n /**\n * 表格:rowspan 的**逆变换**。\n * ProseMirror 在起始格标 rowspan 并省略续接格,OOXML 必须把续接格补回来\n * (`<w:vMerge/>` 无 val)。所以要先铺一张网格,标记哪些位置是被合并占用的。\n */\n function table(node: Node_): string {\n stats.tables += 1\n const rows: Node_[] = (node.content ?? []).filter((r: Node_) => r.type === 'tableRow')\n\n // occupied[row][col] = { colSpan } 表示该位置是某个 rowspan 的续接\n const occupied: Record<number, Record<number, number>> = {}\n const grid: { cell: Node_ | null; colSpan: number }[][] = []\n\n rows.forEach((row, r) => {\n grid[r] = []\n let c = 0\n for (const cell of row.content ?? []) {\n while (occupied[r]?.[c]) {\n grid[r].push({ cell: null, colSpan: occupied[r][c] })\n c += occupied[r][c]\n }\n const colSpan = Number(cell.attrs?.colspan ?? 1)\n const rowSpan = Number(cell.attrs?.rowspan ?? 1)\n grid[r].push({ cell, colSpan })\n for (let rr = r + 1; rr < r + rowSpan; rr++) {\n occupied[rr] = occupied[rr] ?? {}\n occupied[rr][c] = colSpan\n }\n c += colSpan\n }\n while (occupied[r]?.[c]) {\n grid[r].push({ cell: null, colSpan: occupied[r][c] })\n c += occupied[r][c]\n }\n })\n\n // 列宽:从第一行的 colwidth 拼出 tblGrid\n const widths: number[] = []\n for (const { cell, colSpan } of grid[0] ?? []) {\n const cw: number[] = cell?.attrs?.colwidth ?? []\n for (let i = 0; i < colSpan; i++) widths.push(Math.round((cw[i] ?? 100) * PX_TO_DXA))\n }\n const gridXml = widths.map((w) => `<w:gridCol w:w=\"${w}\"/>`).join('')\n const borders =\n '<w:tblBorders>' +\n ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']\n .map((s) => `<w:${s} w:val=\"single\" w:sz=\"4\" w:color=\"auto\"/>`)\n .join('') +\n '</w:tblBorders>'\n\n let xml = `<w:tbl><w:tblPr><w:tblW w:type=\"dxa\" w:w=\"${widths.reduce((a, b) => a + b, 0)}\"/>${borders}</w:tblPr><w:tblGrid>${gridXml}</w:tblGrid>`\n\n grid.forEach((cells, r) => {\n const isHeader = (rows[r].content ?? []).some((c: Node_) => c.type === 'tableHeader')\n xml += '<w:tr>'\n if (isHeader) xml += '<w:trPr><w:tblHeader/></w:trPr>'\n for (const { cell, colSpan } of cells) {\n const props: string[] = []\n if (colSpan > 1) props.push(`<w:gridSpan w:val=\"${colSpan}\"/>`)\n if (!cell) {\n // 续接格:内容为空 + vMerge 无 val\n props.push('<w:vMerge/>')\n xml += `<w:tc><w:tcPr>${props.join('')}</w:tcPr><w:p/></w:tc>`\n continue\n }\n if (Number(cell.attrs?.rowspan ?? 1) > 1) props.push('<w:vMerge w:val=\"restart\"/>')\n const bg = cell.attrs?.backgroundColor\n if (bg) props.push(`<w:shd w:val=\"clear\" w:fill=\"${String(bg).replace('#', '')}\"/>`)\n const va = cell.attrs?.nodeVerticalAlign\n if (va) props.push(`<w:vAlign w:val=\"${esc(va)}\"/>`)\n const inner = blocks(cell.content ?? [])\n xml += `<w:tc><w:tcPr>${props.join('')}</w:tcPr>${inner || '<w:p/>'}</w:tc>`\n }\n xml += '</w:tr>'\n })\n return `${xml}</w:tbl>`\n }\n\n function blocks(nodes: Node_[]): string {\n const out: string[] = []\n for (const n of nodes) {\n switch (n.type) {\n case 'heading': out.push(heading(n)); break\n case 'paragraph': out.push(paragraph(n)); break\n case 'bulletList':\n case 'orderedList': list(n, 0, out); break\n case 'table': out.push(table(n)); break\n case 'blockquote':\n for (const c of n.content ?? []) out.push(paragraph(c, ['<w:ind w:left=\"720\"/>']))\n break\n case 'codeBlock':\n out.push(`<w:p><w:pPr><w:pStyle w:val=\"Code\"/></w:pPr><w:r><w:rPr><w:rFonts w:ascii=\"Consolas\" w:hAnsi=\"Consolas\"/></w:rPr><w:t xml:space=\"preserve\">${esc(collectText(n))}</w:t></w:r></w:p>`)\n break\n case 'horizontalRule':\n out.push('<w:p><w:pPr><w:pBdr><w:bottom w:val=\"single\" w:sz=\"6\" w:color=\"auto\"/></w:pBdr></w:pPr></w:p>')\n break\n case 'image':\n case 'docxInk':\n out.push(`<w:p>${inlineToRuns([n])}</w:p>`)\n break\n default: {\n const t = collectText(n)\n if (t) out.push(`<w:p><w:r><w:t xml:space=\"preserve\">${esc(t)}</w:t></w:r></w:p>`)\n else warnings.push(`未知块级节点 \"${n.type}\",已跳过`)\n }\n }\n }\n return out.join('')\n }\n\n /* ------------------------------ 组包 ------------------------------ */\n\n const bodyXml = blocks(doc.content ?? [])\n files['word/document.xml'] = enc.encode(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:document ${NS}><w:body>${bodyXml}<w:sectPr><w:pgSz w:w=\"11906\" w:h=\"16838\"/><w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\"/></w:sectPr></w:body></w:document>`,\n )\n\n const headingStyles = Array.from({ length: 9 }, (_, i) => {\n const lv = i + 1\n const sz = [32, 28, 26, 24, 22, 21, 21, 21, 21][i]\n return `<w:style w:type=\"paragraph\" w:styleId=\"Heading${lv}\"><w:name w:val=\"heading ${lv}\"/><w:basedOn w:val=\"Normal\"/><w:pPr><w:outlineLvl w:val=\"${i}\"/><w:spacing w:before=\"240\" w:after=\"120\"/></w:pPr><w:rPr><w:b/><w:sz w:val=\"${sz}\"/></w:rPr></w:style>`\n }).join('')\n const dflt = opts.styleOverrides ?? {}\n files['word/styles.xml'] = enc.encode(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:styles ${NS}>` +\n `<w:docDefaults><w:rPrDefault><w:rPr>` +\n `<w:rFonts w:ascii=\"${esc(dflt.defaultFont ?? 'Calibri')}\" w:eastAsia=\"${esc(dflt.defaultFont ?? '等线')}\"/>` +\n `<w:sz w:val=\"${(dflt.defaultSizePt ?? 11) * 2}\"/></w:rPr></w:rPrDefault></w:docDefaults>` +\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/></w:style>` +\n `<w:style w:type=\"paragraph\" w:styleId=\"Code\"><w:name w:val=\"Code\"/><w:basedOn w:val=\"Normal\"/></w:style>` +\n headingStyles +\n `</w:styles>`,\n )\n\n const abstractNums = numDefs\n .map((d, i) => {\n const levels = Array.from({ length: 9 }, (_, l) =>\n d.ordered\n ? `<w:lvl w:ilvl=\"${l}\"><w:start w:val=\"${l === 0 ? d.start : 1}\"/><w:numFmt w:val=\"${['decimal', 'lowerLetter', 'lowerRoman'][l % 3]}\"/><w:lvlText w:val=\"%${l + 1}.\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"${(l + 1) * 720}\" w:hanging=\"360\"/></w:pPr></w:lvl>`\n : `<w:lvl w:ilvl=\"${l}\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"•\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"${(l + 1) * 720}\" w:hanging=\"360\"/></w:pPr></w:lvl>`,\n ).join('')\n return `<w:abstractNum w:abstractNumId=\"${i}\">${levels}</w:abstractNum>`\n })\n .join('')\n const nums = numDefs.map((_, i) => `<w:num w:numId=\"${i + 1}\"><w:abstractNumId w:val=\"${i}\"/></w:num>`).join('')\n files['word/numbering.xml'] = enc.encode(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:numbering ${NS}>${abstractNums}${nums}</w:numbering>`,\n )\n\n files['word/_rels/document.xml.rels'] = enc.encode(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">${rels.join('')}</Relationships>`,\n )\n files['_rels/.rels'] = enc.encode(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/></Relationships>`,\n )\n\n const defaults = ['rels', 'xml', ...mediaExts]\n files['[Content_Types].xml'] = enc.encode(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">` +\n defaults\n .map((e) => `<Default Extension=\"${e}\" ContentType=\"${contentTypeOf(e)}\"/>`)\n .join('') +\n `<Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>` +\n `<Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>` +\n `<Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>` +\n `</Types>`,\n )\n\n return { files, warnings, stats }\n}\n\nfunction collectText(n: Node_): string {\n if (n?.type === 'text') return n.text ?? ''\n return (n?.content ?? []).map(collectText).join('')\n}\n\nfunction sniffExt(b: Uint8Array): string {\n if (b[0] === 0x89 && b[1] === 0x50) return 'png'\n if (b[0] === 0xff && b[1] === 0xd8) return 'jpeg'\n if (b[0] === 0x47 && b[1] === 0x49) return 'gif'\n if (b[8] === 0x57 && b[9] === 0x45) return 'webp'\n return 'png'\n}\n\nfunction contentTypeOf(ext: string): string {\n return (\n {\n rels: 'application/vnd.openxmlformats-package.relationships+xml',\n xml: 'application/xml',\n png: 'image/png',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n } as Record<string, string>\n )[ext] ?? 'application/octet-stream'\n}\n","import { Extension } from '@tiptap/core'\nimport { zipSync } from 'fflate'\n\nimport { serializeDocx, type SerializeOptions, type SerializeResult } from './serialize'\n\nexport { serializeDocx } from './serialize'\nexport type { SerializeOptions, SerializeResult } from './serialize'\n\n/* ------------------------------------------------------------------ *\n * API 形状对齐 @tiptap-pro/extension-export-docx\n * (https://tiptap.dev/docs/conversion/export/docx/editor-extension)\n *\n * 同形:`onCompleteExport` / `exportType` / `styleOverrides` /\n * `paragraphOverrides`,命令 `editor.chain().exportDocx(opts).run()`。\n * 不同:官方 WOFF2 字体转换要 `token` / `endpoint` 走云服务,我们不做字体嵌入,\n * 那两个选项不存在。\n * ------------------------------------------------------------------ */\n\nexport type ExportType = 'blob' | 'buffer' | 'string'\n\nexport interface ExportDocxOptions extends SerializeOptions {\n onCompleteExport: ((result: Blob | Uint8Array | string) => void) | null\n exportType: ExportType\n /** 诊断级别,同导入侧 */\n verbose: number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n exportDocx: {\n exportDocx: (options?: Partial<ExportDocxOptions>) => ReturnType\n }\n }\n}\n\n/** 纯函数:tiptap JSON → .docx 字节。不依赖 editor,服务端 / 测试可直接用。 */\nexport function docxFromJSON(\n doc: Record<string, unknown>,\n opts: SerializeOptions = {},\n): { bytes: Uint8Array; warnings: string[]; stats: Record<string, number> } {\n const { files, warnings, stats }: SerializeResult = serializeDocx(doc, opts)\n // mimetype 不需要 STORED(那是 ODF 的要求),docx 全部 DEFLATE 即可\n return { bytes: zipSync(files, { level: 6 }), warnings, stats }\n}\n\nfunction deliver(bytes: Uint8Array, type: ExportType): Blob | Uint8Array | string {\n if (type === 'buffer') return bytes\n if (type === 'string') {\n let bin = ''\n for (let i = 0; i < bytes.length; i += 0x8000) bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n return typeof btoa === 'function' ? btoa(bin) : Buffer.from(bytes).toString('base64')\n }\n return new Blob([bytes as BlobPart], {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n })\n}\n\nexport const ExportDocx = Extension.create<ExportDocxOptions>({\n name: 'exportDocx',\n\n addOptions() {\n return {\n onCompleteExport: null,\n exportType: 'blob',\n verbose: 0,\n resolveImage: undefined,\n styleOverrides: undefined,\n paragraphOverrides: undefined,\n }\n },\n\n addCommands() {\n return {\n exportDocx:\n (override = {}) =>\n ({ editor }) => {\n const o = { ...this.options, ...override }\n try {\n const { bytes, warnings, stats } = docxFromJSON(editor.getJSON() as never, o)\n if (o.verbose >= 1) console.info('[exportDocx] 统计', stats)\n if (o.verbose >= 2) for (const w of warnings) console.warn('[exportDocx]', w)\n o.onCompleteExport?.(deliver(bytes, o.exportType))\n } catch (e) {\n if (o.verbose >= 1) console.error('[exportDocx] 失败', e)\n return false\n }\n return true\n },\n }\n },\n})\n\n/** 便捷方法:导出并触发浏览器下载 */\nexport function downloadDocx(\n editor: { getJSON: () => unknown },\n filename = 'document.docx',\n opts: SerializeOptions = {},\n): void {\n const { bytes } = docxFromJSON(editor.getJSON() as never, opts)\n const url = URL.createObjectURL(\n new Blob([bytes as BlobPart], {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n }),\n )\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n","import { Extension } from '@tiptap/core'\nimport type { JSONContent } from '@tiptap/core'\nimport { unzipSync } from 'fflate'\n\nimport { DocxField } from './nodes/field'\nimport { DocxInk } from './nodes/ink'\nimport { parseDocx, type ParseDocxResult } from './parse'\n\nexport { DocxField } from './nodes/field'\nexport { DocxInk } from './nodes/ink'\nexport { parseDocx } from './parse'\nexport type { DocxEntries, ParseDocxOptions, ParseDocxResult } from './parse'\n\n// 导出侧\nexport { ExportDocx, docxFromJSON, downloadDocx, serializeDocx } from './export'\nexport type { ExportDocxOptions, ExportType, SerializeOptions, SerializeResult } from './export'\n\n/* ------------------------------------------------------------------ *\n * API 形状对齐 @tiptap-pro/extension-import-docx\n * (https://tiptap.dev/docs/conversion/import/docx/editor-extension)\n *\n * 同形的:命令签名 `importDocx({ file, onImport })`、onImport 上下文、\n * imageUploadConfig、prosemirrorNodes / prosemirrorMarks、\n * cssStyles、verbose。\n *\n * 不同的:官方把 .docx 传到 api.tiptap.dev 转换,所以要 `token` / `endpoint`;\n * 我们在本地解析,那两个选项不存在。带来的差别是没有网络往返、\n * 文档不出内网,代价是转换质量由我们自己负责。\n *\n * 多出来的:`preserveUnsupported` —— 官方能力矩阵里明确标 ✕ 的那几样\n * (域、墨迹、浮动定位),我们用不透明节点保住。\n * ------------------------------------------------------------------ */\n\nexport interface ImageUploadConfig {\n /** 上传端点 */\n url: string\n headers?: HeadersInit\n method?: string\n queryParams?: Record<string, string>\n /**\n * 从上传响应里取出可访问 URL。默认依次尝试 `url` / `data.url` / `src`,\n * 响应是纯文本时直接当 URL 用。\n */\n extractUrl?: (response: unknown) => string\n}\n\nexport interface ImportDocxOptions {\n /** 图片上传配置,对齐官方 `imageUploadConfig` */\n imageUploadConfig: ImageUploadConfig | null\n /**\n * 函数式逃生舱:直接把字节换成 URL(同步)。\n * 和 imageUploadConfig 二选一,两者都给时以本项优先。\n */\n resolveMedia: ((bytes: Uint8Array, entryPath: string) => string) | null\n /** 重命名产出的节点类型,对齐官方 `prosemirrorNodes` */\n prosemirrorNodes: Record<string, string> | null\n /** 重命名产出的标记类型,对齐官方 `prosemirrorMarks` */\n prosemirrorMarks: Record<string, string> | null\n /** 抽取文档默认样式为 CSS,对齐官方 `cssStyles` */\n cssStyles: boolean\n /** 诊断输出级别,对齐官方 `verbose`。0=静默 1=汇总 2=逐条警告 */\n verbose: number\n /**\n * 保留 ProseMirror schema 本来表达不了的 OOXML 结构(域 / 墨迹 / 浮动定位)。\n * 这是本扩展相对官方的增量 —— 官方能力矩阵里这几项是 ✕。\n * 关掉则域降级成纯文本、墨迹降级成普通图片。\n */\n preserveUnsupported: boolean\n /** 是否注入浮动定位所需样式,默认 true */\n injectStyles: boolean\n}\n\n/** onImport 回调拿到的上下文,字段对齐官方 */\nexport interface ImportDocxContext {\n error?: Error\n /** 转换出来的 tiptap JSON */\n content: JSONContent | null\n /** 把内容写进编辑器 */\n setEditorContent: (content?: JSONContent) => void\n /** 各类恢复项计数(本扩展独有,用于量化保真度) */\n recovered: Record<string, number>\n warnings: string[]\n /** cssStyles:true 时的文档默认样式 */\n css?: string\n // —— 以下字段为 API 兼容而保留,本地解析尚未实现,恒为 null/空 ——\n header: JSONContent | null\n footer: JSONContent | null\n footnotes: Record<string, JSONContent>\n endnotes: Record<string, JSONContent>\n}\n\nexport interface ImportDocxCommandArgs {\n /** .docx 内容。File / Blob / ArrayBuffer / Uint8Array 都收 */\n file: File | Blob | ArrayBuffer | Uint8Array\n /** 不传则直接替换编辑器内容;传了则由你决定怎么落 */\n onImport?: (context: ImportDocxContext) => void\n /** 对齐官方:false 时不插入占位内容。本地解析是同步的,占位意义不大 */\n placeholders?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n importDocx: {\n importDocx: (args: ImportDocxCommandArgs) => ReturnType\n }\n }\n}\n\n/**\n * 浮动对象(墨迹 / 浮动图片)是 `position:absolute` 的,需要所在块建立定位上下文,\n * 否则会相对整页定位、跑到别处。用 `:has()` 只作用于真正含浮动对象的块。\n */\nconst FLOATING_CSS = `\n.tiptap p:has(> .docx-ink),\n.tiptap h1:has(> .docx-ink), .tiptap h2:has(> .docx-ink),\n.tiptap h3:has(> .docx-ink), .tiptap h4:has(> .docx-ink),\n.tiptap h5:has(> .docx-ink), .tiptap h6:has(> .docx-ink) { position: relative; }\n.docx-ink { display: inline-block; }\n.docx-ink-placeholder { opacity: .4; }\n.docx-field {\n background: color-mix(in srgb, currentColor 8%, transparent);\n border-radius: 3px; padding: 0 2px; cursor: default;\n}\n`\nconst STYLE_ID = 'tiptap-import-docx-styles'\n\nfunction injectStyles(extra?: string): void {\n if (typeof document === 'undefined') return\n let el = document.getElementById(STYLE_ID)\n if (!el) {\n el = document.createElement('style')\n el.id = STYLE_ID\n document.head.appendChild(el)\n }\n el.textContent = FLOATING_CSS + (extra ? `\\n${extra}` : '')\n}\n\n/**\n * 按宿主 schema 降级:把 schema 里不存在的节点/标记摘掉,保住内容。\n *\n * 为什么必须有这一层:本扩展产出的节点类型(table / bulletList / docxInk …)\n * 依赖宿主注册了对应扩展。宿主没装表格扩展时,`setContent` 遇到 `table` 会直接抛,\n * **整篇文档一个字都进不去** —— 表现是「统计有数字,编辑器一片空白」,\n * 而且错误还容易被吞掉,非常难查。\n *\n * 降级策略:未知节点丢掉自己、把子节点提上来当兄弟(内容不丢,只丢结构);\n * 未知标记直接摘掉。每种类型只警告一次,避免几千条刷屏。\n */\nfunction degradeToSchema(\n node: Record<string, unknown>,\n schema: { nodes: Record<string, unknown>; marks: Record<string, unknown> },\n warned: Set<string>,\n warnings: string[],\n): Record<string, unknown>[] {\n const type = node.type as string | undefined\n const kids = (node.content as Record<string, unknown>[] | undefined) ?? []\n const degradedKids = kids.flatMap((c) => degradeToSchema(c, schema, warned, warnings))\n\n if (type && type !== 'text' && !schema.nodes[type]) {\n if (!warned.has(`node:${type}`)) {\n warned.add(`node:${type}`)\n warnings.push(`宿主 schema 没有节点类型 \"${type}\",已降级为其子内容(宿主需注册对应扩展)`)\n }\n return degradedKids\n }\n\n const out: Record<string, unknown> = { ...node }\n if (Array.isArray(node.marks)) {\n out.marks = (node.marks as Record<string, unknown>[]).filter((m) => {\n const mt = m.type as string\n if (schema.marks[mt]) return true\n if (!warned.has(`mark:${mt}`)) {\n warned.add(`mark:${mt}`)\n warnings.push(`宿主 schema 没有标记类型 \"${mt}\",已摘除`)\n }\n return false\n })\n }\n if (kids.length) out.content = degradedKids\n return [out]\n}\n\nasync function toBytes(file: ImportDocxCommandArgs['file']): Promise<Uint8Array> {\n if (file instanceof Uint8Array) return file\n if (file instanceof ArrayBuffer) return new Uint8Array(file)\n return new Uint8Array(await (file as Blob).arrayBuffer())\n}\n\nasync function uploadImages(\n files: Record<string, Uint8Array>,\n cfg: ImageUploadConfig,\n): Promise<Map<string, string>> {\n const out = new Map<string, string>()\n const entries = Object.keys(files).filter((p) => p.startsWith('word/media/'))\n await Promise.all(\n entries.map(async (entry) => {\n const url = new URL(cfg.url, typeof location === 'undefined' ? 'http://localhost' : location.href)\n for (const [k, v] of Object.entries(cfg.queryParams ?? {})) url.searchParams.set(k, v)\n const body = new FormData()\n body.append('file', new Blob([files[entry] as BlobPart]), entry.split('/').pop() ?? 'image')\n const res = await fetch(url.toString(), {\n method: cfg.method ?? 'POST',\n headers: cfg.headers,\n body,\n })\n const raw = res.headers.get('content-type')?.includes('json') ? await res.json() : await res.text()\n const resolved = cfg.extractUrl\n ? cfg.extractUrl(raw)\n : typeof raw === 'string'\n ? raw\n : ((raw as Record<string, string>)?.url ??\n (raw as { data?: { url?: string } })?.data?.url ??\n (raw as Record<string, string>)?.src ??\n '')\n if (resolved) out.set(entry, resolved)\n }),\n )\n return out\n}\n\nexport const ImportDocx = Extension.create<ImportDocxOptions>({\n name: 'importDocx',\n\n addOptions() {\n return {\n imageUploadConfig: null,\n resolveMedia: null,\n prosemirrorNodes: null,\n prosemirrorMarks: null,\n cssStyles: false,\n verbose: 0,\n preserveUnsupported: true,\n injectStyles: true,\n }\n },\n\n addExtensions() {\n // preserveUnsupported 关掉时不注册这两个节点,产出会降级成文本/普通图片\n return this.options.preserveUnsupported === false ? [] : [DocxInk, DocxField]\n },\n\n onCreate() {\n if (this.options.injectStyles) injectStyles()\n },\n\n addCommands() {\n return {\n importDocx:\n (args) =>\n ({ editor }) => {\n const opts = this.options\n\n // 命令本身同步返回 true,转换在微任务里做完再回调 —— 和官方一致\n void (async () => {\n const finish = (ctx: ImportDocxContext) => {\n if (args.onImport) args.onImport(ctx)\n else if (ctx.content) ctx.setEditorContent(ctx.content)\n }\n const blank = (error: Error): ImportDocxContext => ({\n error,\n content: null,\n setEditorContent: () => {},\n recovered: {},\n warnings: [],\n header: null,\n footer: null,\n footnotes: {},\n endnotes: {},\n })\n\n try {\n const bytes = await toBytes(args.file)\n const files = unzipSync(bytes)\n\n let uploaded: Map<string, string> | null = null\n if (!opts.resolveMedia && opts.imageUploadConfig) {\n uploaded = await uploadImages(files, opts.imageUploadConfig)\n }\n\n const result: ParseDocxResult = parseDocx(\n { read: (p) => files[p] ?? null },\n {\n DOMParser: globalThis.DOMParser as never,\n resolveMedia:\n opts.resolveMedia ??\n (uploaded ? (_b, entry) => uploaded.get(entry) ?? '' : undefined),\n prosemirrorNodes: opts.prosemirrorNodes ?? undefined,\n prosemirrorMarks: opts.prosemirrorMarks ?? undefined,\n cssStyles: opts.cssStyles,\n },\n )\n\n // 按宿主 schema 降级,否则未知节点会让整个 setContent 抛掉\n const warned = new Set<string>()\n const degraded = degradeToSchema(\n result.doc,\n editor.schema as never,\n warned,\n result.warnings,\n )[0] ?? { type: 'doc', content: [] }\n result.doc = degraded\n\n if (opts.cssStyles && result.css && opts.injectStyles) injectStyles(result.css)\n if (opts.verbose >= 1) {\n console.info('[importDocx] 恢复项', result.recovered)\n }\n if (opts.verbose >= 2) {\n for (const w of result.warnings) console.warn('[importDocx]', w)\n }\n\n finish({\n content: result.doc as JSONContent,\n setEditorContent: (c) =>\n editor.commands.setContent((c ?? result.doc) as JSONContent, { emitUpdate: true }),\n recovered: result.recovered,\n warnings: result.warnings,\n css: result.css,\n header: null,\n footer: null,\n footnotes: {},\n endnotes: {},\n })\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e))\n if (opts.verbose >= 1) console.error('[importDocx] 失败', err)\n finish(blank(err))\n }\n })()\n\n return true\n },\n }\n },\n})\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { D as DocumentViewProps, a as DocumentFormat } from './registry-CvGg65s9.js';
|
|
2
|
+
export { F as FormatAdapter, b as FormatCapabilities, d as detectFormat, g as getFormat, l as listFormats, r as registerFormat } from './registry-CvGg65s9.js';
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import { ReactNode } from 'react';
|
|
5
|
+
|
|
6
|
+
interface DocumentViewComponentProps extends DocumentViewProps {
|
|
7
|
+
/** 文档格式。不传则尝试从 source 的扩展名推断 */
|
|
8
|
+
format?: DocumentFormat;
|
|
9
|
+
/** 引擎加载中的占位 */
|
|
10
|
+
fallback?: ReactNode;
|
|
11
|
+
/** 格式不支持时的兜底渲染。不传则渲染一段说明文字 */
|
|
12
|
+
unsupported?: (format: string) => ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 按格式路由到对应引擎,引擎按需下载。
|
|
16
|
+
*
|
|
17
|
+
* 为什么用 registry + lazy 而不是 if/else 直接 import:
|
|
18
|
+
* 直接 import 会让 Univer(871KB gzip)和 pdf.js 无条件进主包,
|
|
19
|
+
* 哪怕用户从头到尾只看文章。这在阅读侧是不可接受的 ——
|
|
20
|
+
* 本仓刚做完「服务端直出 588KB」的优化,一个表格引擎就能全毁掉。
|
|
21
|
+
*/
|
|
22
|
+
declare function DocumentView({ format, source, fallback, unsupported, ...rest }: DocumentViewComponentProps): react.JSX.Element;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @4399ywkf/editor —— 多格式文档编辑器
|
|
26
|
+
*
|
|
27
|
+
* 主入口只放**格式路由与能力申报**,具体引擎全部懒加载。
|
|
28
|
+
* 直接 import 这里不会把 tiptap / Univer / pdf.js 打进你的主包。
|
|
29
|
+
*
|
|
30
|
+
* ```tsx
|
|
31
|
+
* import { DocumentView, detectFormat } from "@4399ywkf/editor"
|
|
32
|
+
* import "@4399ywkf/editor/styles"
|
|
33
|
+
*
|
|
34
|
+
* <DocumentView format={detectFormat("年度报告.docx")} content={html} />
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* 需要直接用某个引擎时走子路径,能拿到完整 API:
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { NotionEditor } from "@4399ywkf/editor/doc"
|
|
41
|
+
* import { ImportDocx, ExportDocx } from "@4399ywkf/editor/docx"
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
declare const VERSION = "0.1.0";
|
|
46
|
+
|
|
47
|
+
export { DocumentFormat, DocumentView, type DocumentViewComponentProps, DocumentViewProps, VERSION };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { useMemo, lazy, Suspense } from 'react';
|
|
2
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/registry.ts
|
|
5
|
+
var registry = /* @__PURE__ */ new Map();
|
|
6
|
+
function registerFormat(adapter) {
|
|
7
|
+
registry.set(adapter.format, adapter);
|
|
8
|
+
}
|
|
9
|
+
function getFormat(format) {
|
|
10
|
+
return registry.get(format);
|
|
11
|
+
}
|
|
12
|
+
function listFormats() {
|
|
13
|
+
return [...registry.values()];
|
|
14
|
+
}
|
|
15
|
+
function detectFormat(nameOrExt) {
|
|
16
|
+
const m = /\.([a-z0-9]+)$/i.exec(nameOrExt.trim());
|
|
17
|
+
const ext = `.${(m ? m[1] : nameOrExt.replace(/^\./, "")).toLowerCase()}`;
|
|
18
|
+
for (const a of registry.values()) if (a.extensions.includes(ext)) return a.format;
|
|
19
|
+
return void 0;
|
|
20
|
+
}
|
|
21
|
+
registerFormat({
|
|
22
|
+
format: "doc",
|
|
23
|
+
label: "文档",
|
|
24
|
+
extensions: [".doc", ".docx", ".dot", ".dotx", ".docm", ".dotm", ".wps", ".wpt", ".md", ".html"],
|
|
25
|
+
capabilities: {
|
|
26
|
+
editable: true,
|
|
27
|
+
aiOperable: true,
|
|
28
|
+
collaborative: true,
|
|
29
|
+
importExtensions: [".docx", ".md", ".html"],
|
|
30
|
+
exportFormats: ["docx", "html", "json", "markdown"]
|
|
31
|
+
},
|
|
32
|
+
load: () => import('./DocView-5KS7B4DA.js')
|
|
33
|
+
});
|
|
34
|
+
registerFormat({
|
|
35
|
+
format: "sheet",
|
|
36
|
+
label: "表格",
|
|
37
|
+
extensions: [".xls", ".xlsx", ".xlt", ".xltx", ".xlsm", ".xltm", ".csv", ".tsv"],
|
|
38
|
+
capabilities: {
|
|
39
|
+
editable: true,
|
|
40
|
+
aiOperable: true,
|
|
41
|
+
collaborative: false,
|
|
42
|
+
// Univer 协同属于 Pro,OSS 核心不含
|
|
43
|
+
importExtensions: [".xlsx", ".csv"],
|
|
44
|
+
exportFormats: ["xlsx", "csv"]
|
|
45
|
+
},
|
|
46
|
+
load: () => import('./SheetView-2EID6B2I.js')
|
|
47
|
+
});
|
|
48
|
+
registerFormat({
|
|
49
|
+
format: "pdf",
|
|
50
|
+
label: "PDF",
|
|
51
|
+
extensions: [".pdf"],
|
|
52
|
+
capabilities: {
|
|
53
|
+
editable: false,
|
|
54
|
+
// 只读预览。PDF 编辑是 OOXML 引擎那一档的事
|
|
55
|
+
aiOperable: false,
|
|
56
|
+
collaborative: false,
|
|
57
|
+
importExtensions: [".pdf"],
|
|
58
|
+
exportFormats: []
|
|
59
|
+
},
|
|
60
|
+
load: () => import('./PdfView-JDCHTG7Y.js')
|
|
61
|
+
});
|
|
62
|
+
function DocumentView({
|
|
63
|
+
format,
|
|
64
|
+
source,
|
|
65
|
+
fallback,
|
|
66
|
+
unsupported,
|
|
67
|
+
...rest
|
|
68
|
+
}) {
|
|
69
|
+
const resolved = useMemo(() => {
|
|
70
|
+
if (format) return format;
|
|
71
|
+
const name = typeof source === "string" ? source : source?.name;
|
|
72
|
+
if (!name) return void 0;
|
|
73
|
+
return detectFormat(name);
|
|
74
|
+
}, [format, source]);
|
|
75
|
+
const adapter = resolved ? getFormat(resolved) : void 0;
|
|
76
|
+
const View = useMemo(() => {
|
|
77
|
+
if (!adapter) return null;
|
|
78
|
+
return lazy(adapter.load);
|
|
79
|
+
}, [adapter]);
|
|
80
|
+
if (!adapter || !View) {
|
|
81
|
+
return /* @__PURE__ */ jsx(Fragment, { children: unsupported?.(String(resolved ?? "unknown")) ?? /* @__PURE__ */ jsxs("div", { "data-editor-unsupported": String(resolved ?? "unknown"), children: [
|
|
82
|
+
"暂不支持该格式",
|
|
83
|
+
resolved ? `(${resolved})` : "",
|
|
84
|
+
"。 可通过 registerFormat() 注册自有引擎。"
|
|
85
|
+
] }) });
|
|
86
|
+
}
|
|
87
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? /* @__PURE__ */ jsx("div", { "data-editor-loading": adapter.format }), children: /* @__PURE__ */ jsx(View, { source, ...rest }) });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/index.ts
|
|
91
|
+
var VERSION = "0.1.0";
|
|
92
|
+
|
|
93
|
+
export { DocumentView, VERSION, detectFormat, getFormat, listFormats, registerFormat };
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
95
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts","../src/DocumentView.tsx","../src/index.ts"],"names":[],"mappings":";;;;AA8DA,IAAM,QAAA,uBAAe,GAAA,EAAmC;AAEjD,SAAS,eAAe,OAAA,EAA8B;AAC3D,EAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACtC;AAEO,SAAS,UAAU,MAAA,EAAmD;AAC3E,EAAA,OAAO,QAAA,CAAS,IAAI,MAAM,CAAA;AAC5B;AAEO,SAAS,WAAA,GAA+B;AAC7C,EAAA,OAAO,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA;AAC9B;AAGO,SAAS,aAAa,SAAA,EAA+C;AAC1E,EAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAA,CAAK,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,WAAA,EAAa,CAAA,CAAA;AACvE,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,MAAA,EAAO,EAAG,IAAI,CAAA,CAAE,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA;AAC5E,EAAA,OAAO,MAAA;AACT;AAIA,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,UAAA,EAAY,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/F,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,aAAA,EAAe,IAAA;AAAA,IACf,gBAAA,EAAkB,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAAA,IAC1C,aAAA,EAAe,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,UAAU;AAAA,GACpD;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,uBAAiB;AACtC,CAAC,CAAA;AAED,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,UAAA,EAAY,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC/E,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,aAAA,EAAe,KAAA;AAAA;AAAA,IACf,gBAAA,EAAkB,CAAC,OAAA,EAAS,MAAM,CAAA;AAAA,IAClC,aAAA,EAAe,CAAC,MAAA,EAAQ,KAAK;AAAA,GAC/B;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,yBAAmB;AACxC,CAAC,CAAA;AAED,cAAA,CAAe;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,EACnB,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAe,KAAA;AAAA,IACf,gBAAA,EAAkB,CAAC,MAAM,CAAA;AAAA,IACzB,eAAe;AAAC,GAClB;AAAA,EACA,IAAA,EAAM,MAAM,OAAO,uBAAiB;AACtC,CAAC,CAAA;AC1GM,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,MAAM,QAAA,GAAW,QAAoC,MAAM;AACzD,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,KAAW,QAAA,GAAW,SAAU,MAAA,EAA6B,IAAA;AACjF,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,QAAA,GAAW,SAAA,CAAU,QAAQ,CAAA,GAAI,MAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,QAAiD,MAAM;AAClE,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,EAAM;AACrB,IAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,WAAA,GAAc,MAAA,CAAO,QAAA,IAAY,SAAS,CAAC,CAAA,oBAC1C,IAAA,CAAC,KAAA,EAAA,EAAI,yBAAA,EAAyB,MAAA,CAAO,QAAA,IAAY,SAAS,CAAA,EAAG,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MACnD,QAAA,GAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,MAAG;AAAA,KAAA,EAE1C,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAU,QAAA,wBAAa,KAAA,EAAA,EAAI,qBAAA,EAAqB,OAAA,CAAQ,MAAA,EAAQ,GACxE,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAA,EAAiB,GAAG,MAAM,CAAA,EAClC,CAAA;AAEJ;;;AC1BO,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["/**\n * 格式注册表 —— 整个包的骨架。\n *\n * 设计取自腾讯 WorkBuddy 的三通道结构:**按「文档住在哪 / 是什么」分通道,\n * 每个通道一个独立引擎,上面加一层路由**。它没有试图用一套编辑器覆盖全部格式,\n * 我们也不该。\n *\n * 三条硬约束:\n *\n * 1. **引擎必须懒加载。** Univer sheets 核心 gzip 后 871KB、pdf.js 也有几百 KB。\n * 塞进主包会毁掉阅读侧的首屏 —— 只有用户真的打开一个表格 / PDF 时才该下载。\n *\n * 2. **能力要可申报,不能靠猜。** `capabilities` 明确说清每种格式能不能编辑、\n * 能不能被 AI 结构化操作。上层据此决定给什么 UI,而不是先渲染再报错。\n *\n * 3. **宿主可注册自有引擎。** 内置覆盖不了的格式(如 pptx)留给宿主接,\n * 而不是我们假装支持。\n */\nimport type { ComponentType } from \"react\"\n\nexport type DocumentFormat = \"doc\" | \"sheet\" | \"pdf\" | \"pptx\" | (string & {})\n\nexport interface FormatCapabilities {\n /** 能否编辑。false 表示只读预览 */\n editable: boolean\n /** 能否被 AI 通过结构化工具面操作(读结构、按 id 定位、增删改) */\n aiOperable: boolean\n /** 能否协同编辑 */\n collaborative: boolean\n /** 支持导入的扩展名 */\n importExtensions: string[]\n /** 支持导出的格式 */\n exportFormats: string[]\n}\n\nexport interface FormatAdapter {\n format: DocumentFormat\n /** 展示名,给 UI 用 */\n label: string\n capabilities: FormatCapabilities\n /** 该格式认领哪些扩展名(小写、带点) */\n extensions: string[]\n /**\n * 懒加载视图组件。**必须是动态 import**,否则引擎会被打进主包。\n */\n load: () => Promise<{ default: ComponentType<DocumentViewProps> }>\n}\n\nexport interface DocumentViewProps {\n /** 文档来源:URL / File / 已有内容 */\n source?: string | Blob | File\n /** 已有内容(doc 走 tiptap JSON 或 HTML;sheet 走 Univer snapshot) */\n content?: unknown\n readOnly?: boolean\n /** 协同房间号,仅 collaborative 为 true 的格式有意义 */\n room?: string\n className?: string\n /** 引擎就绪回调,拿到底层实例(tiptap Editor / Univer API / PDFDocumentProxy) */\n onReady?: (instance: unknown) => void\n onError?: (error: Error) => void\n}\n\nconst registry = new Map<DocumentFormat, FormatAdapter>()\n\nexport function registerFormat(adapter: FormatAdapter): void {\n registry.set(adapter.format, adapter)\n}\n\nexport function getFormat(format: DocumentFormat): FormatAdapter | undefined {\n return registry.get(format)\n}\n\nexport function listFormats(): FormatAdapter[] {\n return [...registry.values()]\n}\n\n/** 按扩展名判定格式。传文件名、路径或裸扩展名都行。 */\nexport function detectFormat(nameOrExt: string): DocumentFormat | undefined {\n const m = /\\.([a-z0-9]+)$/i.exec(nameOrExt.trim())\n const ext = `.${(m ? m[1] : nameOrExt.replace(/^\\./, \"\")).toLowerCase()}`\n for (const a of registry.values()) if (a.extensions.includes(ext)) return a.format\n return undefined\n}\n\n/* --------------------------- 内置格式 --------------------------- */\n\nregisterFormat({\n format: \"doc\",\n label: \"文档\",\n extensions: [\".doc\", \".docx\", \".dot\", \".dotx\", \".docm\", \".dotm\", \".wps\", \".wpt\", \".md\", \".html\"],\n capabilities: {\n editable: true,\n aiOperable: true,\n collaborative: true,\n importExtensions: [\".docx\", \".md\", \".html\"],\n exportFormats: [\"docx\", \"html\", \"json\", \"markdown\"],\n },\n load: () => import(\"./views/DocView\"),\n})\n\nregisterFormat({\n format: \"sheet\",\n label: \"表格\",\n extensions: [\".xls\", \".xlsx\", \".xlt\", \".xltx\", \".xlsm\", \".xltm\", \".csv\", \".tsv\"],\n capabilities: {\n editable: true,\n aiOperable: true,\n collaborative: false, // Univer 协同属于 Pro,OSS 核心不含\n importExtensions: [\".xlsx\", \".csv\"],\n exportFormats: [\"xlsx\", \"csv\"],\n },\n load: () => import(\"./views/SheetView\"),\n})\n\nregisterFormat({\n format: \"pdf\",\n label: \"PDF\",\n extensions: [\".pdf\"],\n capabilities: {\n editable: false, // 只读预览。PDF 编辑是 OOXML 引擎那一档的事\n aiOperable: false,\n collaborative: false,\n importExtensions: [\".pdf\"],\n exportFormats: [],\n },\n load: () => import(\"./views/PdfView\"),\n})\n\n/**\n * pptx 刻意**不内置**。\n *\n * 调研结论:Univer Slides 官方文档原文写着「请勿用于生产环境」,\n * `@univerjs/slides` 只有 0.17MB 骨架;开源世界里没有第二个可用的\n * 前端 pptx 编辑/渲染引擎。真要做只有 OnlyOffice / Collabora 那一档\n * (AGPL,需法务口径 + 独立部署)。\n *\n * 与其假装支持,不如把口子留给宿主:\n *\n * ```ts\n * registerFormat({\n * format: \"pptx\",\n * label: \"演示文稿\",\n * extensions: [\".ppt\", \".pptx\"],\n * capabilities: { editable: false, aiOperable: false, collaborative: false,\n * importExtensions: [], exportFormats: [] },\n * load: () => import(\"./MyOnlyOfficeSlideView\"),\n * })\n * ```\n */\n","import { Suspense, lazy, useMemo, type ComponentType, type ReactNode } from \"react\"\nimport { detectFormat, getFormat, type DocumentFormat, type DocumentViewProps } from \"./registry\"\n\nexport interface DocumentViewComponentProps extends DocumentViewProps {\n /** 文档格式。不传则尝试从 source 的扩展名推断 */\n format?: DocumentFormat\n /** 引擎加载中的占位 */\n fallback?: ReactNode\n /** 格式不支持时的兜底渲染。不传则渲染一段说明文字 */\n unsupported?: (format: string) => ReactNode\n}\n\n/**\n * 按格式路由到对应引擎,引擎按需下载。\n *\n * 为什么用 registry + lazy 而不是 if/else 直接 import:\n * 直接 import 会让 Univer(871KB gzip)和 pdf.js 无条件进主包,\n * 哪怕用户从头到尾只看文章。这在阅读侧是不可接受的 ——\n * 本仓刚做完「服务端直出 588KB」的优化,一个表格引擎就能全毁掉。\n */\nexport function DocumentView({\n format,\n source,\n fallback,\n unsupported,\n ...rest\n}: DocumentViewComponentProps) {\n const resolved = useMemo<DocumentFormat | undefined>(() => {\n if (format) return format\n const name = typeof source === \"string\" ? source : (source as File | undefined)?.name\n if (!name) return undefined\n return detectFormat(name)\n }, [format, source])\n\n const adapter = resolved ? getFormat(resolved) : undefined\n\n const View = useMemo<ComponentType<DocumentViewProps> | null>(() => {\n if (!adapter) return null\n return lazy(adapter.load)\n }, [adapter])\n\n if (!adapter || !View) {\n return (\n <>\n {unsupported?.(String(resolved ?? \"unknown\")) ?? (\n <div data-editor-unsupported={String(resolved ?? \"unknown\")}>\n 暂不支持该格式{resolved ? `(${resolved})` : \"\"}。\n 可通过 registerFormat() 注册自有引擎。\n </div>\n )}\n </>\n )\n }\n\n return (\n <Suspense fallback={fallback ?? <div data-editor-loading={adapter.format} />}>\n <View source={source} {...rest} />\n </Suspense>\n )\n}\n","/**\n * @4399ywkf/editor —— 多格式文档编辑器\n *\n * 主入口只放**格式路由与能力申报**,具体引擎全部懒加载。\n * 直接 import 这里不会把 tiptap / Univer / pdf.js 打进你的主包。\n *\n * ```tsx\n * import { DocumentView, detectFormat } from \"@4399ywkf/editor\"\n * import \"@4399ywkf/editor/styles\"\n *\n * <DocumentView format={detectFormat(\"年度报告.docx\")} content={html} />\n * ```\n *\n * 需要直接用某个引擎时走子路径,能拿到完整 API:\n *\n * ```ts\n * import { NotionEditor } from \"@4399ywkf/editor/doc\"\n * import { ImportDocx, ExportDocx } from \"@4399ywkf/editor/docx\"\n * ```\n */\nexport {\n detectFormat,\n getFormat,\n listFormats,\n registerFormat,\n type DocumentFormat,\n type DocumentViewProps,\n type FormatAdapter,\n type FormatCapabilities,\n} from \"./registry\"\n\nexport { DocumentView, type DocumentViewComponentProps } from \"./DocumentView\"\n\nexport const VERSION = \"0.1.0\"\n"]}
|
package/dist/pdf.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { D as DocumentViewProps } from './registry-CvGg65s9.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* pdf 通道:pdf.js 只读预览。
|
|
6
|
+
*
|
|
7
|
+
* 刻意只做「看」。PDF 编辑是 OOXML 引擎那一档(OnlyOffice / Collabora)的事,
|
|
8
|
+
* 不该混进语义编辑器 —— 这也是腾讯把本地文件、在线文档、生成内容分成三条
|
|
9
|
+
* 通道的原因:看和改本来就是两件事。
|
|
10
|
+
*/
|
|
11
|
+
declare function PdfView({ source, className, onReady, onError }: DocumentViewProps): react.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { DocumentViewProps, PdfView };
|
package/dist/pdf.js
ADDED
package/dist/pdf.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"pdf.js"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 格式注册表 —— 整个包的骨架。
|
|
5
|
+
*
|
|
6
|
+
* 设计取自腾讯 WorkBuddy 的三通道结构:**按「文档住在哪 / 是什么」分通道,
|
|
7
|
+
* 每个通道一个独立引擎,上面加一层路由**。它没有试图用一套编辑器覆盖全部格式,
|
|
8
|
+
* 我们也不该。
|
|
9
|
+
*
|
|
10
|
+
* 三条硬约束:
|
|
11
|
+
*
|
|
12
|
+
* 1. **引擎必须懒加载。** Univer sheets 核心 gzip 后 871KB、pdf.js 也有几百 KB。
|
|
13
|
+
* 塞进主包会毁掉阅读侧的首屏 —— 只有用户真的打开一个表格 / PDF 时才该下载。
|
|
14
|
+
*
|
|
15
|
+
* 2. **能力要可申报,不能靠猜。** `capabilities` 明确说清每种格式能不能编辑、
|
|
16
|
+
* 能不能被 AI 结构化操作。上层据此决定给什么 UI,而不是先渲染再报错。
|
|
17
|
+
*
|
|
18
|
+
* 3. **宿主可注册自有引擎。** 内置覆盖不了的格式(如 pptx)留给宿主接,
|
|
19
|
+
* 而不是我们假装支持。
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
type DocumentFormat = "doc" | "sheet" | "pdf" | "pptx" | (string & {});
|
|
23
|
+
interface FormatCapabilities {
|
|
24
|
+
/** 能否编辑。false 表示只读预览 */
|
|
25
|
+
editable: boolean;
|
|
26
|
+
/** 能否被 AI 通过结构化工具面操作(读结构、按 id 定位、增删改) */
|
|
27
|
+
aiOperable: boolean;
|
|
28
|
+
/** 能否协同编辑 */
|
|
29
|
+
collaborative: boolean;
|
|
30
|
+
/** 支持导入的扩展名 */
|
|
31
|
+
importExtensions: string[];
|
|
32
|
+
/** 支持导出的格式 */
|
|
33
|
+
exportFormats: string[];
|
|
34
|
+
}
|
|
35
|
+
interface FormatAdapter {
|
|
36
|
+
format: DocumentFormat;
|
|
37
|
+
/** 展示名,给 UI 用 */
|
|
38
|
+
label: string;
|
|
39
|
+
capabilities: FormatCapabilities;
|
|
40
|
+
/** 该格式认领哪些扩展名(小写、带点) */
|
|
41
|
+
extensions: string[];
|
|
42
|
+
/**
|
|
43
|
+
* 懒加载视图组件。**必须是动态 import**,否则引擎会被打进主包。
|
|
44
|
+
*/
|
|
45
|
+
load: () => Promise<{
|
|
46
|
+
default: ComponentType<DocumentViewProps>;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
interface DocumentViewProps {
|
|
50
|
+
/** 文档来源:URL / File / 已有内容 */
|
|
51
|
+
source?: string | Blob | File;
|
|
52
|
+
/** 已有内容(doc 走 tiptap JSON 或 HTML;sheet 走 Univer snapshot) */
|
|
53
|
+
content?: unknown;
|
|
54
|
+
readOnly?: boolean;
|
|
55
|
+
/** 协同房间号,仅 collaborative 为 true 的格式有意义 */
|
|
56
|
+
room?: string;
|
|
57
|
+
className?: string;
|
|
58
|
+
/** 引擎就绪回调,拿到底层实例(tiptap Editor / Univer API / PDFDocumentProxy) */
|
|
59
|
+
onReady?: (instance: unknown) => void;
|
|
60
|
+
onError?: (error: Error) => void;
|
|
61
|
+
}
|
|
62
|
+
declare function registerFormat(adapter: FormatAdapter): void;
|
|
63
|
+
declare function getFormat(format: DocumentFormat): FormatAdapter | undefined;
|
|
64
|
+
declare function listFormats(): FormatAdapter[];
|
|
65
|
+
/** 按扩展名判定格式。传文件名、路径或裸扩展名都行。 */
|
|
66
|
+
declare function detectFormat(nameOrExt: string): DocumentFormat | undefined;
|
|
67
|
+
|
|
68
|
+
export { type DocumentViewProps as D, type FormatAdapter as F, type DocumentFormat as a, type FormatCapabilities as b, detectFormat as d, getFormat as g, listFormats as l, registerFormat as r };
|
package/dist/sheet.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { D as DocumentViewProps } from './registry-CvGg65s9.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* sheet 通道:Univer 适配。
|
|
6
|
+
*
|
|
7
|
+
* 只用 Apache-2.0 的 OSS 核心。**不碰** `@univerjs-pro/*` 与 `univer-cli`:
|
|
8
|
+
* 前者要自建 Univer Server 且需商业授权,后者 63MB、license 字段为 None、
|
|
9
|
+
* 90/91 个 JS 被混淆、还会向 univer.ai 上报遥测 —— 不能进生产链路。
|
|
10
|
+
*
|
|
11
|
+
* xlsx 出入建议走 SheetJS(Apache-2.0)在宿主侧做,接受公式/图表保真损失,
|
|
12
|
+
* 换零采购与代码可控。
|
|
13
|
+
*/
|
|
14
|
+
declare function SheetView({ content, readOnly, className, onReady, onError }: DocumentViewProps): react.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { DocumentViewProps, SheetView };
|
package/dist/sheet.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"sheet.js"}
|