@coding01/docsjs 0.1.5 → 0.1.6

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/vue.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as vue from 'vue';
2
- export { D as DocsWordEditorChangeDetail, a as DocsWordEditorElementApi, b as DocsWordEditorErrorDetail, c as DocsWordEditorReadyDetail } from './types-DF14w1ol.cjs';
2
+ export { D as DocsWordEditorChangeDetail, a as DocsWordEditorElementApi, b as DocsWordEditorErrorDetail, c as DocsWordEditorReadyDetail } from './types-VvdwVF0_.cjs';
3
3
 
4
4
  declare const WordFidelityEditorVue: vue.DefineComponent<vue.ExtractPropTypes<{
5
5
  lang: {
package/dist/vue.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as vue from 'vue';
2
- export { D as DocsWordEditorChangeDetail, a as DocsWordEditorElementApi, b as DocsWordEditorErrorDetail, c as DocsWordEditorReadyDetail } from './types-DF14w1ol.js';
2
+ export { D as DocsWordEditorChangeDetail, a as DocsWordEditorElementApi, b as DocsWordEditorErrorDetail, c as DocsWordEditorReadyDetail } from './types-VvdwVF0_.js';
3
3
 
4
4
  declare const WordFidelityEditorVue: vue.DefineComponent<vue.ExtractPropTypes<{
5
5
  lang: {
package/dist/vue.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineDocsWordElement
3
- } from "./chunk-IBVWD4UO.js";
3
+ } from "./chunk-632UOG2B.js";
4
4
 
5
5
  // src/vue/WordFidelityEditorVue.ts
6
6
  import { defineComponent, h, onBeforeUnmount, onMounted, ref } from "vue";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coding01/docsjs",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Render-first Word fidelity component with Web Component core and React/Vue adapters",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -38,6 +38,7 @@
38
38
  "visual:update": "node scripts/visual-regression.mjs --update",
39
39
  "visual:test": "node scripts/visual-regression.mjs",
40
40
  "benchmark:fidelity": "node scripts/fidelity-benchmark.mjs",
41
+ "docs:sync": "node scripts/sync-doc-content.mjs",
41
42
  "verify": "npm run lint && npm run typecheck && npm run test && npm run build && npm run sizecheck",
42
43
  "prepublishOnly": "npm run verify"
43
44
  },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/htmlSnapshot.ts","../src/lib/docxHtml.ts","../src/lib/pastePipeline.ts","../src/lib/htmlCompat.ts","../src/lib/styleProfile.ts","../src/lib/renderApply.ts","../src/core/DocsWordElement.ts"],"sourcesContent":["const SNAPSHOT_SHELL_START = \"<!DOCTYPE html><html><head><meta charset=\\\"utf-8\\\"/>\";\nconst SNAPSHOT_SHELL_END = \"</head><body></body></html>\";\n\nexport function buildHtmlSnapshot(rawHtml: string): string {\n if (!rawHtml.trim()) {\n return `${SNAPSHOT_SHELL_START}${SNAPSHOT_SHELL_END}`;\n }\n\n const hasHtmlTag = /<html[\\s>]/i.test(rawHtml);\n if (hasHtmlTag) {\n return rawHtml;\n }\n\n return `${SNAPSHOT_SHELL_START}${SNAPSHOT_SHELL_END}`.replace(\n \"<body></body>\",\n `<body>${rawHtml}</body>`\n );\n}\n\nexport async function readClipboardHtml(): Promise<string | null> {\n if (!navigator.clipboard?.read) {\n return null;\n }\n\n const items = await navigator.clipboard.read();\n for (const item of items) {\n if (item.types.includes(\"text/html\")) {\n const blob = await item.getType(\"text/html\");\n return blob.text();\n }\n }\n\n return null;\n}\n","import JSZip from \"jszip\";\nimport { buildHtmlSnapshot } from \"./htmlSnapshot\";\n\ninterface RelMap {\n [rid: string]: string;\n}\n\ninterface DrawingSizePx {\n widthPx: number | null;\n heightPx: number | null;\n}\n\ninterface FootnoteMap {\n [id: string]: string;\n}\n\ninterface CommentInfo {\n author: string | null;\n date: string | null;\n text: string;\n}\n\ninterface CommentMap {\n [id: string]: CommentInfo;\n}\n\ninterface RevisionMeta {\n type: \"ins\" | \"del\";\n id: string | null;\n author: string | null;\n date: string | null;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction parseXml(xmlText: string): Document {\n const parser = new DOMParser();\n return parser.parseFromString(xmlText, \"application/xml\");\n}\n\nfunction queryAllByLocalName(root: ParentNode, localName: string): Element[] {\n return Array.from(root.querySelectorAll(\"*\")).filter((el) => el.localName === localName);\n}\n\nfunction queryByLocalName(root: ParentNode, localName: string): Element | null {\n return queryAllByLocalName(root, localName)[0] ?? null;\n}\n\nfunction directChildrenByLocalName(node: Element, localName: string): Element[] {\n return Array.from(node.children).filter((child) => child.localName === localName);\n}\n\nfunction getAttr(node: Element | null, name: string): string | null {\n if (!node) return null;\n return node.getAttribute(name);\n}\n\nfunction emuToPx(emu: number): number {\n return (emu * 96) / 914400;\n}\n\nfunction twipToPx(twip: number): number {\n return (twip * 96) / 1440;\n}\n\nfunction parseDrawingSizePx(drawing: Element): DrawingSizePx {\n const extentNode =\n queryAllByLocalName(drawing, \"extent\").find((node) => {\n const parent = node.parentElement;\n return parent?.localName === \"inline\" || parent?.localName === \"anchor\";\n }) ?? null;\n if (!extentNode) {\n return { widthPx: null, heightPx: null };\n }\n\n const rawCx = getAttr(extentNode, \"cx\");\n const rawCy = getAttr(extentNode, \"cy\");\n const cx = rawCx ? Number.parseInt(rawCx, 10) : Number.NaN;\n const cy = rawCy ? Number.parseInt(rawCy, 10) : Number.NaN;\n\n const widthPx = Number.isFinite(cx) && cx > 0 ? emuToPx(cx) : null;\n const heightPx = Number.isFinite(cy) && cy > 0 ? emuToPx(cy) : null;\n return { widthPx, heightPx };\n}\n\nfunction imageDimensionAttributes(sizePx: DrawingSizePx): string {\n const attrs: string[] = [];\n if (sizePx.widthPx !== null) attrs.push(`width=\"${Math.round(sizePx.widthPx)}\"`);\n if (sizePx.heightPx !== null) attrs.push(`height=\"${Math.round(sizePx.heightPx)}\"`);\n if (sizePx.widthPx !== null || sizePx.heightPx !== null) {\n const style: string[] = [\"max-width:100%\"];\n if (sizePx.widthPx !== null) style.push(`width:${sizePx.widthPx.toFixed(2)}px`);\n if (sizePx.heightPx !== null) style.push(`height:${sizePx.heightPx.toFixed(2)}px`);\n attrs.push(`style=\"${style.join(\";\")}\"`);\n }\n return attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n}\n\ninterface AnchorPositionPx {\n leftPx: number | null;\n topPx: number | null;\n}\n\ntype AnchorWrapMode = \"square\" | \"tight\" | \"topAndBottom\" | \"none\" | null;\n\ninterface AnchorMeta {\n position: AnchorPositionPx;\n wrapMode: AnchorWrapMode;\n distTPx: number | null;\n distBPx: number | null;\n distLPx: number | null;\n distRPx: number | null;\n relativeFromH: string | null;\n relativeFromV: string | null;\n behindDoc: boolean;\n allowOverlap: boolean;\n layoutInCell: boolean;\n relativeHeight: number | null;\n}\n\nfunction parseAnchorPositionPx(anchor: Element): AnchorPositionPx {\n let leftPx: number | null = null;\n let topPx: number | null = null;\n\n const positionH = directChildrenByLocalName(anchor, \"positionH\")[0] ?? null;\n const positionV = directChildrenByLocalName(anchor, \"positionV\")[0] ?? null;\n const posH = positionH ? directChildrenByLocalName(positionH, \"posOffset\")[0] ?? null : null;\n const posV = positionV ? directChildrenByLocalName(positionV, \"posOffset\")[0] ?? null : null;\n\n const rawLeft = posH?.textContent?.trim() ?? \"\";\n const rawTop = posV?.textContent?.trim() ?? \"\";\n const left = rawLeft ? Number.parseFloat(rawLeft) : Number.NaN;\n const top = rawTop ? Number.parseFloat(rawTop) : Number.NaN;\n\n if (Number.isFinite(left)) leftPx = emuToPx(left);\n if (Number.isFinite(top)) topPx = emuToPx(top);\n return { leftPx, topPx };\n}\n\nfunction parseAnchorWrapMode(anchor: Element): AnchorWrapMode {\n if (directChildrenByLocalName(anchor, \"wrapSquare\")[0]) return \"square\";\n if (directChildrenByLocalName(anchor, \"wrapTight\")[0]) return \"tight\";\n if (directChildrenByLocalName(anchor, \"wrapTopAndBottom\")[0]) return \"topAndBottom\";\n if (directChildrenByLocalName(anchor, \"wrapNone\")[0]) return \"none\";\n return null;\n}\n\nfunction parseAnchorMeta(drawing: Element): AnchorMeta | null {\n const anchor = directChildrenByLocalName(drawing, \"anchor\")[0] ?? null;\n if (!anchor) return null;\n\n const positionH = directChildrenByLocalName(anchor, \"positionH\")[0] ?? null;\n const positionV = directChildrenByLocalName(anchor, \"positionV\")[0] ?? null;\n const relativeFromH = getAttr(positionH, \"relativeFrom\");\n const relativeFromV = getAttr(positionV, \"relativeFrom\");\n\n const parseDistPx = (name: string): number | null => {\n const raw = getAttr(anchor, name);\n const emu = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(emu) && emu >= 0 ? emuToPx(emu) : null;\n };\n\n const rawHeight = getAttr(anchor, \"relativeHeight\");\n const parsedHeight = rawHeight ? Number.parseInt(rawHeight, 10) : Number.NaN;\n\n const boolAttr = (name: string, fallback: boolean): boolean => {\n const raw = (getAttr(anchor, name) ?? \"\").toLowerCase();\n if (raw === \"1\" || raw === \"true\" || raw === \"on\") return true;\n if (raw === \"0\" || raw === \"false\" || raw === \"off\") return false;\n return fallback;\n };\n\n return {\n position: parseAnchorPositionPx(anchor),\n wrapMode: parseAnchorWrapMode(anchor),\n distTPx: parseDistPx(\"distT\"),\n distBPx: parseDistPx(\"distB\"),\n distLPx: parseDistPx(\"distL\"),\n distRPx: parseDistPx(\"distR\"),\n relativeFromH,\n relativeFromV,\n behindDoc: boolAttr(\"behindDoc\", false),\n allowOverlap: boolAttr(\"allowOverlap\", true),\n layoutInCell: boolAttr(\"layoutInCell\", true),\n relativeHeight: Number.isFinite(parsedHeight) ? parsedHeight : null\n };\n}\n\nfunction mergeImageStyle(baseAttrs: string, anchorMeta: AnchorMeta | null): string {\n if (!anchorMeta) return baseAttrs;\n const { position, wrapMode } = anchorMeta;\n if (position.leftPx === null && position.topPx === null) return baseAttrs;\n const styleParts = [\n \"position:absolute\",\n position.leftPx !== null ? `left:${position.leftPx.toFixed(2)}px` : \"\",\n position.topPx !== null ? `top:${position.topPx.toFixed(2)}px` : \"\",\n `z-index:${anchorMeta.behindDoc ? 0 : anchorMeta.relativeHeight ?? 3}`,\n anchorMeta.distTPx !== null ? `margin-top:${anchorMeta.distTPx.toFixed(2)}px` : \"\",\n anchorMeta.distBPx !== null ? `margin-bottom:${anchorMeta.distBPx.toFixed(2)}px` : \"\",\n anchorMeta.distLPx !== null ? `margin-left:${anchorMeta.distLPx.toFixed(2)}px` : \"\",\n anchorMeta.distRPx !== null ? `margin-right:${anchorMeta.distRPx.toFixed(2)}px` : \"\"\n ].filter((x) => x.length > 0);\n\n if (wrapMode === \"topAndBottom\") {\n styleParts.push(\"display:block\", \"clear:both\");\n }\n\n const anchorAttrs = [\n `data-word-anchor=\"1\"`,\n wrapMode ? `data-word-wrap=\"${wrapMode}\"` : \"\",\n anchorMeta.relativeFromH ? `data-word-anchor-relh=\"${escapeHtml(anchorMeta.relativeFromH)}\"` : \"\",\n anchorMeta.relativeFromV ? `data-word-anchor-relv=\"${escapeHtml(anchorMeta.relativeFromV)}\"` : \"\",\n anchorMeta.behindDoc ? `data-word-anchor-behind=\"1\"` : `data-word-anchor-behind=\"0\"`,\n anchorMeta.allowOverlap ? `data-word-anchor-overlap=\"1\"` : `data-word-anchor-overlap=\"0\"`,\n anchorMeta.layoutInCell ? `data-word-anchor-layout-cell=\"1\"` : `data-word-anchor-layout-cell=\"0\"`\n ]\n .filter((x) => x.length > 0)\n .join(\" \");\n\n if (!baseAttrs.includes(\"style=\")) {\n return `${baseAttrs} style=\"${styleParts.join(\";\")}\" ${anchorAttrs}`;\n }\n\n return baseAttrs.replace(/style=\"([^\"]*)\"/, (_m, styleText: string) => {\n const merged = [styleText, ...styleParts].filter((x) => x.length > 0).join(\";\");\n return `style=\"${merged}\" ${anchorAttrs}`;\n });\n}\n\nfunction parseDocRelsMap(relsXmlText: string | null): RelMap {\n if (!relsXmlText) return {};\n const rels = parseXml(relsXmlText);\n const relationNodes = queryAllByLocalName(rels, \"Relationship\");\n const map: RelMap = {};\n for (const rel of relationNodes) {\n const id = getAttr(rel, \"Id\");\n const target = getAttr(rel, \"Target\");\n if (!id || !target) continue;\n map[id] = target;\n }\n return map;\n}\n\nfunction extToMime(ext: string): string {\n const lower = ext.toLowerCase();\n if (lower === \"png\") return \"image/png\";\n if (lower === \"jpg\" || lower === \"jpeg\") return \"image/jpeg\";\n if (lower === \"gif\") return \"image/gif\";\n if (lower === \"webp\") return \"image/webp\";\n if (lower === \"bmp\") return \"image/bmp\";\n if (lower === \"svg\") return \"image/svg+xml\";\n return \"application/octet-stream\";\n}\n\nfunction normalizeWordPath(relTarget: string): string {\n const normalized = relTarget.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n if (normalized.startsWith(\"word/\")) return normalized;\n if (normalized.startsWith(\"../\")) return `word/${normalized.replace(/^(\\.\\.\\/)+/, \"\")}`;\n return `word/${normalized}`;\n}\n\nasync function imageRidToDataUrl(zip: JSZip, relMap: RelMap, rid: string): Promise<string | null> {\n const relTarget = relMap[rid];\n if (!relTarget) return null;\n const path = normalizeWordPath(relTarget);\n const file = zip.file(path);\n if (!file) return null;\n const base64 = await file.async(\"base64\");\n const ext = path.split(\".\").pop() ?? \"bin\";\n const mime = extToMime(ext);\n return `data:${mime};base64,${base64}`;\n}\n\nasync function readXmlByRid(zip: JSZip, relMap: RelMap, rid: string): Promise<string | null> {\n const relTarget = relMap[rid];\n if (!relTarget) return null;\n const path = normalizeWordPath(relTarget);\n const file = zip.file(path);\n return file ? file.async(\"string\") : null;\n}\n\nfunction parseChartType(chartDoc: Document): string {\n const known = [\"barChart\", \"lineChart\", \"pieChart\", \"areaChart\", \"scatterChart\", \"radarChart\", \"doughnutChart\"];\n for (const type of known) {\n if (queryByLocalName(chartDoc, type)) return type.replace(/Chart$/, \"\");\n }\n return \"unknown\";\n}\n\nfunction parseChartSummary(chartXmlText: string): { title: string; type: string; seriesCount: number; pointCount: number } {\n const chartDoc = parseXml(chartXmlText);\n const title = queryAllByLocalName(chartDoc, \"t\")\n .map((n) => (n.textContent ?? \"\").trim())\n .find((v) => v.length > 0) ?? \"Chart\";\n const seriesCount = queryAllByLocalName(chartDoc, \"ser\").length;\n const pointCount = queryAllByLocalName(chartDoc, \"pt\").length;\n const type = parseChartType(chartDoc);\n return { title, type, seriesCount, pointCount };\n}\n\nfunction extractSmartArtText(diagramXmlText: string): string[] {\n const diagramDoc = parseXml(diagramXmlText);\n return queryAllByLocalName(diagramDoc, \"t\")\n .map((n) => (n.textContent ?? \"\").trim())\n .filter((v) => v.length > 0)\n .slice(0, 12);\n}\n\nfunction ommlNodeToText(node: Element): string {\n if (node.localName === \"t\") return node.textContent ?? \"\";\n if (node.localName === \"f\") {\n const num = queryByLocalName(node, \"num\");\n const den = queryByLocalName(node, \"den\");\n return `(${num ? ommlNodeToText(num) : \"?\"})/(${den ? ommlNodeToText(den) : \"?\"})`;\n }\n if (node.localName === \"sSup\") {\n const e = queryByLocalName(node, \"e\");\n const sup = queryByLocalName(node, \"sup\");\n return `${e ? ommlNodeToText(e) : \"\"}^(${sup ? ommlNodeToText(sup) : \"\"})`;\n }\n if (node.localName === \"sSub\") {\n const e = queryByLocalName(node, \"e\");\n const sub = queryByLocalName(node, \"sub\");\n return `${e ? ommlNodeToText(e) : \"\"}_(${sub ? ommlNodeToText(sub) : \"\"})`;\n }\n if (node.localName === \"rad\") {\n const e = queryByLocalName(node, \"e\");\n return `sqrt(${e ? ommlNodeToText(e) : \"\"})`;\n }\n return Array.from(node.children)\n .map((child) => ommlNodeToText(child))\n .join(\"\");\n}\n\nfunction runStyleToCss(rPr: Element | null): string {\n if (!rPr) return \"\";\n const declarations: string[] = [];\n\n if (queryByLocalName(rPr, \"b\")) declarations.push(\"font-weight:700\");\n if (queryByLocalName(rPr, \"i\")) declarations.push(\"font-style:italic\");\n if (queryByLocalName(rPr, \"u\")) declarations.push(\"text-decoration:underline\");\n if (queryByLocalName(rPr, \"strike\")) declarations.push(\"text-decoration:line-through\");\n\n const color = queryByLocalName(rPr, \"color\");\n const colorVal = getAttr(color, \"w:val\") ?? getAttr(color, \"val\");\n if (colorVal && colorVal.toLowerCase() !== \"auto\") declarations.push(`color:#${colorVal}`);\n\n const highlight = queryByLocalName(rPr, \"highlight\");\n const highlightVal = (getAttr(highlight, \"w:val\") ?? getAttr(highlight, \"val\") ?? \"\").toLowerCase();\n if (highlightVal === \"yellow\") declarations.push(\"background-color:#fff200\");\n\n const vertAlign = queryByLocalName(rPr, \"vertAlign\");\n const vertVal = (getAttr(vertAlign, \"w:val\") ?? getAttr(vertAlign, \"val\") ?? \"\").toLowerCase();\n if (vertVal === \"superscript\") declarations.push(\"vertical-align:super;font-size:0.83em\");\n if (vertVal === \"subscript\") declarations.push(\"vertical-align:sub;font-size:0.83em\");\n\n return declarations.join(\";\");\n}\n\nfunction paragraphTag(paragraph: Element): \"p\" | \"h1\" | \"h2\" | \"h3\" {\n const pPr = queryByLocalName(paragraph, \"pPr\");\n const pStyle = pPr ? queryByLocalName(pPr, \"pStyle\") : null;\n const val = (getAttr(pStyle, \"w:val\") ?? getAttr(pStyle, \"val\") ?? \"\").toLowerCase();\n if (val.includes(\"heading1\") || val === \"1\" || val === \"heading 1\") return \"h1\";\n if (val.includes(\"heading2\") || val === \"2\" || val === \"heading 2\") return \"h2\";\n if (val.includes(\"heading3\") || val === \"3\" || val === \"heading 3\") return \"h3\";\n return \"p\";\n}\n\nfunction paragraphAlignStyle(paragraph: Element): string {\n const pPr = queryByLocalName(paragraph, \"pPr\");\n const jc = pPr ? queryByLocalName(pPr, \"jc\") : null;\n const align = (getAttr(jc, \"w:val\") ?? getAttr(jc, \"val\") ?? \"\").toLowerCase();\n if (align === \"center\" || align === \"right\" || align === \"left\") {\n return `text-align:${align};`;\n }\n return \"\";\n}\n\nfunction paragraphDataAttr(paragraphIndex: number | null): string {\n return paragraphIndex === null ? \"\" : ` data-word-p-index=\"${paragraphIndex}\"`;\n}\n\nfunction parseFootnotesMap(footnotesXmlText: string | null): FootnoteMap {\n if (!footnotesXmlText) return {};\n const footnotesDoc = parseXml(footnotesXmlText);\n const map: FootnoteMap = {};\n const footnotes = queryAllByLocalName(footnotesDoc, \"footnote\");\n for (const footnote of footnotes) {\n const idRaw = getAttr(footnote, \"w:id\") ?? getAttr(footnote, \"id\");\n const idNum = idRaw ? Number.parseInt(idRaw, 10) : Number.NaN;\n if (!Number.isFinite(idNum) || idNum <= 0) continue;\n\n const paragraphs = queryAllByLocalName(footnote, \"p\");\n const text = paragraphs.map((p) => paragraphText(p)).join(\"<br/>\").trim();\n if (!text) continue;\n map[String(idNum)] = text;\n }\n return map;\n}\n\nfunction parseCommentsMap(commentsXmlText: string | null): CommentMap {\n if (!commentsXmlText) return {};\n const commentsDoc = parseXml(commentsXmlText);\n const map: CommentMap = {};\n const comments = queryAllByLocalName(commentsDoc, \"comment\");\n for (const comment of comments) {\n const idRaw = getAttr(comment, \"w:id\") ?? getAttr(comment, \"id\");\n if (!idRaw) continue;\n const paragraphs = queryAllByLocalName(comment, \"p\");\n const text = paragraphs.map((p) => paragraphText(p)).join(\"<br/>\").trim();\n if (!text) continue;\n map[idRaw] = {\n author: getAttr(comment, \"w:author\") ?? getAttr(comment, \"author\"),\n date: getAttr(comment, \"w:date\") ?? getAttr(comment, \"date\"),\n text\n };\n }\n return map;\n}\n\nfunction parseEndnotesMap(endnotesXmlText: string | null): FootnoteMap {\n if (!endnotesXmlText) return {};\n const endnotesDoc = parseXml(endnotesXmlText);\n const map: FootnoteMap = {};\n const endnotes = queryAllByLocalName(endnotesDoc, \"endnote\");\n for (const endnote of endnotes) {\n const idRaw = getAttr(endnote, \"w:id\") ?? getAttr(endnote, \"id\");\n const idNum = idRaw ? Number.parseInt(idRaw, 10) : Number.NaN;\n if (!Number.isFinite(idNum) || idNum <= 0) continue;\n\n const paragraphs = queryAllByLocalName(endnote, \"p\");\n const text = paragraphs.map((p) => paragraphText(p)).join(\"<br/>\").trim();\n if (!text) continue;\n map[String(idNum)] = text;\n }\n return map;\n}\n\nfunction renderFootnotesSection(usedIds: string[], footnotesMap: FootnoteMap): string {\n const uniq = [...new Set(usedIds)].filter((id) => footnotesMap[id]);\n if (uniq.length === 0) return \"\";\n const items = uniq\n .map((id) => `<li id=\"word-footnote-${id}\" data-word-footnote-id=\"${id}\">${footnotesMap[id]}</li>`)\n .join(\"\");\n return `<section data-word-footnotes=\"1\"><hr/><ol>${items}</ol></section>`;\n}\n\nfunction renderCommentsSection(usedIds: string[], commentsMap: CommentMap): string {\n const uniq = [...new Set(usedIds)].filter((id) => commentsMap[id]);\n if (uniq.length === 0) return \"\";\n const items = uniq\n .map((id) => {\n const item = commentsMap[id];\n const meta = [item.author ?? \"\", item.date ?? \"\"].filter((x) => x.length > 0).join(\" · \");\n const metaHtml = meta ? `<div data-word-comment-meta=\"1\">${escapeHtml(meta)}</div>` : \"\";\n return `<li id=\"word-comment-${id}\" data-word-comment-id=\"${id}\">${metaHtml}<div>${item.text}</div></li>`;\n })\n .join(\"\");\n return `<section data-word-comments=\"1\"><hr/><ol>${items}</ol></section>`;\n}\n\nfunction renderEndnotesSection(usedIds: string[], endnotesMap: FootnoteMap): string {\n const uniq = [...new Set(usedIds)].filter((id) => endnotesMap[id]);\n if (uniq.length === 0) return \"\";\n const items = uniq\n .map((id) => `<li id=\"word-endnote-${id}\" data-word-endnote-id=\"${id}\">${endnotesMap[id]}</li>`)\n .join(\"\");\n return `<section data-word-endnotes=\"1\"><hr/><ol>${items}</ol></section>`;\n}\n\nasync function paragraphToHtml(\n zip: JSZip,\n relMap: RelMap,\n paragraph: Element,\n paragraphIndex: number | null,\n footnotesMap: FootnoteMap,\n usedFootnoteIds: string[],\n endnotesMap: FootnoteMap,\n usedEndnoteIds: string[],\n commentsMap: CommentMap,\n usedCommentIds: string[]\n): Promise<string> {\n const tag = paragraphTag(paragraph);\n const alignStyle = paragraphAlignStyle(paragraph);\n const dataAttr = paragraphDataAttr(paragraphIndex);\n const hasRenderableNode =\n queryAllByLocalName(paragraph, \"r\").length > 0 ||\n queryAllByLocalName(paragraph, \"oMath\").length > 0 ||\n queryAllByLocalName(paragraph, \"oMathPara\").length > 0;\n if (!hasRenderableNode) {\n return `<${tag}${dataAttr}${alignStyle ? ` style=\"${alignStyle}\"` : \"\"}><br/></${tag}>`;\n }\n\n function parseRevisionMeta(node: Element, type: \"ins\" | \"del\"): RevisionMeta {\n return {\n type,\n id: getAttr(node, \"w:id\") ?? getAttr(node, \"id\"),\n author: getAttr(node, \"w:author\") ?? getAttr(node, \"author\"),\n date: getAttr(node, \"w:date\") ?? getAttr(node, \"date\")\n };\n }\n\n function inferRevisionMeta(run: Element, fallback: RevisionMeta | null): RevisionMeta | null {\n if (fallback) return fallback;\n let cursor: Element | null = run;\n while (cursor) {\n if (cursor.localName === \"ins\") return parseRevisionMeta(cursor, \"ins\");\n if (cursor.localName === \"del\") return parseRevisionMeta(cursor, \"del\");\n if (cursor.localName === \"p\") break;\n cursor = cursor.parentElement;\n }\n return null;\n }\n\n function revisionMetaAttrs(meta: RevisionMeta): string {\n const attrs: string[] = [`data-word-revision=\"${meta.type}\"`];\n if (meta.id) attrs.push(`data-word-revision-id=\"${escapeHtml(meta.id)}\"`);\n if (meta.author) attrs.push(`data-word-revision-author=\"${escapeHtml(meta.author)}\"`);\n if (meta.date) attrs.push(`data-word-revision-date=\"${escapeHtml(meta.date)}\"`);\n return attrs.join(\" \");\n }\n\n async function runToHtml(run: Element, revisionFallback: RevisionMeta | null): Promise<string[]> {\n const result: string[] = [];\n const rPr = queryByLocalName(run, \"rPr\");\n const css = runStyleToCss(rPr);\n\n const footnoteRef = queryByLocalName(run, \"footnoteReference\");\n const footnoteId = getAttr(footnoteRef, \"w:id\") ?? getAttr(footnoteRef, \"id\");\n if (footnoteId && footnotesMap[footnoteId]) {\n usedFootnoteIds.push(footnoteId);\n result.push(\n `<sup data-word-footnote-ref=\"${footnoteId}\"><a href=\"#word-footnote-${footnoteId}\">[${footnoteId}]</a></sup>`\n );\n return result;\n }\n\n const endnoteRef = queryByLocalName(run, \"endnoteReference\");\n const endnoteId = getAttr(endnoteRef, \"w:id\") ?? getAttr(endnoteRef, \"id\");\n if (endnoteId && endnotesMap[endnoteId]) {\n usedEndnoteIds.push(endnoteId);\n result.push(\n `<sup data-word-endnote-ref=\"${endnoteId}\"><a href=\"#word-endnote-${endnoteId}\">[${endnoteId}]</a></sup>`\n );\n return result;\n }\n\n const commentRef = queryByLocalName(run, \"commentReference\");\n const commentId = getAttr(commentRef, \"w:id\") ?? getAttr(commentRef, \"id\");\n if (commentId && commentsMap[commentId]) {\n usedCommentIds.push(commentId);\n result.push(\n `<sup data-word-comment-ref=\"${commentId}\"><a href=\"#word-comment-${commentId}\">[c${commentId}]</a></sup>`\n );\n return result;\n }\n\n const drawing = queryByLocalName(run, \"drawing\");\n if (drawing) {\n const blip = queryByLocalName(drawing, \"blip\");\n const rid = getAttr(blip, \"r:embed\") ?? getAttr(blip, \"embed\");\n if (rid) {\n const src = await imageRidToDataUrl(zip, relMap, rid);\n if (src) {\n const imageSize = parseDrawingSizePx(drawing);\n const dimensionAttrs = imageDimensionAttributes(imageSize);\n const anchorMeta = parseAnchorMeta(drawing);\n const attrs = mergeImageStyle(dimensionAttrs, anchorMeta);\n result.push(`<img src=\"${src}\" alt=\"word-image\"${attrs}/>`);\n return result;\n }\n }\n\n const chartRef = queryByLocalName(drawing, \"chart\");\n const chartRid = getAttr(chartRef, \"r:id\") ?? getAttr(chartRef, \"id\");\n if (chartRid) {\n const chartXmlText = await readXmlByRid(zip, relMap, chartRid);\n if (chartXmlText) {\n const summary = parseChartSummary(chartXmlText);\n result.push(\n `<figure data-word-chart=\"1\" data-word-chart-type=\"${summary.type}\" data-word-chart-series=\"${summary.seriesCount}\" data-word-chart-points=\"${summary.pointCount}\">` +\n `<figcaption>${escapeHtml(summary.title)}</figcaption>` +\n `<div>Chart(${escapeHtml(summary.type)}): series=${summary.seriesCount}, points=${summary.pointCount}</div>` +\n `</figure>`\n );\n return result;\n }\n }\n\n const smartArtRef = queryByLocalName(drawing, \"relIds\");\n const smartArtRid = getAttr(smartArtRef, \"r:dm\") ?? getAttr(smartArtRef, \"dm\");\n if (smartArtRid) {\n const diagramXmlText = await readXmlByRid(zip, relMap, smartArtRid);\n const textItems = diagramXmlText ? extractSmartArtText(diagramXmlText) : [];\n const preview = textItems.length > 0 ? `: ${escapeHtml(textItems.join(\" / \"))}` : \"\";\n result.push(\n `<figure data-word-smartart=\"1\" data-word-smartart-items=\"${textItems.length}\">` +\n `<figcaption>SmartArt fallback${preview}</figcaption>` +\n `</figure>`\n );\n return result;\n }\n }\n\n const texts = queryAllByLocalName(run, \"t\").map((t) => t.textContent ?? \"\").join(\"\");\n const delTexts = queryAllByLocalName(run, \"delText\").map((t) => t.textContent ?? \"\").join(\"\");\n const brNodes = queryAllByLocalName(run, \"br\");\n const pageBreakCount = brNodes.filter((node) => {\n const type = (getAttr(node, \"w:type\") ?? getAttr(node, \"type\") ?? \"\").toLowerCase();\n return type === \"page\";\n }).length;\n const lineBreakCount = Math.max(0, brNodes.length - pageBreakCount);\n const runText = `${escapeHtml(texts || delTexts)}${\"<br/>\".repeat(lineBreakCount)}`;\n if (runText) {\n const revisionMeta = inferRevisionMeta(run, revisionFallback);\n if (css) {\n const span = `<span style=\"${css}\">${runText}</span>`;\n if (revisionMeta) {\n const tagName = revisionMeta.type === \"ins\" ? \"ins\" : \"del\";\n result.push(`<${tagName} ${revisionMetaAttrs(revisionMeta)}>${span}</${tagName}>`);\n } else {\n result.push(span);\n }\n } else if (revisionMeta) {\n const tagName = revisionMeta.type === \"ins\" ? \"ins\" : \"del\";\n result.push(`<${tagName} ${revisionMetaAttrs(revisionMeta)}>${runText}</${tagName}>`);\n } else {\n result.push(runText);\n }\n }\n\n for (let i = 0; i < pageBreakCount; i += 1) {\n result.push(`<span data-word-page-break=\"1\" style=\"display:block;break-before:page\"></span>`);\n }\n return result;\n }\n\n async function nodeToHtml(node: Element, revisionFallback: RevisionMeta | null): Promise<string[]> {\n if (node.localName === \"commentRangeStart\") {\n const id = getAttr(node, \"w:id\") ?? getAttr(node, \"id\");\n return id ? [`<span data-word-comment-range-start=\"${id}\"></span>`] : [];\n }\n if (node.localName === \"commentRangeEnd\") {\n const id = getAttr(node, \"w:id\") ?? getAttr(node, \"id\");\n return id ? [`<span data-word-comment-range-end=\"${id}\"></span>`] : [];\n }\n if (node.localName === \"r\") {\n return runToHtml(node, revisionFallback);\n }\n if (node.localName === \"oMath\" || node.localName === \"oMathPara\") {\n const linear = ommlNodeToText(node).trim();\n if (!linear) return [];\n return [`<span data-word-omml=\"1\">${escapeHtml(linear)}</span>`];\n }\n if (node.localName === \"ins\" || node.localName === \"del\") {\n const scopedMeta = parseRevisionMeta(node, node.localName === \"ins\" ? \"ins\" : \"del\");\n const nested: string[] = [];\n for (const child of Array.from(node.children)) {\n nested.push(...(await nodeToHtml(child, scopedMeta)));\n }\n return nested;\n }\n const nested: string[] = [];\n for (const child of Array.from(node.children)) {\n nested.push(...(await nodeToHtml(child, revisionFallback)));\n }\n return nested;\n }\n\n const parts: string[] = [];\n const renderedPageBreakCount = queryAllByLocalName(paragraph, \"lastRenderedPageBreak\").length;\n for (let i = 0; i < renderedPageBreakCount; i += 1) {\n parts.push(`<span data-word-page-break=\"1\" style=\"display:block;break-before:page\"></span>`);\n }\n for (const child of Array.from(paragraph.children)) {\n parts.push(...(await nodeToHtml(child, null)));\n }\n\n const content = parts.join(\"\") || \"<br/>\";\n return `<${tag}${dataAttr}${alignStyle ? ` style=\"${alignStyle}\"` : \"\"}>${content}</${tag}>`;\n}\n\nfunction runText(run: Element): string {\n const text = queryAllByLocalName(run, \"t\").map((t) => t.textContent ?? \"\").join(\"\");\n const delText = queryAllByLocalName(run, \"delText\").map((t) => t.textContent ?? \"\").join(\"\");\n const brCount = queryAllByLocalName(run, \"br\").length;\n return `${escapeHtml(text || delText)}${\"<br/>\".repeat(brCount)}`;\n}\n\nfunction paragraphText(paragraph: Element): string {\n const runs = queryAllByLocalName(paragraph, \"r\");\n const content = runs.map((run) => runText(run)).join(\"\");\n return content || \"<br/>\";\n}\n\nfunction parseTcGridSpan(tc: Element): number {\n const tcPr = directChildrenByLocalName(tc, \"tcPr\")[0] ?? null;\n const gridSpan = tcPr ? directChildrenByLocalName(tcPr, \"gridSpan\")[0] ?? null : null;\n const rawVal = getAttr(gridSpan, \"w:val\") ?? getAttr(gridSpan, \"val\");\n const parsed = rawVal ? Number.parseInt(rawVal, 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;\n}\n\nfunction parseTcVMerge(tc: Element): \"none\" | \"restart\" | \"continue\" {\n const tcPr = directChildrenByLocalName(tc, \"tcPr\")[0] ?? null;\n const vMerge = tcPr ? directChildrenByLocalName(tcPr, \"vMerge\")[0] ?? null : null;\n if (!vMerge) return \"none\";\n const rawVal = (getAttr(vMerge, \"w:val\") ?? getAttr(vMerge, \"val\") ?? \"continue\").toLowerCase();\n return rawVal === \"restart\" ? \"restart\" : \"continue\";\n}\n\nfunction parseTblGridWidthsPx(table: Element): number[] {\n const grid = directChildrenByLocalName(table, \"tblGrid\")[0] ?? null;\n if (!grid) return [];\n return directChildrenByLocalName(grid, \"gridCol\")\n .map((col) => {\n const raw = getAttr(col, \"w:w\") ?? getAttr(col, \"w\");\n const twip = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(twip) && twip > 0 ? twipToPx(twip) : 0;\n })\n .filter((px) => px > 0);\n}\n\nfunction borderSizeToPx(size: number): number {\n return size / 6;\n}\n\nfunction parseBorderCss(borderNode: Element | null): string | null {\n if (!borderNode) return null;\n const val = (getAttr(borderNode, \"w:val\") ?? getAttr(borderNode, \"val\") ?? \"\").toLowerCase();\n if (!val || val === \"nil\" || val === \"none\") return \"none\";\n const color = (getAttr(borderNode, \"w:color\") ?? getAttr(borderNode, \"color\") ?? \"222222\").replace(/^#/, \"\");\n const rawSize = getAttr(borderNode, \"w:sz\") ?? getAttr(borderNode, \"sz\");\n const size = rawSize ? Number.parseInt(rawSize, 10) : Number.NaN;\n const px = Number.isFinite(size) && size > 0 ? borderSizeToPx(size) : 1;\n const style = val === \"single\" ? \"solid\" : val;\n return `${px.toFixed(2)}px ${style} #${color}`;\n}\n\ninterface TableStyleProfile {\n tableLayout: \"fixed\" | \"auto\";\n borderCollapse: \"collapse\" | \"separate\";\n borderSpacingPx: number;\n borderCss: string;\n insideHCss: string | null;\n insideVCss: string | null;\n}\n\nfunction parseTableStyleProfile(table: Element): TableStyleProfile {\n const tblPr = directChildrenByLocalName(table, \"tblPr\")[0] ?? null;\n const tblBorders = tblPr ? directChildrenByLocalName(tblPr, \"tblBorders\")[0] ?? null : null;\n const layout = tblPr ? directChildrenByLocalName(tblPr, \"tblLayout\")[0] ?? null : null;\n const spacing = tblPr ? directChildrenByLocalName(tblPr, \"tblCellSpacing\")[0] ?? null : null;\n const spacingType = (getAttr(spacing, \"w:type\") ?? getAttr(spacing, \"type\") ?? \"dxa\").toLowerCase();\n const spacingRaw = getAttr(spacing, \"w:w\") ?? getAttr(spacing, \"w\");\n const spacingVal = spacingRaw ? Number.parseFloat(spacingRaw) : Number.NaN;\n const borderSpacingPx =\n spacingType === \"dxa\" && Number.isFinite(spacingVal) && spacingVal > 0 ? twipToPx(spacingVal) : 0;\n const borderCollapse = borderSpacingPx > 0 ? \"separate\" : \"collapse\";\n const tableLayout = (getAttr(layout, \"w:type\") ?? getAttr(layout, \"type\") ?? \"\").toLowerCase() === \"autofit\" ? \"auto\" : \"fixed\";\n\n const top = parseBorderCss(tblBorders ? directChildrenByLocalName(tblBorders, \"top\")[0] ?? null : null);\n const bottom = parseBorderCss(tblBorders ? directChildrenByLocalName(tblBorders, \"bottom\")[0] ?? null : null);\n const left = parseBorderCss(tblBorders ? directChildrenByLocalName(tblBorders, \"left\")[0] ?? null : null);\n const right = parseBorderCss(tblBorders ? directChildrenByLocalName(tblBorders, \"right\")[0] ?? null : null);\n const insideH = parseBorderCss(tblBorders ? directChildrenByLocalName(tblBorders, \"insideH\")[0] ?? null : null);\n const insideV = parseBorderCss(tblBorders ? directChildrenByLocalName(tblBorders, \"insideV\")[0] ?? null : null);\n const borderCss = top ?? right ?? bottom ?? left ?? \"1px solid #222\";\n\n return {\n tableLayout,\n borderCollapse,\n borderSpacingPx,\n borderCss,\n insideHCss: insideH,\n insideVCss: insideV\n };\n}\n\nfunction parseTableWidthStyle(table: Element, gridWidthsPx: number[]): string {\n const tblPr = directChildrenByLocalName(table, \"tblPr\")[0] ?? null;\n const tblW = tblPr ? directChildrenByLocalName(tblPr, \"tblW\")[0] ?? null : null;\n const type = (getAttr(tblW, \"w:type\") ?? getAttr(tblW, \"type\") ?? \"\").toLowerCase();\n const rawVal = getAttr(tblW, \"w:w\") ?? getAttr(tblW, \"w\");\n const numericVal = rawVal ? Number.parseFloat(rawVal) : Number.NaN;\n if (type === \"dxa\" && Number.isFinite(numericVal) && numericVal > 0) {\n return `width:${twipToPx(numericVal).toFixed(2)}px`;\n }\n if (type === \"pct\" && Number.isFinite(numericVal) && numericVal > 0) {\n return `width:${(numericVal / 50).toFixed(2)}%`;\n }\n const gridTotal = gridWidthsPx.reduce((sum, item) => sum + item, 0);\n if (gridTotal > 0) return `width:${gridTotal.toFixed(2)}px;max-width:100%`;\n return \"width:100%\";\n}\n\nfunction parseCellWidthStyle(cell: Element, colCursor: number, colSpan: number, gridWidthsPx: number[]): string {\n const tcPr = directChildrenByLocalName(cell, \"tcPr\")[0] ?? null;\n const tcW = tcPr ? directChildrenByLocalName(tcPr, \"tcW\")[0] ?? null : null;\n const type = (getAttr(tcW, \"w:type\") ?? getAttr(tcW, \"type\") ?? \"\").toLowerCase();\n const rawVal = getAttr(tcW, \"w:w\") ?? getAttr(tcW, \"w\");\n const numericVal = rawVal ? Number.parseFloat(rawVal) : Number.NaN;\n\n if (type === \"dxa\" && Number.isFinite(numericVal) && numericVal > 0) {\n return `width:${twipToPx(numericVal).toFixed(2)}px`;\n }\n if (type === \"pct\" && Number.isFinite(numericVal) && numericVal > 0) {\n return `width:${(numericVal / 50).toFixed(2)}%`;\n }\n const width = gridWidthsPx.slice(colCursor, colCursor + colSpan).reduce((sum, item) => sum + item, 0);\n if (width > 0) return `width:${width.toFixed(2)}px`;\n return \"\";\n}\n\nfunction parseCellBorderStyle(cell: Element, tableStyle: TableStyleProfile): string {\n const tcPr = directChildrenByLocalName(cell, \"tcPr\")[0] ?? null;\n const tcBorders = tcPr ? directChildrenByLocalName(tcPr, \"tcBorders\")[0] ?? null : null;\n if (!tcBorders) {\n const fallback = tableStyle.insideHCss ?? tableStyle.insideVCss ?? tableStyle.borderCss;\n return `border:${fallback}`;\n }\n const top = parseBorderCss(directChildrenByLocalName(tcBorders, \"top\")[0] ?? null) ?? tableStyle.insideHCss ?? tableStyle.borderCss;\n const right = parseBorderCss(directChildrenByLocalName(tcBorders, \"right\")[0] ?? null) ?? tableStyle.insideVCss ?? tableStyle.borderCss;\n const bottom = parseBorderCss(directChildrenByLocalName(tcBorders, \"bottom\")[0] ?? null) ?? tableStyle.insideHCss ?? tableStyle.borderCss;\n const left = parseBorderCss(directChildrenByLocalName(tcBorders, \"left\")[0] ?? null) ?? tableStyle.insideVCss ?? tableStyle.borderCss;\n return `border-top:${top};border-right:${right};border-bottom:${bottom};border-left:${left}`;\n}\n\nfunction tableCellHtml(cell: Element, paragraphIndexMap: Map<Element, number>): string {\n const blocks: string[] = [];\n for (const child of Array.from(cell.children)) {\n if (child.localName === \"tcPr\") continue;\n if (child.localName === \"p\") {\n const paragraphIndex = paragraphIndexMap.get(child) ?? null;\n blocks.push(`<p${paragraphDataAttr(paragraphIndex)}>${paragraphText(child)}</p>`);\n continue;\n }\n if (child.localName === \"tbl\") {\n blocks.push(tableToHtml(child, paragraphIndexMap));\n continue;\n }\n }\n\n if (blocks.length > 0) return blocks.join(\"\");\n const text = queryAllByLocalName(cell, \"t\").map((t) => t.textContent ?? \"\").join(\"\").trim();\n return escapeHtml(text) || \"<br/>\";\n}\n\nfunction tableToHtml(table: Element, paragraphIndexMap: Map<Element, number>): string {\n const rows = directChildrenByLocalName(table, \"tr\");\n const gridWidthsPx = parseTblGridWidthsPx(table);\n const tableStyle = parseTableStyleProfile(table);\n\n type MergeOrigin = {\n id: string;\n startCol: number;\n colSpan: number;\n rowSpan: number;\n startedRow: number;\n };\n\n const activeByCol = new Map<number, MergeOrigin>();\n const allOrigins: MergeOrigin[] = [];\n let nextOriginId = 1;\n\n const htmlRows = rows.map((row, rowIndex) => {\n const directCells = directChildrenByLocalName(row, \"tc\");\n const continued = new Set<MergeOrigin>();\n const emittedCells: string[] = [];\n let colCursor = 0;\n\n for (const cell of directCells) {\n const colSpan = parseTcGridSpan(cell);\n const vMerge = parseTcVMerge(cell);\n\n if (vMerge === \"continue\") {\n const activeOrigins = Array.from(new Set(activeByCol.values()))\n .filter((origin) => !continued.has(origin))\n .sort((a, b) => a.startCol - b.startCol);\n const origin =\n activeOrigins.find((item) => item.startCol >= colCursor) ??\n activeOrigins[0] ??\n null;\n if (origin) {\n origin.rowSpan += 1;\n continued.add(origin);\n colCursor = origin.startCol + origin.colSpan;\n }\n continue;\n }\n\n while (activeByCol.has(colCursor)) {\n colCursor += 1;\n }\n\n const html = tableCellHtml(cell, paragraphIndexMap);\n const attrs: string[] = [];\n const widthStyle = parseCellWidthStyle(cell, colCursor, colSpan, gridWidthsPx);\n const borderStyle = parseCellBorderStyle(cell, tableStyle);\n if (vMerge === \"restart\") {\n const origin: MergeOrigin = {\n id: `m${nextOriginId}`,\n startCol: colCursor,\n colSpan,\n rowSpan: 1,\n startedRow: rowIndex\n };\n nextOriginId += 1;\n allOrigins.push(origin);\n for (let i = 0; i < colSpan; i += 1) {\n activeByCol.set(colCursor + i, origin);\n }\n attrs.push(`data-word-merge-id=\"${origin.id}\"`);\n }\n\n if (colSpan > 1) attrs.push(`colspan=\"${colSpan}\"`);\n emittedCells.push(\n `<td${attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\"} style=\"${borderStyle};vertical-align:top;${widthStyle}\">${html}</td>`\n );\n colCursor += colSpan;\n }\n\n for (const origin of Array.from(new Set(activeByCol.values()))) {\n if (origin.startedRow < rowIndex && !continued.has(origin)) {\n for (let i = 0; i < origin.colSpan; i += 1) {\n activeByCol.delete(origin.startCol + i);\n }\n }\n }\n\n return `<tr>${emittedCells.join(\"\")}</tr>`;\n });\n\n let merged = htmlRows.join(\"\");\n for (const origin of allOrigins) {\n const marker = `data-word-merge-id=\"${origin.id}\"`;\n const replacement = origin.rowSpan > 1 ? `rowspan=\"${origin.rowSpan}\"` : \"\";\n merged = merged.replace(marker, replacement).replace(/\\s{2,}/g, \" \");\n }\n\n const tableWidthStyle = parseTableWidthStyle(table, gridWidthsPx);\n const spacing = tableStyle.borderSpacingPx > 0 ? `border-spacing:${tableStyle.borderSpacingPx.toFixed(2)}px;` : \"\";\n return `<table style=\"border-collapse:${tableStyle.borderCollapse};${spacing}table-layout:${tableStyle.tableLayout};${tableWidthStyle};border:${tableStyle.borderCss};\">${merged}</table>`;\n}\n\nexport async function parseDocxToHtmlSnapshot(file: File): Promise<string> {\n const maybeArrayBuffer = (file as unknown as { arrayBuffer?: () => Promise<ArrayBuffer> }).arrayBuffer;\n const buffer = maybeArrayBuffer ? await maybeArrayBuffer.call(file) : await new Response(file).arrayBuffer();\n const zip = await JSZip.loadAsync(buffer);\n\n const documentXmlText = await zip.file(\"word/document.xml\")?.async(\"string\");\n if (!documentXmlText) {\n throw new Error(\"DOCX missing document.xml\");\n }\n const relsText = await zip.file(\"word/_rels/document.xml.rels\")?.async(\"string\");\n const footnotesText = await zip.file(\"word/footnotes.xml\")?.async(\"string\");\n const endnotesText = await zip.file(\"word/endnotes.xml\")?.async(\"string\");\n const commentsText = await zip.file(\"word/comments.xml\")?.async(\"string\");\n const relMap = parseDocRelsMap(relsText ?? null);\n const footnotesMap = parseFootnotesMap(footnotesText ?? null);\n const endnotesMap = parseEndnotesMap(endnotesText ?? null);\n const commentsMap = parseCommentsMap(commentsText ?? null);\n const usedFootnoteIds: string[] = [];\n const usedEndnoteIds: string[] = [];\n const usedCommentIds: string[] = [];\n const documentXml = parseXml(documentXmlText);\n const body = queryByLocalName(documentXml, \"body\");\n if (!body) {\n throw new Error(\"DOCX missing body\");\n }\n\n const paragraphIndexMap = new Map<Element, number>();\n queryAllByLocalName(documentXml, \"p\").forEach((paragraph, index) => {\n paragraphIndexMap.set(paragraph, index);\n });\n\n const blockHtml: string[] = [];\n for (const child of Array.from(body.children)) {\n if (child.localName === \"sectPr\") continue;\n if (child.localName === \"p\") {\n const paragraphIndex = paragraphIndexMap.get(child) ?? null;\n blockHtml.push(\n await paragraphToHtml(\n zip,\n relMap,\n child,\n paragraphIndex,\n footnotesMap,\n usedFootnoteIds,\n endnotesMap,\n usedEndnoteIds,\n commentsMap,\n usedCommentIds\n )\n );\n continue;\n }\n if (child.localName === \"tbl\") {\n blockHtml.push(tableToHtml(child, paragraphIndexMap));\n continue;\n }\n }\n\n blockHtml.push(renderFootnotesSection(usedFootnoteIds, footnotesMap));\n blockHtml.push(renderEndnotesSection(usedEndnoteIds, endnotesMap));\n blockHtml.push(renderCommentsSection(usedCommentIds, commentsMap));\n return buildHtmlSnapshot(blockHtml.join(\"\\n\"));\n}\n","function escapeAttr(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll('\"', \"&quot;\");\n}\n\nasync function fileToDataUrl(file: File): Promise<string> {\n const buffer = await new Response(file).arrayBuffer();\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n const base64 = btoa(binary);\n const mime = file.type || \"application/octet-stream\";\n return `data:${mime};base64,${base64}`;\n}\n\nfunction isUnstableImageSrc(src: string): boolean {\n const normalized = src.trim().toLowerCase();\n return (\n normalized.startsWith(\"file:\") ||\n normalized.startsWith(\"blob:\") ||\n normalized.startsWith(\"cid:\") ||\n normalized.startsWith(\"mhtml:\") ||\n normalized.startsWith(\"ms-appx:\") ||\n normalized.startsWith(\"ms-appdata:\")\n );\n}\n\nasync function replaceUnstableImageSrc(rawHtml: string, imageFiles: File[]): Promise<string> {\n if (!rawHtml.trim() || imageFiles.length === 0) return rawHtml;\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(rawHtml, \"text/html\");\n const images = Array.from(doc.querySelectorAll(\"img\"));\n\n const replacementDataUrls = await Promise.all(imageFiles.map((file) => fileToDataUrl(file)));\n let replacementIndex = 0;\n\n for (const img of images) {\n const src = img.getAttribute(\"src\") ?? \"\";\n if (isUnstableImageSrc(src) && replacementIndex < replacementDataUrls.length) {\n img.setAttribute(\"src\", replacementDataUrls[replacementIndex]);\n replacementIndex += 1;\n }\n }\n\n return doc.body.innerHTML;\n}\n\nasync function buildImageOnlyHtml(imageFiles: File[]): Promise<string> {\n if (imageFiles.length === 0) return \"\";\n const urls = await Promise.all(imageFiles.map((f) => fileToDataUrl(f)));\n return urls.map((url) => `<p><img src=\"${escapeAttr(url)}\" alt=\"clipboard-image\" /></p>`).join(\"\\n\");\n}\n\nexport interface PastePayload {\n html: string;\n text: string;\n imageFiles: File[];\n}\n\nexport async function extractFromClipboardDataTransfer(dataTransfer: DataTransfer): Promise<PastePayload> {\n const html = dataTransfer.getData(\"text/html\") || \"\";\n const text = dataTransfer.getData(\"text/plain\") || \"\";\n\n const imageFiles = Array.from(dataTransfer.items)\n .filter((item) => item.kind === \"file\" && item.type.startsWith(\"image/\"))\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null);\n\n const hydratedHtml = await replaceUnstableImageSrc(html, imageFiles);\n const finalHtml = hydratedHtml.trim() ? hydratedHtml : await buildImageOnlyHtml(imageFiles);\n\n return {\n html: finalHtml,\n text,\n imageFiles\n };\n}\n\nexport async function extractFromClipboardItems(items: ClipboardItem[]): Promise<PastePayload> {\n let html = \"\";\n let text = \"\";\n const imageFiles: File[] = [];\n\n for (const item of items) {\n if (item.types.includes(\"text/html\") && !html) {\n const blob = await item.getType(\"text/html\");\n html = await blob.text();\n }\n if (item.types.includes(\"text/plain\") && !text) {\n const blob = await item.getType(\"text/plain\");\n text = await blob.text();\n }\n\n for (const type of item.types) {\n if (!type.startsWith(\"image/\")) continue;\n const blob = await item.getType(type);\n const name = `clipboard-${Date.now()}-${imageFiles.length}.${type.split(\"/\")[1] ?? \"bin\"}`;\n imageFiles.push(new File([blob], name, { type }));\n }\n }\n\n const hydratedHtml = await replaceUnstableImageSrc(html, imageFiles);\n const finalHtml = hydratedHtml.trim() ? hydratedHtml : await buildImageOnlyHtml(imageFiles);\n\n return {\n html: finalHtml,\n text,\n imageFiles\n };\n}\n","export interface WordHtmlCompatOptions {\n forceBodyFontFamily?: string;\n forceHeadingFontFamily?: string;\n}\n\nfunction parseStyle(styleText: string): Map<string, string> {\n const map = new Map<string, string>();\n for (const seg of styleText.split(\";\")) {\n const [rawKey, ...rawValue] = seg.split(\":\");\n const key = rawKey?.trim().toLowerCase();\n const value = rawValue.join(\":\").trim();\n if (!key || !value) continue;\n map.set(key, value);\n }\n return map;\n}\n\nfunction serializeStyle(styleMap: Map<string, string>): string {\n return Array.from(styleMap.entries())\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\n}\n\nfunction applyMsoMappings(styleMap: Map<string, string>): void {\n const mappingPairs: Array<[string, string]> = [\n [\"mso-ansi-font-size\", \"font-size\"],\n [\"mso-bidi-font-size\", \"font-size\"],\n [\"mso-hansi-font-size\", \"font-size\"],\n [\"mso-margin-top-alt\", \"margin-top\"],\n [\"mso-margin-bottom-alt\", \"margin-bottom\"],\n [\"mso-margin-left-alt\", \"margin-left\"],\n [\"mso-margin-right-alt\", \"margin-right\"],\n [\"mso-line-height-alt\", \"line-height\"]\n ];\n\n for (const [msoKey, cssKey] of mappingPairs) {\n const value = styleMap.get(msoKey);\n if (!value) continue;\n if (!styleMap.has(cssKey)) {\n styleMap.set(cssKey, value);\n }\n }\n\n const msoFore = styleMap.get(\"mso-foreground\");\n if (msoFore && !styleMap.has(\"color\")) {\n styleMap.set(\"color\", msoFore);\n }\n\n if (styleMap.get(\"mso-table-lspace\") && !styleMap.has(\"margin-left\")) {\n styleMap.set(\"margin-left\", \"0\");\n }\n if (styleMap.get(\"mso-table-rspace\") && !styleMap.has(\"margin-right\")) {\n styleMap.set(\"margin-right\", \"0\");\n }\n}\n\nfunction applyListFallback(el: HTMLElement, styleMap: Map<string, string>): void {\n const className = (el.getAttribute(\"class\") ?? \"\").toLowerCase();\n const msoList = styleMap.get(\"mso-list\") ?? \"\";\n const maybeList = className.includes(\"msolist\") || msoList.length > 0;\n if (!maybeList) return;\n\n if (!styleMap.has(\"text-indent\")) {\n styleMap.set(\"text-indent\", \"0\");\n }\n\n const marginLeft = styleMap.get(\"margin-left\");\n if (marginLeft && !styleMap.has(\"padding-left\")) {\n styleMap.set(\"padding-left\", marginLeft);\n }\n}\n\nfunction applyTagSpecificFallback(el: HTMLElement, styleMap: Map<string, string>): void {\n const tag = el.tagName.toLowerCase();\n\n if (tag === \"table\") {\n if (!styleMap.has(\"border-collapse\")) {\n styleMap.set(\"border-collapse\", \"collapse\");\n }\n if (!styleMap.has(\"border-spacing\")) {\n styleMap.set(\"border-spacing\", \"0\");\n }\n }\n\n if ((tag === \"td\" || tag === \"th\") && !styleMap.has(\"vertical-align\")) {\n styleMap.set(\"vertical-align\", \"top\");\n }\n\n if (tag === \"p\" && !styleMap.has(\"min-height\")) {\n styleMap.set(\"min-height\", \"1em\");\n }\n}\n\nfunction normalizeWordEmptyParagraphs(doc: Document): void {\n const paragraphs = Array.from(doc.querySelectorAll(\"p\"));\n for (const p of paragraphs) {\n const text = (p.textContent ?? \"\").replace(/\\u00a0/g, \" \").trim();\n const hasVisibleChildren = p.querySelector(\"img,table,svg,canvas,br\") !== null;\n if (!hasVisibleChildren && text.length === 0) {\n p.innerHTML = \"<br/>\";\n }\n }\n}\n\nfunction applyGlobalDocFixes(doc: Document, options?: WordHtmlCompatOptions): void {\n const body = doc.body;\n if (!body) return;\n\n if (options?.forceBodyFontFamily) {\n body.style.fontFamily = options.forceBodyFontFamily;\n }\n\n if (options?.forceHeadingFontFamily) {\n const headings = Array.from(doc.querySelectorAll(\"h1,h2,h3,h4,h5,h6\"));\n for (const heading of headings) {\n (heading as HTMLElement).style.fontFamily = options.forceHeadingFontFamily;\n }\n }\n}\n\nexport function applyWordHtmlCompatibility(doc: Document, options?: WordHtmlCompatOptions): void {\n const elements = Array.from(doc.querySelectorAll(\"[style], p, table, td, th, li, div, span\"));\n\n for (const el of elements) {\n const htmlEl = el as HTMLElement;\n const rawStyle = htmlEl.getAttribute(\"style\") ?? \"\";\n const styleMap = parseStyle(rawStyle);\n\n applyMsoMappings(styleMap);\n applyListFallback(htmlEl, styleMap);\n applyTagSpecificFallback(htmlEl, styleMap);\n\n if (styleMap.size > 0) {\n htmlEl.setAttribute(\"style\", serializeStyle(styleMap));\n }\n }\n\n normalizeWordEmptyParagraphs(doc);\n applyGlobalDocFixes(doc, options);\n}\n","import JSZip from \"jszip\";\n\nexport interface WordStyleProfile {\n sourceFileName: string;\n bodyFontPx: number;\n bodyLineHeightRatio: number;\n bodyLineHeightPx: number | null;\n bodyLineHeightRule: \"auto\" | \"exact\" | \"atLeast\";\n paragraphAfterPx: number;\n contentWidthPx: number;\n pageHeightPx: number;\n pageMarginTopPx: number;\n pageMarginBottomPx: number;\n titleFontPx: number;\n titleColor: string;\n titleAlign: \"left\" | \"center\" | \"right\";\n bodyFontFamily: string;\n titleFontFamily: string;\n discoveredFonts: string[];\n tableCellPaddingTopPx: number;\n tableCellPaddingLeftPx: number;\n tableCellPaddingBottomPx: number;\n tableCellPaddingRightPx: number;\n paragraphProfiles: ParagraphStyleProfile[];\n trailingDateText: string | null;\n trailingDateAlignedRight: boolean;\n trailingDateParagraphIndex: number | null;\n trailingEmptyParagraphCountBeforeDate: number;\n}\n\nexport interface ParagraphStyleProfile {\n index: number;\n text: string;\n isEmpty: boolean;\n align: \"left\" | \"center\" | \"right\";\n beforePx: number | null;\n afterPx: number | null;\n lineHeightRatio: number | null;\n lineHeightPx: number | null;\n lineHeightRule: \"auto\" | \"exact\" | \"atLeast\" | null;\n indentLeftPx: number | null;\n indentRightPx: number | null;\n firstLinePx: number | null;\n hangingPx: number | null;\n listNumId: number | null;\n listLevel: number | null;\n listFormat: string | null;\n listTextPattern: string | null;\n listStartAt: number;\n keepNext: boolean;\n keepLines: boolean;\n pageBreakBefore: boolean;\n sectionBreakBefore: boolean;\n runs: RunStyleProfile[];\n}\n\nexport interface RunStyleProfile {\n text: string;\n fontSizePx: number | null;\n color: string | null;\n highlightColor: string | null;\n shadingColor: string | null;\n charSpacingPx: number | null;\n shadow: boolean;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n superscript: boolean;\n subscript: boolean;\n fontFamily: string | null;\n}\n\nconst FALLBACK_PROFILE: Omit<WordStyleProfile, \"sourceFileName\"> = {\n bodyFontPx: 14.6667,\n bodyLineHeightRatio: 1.158333,\n bodyLineHeightPx: null,\n bodyLineHeightRule: \"auto\",\n paragraphAfterPx: 10.67,\n contentWidthPx: 553.73,\n pageHeightPx: 1122.53,\n pageMarginTopPx: 96,\n pageMarginBottomPx: 96,\n titleFontPx: 32,\n titleColor: \"#0F4761\",\n titleAlign: \"center\",\n bodyFontFamily: \"\\\"Times New Roman\\\", \\\"Noto Serif SC\\\", serif\",\n titleFontFamily: \"DengXian, \\\"Noto Sans SC\\\", \\\"Microsoft YaHei\\\", sans-serif\",\n discoveredFonts: [],\n tableCellPaddingTopPx: 0,\n tableCellPaddingLeftPx: 7.2,\n tableCellPaddingBottomPx: 0,\n tableCellPaddingRightPx: 7.2,\n paragraphProfiles: [],\n trailingDateText: null,\n trailingDateAlignedRight: false,\n trailingDateParagraphIndex: null,\n trailingEmptyParagraphCountBeforeDate: 0\n};\n\nexport function createFallbackWordStyleProfile(sourceFileName = \"snapshot\"): WordStyleProfile {\n return {\n sourceFileName,\n ...FALLBACK_PROFILE,\n paragraphProfiles: []\n };\n}\n\nfunction twipToPx(twip: number): number {\n return twip / 15;\n}\n\nfunction getAttr(node: Element | null, attr: string): string | null {\n if (!node) return null;\n return node.getAttribute(attr);\n}\n\nfunction getTwipAttr(node: Element | null, attr: string): number | null {\n const raw = getAttr(node, attr);\n if (!raw) return null;\n const parsed = Number.parseFloat(raw);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction queryByLocalName(root: ParentNode, localName: string): Element | null {\n const all = Array.from(root.querySelectorAll(\"*\"));\n return all.find((el) => el.localName === localName) ?? null;\n}\n\nfunction queryAllByLocalName(root: ParentNode, localName: string): Element[] {\n const all = Array.from(root.querySelectorAll(\"*\"));\n return all.filter((el) => el.localName === localName);\n}\n\nfunction parseXml(xmlText: string): Document {\n const parser = new DOMParser();\n return parser.parseFromString(xmlText, \"application/xml\");\n}\n\nfunction parsePageGeometry(documentXml: Document): {\n contentWidthPx: number | null;\n pageHeightPx: number | null;\n marginTopPx: number | null;\n marginBottomPx: number | null;\n} {\n const sectPr = queryByLocalName(documentXml, \"sectPr\");\n if (!sectPr) {\n return {\n contentWidthPx: null,\n pageHeightPx: null,\n marginTopPx: null,\n marginBottomPx: null\n };\n }\n\n const pgSz = queryAllByLocalName(sectPr, \"pgSz\")[0] ?? null;\n const pgMar = queryAllByLocalName(sectPr, \"pgMar\")[0] ?? null;\n const pageW = getTwipAttr(pgSz, \"w:w\") ?? getTwipAttr(pgSz, \"w\") ?? null;\n const pageH = getTwipAttr(pgSz, \"w:h\") ?? getTwipAttr(pgSz, \"h\") ?? null;\n const left = getTwipAttr(pgMar, \"w:left\") ?? getTwipAttr(pgMar, \"left\") ?? 0;\n const right = getTwipAttr(pgMar, \"w:right\") ?? getTwipAttr(pgMar, \"right\") ?? 0;\n const top = getTwipAttr(pgMar, \"w:top\") ?? getTwipAttr(pgMar, \"top\") ?? null;\n const bottom = getTwipAttr(pgMar, \"w:bottom\") ?? getTwipAttr(pgMar, \"bottom\") ?? null;\n\n return {\n contentWidthPx: pageW === null ? null : twipToPx(pageW - left - right),\n pageHeightPx: pageH === null ? null : twipToPx(pageH),\n marginTopPx: top === null ? null : twipToPx(top),\n marginBottomPx: bottom === null ? null : twipToPx(bottom)\n };\n}\n\nfunction parseHeadingAlignFromDocument(documentXml: Document): \"left\" | \"center\" | \"right\" | null {\n const paragraphs = queryAllByLocalName(documentXml, \"p\");\n for (const paragraph of paragraphs) {\n const pPr = queryAllByLocalName(paragraph, \"pPr\")[0] ?? null;\n if (!pPr) continue;\n\n const pStyle = queryAllByLocalName(pPr, \"pStyle\")[0] ?? null;\n const styleVal = getAttr(pStyle, \"w:val\") ?? getAttr(pStyle, \"val\") ?? \"\";\n const isHeading = styleVal === \"1\" || styleVal.toLowerCase().includes(\"heading\");\n if (!isHeading) continue;\n\n const jc = queryAllByLocalName(pPr, \"jc\")[0] ?? null;\n const alignRaw = (getAttr(jc, \"w:val\") ?? getAttr(jc, \"val\") ?? \"\").toLowerCase();\n if (alignRaw === \"center\") return \"center\";\n if (alignRaw === \"right\") return \"right\";\n return \"left\";\n }\n\n return null;\n}\n\nfunction parseParagraphText(paragraph: Element): string {\n const textNodes = queryAllByLocalName(paragraph, \"t\");\n return textNodes.map((node) => node.textContent ?? \"\").join(\"\").trim();\n}\n\nfunction parseParagraphAlign(paragraph: Element): \"left\" | \"center\" | \"right\" {\n const pPr = queryAllByLocalName(paragraph, \"pPr\")[0] ?? null;\n const jc = pPr ? queryAllByLocalName(pPr, \"jc\")[0] ?? null : null;\n const alignRaw = (getAttr(jc, \"w:val\") ?? getAttr(jc, \"val\") ?? \"\").toLowerCase();\n if (alignRaw === \"center\") return \"center\";\n if (alignRaw === \"right\") return \"right\";\n return \"left\";\n}\n\nfunction parseTrailingDateAnchor(documentXml: Document): {\n trailingDateText: string | null;\n trailingDateAlignedRight: boolean;\n trailingDateParagraphIndex: number | null;\n trailingEmptyParagraphCountBeforeDate: number;\n} {\n const paragraphs = queryAllByLocalName(documentXml, \"p\");\n if (paragraphs.length === 0) {\n return {\n trailingDateText: null,\n trailingDateAlignedRight: false,\n trailingDateParagraphIndex: null,\n trailingEmptyParagraphCountBeforeDate: 0\n };\n }\n\n let lastNonEmptyIndex = -1;\n for (let i = paragraphs.length - 1; i >= 0; i -= 1) {\n if (parseParagraphText(paragraphs[i]).length > 0) {\n lastNonEmptyIndex = i;\n break;\n }\n }\n\n if (lastNonEmptyIndex < 0) {\n return {\n trailingDateText: null,\n trailingDateAlignedRight: false,\n trailingDateParagraphIndex: null,\n trailingEmptyParagraphCountBeforeDate: 0\n };\n }\n\n const dateParagraph = paragraphs[lastNonEmptyIndex];\n const dateText = parseParagraphText(dateParagraph);\n const looksLikeDate = /\\d{4}\\s*年\\s*\\d+\\s*月\\s*\\d+\\s*日/.test(dateText);\n const align = parseParagraphAlign(dateParagraph);\n\n let trailingEmpty = 0;\n for (let i = lastNonEmptyIndex - 1; i >= 0; i -= 1) {\n if (parseParagraphText(paragraphs[i]).length === 0) {\n trailingEmpty += 1;\n continue;\n }\n break;\n }\n\n return {\n trailingDateText: looksLikeDate ? dateText : null,\n trailingDateAlignedRight: looksLikeDate && align === \"right\",\n trailingDateParagraphIndex: looksLikeDate ? lastNonEmptyIndex : null,\n trailingEmptyParagraphCountBeforeDate: looksLikeDate ? trailingEmpty : 0\n };\n}\n\ntype NumberingLevelSpec = {\n numFmt: string | null;\n lvlText: string | null;\n startAt: number;\n};\n\nfunction toInt(value: string | null): number | null {\n if (!value) return null;\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction parseNumberingMap(numberingXml: Document | null): Map<string, NumberingLevelSpec> {\n const levelMap = new Map<string, NumberingLevelSpec>();\n if (!numberingXml) return levelMap;\n\n const abstractMap = new Map<number, Map<number, NumberingLevelSpec>>();\n const abstractNums = queryAllByLocalName(numberingXml, \"abstractNum\");\n for (const abs of abstractNums) {\n const absId = toInt(getAttr(abs, \"w:abstractNumId\") ?? getAttr(abs, \"abstractNumId\"));\n if (absId === null) continue;\n\n const lvlNodes = queryAllByLocalName(abs, \"lvl\");\n const lvlMap = new Map<number, NumberingLevelSpec>();\n for (const lvl of lvlNodes) {\n const ilvl = toInt(getAttr(lvl, \"w:ilvl\") ?? getAttr(lvl, \"ilvl\"));\n if (ilvl === null) continue;\n const numFmtNode = queryAllByLocalName(lvl, \"numFmt\")[0] ?? null;\n const lvlTextNode = queryAllByLocalName(lvl, \"lvlText\")[0] ?? null;\n lvlMap.set(ilvl, {\n numFmt: getAttr(numFmtNode, \"w:val\") ?? getAttr(numFmtNode, \"val\") ?? null,\n lvlText: getAttr(lvlTextNode, \"w:val\") ?? getAttr(lvlTextNode, \"val\") ?? null,\n startAt: toInt(getAttr(queryAllByLocalName(lvl, \"start\")[0] ?? null, \"w:val\") ?? getAttr(queryAllByLocalName(lvl, \"start\")[0] ?? null, \"val\")) ?? 1\n });\n }\n abstractMap.set(absId, lvlMap);\n }\n\n const nums = queryAllByLocalName(numberingXml, \"num\");\n for (const num of nums) {\n const numId = toInt(getAttr(num, \"w:numId\") ?? getAttr(num, \"numId\"));\n if (numId === null) continue;\n const abstractRefNode = queryAllByLocalName(num, \"abstractNumId\")[0] ?? null;\n const absId = toInt(getAttr(abstractRefNode, \"w:val\") ?? getAttr(abstractRefNode, \"val\"));\n if (absId === null) continue;\n const lvlMap = abstractMap.get(absId);\n if (!lvlMap) continue;\n for (const [lvl, spec] of lvlMap.entries()) {\n levelMap.set(`${numId}:${lvl}`, { ...spec });\n }\n\n const lvlOverrides = queryAllByLocalName(num, \"lvlOverride\");\n for (const override of lvlOverrides) {\n const ilvl = toInt(getAttr(override, \"w:ilvl\") ?? getAttr(override, \"ilvl\"));\n if (ilvl === null) continue;\n const key = `${numId}:${ilvl}`;\n const base = levelMap.get(key) ?? { numFmt: null, lvlText: null, startAt: 1 };\n\n const overrideStart = toInt(\n getAttr(queryAllByLocalName(override, \"startOverride\")[0] ?? null, \"w:val\") ??\n getAttr(queryAllByLocalName(override, \"startOverride\")[0] ?? null, \"val\")\n );\n\n const overrideLvl = queryAllByLocalName(override, \"lvl\")[0] ?? null;\n const overrideNumFmtNode = overrideLvl ? queryAllByLocalName(overrideLvl, \"numFmt\")[0] ?? null : null;\n const overrideLvlTextNode = overrideLvl ? queryAllByLocalName(overrideLvl, \"lvlText\")[0] ?? null : null;\n const overrideLvlStart = toInt(\n getAttr(queryAllByLocalName(overrideLvl ?? override, \"start\")[0] ?? null, \"w:val\") ??\n getAttr(queryAllByLocalName(overrideLvl ?? override, \"start\")[0] ?? null, \"val\")\n );\n\n levelMap.set(key, {\n numFmt: getAttr(overrideNumFmtNode, \"w:val\") ?? getAttr(overrideNumFmtNode, \"val\") ?? base.numFmt,\n lvlText: getAttr(overrideLvlTextNode, \"w:val\") ?? getAttr(overrideLvlTextNode, \"val\") ?? base.lvlText,\n startAt: overrideStart ?? overrideLvlStart ?? base.startAt\n });\n }\n }\n\n return levelMap;\n}\n\nfunction parseParagraphProfiles(documentXml: Document, numberingMap: Map<string, NumberingLevelSpec>): ParagraphStyleProfile[] {\n const paragraphs = queryAllByLocalName(documentXml, \"p\");\n return paragraphs.map((paragraph, index) => {\n const text = parseParagraphText(paragraph);\n const pPr = queryAllByLocalName(paragraph, \"pPr\")[0] ?? null;\n const spacing = pPr ? queryAllByLocalName(pPr, \"spacing\")[0] ?? null : null;\n const ind = pPr ? queryAllByLocalName(pPr, \"ind\")[0] ?? null : null;\n const numPr = pPr ? queryAllByLocalName(pPr, \"numPr\")[0] ?? null : null;\n const ilvlNode = numPr ? queryAllByLocalName(numPr, \"ilvl\")[0] ?? null : null;\n const numIdNode = numPr ? queryAllByLocalName(numPr, \"numId\")[0] ?? null : null;\n const listLevel = toInt(getAttr(ilvlNode, \"w:val\") ?? getAttr(ilvlNode, \"val\"));\n const listNumId = toInt(getAttr(numIdNode, \"w:val\") ?? getAttr(numIdNode, \"val\"));\n const listSpec = listNumId !== null && listLevel !== null ? numberingMap.get(`${listNumId}:${listLevel}`) : undefined;\n const keepNextNode = pPr ? queryAllByLocalName(pPr, \"keepNext\")[0] ?? null : null;\n const keepLinesNode = pPr ? queryAllByLocalName(pPr, \"keepLines\")[0] ?? null : null;\n const pageBreakBeforeNode = pPr ? queryAllByLocalName(pPr, \"pageBreakBefore\")[0] ?? null : null;\n const renderedPageBreakNode = queryAllByLocalName(paragraph, \"lastRenderedPageBreak\")[0] ?? null;\n const sectionBreakNode = pPr ? queryAllByLocalName(pPr, \"sectPr\")[0] ?? null : null;\n\n const before = getTwipAttr(spacing, \"w:before\") ?? getTwipAttr(spacing, \"before\") ?? null;\n const after = getTwipAttr(spacing, \"w:after\") ?? getTwipAttr(spacing, \"after\") ?? null;\n const line = getTwipAttr(spacing, \"w:line\") ?? getTwipAttr(spacing, \"line\") ?? null;\n const rawLineRule = (getAttr(spacing, \"w:lineRule\") ?? getAttr(spacing, \"lineRule\") ?? \"auto\").toLowerCase();\n const lineHeightRule: \"auto\" | \"exact\" | \"atLeast\" | null =\n line === null ? null : rawLineRule === \"exact\" ? \"exact\" : rawLineRule === \"atleast\" ? \"atLeast\" : \"auto\";\n\n const left = getTwipAttr(ind, \"w:left\") ?? getTwipAttr(ind, \"left\") ?? null;\n const right = getTwipAttr(ind, \"w:right\") ?? getTwipAttr(ind, \"right\") ?? null;\n const firstLine = getTwipAttr(ind, \"w:firstLine\") ?? getTwipAttr(ind, \"firstLine\") ?? null;\n const hanging = getTwipAttr(ind, \"w:hanging\") ?? getTwipAttr(ind, \"hanging\") ?? null;\n const runs = parseRunProfiles(paragraph);\n\n return {\n index,\n text,\n isEmpty: text.length === 0,\n align: parseParagraphAlign(paragraph),\n beforePx: before === null ? null : twipToPx(before),\n afterPx: after === null ? null : twipToPx(after),\n lineHeightRatio: line === null || lineHeightRule !== \"auto\" ? null : line / 240,\n lineHeightPx: line === null || lineHeightRule === \"auto\" ? null : twipToPx(line),\n lineHeightRule,\n indentLeftPx: left === null ? null : twipToPx(left),\n indentRightPx: right === null ? null : twipToPx(right),\n firstLinePx: firstLine === null ? null : twipToPx(firstLine),\n hangingPx: hanging === null ? null : twipToPx(hanging),\n listNumId,\n listLevel,\n listFormat: listSpec?.numFmt ?? null,\n listTextPattern: listSpec?.lvlText ?? null,\n listStartAt: listSpec?.startAt ?? 1,\n keepNext: keepNextNode !== null && (getAttr(keepNextNode, \"w:val\") ?? getAttr(keepNextNode, \"val\") ?? \"1\") !== \"0\",\n keepLines: keepLinesNode !== null && (getAttr(keepLinesNode, \"w:val\") ?? getAttr(keepLinesNode, \"val\") ?? \"1\") !== \"0\",\n pageBreakBefore:\n renderedPageBreakNode !== null ||\n (pageBreakBeforeNode !== null &&\n (getAttr(pageBreakBeforeNode, \"w:val\") ?? getAttr(pageBreakBeforeNode, \"val\") ?? \"1\") !== \"0\"),\n sectionBreakBefore: sectionBreakNode !== null,\n runs\n };\n });\n}\n\nfunction parseTableDefaults(stylesXml: Document): {\n topPx: number | null;\n leftPx: number | null;\n bottomPx: number | null;\n rightPx: number | null;\n} {\n const tableStyles = queryAllByLocalName(stylesXml, \"style\").filter((style) => {\n const type = (getAttr(style, \"w:type\") ?? getAttr(style, \"type\") ?? \"\").toLowerCase();\n return type === \"table\";\n });\n\n const targetStyle =\n tableStyles.find((style) => {\n const styleId = (getAttr(style, \"w:styleId\") ?? getAttr(style, \"styleId\") ?? \"\").toLowerCase();\n return styleId === \"a1\";\n }) ?? tableStyles[0] ?? null;\n\n if (!targetStyle) {\n return { topPx: null, leftPx: null, bottomPx: null, rightPx: null };\n }\n\n const tblPr = queryAllByLocalName(targetStyle, \"tblPr\")[0] ?? null;\n const tblCellMar = tblPr ? queryAllByLocalName(tblPr, \"tblCellMar\")[0] ?? null : null;\n const top = tblCellMar ? queryAllByLocalName(tblCellMar, \"top\")[0] ?? null : null;\n const left = tblCellMar ? queryAllByLocalName(tblCellMar, \"left\")[0] ?? null : null;\n const bottom = tblCellMar ? queryAllByLocalName(tblCellMar, \"bottom\")[0] ?? null : null;\n const right = tblCellMar ? queryAllByLocalName(tblCellMar, \"right\")[0] ?? null : null;\n\n return {\n topPx: (() => {\n const v = getTwipAttr(top, \"w:w\") ?? getTwipAttr(top, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })(),\n leftPx: (() => {\n const v = getTwipAttr(left, \"w:w\") ?? getTwipAttr(left, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })(),\n bottomPx: (() => {\n const v = getTwipAttr(bottom, \"w:w\") ?? getTwipAttr(bottom, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })(),\n rightPx: (() => {\n const v = getTwipAttr(right, \"w:w\") ?? getTwipAttr(right, \"w\") ?? null;\n return v === null ? null : twipToPx(v);\n })()\n };\n}\n\nfunction parseRunProfiles(paragraph: Element): RunStyleProfile[] {\n const runNodes = queryAllByLocalName(paragraph, \"r\");\n return runNodes\n .map((run) => {\n const rPr = queryAllByLocalName(run, \"rPr\")[0] ?? null;\n const textNodes = queryAllByLocalName(run, \"t\");\n const breakNodes = queryAllByLocalName(run, \"br\");\n\n let text = textNodes.map((node) => node.textContent ?? \"\").join(\"\");\n if (breakNodes.length > 0) {\n text += \"\\n\".repeat(breakNodes.length);\n }\n\n if (!text) {\n return null;\n }\n\n const sz = rPr ? queryAllByLocalName(rPr, \"sz\")[0] ?? null : null;\n const halfPoints = getTwipAttr(sz, \"w:val\") ?? getTwipAttr(sz, \"val\") ?? null;\n const fontSizePx = halfPoints === null ? null : (halfPoints / 2) * (96 / 72);\n\n const colorNode = rPr ? queryAllByLocalName(rPr, \"color\")[0] ?? null : null;\n const colorRaw = getAttr(colorNode, \"w:val\") ?? getAttr(colorNode, \"val\") ?? null;\n const color = colorRaw && colorRaw.toLowerCase() !== \"auto\" ? `#${colorRaw}` : null;\n const highlightNode = rPr ? queryAllByLocalName(rPr, \"highlight\")[0] ?? null : null;\n const highlightRaw = (getAttr(highlightNode, \"w:val\") ?? getAttr(highlightNode, \"val\") ?? \"\").toLowerCase();\n const highlightMap: Record<string, string> = {\n yellow: \"#fff59d\",\n green: \"#b9f6ca\",\n cyan: \"#b2ebf2\",\n magenta: \"#f8bbd0\",\n blue: \"#bbdefb\",\n red: \"#ffcdd2\",\n darkyellow: \"#fbc02d\",\n darkgreen: \"#66bb6a\",\n darkblue: \"#64b5f6\",\n darkred: \"#e57373\",\n darkcyan: \"#4dd0e1\",\n darkmagenta: \"#ba68c8\",\n gray: \"#e0e0e0\",\n lightgray: \"#f5f5f5\"\n };\n const highlightColor = highlightRaw && highlightRaw !== \"none\" ? highlightMap[highlightRaw] ?? null : null;\n const shdNode = rPr ? queryAllByLocalName(rPr, \"shd\")[0] ?? null : null;\n const shdFill = (getAttr(shdNode, \"w:fill\") ?? getAttr(shdNode, \"fill\") ?? \"\").toLowerCase();\n const shadingColor = shdFill && shdFill !== \"auto\" ? `#${shdFill}` : null;\n const spacingNode = rPr ? queryAllByLocalName(rPr, \"spacing\")[0] ?? null : null;\n const spacingVal = getTwipAttr(spacingNode, \"w:val\") ?? getTwipAttr(spacingNode, \"val\") ?? null;\n const charSpacingPx = spacingVal === null ? null : (spacingVal / 20) * (96 / 72);\n\n const bNode = rPr ? queryAllByLocalName(rPr, \"b\")[0] ?? null : null;\n const iNode = rPr ? queryAllByLocalName(rPr, \"i\")[0] ?? null : null;\n const uNode = rPr ? queryAllByLocalName(rPr, \"u\")[0] ?? null : null;\n const strikeNode = rPr ? queryAllByLocalName(rPr, \"strike\")[0] ?? null : null;\n const shadowNode = rPr ? queryAllByLocalName(rPr, \"shadow\")[0] ?? null : null;\n const vertAlignNode = rPr ? queryAllByLocalName(rPr, \"vertAlign\")[0] ?? null : null;\n\n const bold = bNode !== null && (getAttr(bNode, \"w:val\") ?? getAttr(bNode, \"val\") ?? \"1\") !== \"0\";\n const italic = iNode !== null && (getAttr(iNode, \"w:val\") ?? getAttr(iNode, \"val\") ?? \"1\") !== \"0\";\n const underlineVal = (getAttr(uNode, \"w:val\") ?? getAttr(uNode, \"val\") ?? \"\").toLowerCase();\n const underline = uNode !== null && underlineVal !== \"none\";\n const strike = strikeNode !== null && (getAttr(strikeNode, \"w:val\") ?? getAttr(strikeNode, \"val\") ?? \"1\") !== \"0\";\n const shadow = shadowNode !== null && (getAttr(shadowNode, \"w:val\") ?? getAttr(shadowNode, \"val\") ?? \"1\") !== \"0\";\n const vertAlign = (getAttr(vertAlignNode, \"w:val\") ?? getAttr(vertAlignNode, \"val\") ?? \"\").toLowerCase();\n const superscript = vertAlign === \"superscript\";\n const subscript = vertAlign === \"subscript\";\n\n const rFonts = rPr ? queryAllByLocalName(rPr, \"rFonts\")[0] ?? null : null;\n const fontFamily =\n getAttr(rFonts, \"w:eastAsia\") ??\n getAttr(rFonts, \"eastAsia\") ??\n getAttr(rFonts, \"w:ascii\") ??\n getAttr(rFonts, \"ascii\") ??\n getAttr(rFonts, \"w:hAnsi\") ??\n getAttr(rFonts, \"hAnsi\") ??\n null;\n\n return {\n text,\n fontSizePx,\n color,\n highlightColor,\n shadingColor,\n charSpacingPx,\n shadow,\n bold,\n italic,\n underline,\n strike,\n superscript,\n subscript,\n fontFamily\n } satisfies RunStyleProfile;\n })\n .filter((run): run is RunStyleProfile => run !== null);\n}\n\nfunction parseDefaults(stylesXml: Document): {\n bodyFontPx: number | null;\n bodyLineHeightRatio: number | null;\n bodyLineHeightPx: number | null;\n bodyLineHeightRule: \"auto\" | \"exact\" | \"atLeast\";\n paragraphAfterPx: number | null;\n} {\n const docDefaults = queryByLocalName(stylesXml, \"docDefaults\");\n if (!docDefaults) {\n return { bodyFontPx: null, bodyLineHeightRatio: null, bodyLineHeightPx: null, bodyLineHeightRule: \"auto\", paragraphAfterPx: null };\n }\n\n const rPrDefault = queryByLocalName(docDefaults, \"rPrDefault\");\n const sz = rPrDefault ? queryByLocalName(rPrDefault, \"sz\") : null;\n const halfPoints = getTwipAttr(sz, \"w:val\") ?? getTwipAttr(sz, \"val\") ?? null;\n const bodyFontPx = halfPoints === null ? null : (halfPoints / 2) * (96 / 72);\n\n const pPrDefault = queryByLocalName(docDefaults, \"pPrDefault\");\n const spacing = pPrDefault ? queryByLocalName(pPrDefault, \"spacing\") : null;\n\n const line = getTwipAttr(spacing, \"w:line\") ?? getTwipAttr(spacing, \"line\") ?? null;\n const rawLineRule = (getAttr(spacing, \"w:lineRule\") ?? getAttr(spacing, \"lineRule\") ?? \"auto\").toLowerCase();\n const bodyLineHeightRule: \"auto\" | \"exact\" | \"atLeast\" =\n rawLineRule === \"exact\" ? \"exact\" : rawLineRule === \"atleast\" ? \"atLeast\" : \"auto\";\n const bodyLineHeightRatio = line === null || bodyLineHeightRule !== \"auto\" ? null : line / 240;\n const bodyLineHeightPx = line === null || bodyLineHeightRule === \"auto\" ? null : twipToPx(line);\n\n const after = getTwipAttr(spacing, \"w:after\") ?? getTwipAttr(spacing, \"after\") ?? null;\n const paragraphAfterPx = after === null ? null : twipToPx(after);\n\n return { bodyFontPx, bodyLineHeightRatio, bodyLineHeightPx, bodyLineHeightRule, paragraphAfterPx };\n}\n\nfunction parseHeading1Style(stylesXml: Document): {\n titleFontPx: number | null;\n titleColor: string | null;\n} {\n const styles = queryAllByLocalName(stylesXml, \"style\");\n const headingStyle = styles.find((style) => {\n const styleId = (getAttr(style, \"w:styleId\") ?? getAttr(style, \"styleId\") ?? \"\").toLowerCase();\n const nameNode = queryByLocalName(style, \"name\");\n const nameVal = (getAttr(nameNode, \"w:val\") ?? getAttr(nameNode, \"val\") ?? \"\").toLowerCase();\n return styleId === \"1\" || nameVal === \"heading 1\" || nameVal === \"标题 1\";\n });\n\n if (!headingStyle) {\n return { titleFontPx: null, titleColor: null };\n }\n\n const rPr = queryByLocalName(headingStyle, \"rPr\");\n const sz = rPr ? queryByLocalName(rPr, \"sz\") : null;\n const halfPoints = getTwipAttr(sz, \"w:val\") ?? getTwipAttr(sz, \"val\") ?? null;\n const titleFontPx = halfPoints === null ? null : (halfPoints / 2) * (96 / 72);\n\n const colorNode = rPr ? queryByLocalName(rPr, \"color\") : null;\n const colorRaw = getAttr(colorNode, \"w:val\") ?? getAttr(colorNode, \"val\") ?? null;\n const titleColor = colorRaw ? `#${colorRaw}` : null;\n\n return { titleFontPx, titleColor };\n}\n\nfunction parseFontTableFamilies(fontTableXml: Document | null): string[] {\n if (!fontTableXml) return [];\n const fontNodes = queryAllByLocalName(fontTableXml, \"font\");\n const families = fontNodes\n .map((node) => getAttr(node, \"w:name\") ?? getAttr(node, \"name\") ?? \"\")\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n return [...new Set(families)];\n}\n\nfunction hasFontLike(families: string[], candidates: string[]): boolean {\n return families.some((family) =>\n candidates.some((candidate) => family.toLowerCase().includes(candidate.toLowerCase()))\n );\n}\n\nfunction inferBodyFontFamily(families: string[]): string {\n if (hasFontLike(families, [\"times new roman\"])) {\n return \"\\\"Times New Roman\\\", \\\"Noto Serif SC\\\", serif\";\n }\n if (hasFontLike(families, [\"dengxian\", \"等线\", \"yahei\", \"hei\", \"song\"])) {\n return \"DengXian, \\\"Microsoft YaHei\\\", \\\"PingFang SC\\\", \\\"Noto Sans SC\\\", sans-serif\";\n }\n return FALLBACK_PROFILE.bodyFontFamily;\n}\n\nfunction inferTitleFontFamily(families: string[]): string {\n if (hasFontLike(families, [\"dengxian\", \"等线\"])) {\n return \"DengXian, \\\"Noto Sans SC\\\", \\\"Microsoft YaHei\\\", sans-serif\";\n }\n if (hasFontLike(families, [\"times new roman\"])) {\n return \"\\\"Times New Roman\\\", \\\"Noto Serif SC\\\", serif\";\n }\n return FALLBACK_PROFILE.titleFontFamily;\n}\n\nexport async function parseDocxStyleProfile(file: File): Promise<WordStyleProfile> {\n const maybeArrayBuffer = (file as unknown as { arrayBuffer?: () => Promise<ArrayBuffer> }).arrayBuffer;\n const buffer = maybeArrayBuffer ? await maybeArrayBuffer.call(file) : await new Response(file).arrayBuffer();\n const zip = await JSZip.loadAsync(buffer);\n\n const documentXmlText = await zip.file(\"word/document.xml\")?.async(\"string\");\n const stylesXmlText = await zip.file(\"word/styles.xml\")?.async(\"string\");\n const fontTableXmlText = await zip.file(\"word/fontTable.xml\")?.async(\"string\");\n const numberingXmlText = await zip.file(\"word/numbering.xml\")?.async(\"string\");\n\n if (!documentXmlText || !stylesXmlText) {\n throw new Error(\"DOCX missing document.xml or styles.xml\");\n }\n\n const documentXml = parseXml(documentXmlText);\n const stylesXml = parseXml(stylesXmlText);\n const fontTableXml = fontTableXmlText ? parseXml(fontTableXmlText) : null;\n const numberingXml = numberingXmlText ? parseXml(numberingXmlText) : null;\n const numberingMap = parseNumberingMap(numberingXml);\n\n const defaults = parseDefaults(stylesXml);\n const heading1 = parseHeading1Style(stylesXml);\n const tableDefaults = parseTableDefaults(stylesXml);\n const pageGeometry = parsePageGeometry(documentXml);\n const titleAlign = parseHeadingAlignFromDocument(documentXml);\n const trailingDate = parseTrailingDateAnchor(documentXml);\n const discoveredFonts = parseFontTableFamilies(fontTableXml);\n const bodyFontFamily = inferBodyFontFamily(discoveredFonts);\n const titleFontFamily = inferTitleFontFamily(discoveredFonts);\n const paragraphProfiles = parseParagraphProfiles(documentXml, numberingMap);\n\n return {\n sourceFileName: file.name,\n bodyFontPx: defaults.bodyFontPx ?? FALLBACK_PROFILE.bodyFontPx,\n bodyLineHeightRatio: defaults.bodyLineHeightRatio ?? FALLBACK_PROFILE.bodyLineHeightRatio,\n bodyLineHeightPx: defaults.bodyLineHeightPx ?? FALLBACK_PROFILE.bodyLineHeightPx,\n bodyLineHeightRule: defaults.bodyLineHeightRule ?? FALLBACK_PROFILE.bodyLineHeightRule,\n paragraphAfterPx: defaults.paragraphAfterPx ?? FALLBACK_PROFILE.paragraphAfterPx,\n contentWidthPx: pageGeometry.contentWidthPx ?? FALLBACK_PROFILE.contentWidthPx,\n pageHeightPx: pageGeometry.pageHeightPx ?? FALLBACK_PROFILE.pageHeightPx,\n pageMarginTopPx: pageGeometry.marginTopPx ?? FALLBACK_PROFILE.pageMarginTopPx,\n pageMarginBottomPx: pageGeometry.marginBottomPx ?? FALLBACK_PROFILE.pageMarginBottomPx,\n titleFontPx: heading1.titleFontPx ?? FALLBACK_PROFILE.titleFontPx,\n titleColor: heading1.titleColor ?? FALLBACK_PROFILE.titleColor,\n titleAlign: titleAlign ?? FALLBACK_PROFILE.titleAlign,\n bodyFontFamily,\n titleFontFamily,\n discoveredFonts,\n tableCellPaddingTopPx: tableDefaults.topPx ?? FALLBACK_PROFILE.tableCellPaddingTopPx,\n tableCellPaddingLeftPx: tableDefaults.leftPx ?? FALLBACK_PROFILE.tableCellPaddingLeftPx,\n tableCellPaddingBottomPx: tableDefaults.bottomPx ?? FALLBACK_PROFILE.tableCellPaddingBottomPx,\n tableCellPaddingRightPx: tableDefaults.rightPx ?? FALLBACK_PROFILE.tableCellPaddingRightPx,\n paragraphProfiles,\n trailingDateText: trailingDate.trailingDateText,\n trailingDateAlignedRight: trailingDate.trailingDateAlignedRight,\n trailingDateParagraphIndex: trailingDate.trailingDateParagraphIndex,\n trailingEmptyParagraphCountBeforeDate: trailingDate.trailingEmptyParagraphCountBeforeDate\n };\n}\n","import { applyWordHtmlCompatibility } from \"./htmlCompat\";\nimport { createFallbackWordStyleProfile, type ParagraphStyleProfile, type RunStyleProfile, type WordStyleProfile } from \"./styleProfile\";\n\ninterface ApplyWordRenderOptions {\n doc: Document;\n styleProfile: WordStyleProfile | null;\n showFormattingMarks: boolean;\n}\n\nfunction setImportantStyle(el: HTMLElement, prop: string, value: string): void {\n el.style.setProperty(prop, value, \"important\");\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction runStyleToCss(run: RunStyleProfile): string {\n const declarations: string[] = [];\n if (run.fontSizePx !== null) declarations.push(`font-size:${run.fontSizePx.toFixed(2)}px`);\n if (run.color) declarations.push(`color:${run.color}`);\n if (run.highlightColor) declarations.push(`background-color:${run.highlightColor}`);\n if (run.shadingColor) declarations.push(`background-color:${run.shadingColor}`);\n if (run.charSpacingPx !== null) declarations.push(`letter-spacing:${run.charSpacingPx.toFixed(2)}px`);\n if (run.shadow) declarations.push(\"text-shadow:0.5px 0.5px 0 rgba(0,0,0,0.28)\");\n if (run.bold) declarations.push(\"font-weight:700\");\n if (run.italic) declarations.push(\"font-style:italic\");\n const textDecorations: string[] = [];\n if (run.underline) textDecorations.push(\"underline\");\n if (run.strike) textDecorations.push(\"line-through\");\n if (textDecorations.length > 0) declarations.push(`text-decoration:${textDecorations.join(\" \")}`);\n if (run.superscript) declarations.push(\"vertical-align:super\");\n if (run.subscript) declarations.push(\"vertical-align:sub\");\n if (run.superscript || run.subscript) declarations.push(\"font-size:0.83em\");\n if (run.fontFamily) declarations.push(`font-family:${run.fontFamily}`);\n return declarations.join(\";\");\n}\n\nfunction paragraphToRunHtml(runs: RunStyleProfile[]): string {\n return runs\n .map((run) => {\n const css = runStyleToCss(run);\n const parts = run.text.split(\"\\n\");\n const html = parts.map((part) => escapeHtml(part)).join(\"<br/>\");\n if (!css) return html;\n return `<span style=\"${css}\">${html}</span>`;\n })\n .join(\"\");\n}\n\nfunction toLowerLetter(n: number): string {\n const alphabet = \"abcdefghijklmnopqrstuvwxyz\";\n if (n <= 0) return \"a\";\n let x = n;\n let out = \"\";\n while (x > 0) {\n x -= 1;\n out = alphabet[x % 26] + out;\n x = Math.floor(x / 26);\n }\n return out;\n}\n\nfunction toRoman(num: number): string {\n if (num <= 0) return \"I\";\n const map: Array<[number, string]> = [\n [1000, \"M\"], [900, \"CM\"], [500, \"D\"], [400, \"CD\"],\n [100, \"C\"], [90, \"XC\"], [50, \"L\"], [40, \"XL\"],\n [10, \"X\"], [9, \"IX\"], [5, \"V\"], [4, \"IV\"], [1, \"I\"]\n ];\n let n = num;\n let result = \"\";\n for (const [v, s] of map) {\n while (n >= v) {\n result += s;\n n -= v;\n }\n }\n return result;\n}\n\nfunction formatListMarker(format: string | null, counter: number): string {\n switch ((format ?? \"\").toLowerCase()) {\n case \"decimal\":\n return `${counter}.`;\n case \"lowerletter\":\n return `${toLowerLetter(counter)}.`;\n case \"upperletter\":\n return `${toLowerLetter(counter).toUpperCase()}.`;\n case \"lowerroman\":\n return `${toRoman(counter).toLowerCase()}.`;\n case \"upperroman\":\n return `${toRoman(counter)}.`;\n case \"bullet\":\n default:\n return \"•\";\n }\n}\n\nfunction formatListMarkerByPattern(\n pattern: string | null,\n currentLevel: number,\n countersByLevel: number[],\n currentFormat: string | null\n): string {\n if (!pattern || pattern.trim().length === 0) {\n return formatListMarker(currentFormat, countersByLevel[currentLevel] ?? 1);\n }\n\n const replaced = pattern.replace(/%(\\d+)/g, (_, g1: string) => {\n const level1Based = Number.parseInt(g1, 10);\n if (!Number.isFinite(level1Based) || level1Based <= 0) return \"\";\n const levelIdx = level1Based - 1;\n const n = countersByLevel[levelIdx] ?? 0;\n if (n <= 0) return \"\";\n if (levelIdx === currentLevel) {\n return formatListMarker(currentFormat, n).replace(/\\.$/, \"\");\n }\n return String(n);\n });\n\n const normalized = replaced.trim();\n if (!normalized) {\n return formatListMarker(currentFormat, countersByLevel[currentLevel] ?? 1);\n }\n return normalized;\n}\n\nfunction ensureStyleTag(doc: Document, id: string): HTMLStyleElement {\n let styleEl = doc.getElementById(id) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = doc.createElement(\"style\");\n styleEl.id = id;\n doc.head.appendChild(styleEl);\n }\n return styleEl;\n}\n\nfunction applyBaseProfileCss(doc: Document, styleProfile: WordStyleProfile): void {\n const styleEl = ensureStyleTag(doc, \"__word_style_profile__\");\n const targetWidthPx = styleProfile.contentWidthPx.toFixed(2);\n const topPaddingPx = styleProfile.pageMarginTopPx.toFixed(2);\n const bottomPaddingPx = styleProfile.pageMarginBottomPx.toFixed(2);\n const pageHeightPx = styleProfile.pageHeightPx.toFixed(2);\n\n const bodyLineHeightCss =\n styleProfile.bodyLineHeightRule === \"auto\" || styleProfile.bodyLineHeightPx === null\n ? styleProfile.bodyLineHeightRatio.toFixed(6)\n : `${styleProfile.bodyLineHeightPx.toFixed(2)}px`;\n\n styleEl.textContent = `\n @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&family=Noto+Serif+SC:wght@400;700&display=swap');\n html, body { box-sizing: border-box; }\n body {\n min-height: ${pageHeightPx}px !important;\n width: ${targetWidthPx}px !important;\n max-width: calc(100% - 24px) !important;\n margin-left: auto !important;\n margin-right: auto !important;\n padding-top: ${topPaddingPx}px !important;\n padding-bottom: ${bottomPaddingPx}px !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n font-family: ${styleProfile.bodyFontFamily} !important;\n }\n p {\n font-size: ${styleProfile.bodyFontPx.toFixed(4)}px !important;\n line-height: ${bodyLineHeightCss} !important;\n margin-bottom: ${styleProfile.paragraphAfterPx.toFixed(2)}px !important;\n }\n table { border-collapse: collapse !important; border-spacing: 0 !important; }\n td, th {\n padding-top: ${styleProfile.tableCellPaddingTopPx.toFixed(2)}px !important;\n padding-left: ${styleProfile.tableCellPaddingLeftPx.toFixed(2)}px !important;\n padding-bottom: ${styleProfile.tableCellPaddingBottomPx.toFixed(2)}px !important;\n padding-right: ${styleProfile.tableCellPaddingRightPx.toFixed(2)}px !important;\n vertical-align: top !important;\n }\n h1 {\n font-size: ${styleProfile.titleFontPx.toFixed(2)}px !important;\n color: ${styleProfile.titleColor} !important;\n text-align: ${styleProfile.titleAlign} !important;\n font-family: ${styleProfile.titleFontFamily} !important;\n }\n `;\n}\n\nfunction applyInlineLayoutGuards(doc: Document, styleProfile: WordStyleProfile): void {\n const body = doc.body as HTMLElement;\n const targetWidthPx = styleProfile.contentWidthPx.toFixed(2);\n const topPaddingPx = styleProfile.pageMarginTopPx.toFixed(2);\n const bottomPaddingPx = styleProfile.pageMarginBottomPx.toFixed(2);\n const pageHeightPx = styleProfile.pageHeightPx.toFixed(2);\n\n setImportantStyle(body, \"box-sizing\", \"border-box\");\n setImportantStyle(body, \"min-height\", `${pageHeightPx}px`);\n setImportantStyle(body, \"width\", `${targetWidthPx}px`);\n setImportantStyle(body, \"max-width\", `${targetWidthPx}px`);\n setImportantStyle(body, \"margin-left\", \"auto\");\n setImportantStyle(body, \"margin-right\", \"auto\");\n setImportantStyle(body, \"padding-top\", `${topPaddingPx}px`);\n setImportantStyle(body, \"padding-bottom\", `${bottomPaddingPx}px`);\n setImportantStyle(body, \"padding-left\", \"0\");\n setImportantStyle(body, \"padding-right\", \"0\");\n setImportantStyle(body, \"font-family\", styleProfile.bodyFontFamily);\n\n for (const child of Array.from(body.children)) {\n if (!(child instanceof HTMLElement)) continue;\n const tag = child.tagName.toLowerCase();\n if (tag === \"script\" || tag === \"style\") continue;\n setImportantStyle(child, \"box-sizing\", \"border-box\");\n setImportantStyle(child, \"max-width\", \"100%\");\n }\n\n for (const img of Array.from(doc.body.querySelectorAll(\"img\"))) {\n if (!(img instanceof HTMLElement)) continue;\n setImportantStyle(img, \"max-width\", \"100%\");\n setImportantStyle(img, \"height\", \"auto\");\n }\n}\n\nfunction normalizeEmptyParagraphMarkers(paragraphs: HTMLElement[]): void {\n for (const p of paragraphs) {\n const hasVisualContent = (p.textContent ?? \"\").trim().length > 0 || p.querySelector(\"img,table,svg,canvas\") !== null;\n if (!hasVisualContent) {\n p.setAttribute(\"data-word-empty\", \"1\");\n if (p.innerHTML.trim().length === 0) {\n p.innerHTML = \"<br/>\";\n }\n } else {\n p.removeAttribute(\"data-word-empty\");\n }\n }\n}\n\nfunction hasMeaningfulParagraphAfter(paragraphs: HTMLElement[], index: number): boolean {\n for (let i = index + 1; i < paragraphs.length; i += 1) {\n const p = paragraphs[i];\n const hasText = (p.textContent ?? \"\").trim().length > 0;\n const hasVisual = p.querySelector(\"img,table,svg,canvas\") !== null;\n if (hasText || hasVisual) return true;\n }\n return false;\n}\n\nfunction applyParagraphProfiles(doc: Document, styleProfile: WordStyleProfile): HTMLElement[] {\n const fallbackParagraphs = Array.from(doc.body.querySelectorAll(\"p\")) as HTMLElement[];\n fallbackParagraphs.forEach((p) => {\n p.classList.remove(\"__word-date-anchor\");\n p.querySelectorAll(\"span.__word-list-marker\").forEach((node) => node.remove());\n });\n\n const resolvedTargets = styleProfile.paragraphProfiles.map((profile, index) => {\n const byIndex =\n (doc.body.querySelector(`[data-word-p-index=\"${profile.index}\"]`) as HTMLElement | null) ?? null;\n const fallback = fallbackParagraphs[index] ?? null;\n return {\n profile,\n node: byIndex ?? fallback\n };\n });\n\n if (styleProfile.trailingDateAlignedRight && styleProfile.trailingDateText) {\n let dateParagraph: HTMLElement | null = null;\n if (\n styleProfile.trailingDateParagraphIndex !== null &&\n styleProfile.trailingDateParagraphIndex >= 0\n ) {\n dateParagraph =\n (doc.body.querySelector(\n `[data-word-p-index=\"${styleProfile.trailingDateParagraphIndex}\"]`\n ) as HTMLElement | null) ??\n fallbackParagraphs[styleProfile.trailingDateParagraphIndex] ??\n null;\n } else {\n dateParagraph =\n fallbackParagraphs\n .slice()\n .reverse()\n .find((p) => {\n const text = (p.textContent ?? \"\").replace(/\\s+/g, \"\");\n const target = styleProfile.trailingDateText?.replace(/\\s+/g, \"\") ?? \"\";\n return target.length > 0 && text.includes(target);\n }) ?? null;\n }\n\n const dateIndex = dateParagraph ? fallbackParagraphs.indexOf(dateParagraph) : -1;\n const hasContentAfterDate = dateIndex >= 0 ? hasMeaningfulParagraphAfter(fallbackParagraphs, dateIndex) : false;\n\n if (dateParagraph && !hasContentAfterDate) {\n let existingEmptyCount = 0;\n let cursor = dateParagraph.previousElementSibling;\n while (cursor && cursor.tagName.toLowerCase() === \"p\" && (cursor.textContent ?? \"\").trim().length === 0) {\n existingEmptyCount += 1;\n cursor = cursor.previousElementSibling;\n }\n\n const needed = Math.max(0, styleProfile.trailingEmptyParagraphCountBeforeDate - existingEmptyCount);\n for (let i = 0; i < needed; i += 1) {\n const spacer = doc.createElement(\"p\");\n spacer.innerHTML = \"<br/>\";\n dateParagraph.parentElement?.insertBefore(spacer, dateParagraph);\n }\n }\n }\n\n const paragraphs = Array.from(doc.body.querySelectorAll(\"p\")) as HTMLElement[];\n const listCounters = new Map<number, number[]>();\n const orderedTargets: HTMLElement[] = [];\n\n for (const target of resolvedTargets) {\n const para = target.node;\n const profile = target.profile;\n if (!para) continue;\n orderedTargets.push(para);\n para.removeAttribute(\"data-word-list\");\n\n para.style.textAlign = profile.align;\n if (profile.beforePx !== null) para.style.marginTop = `${profile.beforePx.toFixed(2)}px`;\n if (profile.afterPx !== null) para.style.marginBottom = `${profile.afterPx.toFixed(2)}px`;\n if (profile.lineHeightRule === \"auto\" && profile.lineHeightRatio !== null) {\n para.style.lineHeight = profile.lineHeightRatio.toFixed(6);\n } else if ((profile.lineHeightRule === \"exact\" || profile.lineHeightRule === \"atLeast\") && profile.lineHeightPx !== null) {\n para.style.lineHeight = `${profile.lineHeightPx.toFixed(2)}px`;\n }\n if (profile.indentLeftPx !== null) para.style.marginLeft = `${profile.indentLeftPx.toFixed(2)}px`;\n if (profile.indentRightPx !== null) para.style.marginRight = `${profile.indentRightPx.toFixed(2)}px`;\n if (profile.firstLinePx !== null) para.style.textIndent = `${profile.firstLinePx.toFixed(2)}px`;\n if (profile.hangingPx !== null) para.style.textIndent = `${(-profile.hangingPx).toFixed(2)}px`;\n\n if (profile.runs.length > 0 && para.querySelector(\"img,table,svg,canvas\") === null) {\n const currentTextNormalized = (para.textContent ?? \"\").replace(/\\s+/g, \"\");\n const runTextNormalized = profile.runs.map((run) => run.text).join(\"\").replace(/\\s+/g, \"\");\n if (runTextNormalized.length > 0 && currentTextNormalized === runTextNormalized) {\n para.innerHTML = paragraphToRunHtml(profile.runs);\n }\n }\n\n if (profile.listNumId !== null && profile.listLevel !== null) {\n para.setAttribute(\"data-word-list\", \"1\");\n if (profile.sectionBreakBefore) {\n listCounters.set(profile.listNumId, []);\n }\n const currentLevel = Math.max(0, profile.listLevel);\n const levels = listCounters.get(profile.listNumId) ?? [];\n const prevValue = levels[currentLevel] ?? (profile.listStartAt - 1);\n const nextValue = prevValue + 1;\n levels[currentLevel] = nextValue;\n for (let lv = currentLevel + 1; lv < levels.length; lv += 1) {\n levels[lv] = 0;\n }\n listCounters.set(profile.listNumId, levels);\n\n const markerText = formatListMarkerByPattern(profile.listTextPattern, currentLevel, levels, profile.listFormat);\n const plainText = (para.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n const alreadyHasMarker = plainText.startsWith(markerText);\n if (!alreadyHasMarker) {\n const marker = doc.createElement(\"span\");\n marker.className = \"__word-list-marker\";\n marker.setAttribute(\"data-word-list-marker\", \"1\");\n marker.textContent = `${markerText} `;\n marker.style.display = \"inline-block\";\n marker.style.minWidth = \"1.8em\";\n marker.style.marginLeft = currentLevel > 0 ? `${currentLevel * 1.2}em` : \"0\";\n marker.style.color = \"inherit\";\n marker.style.fontWeight = \"inherit\";\n para.prepend(marker);\n }\n }\n\n // Date anchoring is represented by explicit spacer insertion.\n // Avoid global flex/auto-margin layout because it distorts generic document flow.\n }\n\n normalizeEmptyParagraphMarkers(paragraphs);\n return orderedTargets;\n}\n\nfunction paragraphHeightPx(paragraph: HTMLElement): number {\n const rect = paragraph.getBoundingClientRect();\n if (rect.height > 0) return rect.height;\n const lh = Number.parseFloat(getComputedStyle(paragraph).lineHeight || \"0\");\n if (Number.isFinite(lh) && lh > 0) return lh;\n return 16;\n}\n\nfunction insertPageSpacerBefore(doc: Document, paragraph: HTMLElement, heightPx: number): void {\n if (heightPx <= 0.5) return;\n const spacer = doc.createElement(\"div\");\n spacer.dataset.wordPageSpacer = \"1\";\n spacer.style.height = `${heightPx.toFixed(2)}px`;\n spacer.style.width = \"100%\";\n spacer.style.pointerEvents = \"none\";\n spacer.style.userSelect = \"none\";\n paragraph.parentElement?.insertBefore(spacer, paragraph);\n}\n\nfunction removePaginationSpacers(doc: Document): void {\n doc.querySelectorAll(\"[data-word-page-spacer='1']\").forEach((node) => node.remove());\n}\n\nfunction estimateGroupHeight(paragraphs: HTMLElement[], idx: number, profile: ParagraphStyleProfile, contentHeight: number): number {\n const currentH = paragraphHeightPx(paragraphs[idx]);\n if (!profile.keepNext) return currentH;\n const next = paragraphs[idx + 1];\n if (!next) return currentH;\n const nextH = paragraphHeightPx(next);\n const sum = currentH + nextH;\n if (sum > contentHeight) return currentH;\n return sum;\n}\n\nfunction applyKeepPagination(doc: Document, styleProfile: WordStyleProfile, paragraphs: HTMLElement[]): void {\n removePaginationSpacers(doc);\n\n const contentHeight = Math.max(120, styleProfile.pageHeightPx - styleProfile.pageMarginTopPx - styleProfile.pageMarginBottomPx);\n const count = Math.min(styleProfile.paragraphProfiles.length, paragraphs.length);\n let used = 0;\n\n for (let i = 0; i < count; i += 1) {\n const p = paragraphs[i];\n const profile = styleProfile.paragraphProfiles[i];\n const h = paragraphHeightPx(p);\n\n const forceBreak = profile.pageBreakBefore;\n if (forceBreak && used > 0) {\n insertPageSpacerBefore(doc, p, contentHeight - used);\n used = 0;\n }\n\n const groupHeight = estimateGroupHeight(paragraphs, i, profile, contentHeight);\n if ((profile.keepLines || profile.keepNext) && used > 0 && used + groupHeight > contentHeight) {\n insertPageSpacerBefore(doc, p, contentHeight - used);\n used = 0;\n }\n\n if (used > 0 && used + h > contentHeight) {\n insertPageSpacerBefore(doc, p, contentHeight - used);\n used = 0;\n }\n\n used += h;\n if (used >= contentHeight) {\n used = used % contentHeight;\n }\n }\n}\n\nfunction applyFormattingMarks(doc: Document, showFormattingMarks: boolean): void {\n const styleEl = ensureStyleTag(doc, \"__word_view_options__\");\n styleEl.textContent = `\n p[data-word-empty=\"1\"]::before { content: \"\\\\00a0\"; }\n ${showFormattingMarks ? `\n p::after {\n content: \"↵\";\n color: #66aef9;\n font-size: 0.85em;\n margin-left: 3px;\n }\n br::after {\n content: \"↵\";\n color: #66aef9;\n }\n ` : \"\"}\n `;\n}\n\nexport function applyWordRenderModel({ doc, styleProfile, showFormattingMarks }: ApplyWordRenderOptions): void {\n const effectiveProfile = styleProfile ?? createFallbackWordStyleProfile(\"__default_a4__\");\n\n applyWordHtmlCompatibility(doc, {\n forceBodyFontFamily: effectiveProfile.bodyFontFamily,\n forceHeadingFontFamily: effectiveProfile.titleFontFamily\n });\n\n let paragraphs = Array.from(doc.body.querySelectorAll(\"p\")) as HTMLElement[];\n normalizeEmptyParagraphMarkers(paragraphs);\n\n applyBaseProfileCss(doc, effectiveProfile);\n applyInlineLayoutGuards(doc, effectiveProfile);\n\n if (styleProfile) {\n paragraphs = applyParagraphProfiles(doc, styleProfile);\n applyKeepPagination(doc, styleProfile, paragraphs);\n }\n\n applyFormattingMarks(doc, showFormattingMarks);\n}\n","import { buildHtmlSnapshot } from \"../lib/htmlSnapshot\";\nimport { parseDocxToHtmlSnapshot } from \"../lib/docxHtml\";\nimport { extractFromClipboardDataTransfer, extractFromClipboardItems } from \"../lib/pastePipeline\";\nimport { applyWordRenderModel } from \"../lib/renderApply\";\nimport { parseDocxStyleProfile, type WordStyleProfile } from \"../lib/styleProfile\";\n\nconst VERSION = \"0.1.2\";\n\ntype Locale = \"zh\" | \"en\";\ntype ChangeSource = \"paste\" | \"upload\" | \"api\" | \"clear\";\n\nconst MESSAGES: Record<Locale, {\n readClipboard: string;\n uploadWord: string;\n clear: string;\n pastePlaceholder: string;\n waitImport: string;\n loadedHtml: string;\n cleared: string;\n loadedWord: (name: string) => string;\n importedClipboard: string;\n noContent: string;\n noClipboardRead: string;\n parseFailed: string;\n clipboardReadFailed: string;\n errorPrefix: string;\n}> = {\n zh: {\n readClipboard: \"从系统剪贴板读取\",\n uploadWord: \"上传 Word\",\n clear: \"清空\",\n pastePlaceholder: \"在此处粘贴 Word/WPS/Google Docs 内容(Ctrl/Cmd+V)\",\n waitImport: \"等待内容导入\",\n loadedHtml: \"已加载 HTML 快照\",\n cleared: \"文档已清空\",\n loadedWord: (name) => `已加载 Word 文件: ${name}`,\n importedClipboard: \"已导入剪贴板内容\",\n noContent: \"未检测到可导入内容\",\n noClipboardRead: \"当前浏览器不支持 clipboard.read\",\n parseFailed: \"Word 解析失败\",\n clipboardReadFailed: \"读取剪贴板失败\",\n errorPrefix: \"错误: \"\n },\n en: {\n readClipboard: \"Read clipboard\",\n uploadWord: \"Upload Word\",\n clear: \"Clear\",\n pastePlaceholder: \"Paste Word/WPS/Google Docs content here (Ctrl/Cmd+V)\",\n waitImport: \"Waiting for input\",\n loadedHtml: \"HTML snapshot loaded\",\n cleared: \"Document cleared\",\n loadedWord: (name) => `Word file loaded: ${name}`,\n importedClipboard: \"Clipboard content imported\",\n noContent: \"No importable content detected\",\n noClipboardRead: \"navigator.clipboard.read is not supported in this browser\",\n parseFailed: \"Word parse failed\",\n clipboardReadFailed: \"Failed to read clipboard\",\n errorPrefix: \"Error: \"\n }\n};\n\nconst BASE_CSS = `\n:host{display:block;border:1px solid #d8deea;border-radius:12px;background:#fff;overflow:hidden;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto}\n.toolbar{display:flex;gap:8px;flex-wrap:wrap;padding:10px;border-bottom:1px solid #e8edf6;background:#f8faff}\nbutton{border:1px solid #c8d2eb;background:#fff;border-radius:9px;padding:6px 10px;cursor:pointer}\n.paste{width:100%;min-height:40px;border:1px dashed #95acef;border-radius:10px;background:#edf3ff;padding:8px 10px;box-sizing:border-box;resize:vertical}\n.hint{display:block;padding:0 10px 10px;color:#4b5c82;font-size:12px}\niframe{width:100%;min-height:760px;border:0}\n`;\n\nexport class DocsWordElement extends HTMLElement {\n private rootRef: ShadowRoot;\n private toolbar: HTMLDivElement;\n private btnRead: HTMLButtonElement;\n private btnUpload: HTMLButtonElement;\n private btnClear: HTMLButtonElement;\n private frame: HTMLIFrameElement;\n private pasteArea: HTMLTextAreaElement;\n private fileInput: HTMLInputElement;\n private hint: HTMLSpanElement;\n private htmlSnapshot: string;\n private styleProfile: WordStyleProfile | null = null;\n private frameHeight = 0;\n private locale: Locale = \"zh\";\n\n constructor() {\n super();\n this.rootRef = this.attachShadow({ mode: \"open\" });\n this.locale = this.parseLocale(this.getAttribute(\"lang\"));\n this.htmlSnapshot = buildHtmlSnapshot(\"<p><br/></p>\");\n\n const style = document.createElement(\"style\");\n style.textContent = BASE_CSS;\n\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"toolbar\";\n\n this.btnRead = document.createElement(\"button\");\n this.btnRead.onclick = () => void this.loadClipboard();\n\n this.btnUpload = document.createElement(\"button\");\n this.btnUpload.onclick = () => this.fileInput.click();\n\n this.btnClear = document.createElement(\"button\");\n this.btnClear.onclick = () => this.clear();\n\n this.fileInput = document.createElement(\"input\");\n this.fileInput.type = \"file\";\n this.fileInput.accept = \".docx\";\n this.fileInput.style.display = \"none\";\n this.fileInput.onchange = () => void this.onUpload();\n\n this.toolbar.append(this.btnRead, this.btnUpload, this.btnClear, this.fileInput);\n\n this.pasteArea = document.createElement(\"textarea\");\n this.pasteArea.className = \"paste\";\n this.pasteArea.placeholder = \"\";\n this.pasteArea.onpaste = (event) => {\n event.preventDefault();\n void this.applyFromClipboardData(event.clipboardData);\n };\n\n this.hint = document.createElement(\"span\");\n this.hint.className = \"hint\";\n this.hint.textContent = \"\";\n\n this.frame = document.createElement(\"iframe\");\n this.frame.sandbox.add(\"allow-same-origin\", \"allow-scripts\");\n this.frame.onload = () => this.onFrameLoad();\n\n this.rootRef.append(style, this.toolbar, this.pasteArea, this.hint, this.frame);\n this.syncLocaleText();\n this.syncToolbarVisibility();\n }\n\n static get observedAttributes(): string[] {\n return [\"lang\", \"show-toolbar\"];\n }\n\n attributeChangedCallback(name: string, _: string | null, newValue: string | null): void {\n if (name === \"lang\") {\n this.locale = this.parseLocale(newValue);\n this.syncLocaleText();\n return;\n }\n if (name === \"show-toolbar\") {\n this.syncToolbarVisibility();\n }\n }\n\n connectedCallback(): void {\n this.renderSnapshot();\n this.dispatchEvent(new CustomEvent(\"docsjs-ready\", { detail: { version: VERSION } }));\n }\n\n public setSnapshot(rawHtml: string): void {\n this.loadHtml(rawHtml);\n }\n\n public loadHtml(rawHtml: string): void {\n this.styleProfile = null;\n this.htmlSnapshot = buildHtmlSnapshot(rawHtml);\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].loadedHtml);\n this.emitChange(\"api\");\n }\n\n public getSnapshot(): string {\n return this.htmlSnapshot;\n }\n\n public clear(): void {\n this.styleProfile = null;\n this.htmlSnapshot = buildHtmlSnapshot(\"<p><br/></p>\");\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].cleared);\n this.emitChange(\"clear\");\n }\n\n public async loadDocx(file: File): Promise<void> {\n await this.applyDocx(file);\n }\n\n private async onUpload(): Promise<void> {\n const file = this.fileInput.files?.[0];\n if (!file) return;\n await this.applyDocx(file);\n this.fileInput.value = \"\";\n }\n\n private async applyDocx(file: File): Promise<void> {\n try {\n const [snapshot, profile] = await Promise.all([\n parseDocxToHtmlSnapshot(file),\n parseDocxStyleProfile(file)\n ]);\n this.styleProfile = profile;\n this.htmlSnapshot = snapshot;\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].loadedWord(profile.sourceFileName));\n this.emitChange(\"upload\", profile.sourceFileName);\n } catch (error) {\n this.emitError(error instanceof Error ? error.message : MESSAGES[this.locale].parseFailed);\n }\n }\n\n public async loadClipboard(): Promise<void> {\n if (!navigator.clipboard?.read) {\n this.emitError(MESSAGES[this.locale].noClipboardRead);\n return;\n }\n try {\n const items = await navigator.clipboard.read();\n const payload = await extractFromClipboardItems(items);\n this.applyPayload(payload.html, payload.text);\n } catch (error) {\n this.emitError(error instanceof Error ? error.message : MESSAGES[this.locale].clipboardReadFailed);\n }\n }\n\n private async applyFromClipboardData(data: DataTransfer | null): Promise<void> {\n if (!data) return;\n const payload = await extractFromClipboardDataTransfer(data);\n this.applyPayload(payload.html, payload.text);\n }\n\n private applyPayload(html: string, text: string): void {\n this.styleProfile = null;\n if (html.trim()) {\n this.htmlSnapshot = buildHtmlSnapshot(html);\n } else if (text.trim()) {\n this.htmlSnapshot = buildHtmlSnapshot(`<p>${text.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\")}</p>`);\n } else {\n this.setHint(MESSAGES[this.locale].noContent);\n return;\n }\n this.renderSnapshot();\n this.setHint(MESSAGES[this.locale].importedClipboard);\n this.emitChange(\"paste\");\n }\n\n private onFrameLoad(): void {\n const doc = this.frame.contentDocument;\n if (!doc) return;\n\n applyWordRenderModel({\n doc,\n styleProfile: this.styleProfile,\n showFormattingMarks: false\n });\n\n this.syncHeight();\n window.setTimeout(() => this.syncHeight(), 120);\n }\n\n private syncHeight(): void {\n const doc = this.frame.contentDocument;\n if (!doc) return;\n const measured = Math.max(760, doc.body.scrollHeight, doc.documentElement.scrollHeight);\n const next = measured + 24;\n if (Math.abs(next - this.frameHeight) < 2) return;\n this.frameHeight = next;\n this.frame.style.height = `${next}px`;\n }\n\n private renderSnapshot(): void {\n this.frame.srcdoc = this.htmlSnapshot;\n }\n\n private emitChange(source: ChangeSource, fileName?: string): void {\n this.dispatchEvent(new CustomEvent(\"docsjs-change\", { detail: { htmlSnapshot: this.htmlSnapshot, source, fileName } }));\n }\n\n private emitError(message: string): void {\n this.dispatchEvent(new CustomEvent(\"docsjs-error\", { detail: { message } }));\n this.setHint(`${MESSAGES[this.locale].errorPrefix}${message}`);\n }\n\n private setHint(text: string): void {\n this.hint.textContent = text;\n }\n\n private parseLocale(value: string | null): Locale {\n return value?.toLowerCase() === \"en\" ? \"en\" : \"zh\";\n }\n\n private syncToolbarVisibility(): void {\n const raw = this.getAttribute(\"show-toolbar\");\n const show = raw === null || raw === \"\" || raw === \"1\" || raw.toLowerCase() === \"true\";\n this.toolbar.style.display = show ? \"flex\" : \"none\";\n }\n\n private syncLocaleText(): void {\n const t = MESSAGES[this.locale];\n this.btnRead.textContent = t.readClipboard;\n this.btnUpload.textContent = t.uploadWord;\n this.btnClear.textContent = t.clear;\n this.pasteArea.placeholder = t.pastePlaceholder;\n if (!this.hint.textContent || this.hint.textContent === MESSAGES.en.waitImport || this.hint.textContent === MESSAGES.zh.waitImport) {\n this.hint.textContent = t.waitImport;\n }\n }\n}\n\nexport function defineDocsWordElement(): void {\n if (!customElements.get(\"docs-word-editor\")) {\n customElements.define(\"docs-word-editor\", DocsWordElement);\n }\n}\n"],"mappings":"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","names":["runText","nested","origin","JSZip","twipToPx","getAttr","queryByLocalName","queryAllByLocalName","parseXml","escapeHtml","runStyleToCss"]}
