@coding01/docsjs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
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","../src/react/WordFidelityEditorReact.tsx","../src/vue/WordFidelityEditorVue.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\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 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 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\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\nasync function imageRidToDataUrl(zip: JSZip, relMap: RelMap, rid: string): Promise<string | null> {\n const relTarget = relMap[rid];\n if (!relTarget) return null;\n const normalized = relTarget.replace(/^\\/+/, \"\");\n const path = normalized.startsWith(\"word/\") ? normalized : `word/${normalized}`;\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\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\nasync function paragraphToHtml(\n zip: JSZip,\n relMap: RelMap,\n paragraph: Element,\n paragraphIndex: number | null\n): Promise<string> {\n const tag = paragraphTag(paragraph);\n const alignStyle = paragraphAlignStyle(paragraph);\n const dataAttr = paragraphDataAttr(paragraphIndex);\n const runs = queryAllByLocalName(paragraph, \"r\");\n if (runs.length === 0) {\n return `<${tag}${dataAttr}${alignStyle ? ` style=\\\"${alignStyle}\\\"` : \"\"}><br/></${tag}>`;\n }\n\n const parts: string[] = [];\n for (const run of runs) {\n const rPr = queryByLocalName(run, \"rPr\");\n const css = runStyleToCss(rPr);\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 parts.push(`<img src=\\\"${src}\\\" alt=\\\"word-image\\\"${dimensionAttrs}/>`);\n continue;\n }\n }\n }\n\n const texts = queryAllByLocalName(run, \"t\").map((t) => t.textContent ?? \"\").join(\"\");\n const brs = queryAllByLocalName(run, \"br\").length;\n const runText = `${escapeHtml(texts)}${\"<br/>\".repeat(brs)}`;\n if (!runText) continue;\n if (css) {\n parts.push(`<span style=\\\"${css}\\\">${runText}</span>`);\n } else {\n parts.push(runText);\n }\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 brCount = queryAllByLocalName(run, \"br\").length;\n return `${escapeHtml(text)}${\"<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 tableCellHtml(cell: Element, paragraphIndexMap: Map<Element, number>): string {\n const paragraphs = queryAllByLocalName(cell, \"p\");\n if (paragraphs.length === 0) {\n const text = queryAllByLocalName(cell, \"t\").map((t) => t.textContent ?? \"\").join(\"\").trim();\n return escapeHtml(text) || \"<br/>\";\n }\n return paragraphs\n .map((p) => {\n const paragraphIndex = paragraphIndexMap.get(p) ?? null;\n return `<p${paragraphDataAttr(paragraphIndex)}>${paragraphText(p)}</p>`;\n })\n .join(\"\");\n}\n\nfunction tableToHtml(table: Element, paragraphIndexMap: Map<Element, number>): string {\n const rows = queryAllByLocalName(table, \"tr\");\n const htmlRows = rows.map((row) => {\n const cells = queryAllByLocalName(row, \"tc\");\n const htmlCells = cells\n .map((cell) => `<td style=\"border:1px solid #222;vertical-align:top;\">${tableCellHtml(cell, paragraphIndexMap)}</td>`)\n .join(\"\");\n return `<tr>${htmlCells}</tr>`;\n });\n return `<table style=\"border-collapse:collapse;table-layout:fixed;width:100%;border:1px solid #222;\">${htmlRows.join(\"\")}</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 relMap = parseDocRelsMap(relsText ?? null);\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(await paragraphToHtml(zip, relMap, child, paragraphIndex));\n continue;\n }\n if (child.localName === \"tbl\") {\n blockHtml.push(tableToHtml(child, paragraphIndexMap));\n continue;\n }\n }\n\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\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 buffer = await 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.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 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 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\n constructor() {\n super();\n this.rootRef = this.attachShadow({ mode: \"open\" });\n this.htmlSnapshot = buildHtmlSnapshot(\"<p><br/></p>\");\n\n const style = document.createElement(\"style\");\n style.textContent = BASE_CSS;\n\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"toolbar\";\n\n const btnRead = document.createElement(\"button\");\n btnRead.textContent = \"从系统剪贴板读取\";\n btnRead.onclick = () => void this.readClipboard();\n\n const btnUpload = document.createElement(\"button\");\n btnUpload.textContent = \"上传 Word\";\n btnUpload.onclick = () => this.fileInput.click();\n\n const btnClear = document.createElement(\"button\");\n btnClear.textContent = \"清空\";\n 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 toolbar.append(btnRead, btnUpload, btnClear, this.fileInput);\n\n this.pasteArea = document.createElement(\"textarea\");\n this.pasteArea.className = \"paste\";\n this.pasteArea.placeholder = \"在此处粘贴 Word/WPS/Google Docs 内容(Ctrl/Cmd+V)\";\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, toolbar, this.pasteArea, this.hint, this.frame);\n }\n\n connectedCallback(): void {\n this.renderSnapshot();\n }\n\n public setSnapshot(rawHtml: string): void {\n this.styleProfile = null;\n this.htmlSnapshot = buildHtmlSnapshot(rawHtml);\n this.renderSnapshot();\n this.hint.textContent = \"已加载 HTML 快照\";\n this.emitChange();\n }\n\n public clear(): void {\n this.styleProfile = null;\n this.htmlSnapshot = buildHtmlSnapshot(\"<p><br/></p>\");\n this.renderSnapshot();\n this.hint.textContent = \"文档已清空\";\n this.emitChange();\n }\n\n private async onUpload(): Promise<void> {\n const file = this.fileInput.files?.[0];\n if (!file) return;\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.hint.textContent = `已加载 Word 文件: ${profile.sourceFileName}`;\n this.emitChange();\n } catch (error) {\n this.emitError(error instanceof Error ? error.message : \"Word 解析失败\");\n } finally {\n this.fileInput.value = \"\";\n }\n }\n\n private async readClipboard(): Promise<void> {\n if (!navigator.clipboard?.read) {\n this.emitError(\"当前浏览器不支持 clipboard.read\");\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 : \"读取剪贴板失败\");\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.hint.textContent = \"未检测到可导入内容\";\n return;\n }\n this.renderSnapshot();\n this.hint.textContent = \"已导入剪贴板内容\";\n this.emitChange();\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(): void {\n this.dispatchEvent(new CustomEvent(\"docsjs-change\", { detail: { htmlSnapshot: this.htmlSnapshot } }));\n }\n\n private emitError(message: string): void {\n this.dispatchEvent(new CustomEvent(\"docsjs-error\", { detail: { message } }));\n this.hint.textContent = `错误: ${message}`;\n }\n}\n\nexport function defineDocsWordElement(): void {\n if (!customElements.get(\"docs-word-editor\")) {\n customElements.define(\"docs-word-editor\", DocsWordElement);\n }\n}\n","import React, { useEffect, useRef } from \"react\";\nimport type { Ref } from \"react\";\nimport { defineDocsWordElement } from \"../core/DocsWordElement\";\nimport type { DocsWordEditorChangeDetail, DocsWordEditorErrorDetail } from \"../core/types\";\n\ndefineDocsWordElement();\n\nexport interface WordFidelityEditorReactProps {\n onChange?: (payload: DocsWordEditorChangeDetail) => void;\n onError?: (payload: DocsWordEditorErrorDetail) => void;\n}\n\nexport function WordFidelityEditorReact({ onChange, onError }: WordFidelityEditorReactProps) {\n const ref = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n\n const onChangeEvent = (event: Event) => {\n const detail = (event as CustomEvent<DocsWordEditorChangeDetail>).detail;\n onChange?.(detail);\n };\n const onErrorEvent = (event: Event) => {\n const detail = (event as CustomEvent<DocsWordEditorErrorDetail>).detail;\n onError?.(detail);\n };\n\n node.addEventListener(\"docsjs-change\", onChangeEvent);\n node.addEventListener(\"docsjs-error\", onErrorEvent);\n return () => {\n node.removeEventListener(\"docsjs-change\", onChangeEvent);\n node.removeEventListener(\"docsjs-error\", onErrorEvent);\n };\n }, [onChange, onError]);\n\n return React.createElement(\"docs-word-editor\", { ref: ref as unknown as Ref<HTMLElement> });\n}\n","import { defineComponent, h, onBeforeUnmount, onMounted, ref } from \"vue\";\nimport { defineDocsWordElement } from \"../core/DocsWordElement\";\nimport type { DocsWordEditorChangeDetail, DocsWordEditorErrorDetail } from \"../core/types\";\n\ndefineDocsWordElement();\n\nexport const WordFidelityEditorVue = defineComponent({\n name: \"WordFidelityEditorVue\",\n emits: [\"change\", \"error\"],\n setup(_, { emit }) {\n const elRef = ref<HTMLElement | null>(null);\n\n const onChange = (event: Event) => {\n emit(\"change\", (event as CustomEvent<DocsWordEditorChangeDetail>).detail);\n };\n const onError = (event: Event) => {\n emit(\"error\", (event as CustomEvent<DocsWordEditorErrorDetail>).detail);\n };\n\n onMounted(() => {\n elRef.value?.addEventListener(\"docsjs-change\", onChange);\n elRef.value?.addEventListener(\"docsjs-error\", onError);\n });\n\n onBeforeUnmount(() => {\n elRef.value?.removeEventListener(\"docsjs-change\", onChange);\n elRef.value?.removeEventListener(\"docsjs-error\", onError);\n });\n\n return () => h(\"docs-word-editor\", { ref: elRef });\n }\n});\n"],"mappings":"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","names":["runText","JSZip","getAttr","queryByLocalName","queryAllByLocalName","parseXml","escapeHtml","runStyleToCss","h","ref"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@coding01/docsjs",
3
+ "version": "0.1.0",
4
+ "description": "Render-first Word fidelity component with Web Component core and React/Vue adapters",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.cjs",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "typecheck": "tsc --noEmit",
23
+ "prepublishOnly": "npm run typecheck && npm run build"
24
+ },
25
+ "keywords": [
26
+ "word",
27
+ "docx",
28
+ "editor",
29
+ "fidelity",
30
+ "iframe",
31
+ "react",
32
+ "vue",
33
+ "web-component"
34
+ ],
35
+ "homepage": "https://github.com/fanly/docsjs#readme",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/fanly/docsjs.git"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/fanly/docsjs/issues"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "peerDependencies": {
47
+ "react": ">=18",
48
+ "react-dom": ">=18",
49
+ "vue": ">=3.4.0"
50
+ },
51
+ "dependencies": {
52
+ "jszip": "^3.10.1"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.10.5",
56
+ "@types/react": "^19.0.2",
57
+ "@types/react-dom": "^19.0.2",
58
+ "tsup": "^8.3.5",
59
+ "typescript": "^5.7.3",
60
+ "vue": "^3.5.13"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "vue": {
64
+ "optional": true
65
+ }
66
+ }
67
+ }