@4399ywkf/editor 0.1.2 → 0.3.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/dist/docx.js.map CHANGED
@@ -1 +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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\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"]}
1
+ {"version":3,"sources":["../src/docx/measure.ts","../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","text","EMU_PER_PX","Extension"],"mappings":"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","file":"docx.js","sourcesContent":["/**\n * 版心测量 —— 导入和导出共用。\n *\n * 表格列宽在两个坐标系之间来回换算:Word 的 dxa 是相对**页面文本宽度**的,\n * 编辑器的 px 是相对**版心宽度**的。两边都需要「版心有多宽」这个数,\n * 而且必须用同一套测法,否则导入缩放一次、导出不缩回来,表格就会越跑越宽。\n */\n\n/** 量一个元素的内容宽度(去掉左右 padding)。量不到就返回 undefined —— 别把 0 或负数传下去 */\nexport function measureContentWidth(dom: unknown): number | undefined {\n const el = dom as HTMLElement | undefined\n if (!el || typeof globalThis.getComputedStyle !== 'function') return undefined\n const cs = globalThis.getComputedStyle(el)\n const w =\n el.clientWidth -\n (Number.parseFloat(cs.paddingLeft) || 0) -\n (Number.parseFloat(cs.paddingRight) || 0)\n return Number.isFinite(w) && w > 0 ? w : undefined\n}\n\n/**\n * 取宿主表格扩展的 cellMinWidth。\n * tiptap 渲染列宽时会 `Math.max(colwidth, cellMinWidth)`,却仍按原始 colwidth\n * 算表格总宽 —— 不把这个下限提前算进去,窄列会被顶宽、表格撑破。\n */\nexport function tableCellMinWidth(editor: {\n extensionManager?: { extensions?: { name: string; options?: unknown }[] }\n}): number | undefined {\n const ext = editor.extensionManager?.extensions?.find((e) => e.name === 'table')\n const v = (ext?.options as { cellMinWidth?: number } | undefined)?.cellMinWidth\n return typeof v === 'number' && v > 0 ? v : undefined\n}\n","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\n/** w:highlight 只有命名色,没有十六进制形式(ECMA-376 §17.18.40,另有一个 none) */\nconst HIGHLIGHT: Record<string, string> = {\n black: '#000000',\n blue: '#0000FF',\n cyan: '#00FFFF',\n green: '#008000',\n magenta: '#FF00FF',\n red: '#FF0000',\n yellow: '#FFFF00',\n white: '#FFFFFF',\n darkBlue: '#000080',\n darkCyan: '#008080',\n darkGreen: '#006400',\n darkMagenta: '#800080',\n darkRed: '#800000',\n darkYellow: '#808000',\n darkGray: '#808080',\n lightGray: '#C0C0C0',\n}\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 * 宿主正文列的宽度(px),用来把表格列宽从「Word 页面」换算到「编辑器版心」。\n *\n * Word 的列宽虽然是绝对磅值,但它是**相对页面文本宽度**定出来的:本文档的\n * 表格 tblW=9026dxa,而页面文本宽度(pgSz − 左右 pgMar)也正好是 9026dxa ——\n * 在 Word 里它铺满一行。照搬绝对值塞进更宽的编辑器版心,就成了缩在左边的窄表。\n * 给了这个值就按比例重新落位:满宽的表继续满宽,半宽的表继续占一半。\n * 不给则保持 Word 的绝对磅值(Node 侧无从测量时的默认)。\n */\n contentWidthPx?: number\n /**\n * 宿主表格扩展的 `cellMinWidth`(px)。\n *\n * tiptap 渲染列宽时会做 `Math.max(colwidth, cellMinWidth)`,但表格总宽仍按\n * 原始 colwidth 算 —— 于是窄列被顶宽、表格撑破、列比例还变了形。\n * 告诉我们这个下限,就能提前把宽度摊匀,不让读端去顶。\n */\n minColumnWidthPx?: number\n}\n\nexport interface DocxSectionRef {\n kind: 'header' | 'footer'\n /** `default` | `first` | `even` */\n type: string\n /** 原 sectPr 里的 r:id */\n rid: string\n /** 包内路径,如 `word/header1.xml` */\n path: string\n}\n\n/**\n * 节属性(页眉页脚 + 页面几何),**原样**带出来。\n *\n * 为什么不解析成 JSONContent 再写回:编辑器没有页眉页脚这个概念,解析→重建\n * 只会把我们看不懂的东西(域、图片、制表位、边框…)在往返中磨掉。这里存的是\n * 原始字节和原始 XML,导出时塞回包里即可,磨不掉 —— 和 `docxInk` 存\n * `strokesXml` 是同一个思路。\n */\nexport interface DocxSection {\n /**\n * 原始 `<w:sectPr>` XML。导出时除了重写页眉页脚的 r:id,其余原样写回 ——\n * 页面尺寸、页边距、页码格式、文档网格、首页不同都在里面。\n */\n sectPrXml: string | null\n refs: DocxSectionRef[]\n /** 页眉页脚部件本身 + 各自的 .rels + 它们引用到的媒体,键是包内路径 */\n files: Record<string, Uint8Array>\n /**\n * 原始 `word/settings.xml`。\n *\n * 和页眉直接相关:`evenAndOddHeaders` 决定奇偶页是否用不同页眉,丢了它\n * 奇偶页眉就失效。另外 `compatSetting compatibilityMode` 缺失会让 Word\n * 按兼容模式打开文档(标题栏挂「兼容模式」,排版规则也退回旧版)。\n */\n settingsXml: string | null\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 /** 默认页眉的结构化内容(供宿主展示;往返靠的是 `section`,不是它) */\n header: Record<string, unknown> | null\n /** 默认页脚的结构化内容,同上 */\n footer: Record<string, unknown> | null\n /** 节属性原件,交给导出侧原样写回 */\n section: DocxSection\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 charStyles: 0,\n fontSizes: 0,\n fontFamilies: 0,\n highlights: 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 paraShading: 0,\n paraSpacing: 0,\n paraIndent: 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 /**\n * 一个 run 的字符格式。`false` 和 `undefined` 是**两回事**:\n * `undefined` = 这一层没表态(继承上层),`false` = 显式关掉(覆盖上层)。\n * 少了这个区分,`<w:b w:val=\"0\"/>` 就压不住样式里的加粗。\n */\n interface Fmt {\n b?: boolean\n i?: boolean\n u?: boolean\n strike?: boolean\n color?: string\n /** CSS 字号,如 `19pt`(OOXML 的 w:sz 是半磅) */\n size?: string\n /** CSS font stack,如 `\"Microsoft YaHei\"` */\n font?: string\n /** 高亮/字符底纹的十六进制色 */\n highlight?: string\n /** 上下标:`superscript` / `subscript` */\n vertAlign?: string\n }\n const STYLE_NAME: Record<string, string> = {}\n const STYLE_FMT: Record<string, Fmt> = {}\n const STYLE_PPR: Record<string, El> = {}\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 own = Array.from(s.childNodes).filter((c) => c.nodeType === 1) as El[]\n const pPr = own.find((c) => c.nodeName === 'w:pPr')\n if (pPr) STYLE_PPR[id] = pPr\n const rPr = own.find((c) => c.nodeName === 'w:rPr')\n if (!rPr) continue\n STYLE_FMT[id] = readFmt(rPr)\n }\n }\n\n function readFmt(rPr: El): Fmt {\n // 缺元素 = 没表态;元素在但 val 是关闭值 = 显式关掉\n const on = (t: string): boolean | undefined => {\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' || v === 'off' ? false : true\n }\n const color = rPr.getElementsByTagName('w:color')[0]?.getAttribute('w:val')\n\n // w:sz 的单位是半磅:38 → 19pt\n const szRaw = rPr.getElementsByTagName('w:sz')[0]?.getAttribute('w:val')\n const szNum = szRaw ? Number(szRaw) : Number.NaN\n const size = Number.isFinite(szNum) && szNum > 0 ? `${szNum / 2}pt` : undefined\n\n /*\n * w:rFonts 有四个槽:ascii(西文)/ eastAsia(中日韩)/ hAnsi / cs。\n * 中文文档里西文和中文常常配不同字体,CSS 表达不了「按字符集分派」,\n * 但 font stack 的回退语义正好够用 —— 西文字体在前、中文字体在后,\n * 浏览器给每个字符各自挑第一个能渲染它的,效果和 Word 一致。\n */\n const rf = rPr.getElementsByTagName('w:rFonts')[0]\n const stack = [rf?.getAttribute('w:ascii'), rf?.getAttribute('w:hAnsi'), rf?.getAttribute('w:eastAsia')]\n .filter((n): n is string => Boolean(n))\n .filter((n, i, a) => a.indexOf(n) === i)\n .map((n) => (/[\\s,]/.test(n) ? `\"${n}\"` : n))\n const font = stack.length ? stack.join(', ') : undefined\n\n // 高亮有两种写法:命名色 w:highlight,和字符底纹 w:shd(任意色)\n const hlName = rPr.getElementsByTagName('w:highlight')[0]?.getAttribute('w:val')\n const shdFill = rPr.getElementsByTagName('w:shd')[0]?.getAttribute('w:fill')\n const highlight =\n hlName && hlName !== 'none'\n ? (HIGHLIGHT[hlName] ?? undefined)\n : shdFill && shdFill !== 'auto' && shdFill !== 'FFFFFF'\n ? `#${shdFill}`\n : undefined\n\n const va = rPr.getElementsByTagName('w:vertAlign')[0]?.getAttribute('w:val')\n\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 size,\n font,\n highlight,\n vertAlign: va === 'superscript' || va === 'subscript' ? va : 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\n // 颜色 / 字号 / 字体共用一个 textStyle 标记(tiptap 的 FontSize、FontFamily、\n // Color 三个扩展都是往 textStyle 上挂属性,拆成多个 mark 会互相覆盖)\n const ts: Record<string, unknown> = {}\n if (f.color) ts.color = f.color\n if (f.size) {\n ts.fontSize = f.size\n recovered.fontSizes += 1\n }\n if (f.font) {\n ts.fontFamily = f.font\n recovered.fontFamilies += 1\n }\n if (Object.keys(ts).length) marks.push({ type: 'textStyle', attrs: ts })\n\n if (f.highlight) {\n marks.push({ type: 'highlight', attrs: { color: f.highlight } })\n recovered.highlights += 1\n }\n if (f.vertAlign) marks.push({ type: f.vertAlign })\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 // 收窄后固化一份:闭包里引用 docXml 拿不到这次判空的收窄结果\n const documentXml: Document = docXml\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\n // 字符样式(w:rStyle,如 Hyperlink / Emphasis)夹在段落样式和直接格式之间\n const rStyleId = rPr ? (rPr.getElementsByTagName('w:rStyle')[0]?.getAttribute('w:val') ?? null) : null\n const charFmt = rStyleId ? resolveStyleFmt(rStyleId) : {}\n if (rStyleId && Object.values(charFmt).some((v) => v !== undefined)) recovered.charStyles += 1\n\n const marks = fmtToMarks({\n ...inherited,\n ...stripUndefined(charFmt),\n ...stripUndefined(direct),\n })\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 /**\n * w:pPr 里的块级排版 → 段落属性。\n *\n * 单位换算:twip(1/20 磅)是 OOXML 的通用长度单位;`w:line` 特殊,\n * lineRule=auto 时它是 240 分之一的**倍数**(360 = 1.5 倍行距),\n * atLeast/exact 时才是 twip。这两种混淆会让行距差出一个数量级。\n */\n function paraLayout(pPr: El, count = true): Record<string, unknown> {\n const attrs: Record<string, unknown> = {}\n\n const jc = first(pPr, 'w:jc')?.getAttribute('w:val')\n if (jc) attrs.textAlign = jc === 'both' ? 'justify' : jc\n\n const fill = first(pPr, 'w:shd')?.getAttribute('w:fill')\n if (fill && fill !== 'auto' && fill !== 'FFFFFF') {\n attrs.backgroundColor = `#${fill}`\n if (count) recovered.paraShading += 1\n }\n\n const ind = first(pPr, 'w:ind')\n // 只认整段左缩进;首行缩进(firstLine / firstLineChars)在 tiptap 里没有对应属性,\n // 拿它当整段缩进会把中文文档常见的「首行缩进 2 字符」放大成整段内缩。\n const left = Number(ind?.getAttribute('w:left') ?? ind?.getAttribute('w:start') ?? 0)\n if (left > 0) {\n attrs.indent = Math.min(8, Math.max(1, Math.round(left / 420)))\n if (count) recovered.paraIndent += 1\n }\n\n const sp = first(pPr, 'w:spacing')\n if (sp) {\n let touched = false\n const line = Number(sp.getAttribute('w:line') ?? 0)\n if (line > 0) {\n const rule = sp.getAttribute('w:lineRule') ?? 'auto'\n attrs.lineHeight =\n rule === 'auto' ? String(Math.round((line / 240) * 100) / 100) : `${line / 20}pt`\n touched = true\n }\n // *Autospacing=\"1\" 表示「由 Word 按上下文自动决定」,此时 before/after 的字面值无意义\n const before = sp.getAttribute('w:before')\n if (before != null && sp.getAttribute('w:beforeAutospacing') !== '1') {\n attrs.spaceBefore = `${Number(before) / 20}pt`\n touched = true\n }\n const after = sp.getAttribute('w:after')\n if (after != null && sp.getAttribute('w:afterAutospacing') !== '1') {\n attrs.spaceAfter = `${Number(after) / 20}pt`\n touched = true\n }\n if (touched && count) recovered.paraSpacing += 1\n }\n\n return attrs\n }\n\n /** 顺 w:basedOn 链合并样式里的段落排版,子样式覆盖父样式 */\n function resolveStylePara(id: string | null, seen = new Set<string>()): Record<string, unknown> {\n if (!id || seen.has(id)) return {}\n seen.add(id)\n const pPr = STYLE_PPR[id]\n return {\n ...resolveStylePara(STYLE_BASE[id] ?? null, seen),\n ...(pPr ? paraLayout(pPr, false) : {}),\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\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 // 段落排版同样走「样式链 → 直接属性」的覆盖顺序\n const attrs: Record<string, unknown> = { ...resolveStylePara(styleId) }\n if (pPr) Object.assign(attrs, paraLayout(pPr))\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 /** 页面文本宽度(px)= pgSz.w − pgMar.left − pgMar.right,取自最后一个 sectPr */\n const sectionTextWidthPx = (() => {\n const sects = documentXml.getElementsByTagName('w:sectPr')\n const sect = sects[sects.length - 1]\n if (!sect) return null\n const num = (tag: string, attr: string) =>\n Number(sect.getElementsByTagName(tag)[0]?.getAttribute(attr) ?? Number.NaN)\n const text = num('w:pgSz', 'w:w') - num('w:pgMar', 'w:left') - num('w:pgMar', 'w:right')\n return Number.isFinite(text) && text > 0 ? text / 15 : null\n })()\n\n /**\n * Word 页面上的列宽 → 编辑器版心里的列宽。\n *\n * 两步:先按「占页面文本宽度的比例」缩放到宿主版心(见 contentWidthPx 的说明),\n * 再把窄于 minColumnWidthPx 的列钉到下限、并从其余列按比例扣回来 ——\n * 否则读端自己去顶下限,表格总宽算的还是原值,结果就是撑破 + 比例失真。\n */\n function fitColumns(pxWidths: number[]): number[] {\n /*\n * 基准必须是正的有限数才敢用。\n * 宿主在隐藏容器里(display:none / 未挂载)导入时量出来的宽度可能是 0,\n * 减掉 padding 甚至是负数 —— 拿它算缩放系数,列宽会全变负;而读端的\n * `Math.max(colwidth, cellMinWidth)` 又会把负值统统顶成下限,\n * 表格所有列一样宽。宁可不缩放,也不能产出负列宽。\n */\n const basis = opts.contentWidthPx\n const usable =\n typeof basis === 'number' && Number.isFinite(basis) && basis > 0 &&\n sectionTextWidthPx !== null && sectionTextWidthPx > 0\n const scale = usable ? (basis as number) / (sectionTextWidthPx as number) : 1\n let out = pxWidths.map((w) => w * scale)\n\n const min = opts.minColumnWidthPx ?? 0\n if (min > 0) {\n const total = out.reduce((a, b) => a + b, 0)\n const pinned = out.map(() => false)\n // 每轮钉住一批不达标的列,剩下的重新摊;最多 n 轮就收敛\n for (let round = 0; round < out.length; round++) {\n const freeTotal = total - out.reduce((a, w, i) => a + (pinned[i] ? min : 0), 0)\n const freeSum = out.reduce((a, w, i) => a + (pinned[i] ? 0 : w), 0)\n if (freeSum <= 0 || freeTotal <= 0) break\n const k = freeTotal / freeSum\n const short = out.map((w, i) => !pinned[i] && w * k < min)\n if (!short.some(Boolean)) {\n out = out.map((w, i) => (pinned[i] ? min : w * k))\n break\n }\n short.forEach((s, i) => {\n if (s) pinned[i] = true\n })\n }\n out = out.map((w, i) => (pinned[i] ? Math.max(w, min) : w))\n }\n\n // 逐列四舍五入会攒出几 px 误差,把差额算在最后一列上,总宽才严丝合缝\n const target = Math.round(out.reduce((a, b) => a + b, 0))\n const rounded = out.map((w) => Math.round(w))\n const drift = target - rounded.reduce((a, b) => a + b, 0)\n if (drift !== 0 && rounded.length) rounded[rounded.length - 1] += drift\n // 兜底:任何情况下都不产出 0 / 负列宽\n return rounded.map((w) => Math.max(1, w))\n }\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 // 采信后还要从 Word 页面换算到宿主版心,否则满宽的表会缩在左边\n const colWidths: (number | null)[] =\n useAbsoluteWidths && sane ? fitColumns(rawWidths as number[]) : []\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 /* --------------------------- 页眉 / 页脚 --------------------------- *\n * 编辑器没有页眉页脚的概念,所以这里做两件不同的事:\n * · 解析出结构化内容 —— 供宿主展示 / 检查(对齐官方 API 的 header/footer 字段)\n * · 把原始部件整包带出 —— 往返靠的是这个。解析→重建一定会磨掉我们看不懂的\n * 东西(域、图片、制表位…),而原始字节磨不掉。\n * ------------------------------------------------------------------ */\n\n const section = readSection()\n const defaultHeader = section.refs.find((r) => r.kind === 'header' && r.type === 'default')\n const defaultFooter = section.refs.find((r) => r.kind === 'footer' && r.type === 'default')\n\n return {\n doc,\n recovered,\n warnings,\n ...(opts.cssStyles ? { css: extractCss(stylesDoc) } : {}),\n header: defaultHeader ? partContent(defaultHeader.path, 'w:hdr') : null,\n footer: defaultFooter ? partContent(defaultFooter.path, 'w:ftr') : null,\n section,\n }\n\n /** 把 header/footer 部件解析成 tiptap doc(只为展示,不参与往返) */\n function partContent(path: string, root: string): Record<string, unknown> | null {\n const d = xml(path)\n const el = d?.getElementsByTagName(root)[0]\n if (!el) return null\n return remapTypes(\n { type: 'doc', content: blocksOf(el) },\n opts.prosemirrorNodes,\n opts.prosemirrorMarks,\n )\n }\n\n /** `word/header1.xml` + `media/a.png` → `word/media/a.png`;处理 ./ 与 ../ */\n function resolveRelative(fromPart: string, target: string): string {\n const segs = fromPart.split('/').slice(0, -1)\n for (const s of target.split('/')) {\n if (s === '' || s === '.') continue\n if (s === '..') segs.pop()\n else segs.push(s)\n }\n return segs.join('/')\n }\n\n /** 带上一个部件本身、它的 .rels,以及 .rels 指向的所有包内文件 */\n function collectPart(path: string, into: Record<string, Uint8Array>): boolean {\n const bytes = entries.read(path)\n if (!bytes) {\n warnings.push(`页眉/页脚部件缺失,已跳过:${path}`)\n return false\n }\n into[path] = bytes\n\n const relsPath = path.replace(/([^/]+)$/, '_rels/$1.rels')\n const relBytes = entries.read(relsPath)\n if (!relBytes) return true\n into[relsPath] = relBytes\n\n const relsDom = new DOMParser().parseFromString(decoder.decode(relBytes), 'text/xml')\n for (const r of Array.from(relsDom.getElementsByTagName('Relationship'))) {\n // 外链(TargetMode=External)不在包里,跳过\n if (r.getAttribute('TargetMode') === 'External') continue\n const target = r.getAttribute('Target')\n if (!target || /^[a-z]+:\\/\\//i.test(target)) continue\n const dep = resolveRelative(path, target)\n const b = entries.read(dep)\n if (b) into[dep] = b\n }\n return true\n }\n\n function readSection(): DocxSection {\n const files: Record<string, Uint8Array> = {}\n const refs: DocxSectionRef[] = []\n\n // 正文的 sectPr 是 w:body 的最后一个子元素;段落级 sectPr 藏在 w:pPr 里,\n // 所以取「最后一个」而不是「第一个」\n const sects = documentXml.getElementsByTagName('w:sectPr')\n const sect = sects[sects.length - 1]\n\n if (sect) {\n for (const kind of ['header', 'footer'] as const) {\n for (const ref of Array.from(sect.getElementsByTagName(`w:${kind}Reference`))) {\n const rid = ref.getAttribute('r:id')\n const target = rid ? REL[rid] : undefined\n if (!rid || !target) continue\n const path = `word/${target.replace(/^\\.\\//, '')}`\n if (!collectPart(path, files)) continue\n refs.push({ kind, type: ref.getAttribute('w:type') ?? 'default', rid, path })\n }\n }\n }\n\n return {\n sectPrXml: rawSectPr(),\n refs,\n files,\n settingsXml: text('word/settings.xml'),\n }\n }\n\n /**\n * 从 document.xml 的原文里切出最后一个 sectPr。\n *\n * 走原文而不是把 DOM 序列化回去:`XMLSerializer` 不在我们注入的接口里\n * (同构约束只要求宿主提供 DOMParser),而且原文能保住属性顺序和命名空间前缀。\n */\n function rawSectPr(): string | null {\n const src = text('word/document.xml')\n if (!src) return null\n const all = src.match(/<w:sectPr\\b[^>]*(?:\\/>|>[\\s\\S]*?<\\/w:sectPr>)/g)\n return all?.length ? all[all.length - 1] : null\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\nimport type { DocxSection } from './parse.ts'\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 * 导入时带出来的节属性(`ParseDocxResult.section`),原样写回。\n *\n * 编辑器渲染不了页眉页脚,但只要把原始部件塞回包里,一趟往返就不会丢 ——\n * 连同页面尺寸、页边距、页码格式、文档网格这些 sectPr 上的东西一起。\n * 不给则退回默认的 A4 + 2.54cm 页边距,且没有页眉页脚。\n */\n section?: DocxSection\n /**\n * 列宽所依据的编辑器版心宽度(px)—— 导入侧 `contentWidthPx` 的**逆变换**。\n *\n * 导入把 Word 的列宽按「占页面文本宽度的比例」重新落到了版心上,导出必须按\n * 同样的比例还回去。只做单向的后果:708px 的表格被当成 708×15 = 10620 dxa 写出去,\n * 而 A4 的页面文本宽度只有 9026 —— 表格在 Word 里冲出右边距、最后一列被切掉。\n *\n * 不给的话按 96dpi 直译(1px = 15dxa),但会**兜底裁到页面文本宽度以内**,\n * 保证再怎么样也不会溢出页面。\n */\n contentWidthPx?: number\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\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 /* --------------------------- 页眉 / 页脚 --------------------------- *\n * 原样带过来的部件先铺进包里 —— 必须在任何 addImage 之前,\n * 否则新图片可能占用 word/media/imageN.png 这种已被页眉媒体占住的名字。\n * ------------------------------------------------------------------ */\n const carried = opts.section?.files ?? {}\n for (const [p, b] of Object.entries(carried)) files[p] = b\n\n /**\n * 页面文本宽度(dxa)= pgSz.w − pgMar.left − pgMar.right。\n * 从带回来的 sectPr 里读;没有就按我们默认写出的 A4 + 2.54cm 边距算。\n */\n const pageTextWidthDxa = (() => {\n const raw = opts.section?.sectPrXml\n const attr = (tag: string, name: string): number | null => {\n const el = raw ? new RegExp(`<w:${tag}\\\\b[^>]*>`).exec(raw)?.[0] : null\n const m = el ? new RegExp(`w:${name}=\"(\\\\d+)\"`).exec(el) : null\n return m ? Number(m[1]) : null\n }\n const w = attr('pgSz', 'w')\n const l = attr('pgMar', 'left')\n const r = attr('pgMar', 'right')\n const text = w !== null && l !== null && r !== null ? w - l - r : null\n return text !== null && text > 0 ? text : 11906 - 1440 - 1440\n })()\n\n /**\n * 编辑器版心里的 px 列宽 → Word 页面上的 dxa。导入侧缩放的逆变换,\n * 加一道「无论如何不许超出页面文本宽度」的兜底。\n */\n function columnsToDxa(px: number[]): number[] {\n const basis = opts.contentWidthPx\n const clamp = (arr: number[]) => {\n const total = arr.reduce((a, b) => a + b, 0)\n if (total <= pageTextWidthDxa || total <= 0) return arr\n const k = pageTextWidthDxa / total\n return arr.map((w) => Math.max(1, Math.round(w * k)))\n }\n if (typeof basis === 'number' && Number.isFinite(basis) && basis > 0) {\n const k = pageTextWidthDxa / basis\n return clamp(px.map((w) => Math.max(1, Math.round(w * k))))\n }\n return clamp(px.map((w) => Math.max(1, Math.round(w * PX_TO_DXA))))\n }\n\n /** 原 r:id → 本次导出新分配的 r:id */\n const ridMap = new Map<string, string>()\n const hdrFtrOverrides: string[] = []\n for (const ref of opts.section?.refs ?? []) {\n if (!files[ref.path]) continue\n const id = `rHF${ridMap.size + 1}`\n ridMap.set(ref.rid, id)\n rels.push(\n `<Relationship Id=\"${id}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/${ref.kind}\" Target=\"${esc(ref.path.replace(/^word\\//, ''))}\"/>`,\n )\n hdrFtrOverrides.push(\n `<Override PartName=\"/${esc(ref.path)}\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.${ref.kind}+xml\"/>`,\n )\n }\n // 页眉里的图片也要有 Default Extension,否则 Word 打不开\n for (const p of Object.keys(carried)) {\n const ext = /\\.([a-z0-9]+)$/i.exec(p)?.[1]?.toLowerCase()\n if (ext && ext !== 'xml' && ext !== 'rels') mediaExts.add(ext)\n }\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 // 避开带过来的媒体已经占用的文件名\n let n = relSeq\n while (files[`word/media/image${n}.${ext}`]) n += 1\n const name = `image${n}.${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 const ts = marks.find((m) => m.type === 'textStyle')?.attrs ?? {}\n\n /*\n * w:rPr 的子元素在 OOXML 里是**有序**序列(CT_RPr):\n * rFonts → b → i → strike → color → sz/szCs → u → shd → vertAlign。\n * 顺序不对属于 schema 违例,严格的读端(含部分 Word 版本)会判文档损坏。\n */\n const fam = cssFontStack(ts.fontFamily)\n if (fam) {\n p.push(\n `<w:rFonts w:ascii=\"${esc(fam.ascii)}\" w:hAnsi=\"${esc(fam.ascii)}\" ` +\n `w:eastAsia=\"${esc(fam.eastAsia)}\" w:cs=\"${esc(fam.ascii)}\"/>`,\n )\n }\n if (has('bold')) p.push('<w:b/>')\n if (has('italic')) p.push('<w:i/>')\n if (has('strike')) p.push('<w:strike/>')\n const color = ts.color\n if (color) p.push(`<w:color w:val=\"${String(color).replace('#', '')}\"/>`)\n // w:sz 是半磅\n const halfPt = cssToHalfPoints(ts.fontSize)\n if (halfPt) p.push(`<w:sz w:val=\"${halfPt}\"/><w:szCs w:val=\"${halfPt}\"/>`)\n if (has('underline')) p.push('<w:u w:val=\"single\"/>')\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 if (has('superscript')) p.push('<w:vertAlign w:val=\"superscript\"/>')\n if (has('subscript')) p.push('<w:vertAlign w:val=\"subscript\"/>')\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 /**\n * w:pPr 的子元素同样有序(CT_PPr):\n * pStyle → numPr → shd → spacing → ind → jc。`lead` 只放 pStyle / numPr,\n * 缩进走 `indentTwips` 而不是塞进 lead —— 否则它会排到 spacing 前面,\n * 还可能和段落自身的 indent 属性各出一个 w:ind。\n */\n function paraProps(node: Node_, lead: string[] = [], indentTwips?: number): string {\n const p = [...lead]\n const bg = node.attrs?.backgroundColor\n if (bg) p.push(`<w:shd w:val=\"clear\" w:fill=\"${String(bg).replace('#', '')}\"/>`)\n\n // 行距 / 段前段后 —— 三者共用一个 w:spacing\n const sp: string[] = []\n const before = cssToTwips(node.attrs?.spaceBefore)\n if (before !== null) sp.push(`w:before=\"${before}\"`)\n const after = cssToTwips(node.attrs?.spaceAfter)\n if (after !== null) sp.push(`w:after=\"${after}\"`)\n const lh = String(node.attrs?.lineHeight ?? '').trim()\n if (lh) {\n // 无单位的是倍数(Word 的基准是 240 = 单倍行距),带单位的是绝对值\n const abs = cssToTwips(lh)\n if (/^[\\d.]+$/.test(lh)) sp.push(`w:line=\"${Math.round(Number(lh) * 240)}\" w:lineRule=\"auto\"`)\n else if (abs !== null) sp.push(`w:line=\"${abs}\" w:lineRule=\"atLeast\"`)\n }\n if (sp.length) p.push(`<w:spacing ${sp.join(' ')}/>`)\n\n const ind = indentTwips ?? Number(node.attrs?.indent ?? 0) * 420\n if (ind > 0) p.push(`<w:ind w:left=\"${ind}\"/>`)\n const align = node.attrs?.textAlign ?? node.attrs?.nodeTextAlign\n if (align && align !== 'left') {\n p.push(`<w:jc w:val=\"${esc(align === 'justify' ? 'both' : align)}\"/>`)\n }\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_, lead: string[] = [], indentTwips?: number): string {\n stats.paragraphs += 1\n return `<w:p>${paraProps(node, lead, indentTwips)}${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 lead = firstDone\n ? []\n : [`<w:numPr><w:ilvl w:val=\"${level}\"/><w:numId w:val=\"${numId}\"/></w:numPr>`]\n const indent = firstDone ? (level + 1) * 720 : undefined\n out.push(`<w:p>${paraProps(child, lead, indent)}${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(px)拼出 tblGrid(dxa)\n const px: number[] = []\n for (const { cell, colSpan } of grid[0] ?? []) {\n const cw: number[] = cell?.attrs?.colwidth ?? []\n for (let i = 0; i < colSpan; i++) px.push(cw[i] ?? 100)\n }\n const widths = columnsToDxa(px)\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 /*\n * tblLayout=fixed:让 Word 严格按 tblGrid / tcW 排版。\n * 默认是 autofit —— Word 会**按内容重算列宽**,我们算好的列宽只当参考值,\n * 结果就是内容短的列被挤扁(\"阶段\"折成两行)。既然列宽是精确算出来的,\n * 就别再让读端二次分配。\n */\n let xml =\n `<w:tbl><w:tblPr><w:tblW w:type=\"dxa\" w:w=\"${widths.reduce((a, b) => a + b, 0)}\"/>` +\n `${borders}<w:tblLayout w:type=\"fixed\"/></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 let col = 0\n for (const { cell, colSpan } of cells) {\n // 单元格自己的首选宽度。只写 tblGrid 是不够的 —— Word 的列宽分配\n // 主要看 tcW,缺了它 tblGrid 会被 autofit 覆盖掉。\n const tcW = widths.slice(col, col + colSpan).reduce((a, b) => a + b, 0)\n col += colSpan\n // CT_TcPr 有序:tcW → gridSpan → vMerge → shd → vAlign\n const props: string[] = [`<w:tcW w:type=\"dxa\" w:w=\"${tcW || 100}\"/>`]\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, [], 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 /**\n * 正文的 sectPr。\n *\n * 有带过来的原件就原样用,只把页眉页脚引用换成本次导出新分配的 r:id ——\n * 用「删掉旧引用 + 在开头插新的」而不是逐个替换 id 字符串:CT_SectPr 里\n * headerReference/footerReference 本来就必须排在最前面,插在开头是合法的,\n * 而且没带回来的部件(导入时就缺失)会顺带被清掉,不会留下悬空引用。\n */\n function sectPr(): string {\n const raw = opts.section?.sectPrXml\n const refs = (opts.section?.refs ?? [])\n .filter((r) => ridMap.has(r.rid))\n .map(\n (r) =>\n `<w:${r.kind}Reference w:type=\"${esc(r.type)}\" r:id=\"${ridMap.get(r.rid)}\"/>`,\n )\n .join('')\n\n if (!raw) {\n const geometry =\n '<w:pgSz w:w=\"11906\" w:h=\"16838\"/><w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\"/>'\n return `<w:sectPr>${refs}${geometry}</w:sectPr>`\n }\n\n const stripped = raw.replace(/<w:(?:header|footer)Reference\\b[^>]*\\/>/g, '')\n // 自闭合的 <w:sectPr .../> 里没地方插,先展开成成对标签\n const selfClosing = /^<w:sectPr\\b([^>]*)\\/>$/.exec(stripped)\n if (selfClosing) return `<w:sectPr${selfClosing[1]}>${refs}</w:sectPr>`\n return stripped.replace(/^(<w:sectPr\\b[^>]*>)/, `$1${refs}`)\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}${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 /*\n * settings.xml。带回来就原样用,否则至少声明 compatibilityMode=15 ——\n * 缺了它 Word 会按「兼容模式」打开(标题栏挂着,排版规则也退回旧版)。\n */\n files['word/settings.xml'] = enc.encode(\n opts.section?.settingsXml ??\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:settings ${NS}>` +\n `<w:compat><w:compatSetting w:name=\"compatibilityMode\" ` +\n `w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"15\"/></w:compat></w:settings>`,\n )\n rels.push(\n `<Relationship Id=\"rSettings\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/>`,\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 `<Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/>` +\n hdrFtrOverrides.join('') +\n `</Types>`,\n )\n\n return { files, warnings, stats }\n}\n\n/** CSS 长度 → 磅。认 pt / px / in / cm / mm;其余(em、%、无单位)返回 null */\nfunction cssToPoints(v: unknown): number | null {\n const m = /^\\s*(-?[\\d.]+)\\s*(pt|px|in|cm|mm)\\s*$/.exec(String(v ?? ''))\n if (!m) return null\n const n = Number(m[1])\n if (!Number.isFinite(n)) return null\n // CSS 里 1px = 1/96 in,1pt = 1/72 in\n const perUnit: Record<string, number> = { pt: 1, px: 0.75, in: 72, cm: 72 / 2.54, mm: 7.2 / 2.54 }\n return n * perUnit[m[2]]\n}\n\n/** CSS 长度 → twip(1/20 磅),OOXML 的通用长度单位 */\nfunction cssToTwips(v: unknown): number | null {\n const pt = cssToPoints(v)\n return pt === null ? null : Math.round(pt * 20)\n}\n\n/** CSS 长度 → 半磅,w:sz / w:szCs 的单位 */\nfunction cssToHalfPoints(v: unknown): number | null {\n const pt = cssToPoints(v)\n return pt === null || pt <= 0 ? null : Math.round(pt * 2)\n}\n\n/**\n * CSS font stack → w:rFonts 的两个槽。\n *\n * 导入时把 ascii / eastAsia 合并成了一个回退栈(西文在前、中文在后),\n * 这里做逆变换:第一项当西文字体,最后一项当中日韩字体。只有一项时两者相同。\n */\nfunction cssFontStack(v: unknown): { ascii: string; eastAsia: string } | null {\n const raw = String(v ?? '').trim()\n if (!raw) return null\n const parts = raw\n .split(',')\n .map((s) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter(Boolean)\n if (!parts.length) return null\n return { ascii: parts[0], eastAsia: parts[parts.length - 1] }\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 { measureContentWidth } from './measure.ts'\nimport { serializeDocx, type SerializeOptions, type SerializeResult } from './serialize.ts'\n\nexport { serializeDocx } from './serialize.ts'\nexport type { SerializeOptions, SerializeResult } from './serialize.ts'\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\n/** 导出的伴随信息。官方回调只给结果本身,统计和警告拿不到 —— 这里作为第二个参数补上 */\nexport interface ExportDocxMeta {\n stats: Record<string, number>\n warnings: string[]\n /** 未压缩的字节数 */\n bytes: number\n}\n\nexport interface ExportDocxOptions extends SerializeOptions {\n /**\n * 导出完成回调。第一个参数的形状由 `exportType` 决定,对齐官方。\n * 第二个参数是本扩展多给的统计与警告 —— 官方回调只给结果,\n * 调用方拿不到「导出时丢了什么」,而那恰恰是最该看的。\n */\n onCompleteExport: ((result: Blob | Uint8Array | string, meta: ExportDocxMeta) => 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 section: undefined,\n contentWidthPx: undefined,\n }\n },\n\n addCommands() {\n return {\n exportDocx:\n (override = {}) =>\n ({ editor }) => {\n const o = { ...this.options, ...override }\n /*\n * 页眉页脚不在文档树里(编辑器渲染不了),而是 ImportDocx 导入时记在\n * storage 上的原始部件。这里默认接上 —— 不接的话,「导入 → 导出」\n * 一趟下来页眉就没了,而这恰恰是最常见的用法。\n * 显式传 section(含传 null)以调用方为准。\n */\n if (o.section === undefined) {\n o.section =\n (editor.storage as { importDocx?: { section?: SerializeOptions['section'] } })\n .importDocx?.section ?? undefined\n }\n /*\n * 列宽换算的基准要和导入侧用同一个,否则表格会越导越宽:\n * 导入按版心把 dxa 缩成 px,导出不缩回去就等于凭空放大。\n */\n if (o.contentWidthPx === undefined) {\n o.contentWidthPx = measureContentWidth(editor.view?.dom)\n }\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 stats,\n warnings,\n bytes: bytes.length,\n })\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 { measureContentWidth, tableCellMinWidth } from './measure.ts'\nimport { DocxField } from './nodes/field.ts'\nimport { DocxInk } from './nodes/ink.ts'\nimport { parseDocx, type DocxSection, type ParseDocxResult } from './parse.ts'\n\nexport { DocxField } from './nodes/field.ts'\nexport { DocxInk } from './nodes/ink.ts'\nexport { parseDocx } from './parse.ts'\nexport type {\n DocxEntries,\n DocxSection,\n DocxSectionRef,\n ParseDocxOptions,\n ParseDocxResult,\n} from './parse.ts'\n\n// 导出侧\nexport { ExportDocx, docxFromJSON, downloadDocx, serializeDocx } from './export.ts'\nexport type { ExportDocxOptions, ExportType, SerializeOptions, SerializeResult } from './export.ts'\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 *\n * Word 的列宽是相对**页面文本宽度**定的:铺满一行的表格,其 tblW 就等于\n * 页宽减左右页边距。照搬这个绝对值塞进编辑器版心(往往更宽),表格就缩在\n * 左边不铺满 —— 也就是「Word 里是自适应的,导进来却不是」。\n *\n * - `'auto'`(默认):导入时量一下编辑器正文列的实际宽度,按比例重新落位。\n * 满宽的表继续满宽,半宽的表继续占一半。\n * - 数字:直接用这个宽度(px)当基准,SSR / 测试等量不到 DOM 的场景用。\n * - `null`:不换算,保留 Word 的绝对磅值。\n */\n tableWidthBasis: number | 'auto' | null\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 /** 默认页眉的结构化内容。供宿主展示 —— 往返靠的是 `section`,不是它 */\n header: JSONContent | null\n /** 默认页脚的结构化内容,同上 */\n footer: JSONContent | null\n /**\n * 节属性原件(页眉页脚部件 + 页面几何)。\n *\n * 编辑器渲染不了页眉页脚,所以它不进文档树;导出时把它交回\n * `serializeDocx({ section })` 就能原样写回。同一个 editor 上同时挂了\n * `ImportDocx` 和 `ExportDocx` 的话不用管 —— 导出侧会自动接上(见下)。\n * 但它只活在内存里:刷新页面 / 换设备就没了,要跨会话往返得自己存。\n */\n section: DocxSection\n // —— 以下字段为 API 兼容而保留,本地解析尚未实现,恒为空 ——\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 tableWidthBasis: 'auto',\n }\n },\n\n addExtensions() {\n // preserveUnsupported 关掉时不注册这两个节点,产出会降级成文本/普通图片\n return this.options.preserveUnsupported === false ? [] : [DocxInk, DocxField]\n },\n\n addStorage() {\n /**\n * 最近一次导入带出来的节属性。\n *\n * 放在 storage 而不是文档树里:页眉页脚不是正文内容,塞进 doc 会多出一个\n * 用户能选中、能删掉的隐形节点,还得走协同同步。放这儿,`ExportDocx`\n * 直接读 `editor.storage.importDocx.section` 就接上了,宿主一行不用写。\n */\n return { section: null as DocxSection | null }\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 section: { sectPrXml: null, refs: [], files: {}, settingsXml: 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 contentWidthPx =\n opts.tableWidthBasis === 'auto'\n ? measureContentWidth(editor.view?.dom)\n : (opts.tableWidthBasis ?? undefined)\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 contentWidthPx,\n minColumnWidthPx: tableCellMinWidth(editor),\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 // 记在 storage 上,导出时 ExportDocx 自己会来取 —— 宿主不用接线\n this.storage.section = result.section\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: result.header as JSONContent | null,\n footer: result.footer as JSONContent | null,\n section: result.section,\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"]}