@@ -1,20 +0,0 @@
1
- interface DocsWordEditorChangeDetail {
2
- htmlSnapshot: string;
3
- source: "paste" | "upload" | "api" | "clear";
4
- fileName?: string;
5
- }
6
- interface DocsWordEditorErrorDetail {
7
- message: string;
8
- }
9
- interface DocsWordEditorReadyDetail {
10
- version: string;
11
- }
12
- interface DocsWordEditorElementApi extends HTMLElement {
13
- loadDocx(file: File): Promise<void>;
14
- loadHtml(rawHtml: string): void;
15
- loadClipboard(): Promise<void>;
16
- clear(): void;
17
- getSnapshot(): string;
18
- }
19
-
20
- export type { DocsWordEditorChangeDetail as D, DocsWordEditorElementApi as a, DocsWordEditorErrorDetail as b, DocsWordEditorReadyDetail as c };
@@ -1,20 +0,0 @@
1
- interface DocsWordEditorChangeDetail {
2
- htmlSnapshot: string;
3
- source: "paste" | "upload" | "api" | "clear";
4
- fileName?: string;
5
- }
6
- interface DocsWordEditorErrorDetail {
7
- message: string;
8
- }
9
- interface DocsWordEditorReadyDetail {
10
- version: string;
11
- }
12
- interface DocsWordEditorElementApi extends HTMLElement {
13
- loadDocx(file: File): Promise<void>;
14
- loadHtml(rawHtml: string): void;
15
- loadClipboard(): Promise<void>;
16
- clear(): void;
17
- getSnapshot(): string;
18
- }
19
-
20
- export type { DocsWordEditorChangeDetail as D, DocsWordEditorElementApi as a, DocsWordEditorErrorDetail as b, DocsWordEditorReadyDetail as c };