@yinyoudexing/xml2word 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/{createDocxZip-5CCNW5LX.js → createDocxZip-BVX7SQOB.js} +85 -11
- package/dist/{createDocxZip-5CCNW5LX.js.map → createDocxZip-BVX7SQOB.js.map} +1 -1
- package/dist/{htmlToWordBodyXml-JSGDLGOS.js → htmlToWordBodyXml-VH5U3L5J.js} +32 -16
- package/dist/htmlToWordBodyXml-VH5U3L5J.js.map +1 -0
- package/dist/index.cjs +163 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.js +51 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/htmlToWordBodyXml-JSGDLGOS.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/normalizeDocumentXml.ts","../src/lib/validateXml.ts","../src/lib/createDocxZip.ts","../src/lib/htmlToWordBodyXml.ts","../src/index.ts"],"sourcesContent":["import type { XmlToDocxInputKind } from \"../index.js\";\n\nconst WORD_MAIN_NS = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\";\n\nfunction hasWordDocumentRoot(xml: string): boolean {\n return /<w:document[\\s>]/.test(xml);\n}\n\nfunction ensureXmlDeclaration(xml: string): string {\n if (/^\\s*<\\?xml\\b/.test(xml)) return xml;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${xml}`;\n}\n\nfunction wrapBodyXml(bodyXml: string): string {\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n>\n <w:body>\n${bodyXml}\n <w:sectPr>\n <w:headerReference w:type=\"default\" r:id=\"rId6\"/>\n <w:footerReference w:type=\"default\" r:id=\"rId7\"/>\n <w:pgSz w:w=\"11906\" w:h=\"16838\"/>\n <w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\" w:header=\"708\" w:footer=\"708\" w:gutter=\"0\"/>\n <w:cols w:space=\"708\"/>\n </w:sectPr>\n </w:body>\n</w:document>\n`;\n return xml;\n}\n\nfunction ensureWordNamespace(xml: string): string {\n const hasWNamespace =\n /xmlns:w\\s*=\\s*[\"']http:\\/\\/schemas\\.openxmlformats\\.org\\/wordprocessingml\\/2006\\/main[\"']/.test(\n xml,\n );\n if (hasWNamespace) return xml;\n\n return xml.replace(\n /<w:document\\b/,\n `<w:document xmlns:w=\"${WORD_MAIN_NS}\"`,\n );\n}\n\nexport function normalizeDocumentXml(xml: string, inputKind: XmlToDocxInputKind): string {\n const trimmed = xml.trim();\n if (!trimmed) {\n throw new Error(\"XML is empty.\");\n }\n\n if (inputKind === \"document\") {\n const withDecl = ensureXmlDeclaration(trimmed);\n const withNs = ensureWordNamespace(withDecl);\n if (!hasWordDocumentRoot(withNs)) {\n throw new Error('inputKind=\"document\" requires a <w:document> root.');\n }\n return withNs;\n }\n\n if (inputKind === \"body\") {\n return wrapBodyXml(trimmed);\n }\n\n if (hasWordDocumentRoot(trimmed)) {\n const withDecl = ensureXmlDeclaration(trimmed);\n return ensureWordNamespace(withDecl);\n }\n\n return wrapBodyXml(trimmed);\n}\n","import { XMLValidator } from \"fast-xml-parser\";\n\nexport function validateXmlIfNeeded(xml: string, validateXml: boolean): void {\n if (!validateXml) return;\n\n const result = XMLValidator.validate(xml);\n if (result === true) return;\n\n const err = (result as { err?: { msg?: string; line?: number; col?: number } }).err;\n const msg = err?.msg ?? \"Invalid XML.\";\n const line = err?.line;\n const col = err?.col;\n\n const location =\n typeof line === \"number\" && typeof col === \"number\" ? ` (line ${line}, col ${col})` : \"\";\n throw new Error(`${msg}${location}`);\n}\n\n","import JSZip from \"jszip\";\nimport type { XmlToDocxOptions } from \"../index.js\";\nimport { normalizeDocumentXml } from \"./normalizeDocumentXml.js\";\nimport { validateXmlIfNeeded } from \"./validateXml.js\";\n\nexport type DocxAsset = {\n relationshipId: string;\n relationshipType: string;\n target: string;\n data: Uint8Array;\n contentType?: string;\n};\n\nconst STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\">\n <w:name w:val=\"Normal\"/>\n <w:qFormat/>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\n <w:name w:val=\"heading 1\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"0\"/>\n <w:spacing w:before=\"240\" w:after=\"120\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"44\"/>\n <w:szCs w:val=\"44\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\n <w:name w:val=\"heading 2\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"1\"/>\n <w:spacing w:before=\"200\" w:after=\"100\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"32\"/>\n <w:szCs w:val=\"32\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\n <w:name w:val=\"heading 3\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"2\"/>\n <w:spacing w:before=\"180\" w:after=\"90\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\n <w:name w:val=\"heading 4\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"3\"/>\n <w:spacing w:before=\"160\" w:after=\"80\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"24\"/>\n <w:szCs w:val=\"24\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\n <w:name w:val=\"heading 5\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"4\"/>\n <w:spacing w:before=\"140\" w:after=\"70\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\n <w:name w:val=\"heading 6\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"5\"/>\n <w:spacing w:before=\"120\" w:after=\"60\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n</w:styles>\n`;\n\nconst SETTINGS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:settings xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:themeFontLang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n <w:defaultTabStop w:val=\"720\"/>\n <w:compat/>\n</w:settings>\n`;\n\nconst NUMBERING_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:abstractNum w:abstractNumId=\"1\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"•\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"○\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"■\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:abstractNum w:abstractNumId=\"2\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.%3.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"1\"/></w:num>\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"2\"/></w:num>\n</w:numbering>\n`;\n\nconst HEADER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:hdr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"center\"/></w:pPr>\n <w:r><w:t></w:t></w:r>\n </w:p>\n</w:hdr>\n`;\n\nconst FOOTER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:ftr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"right\"/></w:pPr>\n <w:r><w:t>第 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> PAGE </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页 / 共 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> NUMPAGES </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页</w:t></w:r>\n </w:p>\n</w:ftr>\n`;\n\nconst THEME_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\">\n <a:themeElements>\n <a:clrScheme name=\"Office\">\n <a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n <a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n <a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2>\n <a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2>\n <a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1>\n <a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2>\n <a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3>\n <a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4>\n <a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5>\n <a:accent6><a:srgbClr val=\"F79646\"/></a:accent6>\n <a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink>\n <a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink>\n </a:clrScheme>\n <a:fontScheme name=\"Office\">\n <a:majorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:majorFont>\n <a:minorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:minorFont>\n </a:fontScheme>\n <a:fmtScheme name=\"Office\">\n <a:fillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n </a:fillStyleLst>\n <a:lnStyleLst>\n <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n </a:lnStyleLst>\n <a:effectStyleLst>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n </a:effectStyleLst>\n <a:bgFillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n </a:bgFillStyleLst>\n </a:fmtScheme>\n </a:themeElements>\n <a:objectDefaults/>\n <a:extraClrSchemeLst/>\n</a:theme>\n`;\n\nconst FONT_TABLE_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:fonts xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:font w:name=\"Times New Roman\">\n <w:charset w:val=\"00\"/>\n <w:family w:val=\"roman\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n <w:font w:name=\"FangSong_GB2312\">\n <w:charset w:val=\"86\"/>\n <w:family w:val=\"auto\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n</w:fonts>\n`;\n\nfunction buildContentTypesXml(assets: DocxAsset[]): string {\n const defaults = new Map<string, string>();\n defaults.set(\"rels\", \"application/vnd.openxmlformats-package.relationships+xml\");\n defaults.set(\"xml\", \"application/xml\");\n\n for (const asset of assets) {\n if (!asset.contentType) continue;\n const extMatch = asset.target.match(/\\.([a-zA-Z0-9]+)$/);\n if (!extMatch) continue;\n const ext = extMatch[1].toLowerCase();\n defaults.set(ext, asset.contentType);\n }\n\n const defaultLines = [...defaults.entries()]\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([ext, ct]) => ` <Default Extension=\"${ext}\" ContentType=\"${ct}\"/>`)\n .join(\"\\n\");\n\n const overrides = [\n ' <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>',\n ' <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>',\n ' <Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/>',\n ' <Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>',\n ' <Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/>',\n ' <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>',\n ' <Override PartName=\"/word/header1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\"/>',\n ' <Override PartName=\"/word/footer1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\"/>',\n ].join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\\n${defaultLines}\\n${overrides}\\n</Types>\\n`;\n}\n\nconst ROOT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\"\n Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n Target=\"word/document.xml\"/>\n</Relationships>\n`;\n\nfunction buildDocumentRelsXml(assets: DocxAsset[]): string {\n const relLines = [\n ' <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>',\n ' <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/>',\n ' <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>',\n ' <Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\"/>',\n ' <Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>',\n ' <Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\" Target=\"header1.xml\"/>',\n ' <Relationship Id=\"rId7\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\" Target=\"footer1.xml\"/>',\n ...assets.map(\n (a) =>\n ` <Relationship Id=\"${a.relationshipId}\" Type=\"${a.relationshipType}\" Target=\"${a.target}\"/>`,\n ),\n ].join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n${relLines}\\n</Relationships>\\n`;\n}\n\nexport async function createDocxZipUint8Array(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\");\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml([]));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml([]));\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n\nexport async function createDocxZipWithAssetsUint8Array(\n xml: string,\n options: XmlToDocxOptions,\n assets: DocxAsset[],\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\");\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml(assets));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml(assets));\n\n if (assets.length) {\n for (const asset of assets) {\n const targetPath = asset.target.replace(/^\\.\\//, \"\");\n const normalized = targetPath.startsWith(\"word/\") ? targetPath.slice(\"word/\".length) : targetPath;\n wordFolder?.file(normalized, asset.data);\n }\n }\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n","import { parseDocument } from \"htmlparser2\";\n\ntype HtmlNode = {\n type?: string;\n name?: string;\n data?: string;\n attribs?: Record<string, string | undefined>;\n children?: HtmlNode[];\n};\n\ntype TextStyle = {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n colorHex?: string;\n fontFamily?: string;\n fontSizeHalfPoints?: number;\n};\n\ntype HtmlToWordContext = {\n defaultBaseFontHalfPoints: number;\n defaultBodyCss: Record<string, string>;\n defaultPCss: Record<string, string>;\n tableWrapperCss: Record<string, string>;\n};\n\nfunction escapeXmlText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction shouldPreserveSpace(text: string): boolean {\n if (!text) return false;\n return /^\\s/.test(text) || /\\s$/.test(text) || /\\s{2,}/.test(text);\n}\n\nfunction shouldKeepWhitespaceOnlyRun(text: string): boolean {\n if (!text) return false;\n if (/\\r|\\n/.test(text)) return false;\n if (text.includes(\"\\u00a0\")) return true;\n return /\\s{2,}/.test(text);\n}\n\nfunction parseStyleAttribute(style: string | undefined): Record<string, string> {\n if (!style) return {};\n const normalized = style.replace(/\\r/g, \"\\n\");\n const parts = normalized.split(\";\");\n const entries: [string, string][] = [];\n for (const part of parts) {\n const idx = part.indexOf(\":\");\n if (idx <= 0) continue;\n const key = part.slice(0, idx).trim().toLowerCase();\n const val = part.slice(idx + 1).trim();\n if (!key || !val) continue;\n entries.push([key, val]);\n }\n return Object.fromEntries(entries);\n}\n\nfunction parseRgbToHex(value: string): string | undefined {\n const m = value\n .trim()\n .toLowerCase()\n .match(/^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/);\n if (!m) return undefined;\n const nums = [Number(m[1]), Number(m[2]), Number(m[3])];\n if (nums.some((n) => Number.isNaN(n) || n < 0 || n > 255)) return undefined;\n return nums.map((n) => n.toString(16).padStart(2, \"0\")).join(\"\").toUpperCase();\n}\n\nfunction parseCssColorToHex(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const v = value.trim();\n const hex = v.match(/^#([0-9a-fA-F]{6})$/)?.[1];\n if (hex) return hex.toUpperCase();\n return parseRgbToHex(v);\n}\n\nfunction extractBackgroundFillHex(css: Record<string, string>): string | undefined {\n const raw = (css[\"background-color\"] ?? css.background)?.trim();\n if (!raw) return undefined;\n const direct = parseCssColorToHex(raw);\n if (direct) return direct;\n const hex = raw.match(/#([0-9a-fA-F]{6})/)?.[0];\n if (hex) return parseCssColorToHex(hex);\n const rgb = raw.match(/rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)/)?.[0];\n if (rgb) return parseCssColorToHex(rgb);\n return undefined;\n}\n\nfunction parseFontSizeToHalfPoints(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n const pt = v.match(/^(\\d+(?:\\.\\d+)?)pt$/);\n if (pt) return Math.max(1, Math.round(Number(pt[1]) * 2));\n const px = v.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (px) {\n const ptValue = (Number(px[1]) * 72) / 96;\n return Math.max(1, Math.round(ptValue * 2));\n }\n return undefined;\n}\n\nfunction normalizeFontFamily(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const first = value.split(\",\")[0]?.trim();\n if (!first) return undefined;\n return first.replace(/^[\"']|[\"']$/g, \"\");\n}\n\n/**\n * 判断某条 CSS 规则选择器列表是否“命中”目标 selector。\n * 说明:这里只做非常轻量的匹配(等值 / 目标为前缀),用于从 HTML 内嵌 style 中粗略抽取常见规则。\n */\nfunction cssSelectorsHitTarget(selectorsText: string, targetSelector: string): boolean {\n const target = targetSelector.trim().toLowerCase();\n if (!target) return false;\n\n const selectors = selectorsText\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \" \")\n .split(\",\")\n .map((s) => s.replace(/\\s+/g, \" \").trim().toLowerCase())\n .filter(Boolean);\n\n return selectors.some((s) => {\n if (s === target) return true;\n if (!s.startsWith(target)) return false;\n const rest = s.slice(target.length);\n return rest.startsWith(\".\") || rest.startsWith(\":\") || rest.startsWith(\"#\") || rest.startsWith(\"[\");\n });\n}\n\n/**\n * 从 HTML 的 <style> 中合并提取指定 selector 的规则(后出现的同名属性会覆盖先出现的)。\n */\nfunction parseCssRuleFromHtml(html: string, selector: string): Record<string, string> {\n const styleTagRegex = /<style\\b[^>]*>([\\s\\S]*?)<\\/style>/gi;\n const merged: Record<string, string> = {};\n let m: RegExpExecArray | null;\n while ((m = styleTagRegex.exec(html))) {\n const cssText = m[1] ?? \"\";\n const target = selector.trim().toLowerCase();\n if (!target) continue;\n\n let depth = 0;\n let lastRuleEnd = 0;\n let ruleStart = -1;\n let declStart = -1;\n\n for (let i = 0; i < cssText.length; i++) {\n const ch = cssText[i] as string;\n if (ch === \"{\") {\n if (depth === 0) {\n ruleStart = lastRuleEnd;\n declStart = i + 1;\n }\n depth++;\n continue;\n }\n if (ch === \"}\") {\n if (depth > 0) depth--;\n if (depth === 0 && ruleStart >= 0 && declStart >= 0) {\n const selectorsText = cssText.slice(ruleStart, declStart - 1).trim().toLowerCase();\n const decl = cssText.slice(declStart, i).trim();\n lastRuleEnd = i + 1;\n ruleStart = -1;\n declStart = -1;\n\n const hit = cssSelectorsHitTarget(selectorsText, target);\n if (hit) Object.assign(merged, parseStyleAttribute(decl));\n }\n }\n }\n }\n return merged;\n}\n\n/**\n * 从 HTML 的 <style> 中提取指定 selector 的“第一条命中规则”(不继续向后合并覆盖)。\n * 用途:HTML 里经常混入大量业务 CSS(例如 modal、dropdown),会把全局 p/body 覆盖成不符合预期的值;\n * 这里用“优先早期基础排版规则”的策略,避免被后面的 UI 样式污染。\n */\nfunction parseCssRuleFromHtmlFirst(html: string, selector: string): Record<string, string> {\n const styleTagRegex = /<style\\b[^>]*>([\\s\\S]*?)<\\/style>/gi;\n let m: RegExpExecArray | null;\n while ((m = styleTagRegex.exec(html))) {\n const cssText = m[1] ?? \"\";\n const target = selector.trim().toLowerCase();\n if (!target) continue;\n\n let depth = 0;\n let lastRuleEnd = 0;\n let ruleStart = -1;\n let declStart = -1;\n\n for (let i = 0; i < cssText.length; i++) {\n const ch = cssText[i] as string;\n if (ch === \"{\") {\n if (depth === 0) {\n ruleStart = lastRuleEnd;\n declStart = i + 1;\n }\n depth++;\n continue;\n }\n if (ch === \"}\") {\n if (depth > 0) depth--;\n if (depth === 0 && ruleStart >= 0 && declStart >= 0) {\n const selectorsText = cssText.slice(ruleStart, declStart - 1).trim().toLowerCase();\n const decl = cssText.slice(declStart, i).trim();\n lastRuleEnd = i + 1;\n ruleStart = -1;\n declStart = -1;\n\n const hit = cssSelectorsHitTarget(selectorsText, target);\n if (hit) return parseStyleAttribute(decl);\n }\n }\n }\n }\n return {};\n}\n\nfunction mergeTextStyle(base: TextStyle, patch: TextStyle): TextStyle {\n return {\n bold: patch.bold ?? base.bold,\n italic: patch.italic ?? base.italic,\n underline: patch.underline ?? base.underline,\n colorHex: patch.colorHex ?? base.colorHex,\n fontFamily: patch.fontFamily ?? base.fontFamily,\n fontSizeHalfPoints: patch.fontSizeHalfPoints ?? base.fontSizeHalfPoints,\n };\n}\n\nfunction styleFromElement(node: HtmlNode): TextStyle {\n const tag = node.name?.toLowerCase();\n const styleAttr = node.attribs?.style;\n const css = parseStyleAttribute(styleAttr);\n\n const boldFromCss = (() => {\n const v = css[\"font-weight\"]?.trim().toLowerCase();\n if (!v) return undefined;\n if (v === \"bold\" || v === \"bolder\") return true;\n const n = Number(v);\n if (!Number.isNaN(n)) return n >= 600;\n return undefined;\n })();\n\n const italicFromCss = (() => {\n const v = css[\"font-style\"]?.trim().toLowerCase();\n if (!v) return undefined;\n if (v === \"italic\" || v === \"oblique\") return true;\n return undefined;\n })();\n\n const underlineFromCss = (() => {\n const v = css[\"text-decoration\"]?.trim().toLowerCase();\n if (!v) return undefined;\n return v.includes(\"underline\");\n })();\n\n const tagBold = tag === \"b\" || tag === \"strong\" ? true : undefined;\n const tagItalic = tag === \"i\" || tag === \"em\" ? true : undefined;\n const tagUnderline = tag === \"u\" ? true : undefined;\n\n return {\n bold: tagBold ?? boldFromCss,\n italic: tagItalic ?? italicFromCss,\n underline: tagUnderline ?? underlineFromCss,\n colorHex: parseCssColorToHex(css.color),\n fontFamily: normalizeFontFamily(css[\"font-family\"]),\n fontSizeHalfPoints: parseFontSizeToHalfPoints(css[\"font-size\"]),\n };\n}\n\nfunction getTextContent(node: HtmlNode): string {\n if (node.type === \"text\") return node.data ?? \"\";\n let out = \"\";\n const children = node.children ?? [];\n for (const c of children) out += getTextContent(c);\n return out;\n}\n\ntype RunToken =\n | { kind: \"text\"; text: string; style: TextStyle }\n | { kind: \"br\" }\n | { kind: \"image\"; image: EmbeddedImageRef };\n\ntype EmbeddedImage = {\n relationshipId: string;\n target: string;\n data: Uint8Array;\n contentType: string;\n widthPx: number;\n heightPx: number;\n};\n\nconst IMAGE_RELATIONSHIP_ID_OFFSET = 7;\n\ntype EmbeddedImageRef = {\n relationshipId: string;\n widthPx: number;\n heightPx: number;\n};\n\ntype HtmlToWordResult = {\n bodyXml: string;\n images: EmbeddedImage[];\n};\n\nfunction decodeBase64ToUint8Array(base64: string): Uint8Array {\n const BufferCtor = (globalThis as unknown as { Buffer?: typeof Buffer }).Buffer;\n if (BufferCtor) {\n return new Uint8Array(BufferCtor.from(base64, \"base64\"));\n }\n const atobFn = (globalThis as unknown as { atob?: (data: string) => string }).atob;\n if (!atobFn) {\n throw new Error(\"Base64 decode is not available in this environment.\");\n }\n const bin = atobFn(base64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\nfunction parseImageDataUrl(\n src: string,\n): { contentType: string; data: Uint8Array; extension: \"png\" | \"jpeg\" } | undefined {\n const m = src.match(/^data:(image\\/png|image\\/jpeg);base64,([\\s\\S]+)$/i);\n if (!m) return undefined;\n const contentType = m[1].toLowerCase();\n const base64 = m[2].replace(/\\s+/g, \"\");\n const data = decodeBase64ToUint8Array(base64);\n const extension = contentType === \"image/png\" ? \"png\" : \"jpeg\";\n return { contentType, data, extension };\n}\n\nfunction parseCssLengthToPx(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n const px = v.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (px) return Math.max(1, Math.round(Number(px[1])));\n return undefined;\n}\n\nfunction readUInt32BE(bytes: Uint8Array, offset: number): number | undefined {\n if (offset < 0 || offset + 4 > bytes.length) return undefined;\n return (\n ((bytes[offset] ?? 0) << 24) |\n ((bytes[offset + 1] ?? 0) << 16) |\n ((bytes[offset + 2] ?? 0) << 8) |\n (bytes[offset + 3] ?? 0)\n ) >>> 0;\n}\n\nfunction parsePngDimensions(data: Uint8Array): { widthPx: number; heightPx: number } | undefined {\n if (data.length < 24) return undefined;\n const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (let i = 0; i < signature.length; i++) {\n if ((data[i] ?? 0) !== signature[i]) return undefined;\n }\n const widthPx = readUInt32BE(data, 16);\n const heightPx = readUInt32BE(data, 20);\n if (!widthPx || !heightPx) return undefined;\n return { widthPx, heightPx };\n}\n\nfunction parseJpegDimensions(data: Uint8Array): { widthPx: number; heightPx: number } | undefined {\n if (data.length < 4) return undefined;\n if (data[0] !== 0xff || data[1] !== 0xd8) return undefined;\n\n let offset = 2;\n while (offset + 4 <= data.length) {\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n while (offset < data.length && data[offset] === 0xff) offset++;\n if (offset >= data.length) return undefined;\n\n const marker = data[offset] as number;\n offset++;\n\n const isStandalone = marker === 0xd9 || marker === 0xda;\n if (isStandalone) break;\n if (offset + 2 > data.length) return undefined;\n const length = ((data[offset] as number) << 8) | (data[offset + 1] as number);\n if (length < 2 || offset + length > data.length) return undefined;\n\n const isSof =\n marker === 0xc0 ||\n marker === 0xc1 ||\n marker === 0xc2 ||\n marker === 0xc3 ||\n marker === 0xc5 ||\n marker === 0xc6 ||\n marker === 0xc7 ||\n marker === 0xc9 ||\n marker === 0xca ||\n marker === 0xcb ||\n marker === 0xcd ||\n marker === 0xce ||\n marker === 0xcf;\n if (isSof) {\n if (offset + 7 > data.length) return undefined;\n const heightPx = ((data[offset + 3] as number) << 8) | (data[offset + 4] as number);\n const widthPx = ((data[offset + 5] as number) << 8) | (data[offset + 6] as number);\n if (!widthPx || !heightPx) return undefined;\n return { widthPx, heightPx };\n }\n\n offset += length;\n }\n\n return undefined;\n}\n\nfunction parseIntrinsicImageSizePx(\n contentType: string,\n data: Uint8Array,\n): { widthPx: number; heightPx: number } | undefined {\n if (contentType === \"image/png\") return parsePngDimensions(data);\n if (contentType === \"image/jpeg\") return parseJpegDimensions(data);\n return undefined;\n}\n\nfunction applyMaxBoxPx(\n size: { widthPx: number; heightPx: number },\n maxBox: { maxWidthPx: number; maxHeightPx: number },\n): { widthPx: number; heightPx: number } {\n const w = Math.max(1, Math.round(size.widthPx));\n const h = Math.max(1, Math.round(size.heightPx));\n const scale = Math.min(1, maxBox.maxWidthPx / w, maxBox.maxHeightPx / h);\n return { widthPx: Math.max(1, Math.round(w * scale)), heightPx: Math.max(1, Math.round(h * scale)) };\n}\n\nfunction computeImageSizePx(\n node: HtmlNode,\n intrinsic: { widthPx: number; heightPx: number } | undefined,\n): { widthPx: number; heightPx: number } {\n const wAttr = node.attribs?.width ? Number(node.attribs.width) : undefined;\n const hAttr = node.attribs?.height ? Number(node.attribs.height) : undefined;\n const css = parseStyleAttribute(node.attribs?.style);\n const wCss = parseCssLengthToPx(css.width);\n const hCss = parseCssLengthToPx(css.height);\n\n const widthAttrPx = Number.isFinite(wAttr) && wAttr ? Math.max(1, Math.round(wAttr)) : undefined;\n const heightAttrPx = Number.isFinite(hAttr) && hAttr ? Math.max(1, Math.round(hAttr)) : undefined;\n\n const ratio =\n intrinsic && intrinsic.widthPx > 0 && intrinsic.heightPx > 0\n ? intrinsic.heightPx / intrinsic.widthPx\n : widthAttrPx && heightAttrPx\n ? heightAttrPx / widthAttrPx\n : 0.5;\n\n const widthPx =\n typeof wCss === \"number\"\n ? wCss\n : typeof widthAttrPx === \"number\"\n ? widthAttrPx\n : intrinsic?.widthPx ?? 300;\n const heightPx =\n typeof hCss === \"number\"\n ? hCss\n : typeof heightAttrPx === \"number\"\n ? heightAttrPx\n : intrinsic?.heightPx ?? 150;\n\n const finalSize =\n typeof wCss === \"number\" && typeof hCss !== \"number\"\n ? { widthPx, heightPx: Math.max(1, Math.round(widthPx * ratio)) }\n : typeof hCss === \"number\" && typeof wCss !== \"number\"\n ? { widthPx: Math.max(1, Math.round(heightPx / ratio)), heightPx }\n : typeof widthAttrPx === \"number\" && typeof heightAttrPx !== \"number\" && intrinsic\n ? { widthPx, heightPx: Math.max(1, Math.round(widthPx * ratio)) }\n : typeof heightAttrPx === \"number\" && typeof widthAttrPx !== \"number\" && intrinsic\n ? { widthPx: Math.max(1, Math.round(heightPx / ratio)), heightPx }\n : { widthPx, heightPx };\n\n return applyMaxBoxPx(finalSize, { maxWidthPx: 624, maxHeightPx: 864 });\n}\n\nfunction collectInlineRuns(\n node: HtmlNode,\n inherited: TextStyle,\n out: RunToken[],\n result: HtmlToWordResult,\n): void {\n if (node.type === \"text\") {\n const text = node.data ?? \"\";\n if (text) out.push({ kind: \"text\", text, style: inherited });\n return;\n }\n\n if (node.type === \"tag\") {\n const tag = node.name?.toLowerCase();\n if (tag === \"br\") {\n out.push({ kind: \"br\" });\n return;\n }\n if (tag === \"img\") {\n const src = node.attribs?.src;\n if (!src) return;\n const parsed = parseImageDataUrl(src);\n if (!parsed) return;\n const intrinsic = parseIntrinsicImageSizePx(parsed.contentType, parsed.data);\n const { widthPx, heightPx } = computeImageSizePx(node, intrinsic);\n const id = result.images.length + 1;\n const relationshipId = `rId${id + IMAGE_RELATIONSHIP_ID_OFFSET}`;\n const target = `media/image${id}.${parsed.extension}`;\n result.images.push({\n relationshipId,\n target,\n data: parsed.data,\n contentType: parsed.contentType,\n widthPx,\n heightPx,\n });\n out.push({ kind: \"image\", image: { relationshipId, widthPx, heightPx } });\n return;\n }\n if (tag === \"canvas\") {\n const dataUrl = node.attribs?.[\"data-image\"] ?? node.attribs?.[\"data-src\"];\n if (!dataUrl) return;\n const parsed = parseImageDataUrl(dataUrl);\n if (!parsed) return;\n const bufferW = node.attribs?.width ? Number(node.attribs.width) : undefined;\n const bufferH = node.attribs?.height ? Number(node.attribs.height) : undefined;\n const intrinsic =\n Number.isFinite(bufferW) && bufferW && Number.isFinite(bufferH) && bufferH\n ? { widthPx: Math.max(1, Math.round(bufferW)), heightPx: Math.max(1, Math.round(bufferH)) }\n : parseIntrinsicImageSizePx(parsed.contentType, parsed.data);\n const { widthPx, heightPx } = computeImageSizePx(node, intrinsic);\n const id = result.images.length + 1;\n const relationshipId = `rId${id + IMAGE_RELATIONSHIP_ID_OFFSET}`;\n const target = `media/image${id}.${parsed.extension}`;\n result.images.push({\n relationshipId,\n target,\n data: parsed.data,\n contentType: parsed.contentType,\n widthPx,\n heightPx,\n });\n out.push({ kind: \"image\", image: { relationshipId, widthPx, heightPx } });\n return;\n }\n const next = mergeTextStyle(inherited, styleFromElement(node));\n const children = node.children ?? [];\n for (const c of children) collectInlineRuns(c, next, out, result);\n return;\n }\n\n const children = node.children ?? [];\n for (const c of children) collectInlineRuns(c, inherited, out, result);\n}\n\nfunction buildRunXml(style: TextStyle, text: string): string {\n const rPrParts: string[] = [];\n if (style.bold) rPrParts.push(\"<w:b/>\");\n if (style.italic) rPrParts.push(\"<w:i/>\");\n if (style.underline) rPrParts.push('<w:u w:val=\"single\"/>');\n if (style.colorHex) rPrParts.push(`<w:color w:val=\"${style.colorHex}\"/>`);\n if (style.fontFamily) {\n const ff = escapeXmlText(style.fontFamily);\n rPrParts.push(`<w:rFonts w:ascii=\"${ff}\" w:hAnsi=\"${ff}\" w:eastAsia=\"${ff}\"/>`);\n }\n if (typeof style.fontSizeHalfPoints === \"number\") {\n const sz = style.fontSizeHalfPoints;\n rPrParts.push(`<w:sz w:val=\"${sz}\"/><w:szCs w:val=\"${sz}\"/>`);\n }\n\n const rPrXml = rPrParts.length ? `<w:rPr>${rPrParts.join(\"\")}</w:rPr>` : \"\";\n const escaped = escapeXmlText(text);\n const preserve = shouldPreserveSpace(text) ? ' xml:space=\"preserve\"' : \"\";\n return `<w:r>${rPrXml}<w:t${preserve}>${escaped}</w:t></w:r>`;\n}\n\nfunction pxToEmu(px: number): number {\n return Math.max(1, Math.round(px * 9525));\n}\n\nfunction buildImageRunXml(image: EmbeddedImageRef): string {\n const cx = pxToEmu(image.widthPx);\n const cy = pxToEmu(image.heightPx);\n const docPrId = image.relationshipId.replace(/^rId/, \"\");\n const name = `Picture ${docPrId}`;\n\n return `<w:r><w:drawing xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"${cx}\" cy=\"${cy}\"/><wp:docPr id=\"${docPrId}\" name=\"${escapeXmlText(name)}\"/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"${escapeXmlText(name)}\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${image.relationshipId}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n}\n\nfunction hasClass(node: HtmlNode, className: string): boolean {\n const cls = node.attribs?.class;\n if (!cls) return false;\n return cls.split(/\\s+/).includes(className);\n}\n\nfunction isSkippableSubtree(node: HtmlNode): boolean {\n if (node.type !== \"tag\") return false;\n const tag = node.name?.toLowerCase();\n if (tag === \"button\") return true;\n if (tag === \"canvas\") {\n const dataUrl = node.attribs?.[\"data-image\"] ?? node.attribs?.[\"data-src\"];\n if (!dataUrl) return true;\n }\n if (tag === \"img\" && hasClass(node, \"ProseMirror-separator\")) return true;\n if (node.attribs?.id === \"pages\") return true;\n if (hasClass(node, \"ProseMirror-widget\")) return true;\n return false;\n}\n\nfunction parseCssLengthToTwips(\n value: string | undefined,\n baseFontHalfPoints: number,\n): number | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n if (!v) return undefined;\n\n const pt = v.match(/^(-?\\d+(?:\\.\\d+)?)pt$/);\n if (pt) return Math.round(Number(pt[1]) * 20);\n\n const px = v.match(/^(-?\\d+(?:\\.\\d+)?)px$/);\n if (px) return Math.round((Number(px[1]) * 72 * 20) / 96);\n\n const em = v.match(/^(-?\\d+(?:\\.\\d+)?)em$/);\n if (em) {\n const basePt = baseFontHalfPoints / 2;\n return Math.round(Number(em[1]) * basePt * 20);\n }\n\n const rem = v.match(/^(-?\\d+(?:\\.\\d+)?)rem$/);\n if (rem) return Math.round((Number(rem[1]) * 16 * 72 * 20) / 96);\n\n const num = v.match(/^(-?\\d+(?:\\.\\d+)?)$/);\n if (num) return Math.round(Number(num[1]));\n\n return undefined;\n}\n\n/**\n * 提取 margin-top / margin-bottom(支持 margin 简写),并转成 twips。\n */\nfunction extractMarginBeforeAfterTwips(\n css: Record<string, string>,\n baseFontHalfPoints: number,\n): { beforeTwips?: number; afterTwips?: number } {\n const before = parseCssLengthToTwips(css[\"margin-top\"], baseFontHalfPoints);\n const after = parseCssLengthToTwips(css[\"margin-bottom\"], baseFontHalfPoints);\n if (typeof before === \"number\" || typeof after === \"number\") {\n return { beforeTwips: before, afterTwips: after };\n }\n\n const m = css.margin?.trim().toLowerCase();\n if (!m) return {};\n const tokens = m.split(/\\s+/).filter(Boolean);\n if (!tokens.length) return {};\n\n const topToken = tokens[0];\n const bottomToken = tokens.length === 1 ? tokens[0] : tokens.length === 2 ? tokens[0] : tokens[2] ?? tokens[0];\n return {\n beforeTwips: parseCssLengthToTwips(topToken, baseFontHalfPoints),\n afterTwips: parseCssLengthToTwips(bottomToken, baseFontHalfPoints),\n };\n}\n\nfunction inferFirstFontSizeHalfPoints(node: HtmlNode): number | undefined {\n const stack: HtmlNode[] = [node];\n while (stack.length) {\n const cur = stack.pop() as HtmlNode;\n if (cur.type === \"tag\") {\n const css = parseStyleAttribute(cur.attribs?.style);\n const sz = parseFontSizeToHalfPoints(css[\"font-size\"]);\n if (typeof sz === \"number\") return sz;\n }\n const children = cur.children ?? [];\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push(children[i] as HtmlNode);\n }\n }\n return undefined;\n}\n\nfunction buildParagraphPrXml(\n node: HtmlNode,\n baseFontHalfPoints: number,\n extraInd?: { leftTwips?: number; hangingTwips?: number },\n pStyleId?: string,\n defaultCss?: Record<string, string>,\n): string {\n const tag = node.type === \"tag\" ? node.name?.toLowerCase() : undefined;\n const inlineCss = parseStyleAttribute(node.attribs?.style);\n const css = defaultCss ? { ...defaultCss, ...inlineCss } : inlineCss;\n const parts: string[] = [];\n\n if (pStyleId) parts.push(`<w:pStyle w:val=\"${escapeXmlText(pStyleId)}\"/>`);\n\n const shdHex = extractBackgroundFillHex(css);\n if (shdHex) parts.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${shdHex}\"/>`);\n\n const align = css[\"text-align\"]?.trim().toLowerCase();\n const jcVal =\n align === \"center\"\n ? \"center\"\n : align === \"right\"\n ? \"right\"\n : align === \"justify\"\n ? \"both\"\n : undefined;\n if (jcVal) parts.push(`<w:jc w:val=\"${jcVal}\"/>`);\n\n const left = (() => {\n const marginLeft = parseCssLengthToTwips(css[\"margin-left\"], baseFontHalfPoints);\n const paddingLeft = parseCssLengthToTwips(css[\"padding-left\"], baseFontHalfPoints);\n const sum = (marginLeft ?? 0) + (paddingLeft ?? 0);\n if (!sum) return undefined;\n return Math.max(0, sum);\n })();\n\n const firstLine = (() => {\n const textIndent = parseCssLengthToTwips(css[\"text-indent\"], baseFontHalfPoints);\n if (typeof textIndent !== \"number\" || !textIndent) return undefined;\n return Math.max(0, textIndent);\n })();\n\n const indAttrs: string[] = [];\n const leftTwips = extraInd?.leftTwips ?? left;\n if (typeof leftTwips === \"number\") indAttrs.push(`w:left=\"${leftTwips}\"`);\n const hangingTwips = extraInd?.hangingTwips;\n if (typeof hangingTwips === \"number\") indAttrs.push(`w:hanging=\"${hangingTwips}\"`);\n if (typeof firstLine === \"number\") indAttrs.push(`w:firstLine=\"${firstLine}\"`);\n if (indAttrs.length) parts.push(`<w:ind ${indAttrs.join(\" \")}/>`);\n\n const hasInlineBefore = inlineCss[\"margin-top\"] != null;\n const hasInlineAfter = inlineCss[\"margin-bottom\"] != null;\n const beforeToken =\n inlineCss[\"margin-top\"] ?? (pStyleId ? undefined : defaultCss?.[\"margin-top\"]);\n const afterToken =\n inlineCss[\"margin-bottom\"] ?? (pStyleId ? undefined : defaultCss?.[\"margin-bottom\"]);\n let before = parseCssLengthToTwips(beforeToken, baseFontHalfPoints);\n let after = parseCssLengthToTwips(afterToken, baseFontHalfPoints);\n if (tag === \"p\" && !hasInlineBefore && typeof before === \"number\") before = Math.min(before, 160);\n if (tag === \"p\" && !hasInlineAfter && typeof after === \"number\") after = Math.min(after, 160);\n const lineHeight = (() => {\n const lhToken =\n inlineCss[\"line-height\"] ?? (pStyleId ? undefined : defaultCss?.[\"line-height\"]);\n const lh = lhToken?.trim().toLowerCase();\n if (!lh || lh === \"normal\") return undefined;\n\n const unitless = lh.match(/^(\\d+(?:\\.\\d+)?)$/);\n if (unitless) {\n const multiplier = Number(unitless[1]);\n if (!Number.isFinite(multiplier) || multiplier <= 0) return undefined;\n const basePt = baseFontHalfPoints / 2;\n return Math.round(basePt * multiplier * 20);\n }\n\n const twips = parseCssLengthToTwips(lh, baseFontHalfPoints);\n if (typeof twips !== \"number\") return undefined;\n return Math.max(1, twips);\n })();\n\n if (\n typeof before === \"number\" ||\n typeof after === \"number\" ||\n typeof lineHeight === \"number\"\n ) {\n const attrs: string[] = [];\n if (typeof before === \"number\") {\n attrs.push(`w:before=\"${Math.max(0, before)}\"`);\n } else if (typeof lineHeight === \"number\") {\n attrs.push('w:before=\"0\"');\n }\n if (typeof after === \"number\") {\n attrs.push(`w:after=\"${Math.max(0, after)}\"`);\n } else if (typeof lineHeight === \"number\") {\n attrs.push('w:after=\"160\"');\n }\n if (typeof lineHeight === \"number\") {\n attrs.push(`w:line=\"${lineHeight}\"`, 'w:lineRule=\"exact\"');\n }\n parts.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n\n if (!parts.length) return \"\";\n return `<w:pPr>${parts.join(\"\")}</w:pPr>`;\n}\n\nfunction buildParagraphXmlFromContainer(\n node: HtmlNode,\n baseStyle: TextStyle,\n extraInd?: { leftTwips?: number; hangingTwips?: number },\n pStyleId?: string,\n result?: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string {\n const seededBaseStyle: TextStyle = ctx\n ? { fontSizeHalfPoints: ctx.defaultBaseFontHalfPoints }\n : {};\n const containerStyle = mergeTextStyle(mergeTextStyle(seededBaseStyle, baseStyle), styleFromElement(node));\n const baseFontHalfPoints =\n containerStyle.fontSizeHalfPoints ?? inferFirstFontSizeHalfPoints(node) ?? 28;\n const computedBaseFontHalfPoints =\n containerStyle.fontSizeHalfPoints ??\n inferFirstFontSizeHalfPoints(node) ??\n ctx?.defaultBaseFontHalfPoints ??\n 28;\n const defaultCss =\n ctx\n ? node.type === \"tag\" && node.name?.toLowerCase() === \"p\"\n ? { ...ctx.defaultBodyCss, ...ctx.defaultPCss }\n : ctx.defaultBodyCss\n : undefined;\n const pPrXml = buildParagraphPrXml(node, computedBaseFontHalfPoints, extraInd, pStyleId, defaultCss);\n\n const runs: RunToken[] = [];\n const res =\n result ??\n ({\n bodyXml: \"\",\n images: [],\n } as HtmlToWordResult);\n for (const c of node.children ?? []) collectInlineRuns(c, containerStyle, runs, res);\n\n const rXml: string[] = [];\n for (const token of runs) {\n if (token.kind === \"br\") {\n rXml.push(\"<w:r><w:br/></w:r>\");\n continue;\n }\n if (token.kind === \"image\") {\n rXml.push(buildImageRunXml(token.image));\n continue;\n }\n const text = token.text;\n if (!text) continue;\n if (!text.trim() && !shouldKeepWhitespaceOnlyRun(text)) continue;\n rXml.push(buildRunXml(token.style, text));\n }\n\n if (!rXml.length) return \"\";\n return `<w:p>${pPrXml}${rXml.join(\"\")}</w:p>`;\n}\n\nconst PAGE_BREAK_XML = '<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>';\n\n/**\n * 生成一个“间距占位段落”,用于模拟 HTML 元素 margin(例如 tableWrapper 的上下留白)。\n */\nfunction buildSpacerParagraphXml(afterTwips: number): string {\n const after = Math.max(0, Math.round(afterTwips));\n if (!after) return \"\";\n return `<w:p><w:pPr><w:spacing w:before=\"0\" w:after=\"${after}\" w:line=\"1\" w:lineRule=\"exact\"/></w:pPr><w:r><w:rPr><w:sz w:val=\"1\"/><w:szCs w:val=\"1\"/></w:rPr><w:t></w:t></w:r></w:p>`;\n}\n\nfunction isExplicitPageBreak(node: HtmlNode): boolean {\n if (node.type !== \"tag\") return false;\n const tag = node.name?.toLowerCase();\n const css = parseStyleAttribute(node.attribs?.style);\n const cls = node.attribs?.class ?? \"\";\n const classList = cls ? cls.split(/\\s+/) : [];\n\n if (tag === \"hr\" && classList.includes(\"page-break\")) return true;\n if (classList.includes(\"page-break\")) return true;\n if (classList.includes(\"umo-page-break\")) return true;\n if (node.attribs?.[\"data-page-break\"] === \"true\") return true;\n\n const after = css[\"page-break-after\"]?.toLowerCase() ?? css[\"break-after\"]?.toLowerCase();\n const before = css[\"page-break-before\"]?.toLowerCase() ?? css[\"break-before\"]?.toLowerCase();\n if (after?.includes(\"always\") || before?.includes(\"always\")) return true;\n\n return false;\n}\n\nfunction buildHeadingBaseStyle(level: number): TextStyle {\n const size = level === 1 ? 44 : level === 2 ? 32 : level === 3 ? 28 : level === 4 ? 24 : 22;\n return { bold: true, fontSizeHalfPoints: size };\n}\n\nfunction buildListBlocks(\n listNode: HtmlNode,\n ordered: boolean,\n level: number,\n result: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string[] {\n const liNodes = (listNode.children ?? []).filter(\n (c) => c.type === \"tag\" && c.name?.toLowerCase() === \"li\",\n );\n if (!liNodes.length) return [];\n\n const out: string[] = [];\n const numId = ordered ? 2 : 1;\n const ilvl = Math.max(0, Math.min(8, Math.floor(level)));\n const leftTwips = 720 * (ilvl + 1);\n const hangingTwips = 360;\n\n for (const li of liNodes) {\n const nestedLists: HtmlNode[] = [];\n const baseStyle: TextStyle = styleFromElement(li);\n const runs: RunToken[] = [];\n for (const c of li.children ?? []) {\n if (c.type === \"tag\") {\n const tag = c.name?.toLowerCase();\n if (tag === \"ul\" || tag === \"ol\") {\n nestedLists.push(c);\n continue;\n }\n }\n collectInlineRuns(c, baseStyle, runs, result);\n }\n\n const rXml: string[] = [];\n for (const token of runs) {\n if (token.kind === \"br\") {\n rXml.push(\"<w:r><w:br/></w:r>\");\n continue;\n }\n if (token.kind === \"image\") {\n rXml.push(buildImageRunXml(token.image));\n continue;\n }\n const text = token.text;\n if (!text) continue;\n if (!text.trim() && !shouldKeepWhitespaceOnlyRun(text)) continue;\n rXml.push(buildRunXml(token.style, text));\n }\n\n if (rXml.length) {\n const baseFontHalfPoints = inferFirstFontSizeHalfPoints(li) ?? ctx?.defaultBaseFontHalfPoints ?? 28;\n const pPrXml = buildParagraphPrXml(\n li,\n baseFontHalfPoints,\n { leftTwips, hangingTwips },\n undefined,\n ctx?.defaultBodyCss,\n );\n const numPrXml = `<w:numPr><w:ilvl w:val=\"${ilvl}\"/><w:numId w:val=\"${numId}\"/></w:numPr>`;\n const mergedPPrXml = pPrXml\n ? pPrXml.replace(\"<w:pPr>\", `<w:pPr>${numPrXml}`)\n : `<w:pPr>${numPrXml}<w:ind w:left=\"${leftTwips}\" w:hanging=\"${hangingTwips}\"/></w:pPr>`;\n out.push(`<w:p>${mergedPPrXml}${rXml.join(\"\")}</w:p>`);\n }\n\n for (const nested of nestedLists) {\n const nestedOrdered = nested.name?.toLowerCase() === \"ol\";\n out.push(...buildListBlocks(nested, nestedOrdered, ilvl + 1, result, ctx));\n }\n }\n\n return out;\n}\n\nfunction parseCellWidthTwips(node: HtmlNode): number | undefined {\n const css = parseStyleAttribute(node.attribs?.style);\n const width = parseCssLengthToTwips(css.width, 28);\n if (typeof width !== \"number\" || width <= 0) return undefined;\n return width;\n}\n\nfunction estimateTextWidthTwips(text: string, baseFontHalfPoints: number): number {\n const basePt = baseFontHalfPoints / 2;\n const cjkRegex = /[\\u3400-\\u4dbf\\u4e00-\\u9fff\\u3000-\\u303f\\uff00-\\uffef]/;\n let cjk = 0;\n let latin = 0;\n let spaces = 0;\n for (const ch of text) {\n if (ch === \" \" || ch === \"\\t\") {\n spaces++;\n continue;\n }\n if (cjkRegex.test(ch)) {\n cjk++;\n continue;\n }\n latin++;\n }\n const cjkTwips = Math.round(basePt * 20);\n const latinTwips = Math.round(basePt * 11);\n const spaceTwips = Math.round(basePt * 6);\n return cjk * cjkTwips + latin * latinTwips + spaces * spaceTwips;\n}\n\ntype WordBorder = { val: string; sz: number; colorHex?: string };\n\nfunction parseBorderShorthand(value: string | undefined, baseFontHalfPoints: number): WordBorder | undefined {\n if (!value) return undefined;\n const raw = value.trim().toLowerCase();\n if (!raw) return undefined;\n if (raw === \"none\" || raw === \"0\") return { val: \"nil\", sz: 0 };\n\n const tokens = raw.split(/\\s+/).filter(Boolean);\n if (!tokens.length) return undefined;\n\n const css = Object.fromEntries(tokens.map((t, i) => [`${i}`, t]));\n const widthToken = Object.values(css).find((t) => /^(?:\\d+(?:\\.\\d+)?)(?:px|pt)?$/.test(t));\n const styleToken = Object.values(css).find((t) =>\n [\"none\", \"solid\", \"dashed\", \"dotted\", \"double\", \"hidden\"].includes(t),\n );\n const colorToken = Object.values(css).find((t) => t.startsWith(\"#\") || t.startsWith(\"rgb(\"));\n\n const widthTwips = parseCssLengthToTwips(widthToken, baseFontHalfPoints);\n const sz = (() => {\n if (typeof widthTwips !== \"number\") return 4;\n if (widthTwips <= 0) return 0;\n return Math.max(2, Math.round(widthTwips * 0.4));\n })();\n\n const val = (() => {\n if (!styleToken) return \"single\";\n if (styleToken === \"none\" || styleToken === \"hidden\") return \"nil\";\n if (styleToken === \"solid\") return \"single\";\n if (styleToken === \"dashed\") return \"dashed\";\n if (styleToken === \"dotted\") return \"dotted\";\n if (styleToken === \"double\") return \"double\";\n return \"single\";\n })();\n\n const colorHex = parseCssColorToHex(colorToken);\n return { val, sz, colorHex };\n}\n\nfunction buildBorderTag(tag: string, border: WordBorder | undefined, fallbackColorHex: string): string {\n const b = border ?? { val: \"single\", sz: 4, colorHex: fallbackColorHex };\n const color = (b.colorHex ?? fallbackColorHex).toUpperCase();\n return `<w:${tag} w:val=\"${b.val}\" w:sz=\"${b.sz}\" w:space=\"0\" w:color=\"${color}\"/>`;\n}\n\nfunction injectTableCellParagraphSpacing(pXml: string): string {\n if (!pXml.includes(\"<w:p\")) return pXml;\n if (!pXml.includes(\"<w:p>\")) return pXml;\n const spacingXml = '<w:spacing w:before=\"0\" w:after=\"0\" w:line=\"360\" w:lineRule=\"auto\"/><w:wordWrap w:val=\"1\"/>';\n if (pXml.includes(\"<w:pPr>\")) {\n if (pXml.includes(\"<w:spacing \")) return pXml;\n return pXml.replace(\"<w:pPr>\", `<w:pPr>${spacingXml}`);\n }\n return pXml.replace(\"<w:p>\", `<w:p><w:pPr>${spacingXml}</w:pPr>`);\n}\n\nfunction buildTableCellBlocksXml(\n cell: HtmlNode,\n baseStyle: TextStyle,\n result: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string {\n const children = cell.children ?? [];\n const hasBlocks = children.some((c) => {\n if (c.type !== \"tag\") return false;\n const tag = c.name?.toLowerCase();\n return tag === \"p\" || tag === \"ul\" || tag === \"ol\" || tag === \"img\" || tag === \"canvas\" || /^h[1-6]$/.test(tag ?? \"\");\n });\n\n const out: string[] = [];\n if (!hasBlocks) {\n const p = buildParagraphXmlFromContainer(cell, baseStyle, undefined, undefined, result, ctx);\n if (p) out.push(p);\n return out.length ? out.map(injectTableCellParagraphSpacing).join(\"\") : \"<w:p/>\";\n }\n\n for (const c of children) {\n if (c.type === \"tag\") {\n const tag = c.name?.toLowerCase();\n if (tag === \"p\") {\n const p = buildParagraphXmlFromContainer(c, baseStyle, undefined, undefined, result, ctx);\n if (p) out.push(p);\n continue;\n }\n if (tag && /^h[1-6]$/.test(tag)) {\n const level = Number(tag.slice(1));\n const p = buildParagraphXmlFromContainer(c, baseStyle, undefined, `Heading${level}`, result, ctx);\n if (p) out.push(p);\n continue;\n }\n if (tag === \"ul\" || tag === \"ol\") {\n out.push(...buildListBlocks(c, tag === \"ol\", 0, result, ctx));\n continue;\n }\n if (tag === \"img\" || tag === \"canvas\") {\n const p = buildParagraphXmlFromSingleInlineNode(c, baseStyle, result);\n if (p) out.push(p);\n continue;\n }\n }\n }\n\n if (!out.length) return \"<w:p/>\";\n return out.map(injectTableCellParagraphSpacing).join(\"\");\n}\n\nfunction buildTableXml(tableNode: HtmlNode, result: HtmlToWordResult, ctx?: HtmlToWordContext): string {\n const rows: HtmlNode[] = [];\n const stack: HtmlNode[] = [...(tableNode.children ?? [])];\n while (stack.length) {\n const n = stack.shift() as HtmlNode;\n if (n.type === \"tag\" && n.name?.toLowerCase() === \"tr\") rows.push(n);\n if (n.children?.length) stack.unshift(...n.children);\n }\n\n const rowCells = rows.map((tr) =>\n (tr.children ?? []).filter((c) => c.type === \"tag\" && (c.name === \"td\" || c.name === \"th\")),\n );\n const colCount = Math.max(0, ...rowCells.map((cells) => cells.length));\n const maxTableWidthTwips = 9360;\n\n // Parse colgroup/col widths if present\n const colGroup = (tableNode.children ?? []).find((c) => c.type === \"tag\" && c.name === \"colgroup\");\n const colWidthsFromGroup: (number | undefined)[] = [];\n if (colGroup) {\n const cols = (colGroup.children ?? []).filter((c) => c.type === \"tag\" && c.name === \"col\");\n for (const col of cols) {\n const css = parseStyleAttribute(col.attribs?.style);\n // Check width, then min-width\n const w = parseCssLengthToTwips(css.width ?? css[\"min-width\"], 28);\n colWidthsFromGroup.push(w);\n }\n }\n\n const estimatedColWidths = new Array(colCount).fill(0).map((_, i) => {\n let explicit: number | undefined = colWidthsFromGroup[i];\n let estimated = 0;\n for (const cells of rowCells) {\n const cell = cells[i] as HtmlNode | undefined;\n if (!cell) continue;\n const w = parseCellWidthTwips(cell);\n if (typeof w === \"number\") explicit = explicit ?? w;\n const text = getTextContent(cell).replace(/\\s+/g, \" \").trim();\n if (!text) continue;\n const baseFontHalfPoints = inferFirstFontSizeHalfPoints(cell) ?? 28;\n const wTwips = estimateTextWidthTwips(text, baseFontHalfPoints) + 240;\n estimated = Math.max(estimated, wTwips);\n }\n const base =\n typeof explicit === \"number\"\n ? Math.max(explicit, estimated)\n : estimated || Math.round(maxTableWidthTwips / Math.max(1, colCount));\n \n return Math.max(720, Math.min(6000, Math.round(base)));\n });\n\n const normalizedColWidths = (() => {\n const sum = estimatedColWidths.reduce((a, b) => a + b, 0);\n if (!sum) return estimatedColWidths;\n if (sum <= maxTableWidthTwips) return estimatedColWidths;\n const scaled = estimatedColWidths.map((w) =>\n Math.max(720, Math.floor((w * maxTableWidthTwips) / sum)),\n );\n const scaledSum = scaled.reduce((a, b) => a + b, 0);\n const diff = maxTableWidthTwips - scaledSum;\n if (diff !== 0 && scaled.length) scaled[scaled.length - 1] = Math.max(720, scaled[scaled.length - 1] + diff);\n return scaled;\n })();\n\n const tblGrid = `<w:tblGrid>${normalizedColWidths.map((w) => `<w:gridCol w:w=\"${w}\"/>`).join(\"\")}</w:tblGrid>`;\n\n const rowXml: string[] = [];\n for (let rowIdx = 0; rowIdx < rows.length; rowIdx++) {\n const tr = rows[rowIdx] as HtmlNode;\n const cells = rowCells[rowIdx] ?? [];\n\n const cellXml: string[] = [];\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i] as HtmlNode;\n const isHeader = cell.name === \"th\";\n const baseStyle: TextStyle = isHeader ? { bold: true } : {};\n const paragraphs = buildTableCellBlocksXml(cell, baseStyle, result, ctx);\n const css = parseStyleAttribute(cell.attribs?.style);\n const widthTwips = parseCellWidthTwips(cell) ?? normalizedColWidths[i];\n const tcW =\n typeof widthTwips === \"number\"\n ? `<w:tcW w:w=\"${widthTwips}\" w:type=\"dxa\"/>`\n : `<w:tcW w:w=\"0\" w:type=\"auto\"/>`;\n const vAlign = (() => {\n const v = css[\"vertical-align\"]?.trim().toLowerCase();\n if (!v) return \"\";\n if (v === \"middle\" || v === \"center\") return '<w:vAlign w:val=\"center\"/>';\n if (v === \"bottom\") return '<w:vAlign w:val=\"bottom\"/>';\n if (v === \"top\") return '<w:vAlign w:val=\"top\"/>';\n return \"\";\n })();\n const shd = (() => {\n const hex = parseCssColorToHex(css[\"background-color\"]);\n if (!hex) return \"\";\n return `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${hex}\"/>`;\n })();\n const noWrap = (() => {\n const ws = css[\"white-space\"]?.trim().toLowerCase();\n if (ws?.includes(\"nowrap\")) return \"<w:noWrap/>\";\n return \"\";\n })();\n const cellBorder = (() => {\n const bAll = parseBorderShorthand(css.border, 28);\n const bTop = parseBorderShorthand(css[\"border-top\"] ?? css.border, 28);\n const bLeft = parseBorderShorthand(css[\"border-left\"] ?? css.border, 28);\n const bBottom = parseBorderShorthand(css[\"border-bottom\"] ?? css.border, 28);\n const bRight = parseBorderShorthand(css[\"border-right\"] ?? css.border, 28);\n const any =\n bAll || css.border || css[\"border-top\"] || css[\"border-left\"] || css[\"border-bottom\"] || css[\"border-right\"];\n if (!any) return \"\";\n const fallback = bAll?.colorHex ?? \"D9D9D9\";\n return `<w:tcBorders>${buildBorderTag(\"top\", bTop, fallback)}${buildBorderTag(\n \"left\",\n bLeft,\n fallback,\n )}${buildBorderTag(\"bottom\", bBottom, fallback)}${buildBorderTag(\n \"right\",\n bRight,\n fallback,\n )}</w:tcBorders>`;\n })();\n cellXml.push(`<w:tc><w:tcPr>${tcW}${vAlign}${shd}${noWrap}${cellBorder}</w:tcPr>${paragraphs}</w:tc>`);\n }\n if (cellXml.length) rowXml.push(`<w:tr>${cellXml.join(\"\")}</w:tr>`);\n }\n\n const tblCss = parseStyleAttribute(tableNode.attribs?.style);\n const tblAlign = (() => {\n const ml = tblCss[\"margin-left\"]?.trim().toLowerCase();\n const mr = tblCss[\"margin-right\"]?.trim().toLowerCase();\n const m = tblCss.margin?.trim().toLowerCase();\n if ((ml === \"auto\" && mr === \"auto\") || (m?.includes(\"auto\") ?? false)) return '<w:tblJc w:val=\"center\"/>';\n const ta = tblCss[\"text-align\"]?.trim().toLowerCase();\n if (ta === \"center\") return '<w:tblJc w:val=\"center\"/>';\n if (ta === \"right\") return '<w:tblJc w:val=\"right\"/>';\n return \"\";\n })();\n const tblBorder = (() => {\n const border = parseBorderShorthand(tblCss.border, 28);\n if (tblCss.border) {\n const fallback = border?.colorHex ?? \"D9D9D9\";\n return `<w:tblBorders>${buildBorderTag(\"top\", border, fallback)}${buildBorderTag(\n \"left\",\n border,\n fallback,\n )}${buildBorderTag(\"bottom\", border, fallback)}${buildBorderTag(\n \"right\",\n border,\n fallback,\n )}${buildBorderTag(\"insideH\", border, fallback)}${buildBorderTag(\n \"insideV\",\n border,\n fallback,\n )}</w:tblBorders>`;\n }\n const fallback = \"D9D9D9\";\n return `<w:tblBorders>${buildBorderTag(\"top\", undefined, fallback)}${buildBorderTag(\n \"left\",\n undefined,\n fallback,\n )}${buildBorderTag(\"bottom\", undefined, fallback)}${buildBorderTag(\n \"right\",\n undefined,\n fallback,\n )}${buildBorderTag(\"insideH\", undefined, fallback)}${buildBorderTag(\"insideV\", undefined, fallback)}</w:tblBorders>`;\n })();\n const tblW = `<w:tblW w:w=\"${normalizedColWidths.reduce((a, b) => a + b, 0)}\" w:type=\"dxa\"/>`;\n const tblPr = `<w:tblPr>${tblW}<w:tblLayout w:type=\"fixed\"/>${tblAlign}${tblBorder}</w:tblPr>`;\n return `<w:tbl>${tblPr}${tblGrid}${rowXml.join(\"\")}</w:tbl>`;\n}\n\nfunction buildParagraphXmlFromSingleInlineNode(\n node: HtmlNode,\n baseStyle: TextStyle,\n result: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string {\n const wrapper: HtmlNode = {\n type: \"tag\",\n name: \"p\",\n attribs: { style: \"text-align: center;\" },\n children: [node],\n };\n return buildParagraphXmlFromContainer(wrapper, baseStyle, undefined, undefined, result, ctx);\n}\n\nfunction isRecognizedBlockTag(tag: string | undefined): boolean {\n if (!tag) return false;\n if (tag === \"p\") return true;\n if (tag === \"table\") return true;\n if (tag === \"ul\" || tag === \"ol\") return true;\n if (tag === \"img\" || tag === \"canvas\") return true;\n if (/^h[1-6]$/.test(tag)) return true;\n if (tag === \"pre\") return true;\n return false;\n}\n\nfunction subtreeHasRecognizedBlocks(root: HtmlNode): boolean {\n const stack: HtmlNode[] = [root];\n while (stack.length) {\n const cur = stack.pop() as HtmlNode;\n if (cur.type === \"tag\") {\n if (isExplicitPageBreak(cur)) return true;\n if (isRecognizedBlockTag(cur.name?.toLowerCase())) return true;\n }\n const children = cur.children ?? [];\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push(children[i] as HtmlNode);\n }\n }\n return false;\n}\n\nfunction collectDivBlocks(node: HtmlNode, out: string[], result: HtmlToWordResult, ctx: HtmlToWordContext): void {\n const parentStyle = node.attribs?.style;\n const inlineBuffer: HtmlNode[] = [];\n\n const flushInline = () => {\n const wrapper: HtmlNode = {\n type: \"tag\",\n name: \"p\",\n attribs: { style: parentStyle },\n children: inlineBuffer.splice(0),\n };\n const pXml = buildParagraphXmlFromContainer(wrapper, {}, undefined, undefined, result, ctx);\n if (pXml) out.push(pXml);\n };\n\n const children = node.children ?? [];\n for (const child of children) {\n if (child.type === \"tag\") {\n const tag = child.name?.toLowerCase();\n if (isExplicitPageBreak(child)) {\n if (inlineBuffer.length) flushInline();\n out.push(PAGE_BREAK_XML);\n continue;\n }\n if (isRecognizedBlockTag(tag)) {\n if (inlineBuffer.length) flushInline();\n collectBodyBlocks(child, out, result, ctx);\n continue;\n }\n if (subtreeHasRecognizedBlocks(child)) {\n if (inlineBuffer.length) flushInline();\n collectBodyBlocks(child, out, result, ctx);\n continue;\n }\n if (tag === \"div\") {\n if (inlineBuffer.length) flushInline();\n const mergedStyle = [parentStyle, child.attribs?.style].filter(Boolean).join(\";\");\n const wrapper: HtmlNode = {\n type: \"tag\",\n name: \"p\",\n attribs: { style: mergedStyle || undefined },\n children: child.children ?? [],\n };\n const pXml = buildParagraphXmlFromContainer(wrapper, {}, undefined, undefined, result, ctx);\n if (pXml) out.push(pXml);\n continue;\n }\n }\n inlineBuffer.push(child);\n }\n\n if (inlineBuffer.length) flushInline();\n}\n\nfunction collectBodyBlocks(node: HtmlNode, out: string[], result: HtmlToWordResult, ctx: HtmlToWordContext): void {\n if (isSkippableSubtree(node)) return;\n\n if (node.type === \"tag\") {\n const tag = node.name?.toLowerCase();\n\n if (isExplicitPageBreak(node)) {\n out.push(PAGE_BREAK_XML);\n return;\n }\n\n if (tag === \"p\") {\n const pXml = buildParagraphXmlFromContainer(node, {}, undefined, undefined, result, ctx);\n if (pXml) out.push(pXml);\n return;\n }\n\n if (tag === \"img\" || tag === \"canvas\") {\n const pXml = buildParagraphXmlFromSingleInlineNode(node, {}, result, ctx);\n if (pXml) out.push(pXml);\n return;\n }\n\n if (tag && /^h[1-6]$/.test(tag)) {\n const level = Number(tag.slice(1));\n const hXml = buildParagraphXmlFromContainer(node, {}, undefined, `Heading${level}`, result, ctx);\n if (hXml) out.push(hXml);\n return;\n }\n\n if (tag === \"table\") {\n const tblXml = buildTableXml(node, result, ctx);\n if (tblXml) out.push(tblXml);\n return;\n }\n\n if (tag === \"ul\" || tag === \"ol\") {\n out.push(...buildListBlocks(node, tag === \"ol\", 0, result, ctx));\n return;\n }\n\n if (tag === \"div\") {\n if (hasClass(node, \"tableWrapper\")) {\n const display = ctx.tableWrapperCss.display?.trim().toLowerCase();\n if (display !== \"contents\") {\n const baseFontHalfPoints = inferFirstFontSizeHalfPoints(node) ?? ctx.defaultBaseFontHalfPoints;\n const { beforeTwips, afterTwips } = extractMarginBeforeAfterTwips(ctx.tableWrapperCss, baseFontHalfPoints);\n const beforeXml =\n typeof beforeTwips === \"number\" && beforeTwips > 0 ? buildSpacerParagraphXml(beforeTwips) : \"\";\n const afterXml =\n typeof afterTwips === \"number\" && afterTwips > 0 ? buildSpacerParagraphXml(afterTwips) : \"\";\n if (beforeXml) out.push(beforeXml);\n collectDivBlocks(node, out, result, ctx);\n if (afterXml) out.push(afterXml);\n return;\n }\n collectDivBlocks(node, out, result, ctx);\n return;\n }\n collectDivBlocks(node, out, result, ctx);\n return;\n }\n }\n\n for (const c of node.children ?? []) collectBodyBlocks(c, out, result, ctx);\n}\n\nexport function textToWordBodyXml(text: string): string {\n const normalized = text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n if (!normalized.trim()) {\n throw new Error(\"Text is empty.\");\n }\n\n const lines = normalized.split(\"\\n\");\n const out: string[] = [];\n for (const line of lines) {\n if (!line) {\n out.push(\"<w:p/>\");\n continue;\n }\n out.push(`<w:p>${buildRunXml({}, line)}</w:p>`);\n }\n return out.join(\"\");\n}\n\nfunction htmlToWordBody(html: string): HtmlToWordResult {\n const normalized = html.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n const bodyCss = parseCssRuleFromHtmlFirst(normalized, \"body\");\n const pCss = parseCssRuleFromHtmlFirst(normalized, \"p\");\n const defaultBaseFontHalfPoints = parseFontSizeToHalfPoints(bodyCss[\"font-size\"]) ?? 28;\n const defaultBodyCss: Record<string, string> = {};\n if (bodyCss[\"line-height\"]) defaultBodyCss[\"line-height\"] = bodyCss[\"line-height\"];\n\n const defaultPCss: Record<string, string> = {};\n if (pCss[\"line-height\"]) defaultPCss[\"line-height\"] = pCss[\"line-height\"];\n if (pCss[\"margin-top\"]) defaultPCss[\"margin-top\"] = pCss[\"margin-top\"];\n if (pCss[\"margin-bottom\"]) defaultPCss[\"margin-bottom\"] = pCss[\"margin-bottom\"];\n if (pCss[\"text-align\"]) defaultPCss[\"text-align\"] = pCss[\"text-align\"];\n\n const tableWrapperCss = {\n ...parseCssRuleFromHtml(normalized, \".tableWrapper\"),\n ...parseCssRuleFromHtml(normalized, \".tiptap .tableWrapper\"),\n };\n\n const doc = parseDocument(normalized, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n }) as unknown as HtmlNode;\n\n const result: HtmlToWordResult = { bodyXml: \"\", images: [] };\n const out: string[] = [];\n const ctx: HtmlToWordContext = { defaultBaseFontHalfPoints, defaultBodyCss, defaultPCss, tableWrapperCss };\n collectBodyBlocks(doc, out, result, ctx);\n result.bodyXml = out.join(\"\");\n return result;\n}\n\n/**\n * 把 HTML 字符串转换成 WordprocessingML 的 body 片段(由 <w:p> / <w:tbl> 等组成)。\n * 说明:\n * - 这个函数只生成 body 内容,不生成完整的 <w:document> 包装\n * - 支持:p/span/strong/br、h1~h6、ul/ol/li、table/tr/td/th、基础分页标记\n * - 不支持:canvas 图表、复杂 CSS、HTML 图片(需要额外提供图片二进制)\n */\nexport function htmlToWordBodyXml(html: string): string {\n const { bodyXml } = htmlToWordBody(html);\n if (!bodyXml) {\n const text = getTextContent(\n parseDocument(html, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n }) as unknown as HtmlNode,\n );\n return textToWordBodyXml(text);\n }\n return bodyXml;\n}\n\nexport function htmlToWordBodyWithAssets(html: string): HtmlToWordResult {\n const result = htmlToWordBody(html);\n if (!result.bodyXml) {\n const text = getTextContent(\n parseDocument(html, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n }) as unknown as HtmlNode,\n );\n return { bodyXml: textToWordBodyXml(text), images: [] };\n }\n return result;\n}\n","export type XmlToDocxInputKind = \"auto\" | \"document\" | \"body\";\nexport type HtmlToDocxInputFormat = \"auto\" | \"html\" | \"text\";\n\n/**\n * XML→DOCX 输入类型。\n * - auto: 自动判断是否为完整的 <w:document>;否则按 body 片段处理\n * - document: 你传入的是完整的 WordprocessingML document.xml(必须以 <w:document> 开头)\n * - body: 你传入的是 <w:p> 等正文片段(库会自动包一层 <w:document><w:body>)\n */\nexport interface XmlToDocxOptions {\n inputKind?: XmlToDocxInputKind;\n /**\n * 是否校验 XML 合法性。\n * - true: 发现 XML 不合法会直接抛错(推荐生产开启)\n * - false: 跳过校验(更快,但错误会在 Word 打开时才暴露)\n */\n validateXml?: boolean;\n}\n\n/**\n * HTML→DOCX 输入格式。\n * - auto: 自动判断(像 HTML 就按 HTML 解析,否则当纯文本)\n * - html: 强制当 HTML 解析\n * - text: 强制当纯文本处理(按换行拆段)\n */\nexport interface HtmlToDocxOptions {\n inputFormat?: HtmlToDocxInputFormat;\n /**\n * 是否校验最终生成的 document.xml 是否为合法 XML。\n */\n validateXml?: boolean;\n}\n\nfunction looksLikeHtml(input: string): boolean {\n const s = input.trim();\n if (!s) return false;\n if (!s.includes(\"<\") || !s.includes(\">\")) return false;\n return /<\\/?[a-zA-Z][\\s\\S]*?>/.test(s);\n}\n\n/**\n * 把 WordprocessingML XML 转成 docx(二进制 Uint8Array)。\n * 适合 Node/浏览器通用场景。\n */\nexport async function xmlToDocxUint8Array(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const { createDocxZipUint8Array } = await import(\"./lib/createDocxZip.js\");\n return createDocxZipUint8Array(xml, options);\n}\n\n/**\n * 把 WordprocessingML XML 转成 docx(Blob)。\n * 适合浏览器下载:new File([blob], 'xx.docx') 或 URL.createObjectURL(blob)。\n */\nexport async function xmlToDocxBlob(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Blob> {\n const docx = await xmlToDocxUint8Array(xml, options);\n const bytes = new Uint8Array(docx);\n return new Blob([bytes], {\n type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n });\n}\n\n/**\n * 把 WordprocessingML XML 转成 docx(Buffer)。\n * 仅在 Node 环境可用,适合直接 fs.writeFileSync('xx.docx', buffer)。\n */\nexport async function xmlToDocxBuffer(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Buffer> {\n const docx = await xmlToDocxUint8Array(xml, options);\n const BufferCtor = (globalThis as unknown as { Buffer?: typeof Buffer }).Buffer;\n if (!BufferCtor) {\n throw new Error(\"Buffer is not available. Use xmlToDocxUint8Array or xmlToDocxBlob instead.\");\n }\n return BufferCtor.from(docx);\n}\n\n/**\n * 把 HTML/纯文本字符串转成 docx(二进制 Uint8Array)。\n * - 适合前端直接传入“很长的字符串”(HTML 或纯文本)\n * - inputFormat 默认 auto:像 HTML 就按 HTML 解析,否则按纯文本解析\n */\nexport async function htmlToDocxUint8Array(\n html: string,\n options: HtmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const { htmlToWordBodyWithAssets, htmlToWordBodyXml, textToWordBodyXml } = await import(\n \"./lib/htmlToWordBodyXml.js\"\n );\n const { createDocxZipWithAssetsUint8Array } = await import(\"./lib/createDocxZip.js\");\n const format = options.inputFormat ?? \"auto\";\n const isHtml =\n format === \"html\" ? true : format === \"text\" ? false : looksLikeHtml(html) ? true : false;\n\n if (!isHtml) {\n const bodyXml = textToWordBodyXml(html);\n return xmlToDocxUint8Array(bodyXml, {\n inputKind: \"body\",\n validateXml: options.validateXml,\n });\n }\n\n const { bodyXml, images } = htmlToWordBodyWithAssets(html);\n if (!images.length) {\n return xmlToDocxUint8Array(bodyXml || htmlToWordBodyXml(html), {\n inputKind: \"body\",\n validateXml: options.validateXml,\n });\n }\n\n const assets = images.map((img) => ({\n relationshipId: img.relationshipId,\n relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n target: img.target,\n data: img.data,\n contentType: img.contentType,\n }));\n\n return createDocxZipWithAssetsUint8Array(\n bodyXml,\n { inputKind: \"body\", validateXml: options.validateXml },\n assets,\n );\n}\n\n/**\n * 把 HTML/纯文本字符串转成 docx(Blob)。\n * 适合浏览器下载。\n */\nexport async function htmlToDocxBlob(\n html: string,\n options: HtmlToDocxOptions = {},\n): Promise<Blob> {\n const docx = await htmlToDocxUint8Array(html, options);\n const bytes = new Uint8Array(docx);\n return new Blob([bytes], {\n type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n });\n}\n\n/**\n * 把 HTML/纯文本字符串转成 docx(Buffer)。\n * 仅在 Node 环境可用。\n */\nexport async function htmlToDocxBuffer(\n html: string,\n options: HtmlToDocxOptions = {},\n): Promise<Buffer> {\n const docx = await htmlToDocxUint8Array(html, options);\n const BufferCtor = (globalThis as unknown as { Buffer?: typeof Buffer }).Buffer;\n if (!BufferCtor) {\n throw new Error(\"Buffer is not available. Use htmlToDocxUint8Array or htmlToDocxBlob instead.\");\n }\n return BufferCtor.from(docx);\n}\n"],"mappings":"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","names":["JSZip","children","fallback","createDocxZipUint8Array","htmlToWordBodyWithAssets","htmlToWordBodyXml","textToWordBodyXml","createDocxZipWithAssetsUint8Array","bodyXml"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/normalizeDocumentXml.ts","../src/lib/validateXml.ts","../src/lib/createDocxZip.ts","../src/lib/htmlToWordBodyXml.ts","../src/index.ts"],"sourcesContent":["import type { DocxPageSetupOptions, XmlToDocxInputKind } from \"../index.js\";\n\nconst WORD_MAIN_NS = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\";\n\nfunction hasWordDocumentRoot(xml: string): boolean {\n return /<w:document[\\s>]/.test(xml);\n}\n\nfunction ensureXmlDeclaration(xml: string): string {\n if (/^\\s*<\\?xml\\b/.test(xml)) return xml;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${xml}`;\n}\n\nfunction resolvePageSetupTwips(page: DocxPageSetupOptions | undefined): {\n pageWidthTwips: number;\n pageHeightTwips: number;\n margins: { top: number; right: number; bottom: number; left: number; header: number; footer: number; gutter: number };\n} {\n const size = page?.size;\n const defaultSize = { widthTwips: 11906, heightTwips: 16838 };\n const resolvedSize =\n typeof size === \"object\" && size && \"widthTwips\" in size && \"heightTwips\" in size\n ? { widthTwips: Math.round(size.widthTwips), heightTwips: Math.round(size.heightTwips) }\n : size === \"Letter\"\n ? { widthTwips: 12240, heightTwips: 15840 }\n : size === \"Letter_Landscape\"\n ? { widthTwips: 15840, heightTwips: 12240 }\n : size === \"A4_Landscape\"\n ? { widthTwips: 16838, heightTwips: 11906 }\n : defaultSize;\n\n const defaultMargins = {\n top: 1440,\n right: 1440,\n bottom: 1440,\n left: 1440,\n header: 708,\n footer: 708,\n gutter: 0,\n };\n const m = page?.marginTwips;\n const margins =\n typeof m === \"number\"\n ? { ...defaultMargins, top: m, right: m, bottom: m, left: m }\n : m\n ? {\n ...defaultMargins,\n top: m.top ?? defaultMargins.top,\n right: m.right ?? defaultMargins.right,\n bottom: m.bottom ?? defaultMargins.bottom,\n left: m.left ?? defaultMargins.left,\n header: m.header ?? defaultMargins.header,\n footer: m.footer ?? defaultMargins.footer,\n gutter: m.gutter ?? defaultMargins.gutter,\n }\n : defaultMargins;\n\n return {\n pageWidthTwips: Math.max(1, Math.round(resolvedSize.widthTwips)),\n pageHeightTwips: Math.max(1, Math.round(resolvedSize.heightTwips)),\n margins,\n };\n}\n\nfunction wrapBodyXml(bodyXml: string, page: DocxPageSetupOptions | undefined): string {\n const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n>\n <w:body>\n${bodyXml}\n <w:sectPr>\n <w:headerReference w:type=\"default\" r:id=\"rId6\"/>\n <w:footerReference w:type=\"default\" r:id=\"rId7\"/>\n <w:pgSz w:w=\"${pageWidthTwips}\" w:h=\"${pageHeightTwips}\"/>\n <w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"${margins.header}\" w:footer=\"${margins.footer}\" w:gutter=\"${margins.gutter}\"/>\n <w:cols w:space=\"708\"/>\n </w:sectPr>\n </w:body>\n</w:document>\n`;\n return xml;\n}\n\nfunction ensureWordNamespace(xml: string): string {\n const hasWNamespace =\n /xmlns:w\\s*=\\s*[\"']http:\\/\\/schemas\\.openxmlformats\\.org\\/wordprocessingml\\/2006\\/main[\"']/.test(\n xml,\n );\n if (hasWNamespace) return xml;\n\n return xml.replace(\n /<w:document\\b/,\n `<w:document xmlns:w=\"${WORD_MAIN_NS}\"`,\n );\n}\n\nfunction applyPageSetupToDocumentXml(xml: string, page: DocxPageSetupOptions | undefined): string {\n if (!page) return xml;\n const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);\n const pgSzTag = `<w:pgSz w:w=\"${pageWidthTwips}\" w:h=\"${pageHeightTwips}\"/>`;\n const pgMarTag = `<w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"${margins.header}\" w:footer=\"${margins.footer}\" w:gutter=\"${margins.gutter}\"/>`;\n\n const sectPrRegex = /<w:sectPr\\b[^>]*>[\\s\\S]*?<\\/w:sectPr>/g;\n const hasSectPr = sectPrRegex.test(xml);\n if (!hasSectPr) {\n const insertAt = xml.lastIndexOf(\"</w:body>\");\n if (insertAt < 0) return xml;\n const sectPr =\n `\\n <w:sectPr>` +\n `\\n ${pgSzTag}` +\n `\\n ${pgMarTag}` +\n `\\n <w:cols w:space=\"708\"/>` +\n `\\n </w:sectPr>\\n`;\n return xml.slice(0, insertAt) + sectPr + xml.slice(insertAt);\n }\n\n return xml.replace(sectPrRegex, (sect) => {\n let out = sect;\n\n const insertTag = (tag: string) => {\n const headerFooterRegex = /<w:(?:headerReference|footerReference)\\b[^>]*\\/>/g;\n let last: RegExpExecArray | null = null;\n let m: RegExpExecArray | null;\n while ((m = headerFooterRegex.exec(out))) last = m;\n const open = out.match(/<w:sectPr\\b[^>]*>/);\n const insertPos = last ? last.index + last[0].length : open ? open[0].length : 0;\n out = out.slice(0, insertPos) + tag + out.slice(insertPos);\n };\n\n if (/<w:pgSz\\b[^>]*\\/>/.test(out)) {\n out = out.replace(/<w:pgSz\\b[^>]*\\/>/g, pgSzTag);\n } else {\n insertTag(pgSzTag);\n }\n\n if (/<w:pgMar\\b[^>]*\\/>/.test(out)) {\n out = out.replace(/<w:pgMar\\b[^>]*\\/>/g, pgMarTag);\n } else {\n insertTag(pgMarTag);\n }\n\n return out;\n });\n}\n\nexport function normalizeDocumentXml(\n xml: string,\n inputKind: XmlToDocxInputKind,\n page: DocxPageSetupOptions | undefined,\n): string {\n const trimmed = xml.trim();\n if (!trimmed) {\n throw new Error(\"XML is empty.\");\n }\n\n if (inputKind === \"document\") {\n const withDecl = ensureXmlDeclaration(trimmed);\n const withNs = ensureWordNamespace(withDecl);\n if (!hasWordDocumentRoot(withNs)) {\n throw new Error('inputKind=\"document\" requires a <w:document> root.');\n }\n return applyPageSetupToDocumentXml(withNs, page);\n }\n\n if (inputKind === \"body\") {\n return wrapBodyXml(trimmed, page);\n }\n\n if (hasWordDocumentRoot(trimmed)) {\n const withDecl = ensureXmlDeclaration(trimmed);\n return applyPageSetupToDocumentXml(ensureWordNamespace(withDecl), page);\n }\n\n return wrapBodyXml(trimmed, page);\n}\n","import { XMLValidator } from \"fast-xml-parser\";\n\nexport function validateXmlIfNeeded(xml: string, validateXml: boolean): void {\n if (!validateXml) return;\n\n const result = XMLValidator.validate(xml);\n if (result === true) return;\n\n const err = (result as { err?: { msg?: string; line?: number; col?: number } }).err;\n const msg = err?.msg ?? \"Invalid XML.\";\n const line = err?.line;\n const col = err?.col;\n\n const location =\n typeof line === \"number\" && typeof col === \"number\" ? ` (line ${line}, col ${col})` : \"\";\n throw new Error(`${msg}${location}`);\n}\n\n","import JSZip from \"jszip\";\nimport type { XmlToDocxOptions } from \"../index.js\";\nimport { normalizeDocumentXml } from \"./normalizeDocumentXml.js\";\nimport { validateXmlIfNeeded } from \"./validateXml.js\";\n\nexport type DocxAsset = {\n relationshipId: string;\n relationshipType: string;\n target: string;\n data: Uint8Array;\n contentType?: string;\n};\n\nconst STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n <w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\">\n <w:name w:val=\"Normal\"/>\n <w:qFormat/>\n <w:pPr>\n <w:spacing w:before=\"0\" w:after=\"160\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\n <w:name w:val=\"heading 1\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"0\"/>\n <w:spacing w:before=\"240\" w:after=\"120\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"44\"/>\n <w:szCs w:val=\"44\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\n <w:name w:val=\"heading 2\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"1\"/>\n <w:spacing w:before=\"200\" w:after=\"100\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"32\"/>\n <w:szCs w:val=\"32\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\n <w:name w:val=\"heading 3\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"2\"/>\n <w:spacing w:before=\"180\" w:after=\"90\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"28\"/>\n <w:szCs w:val=\"28\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\n <w:name w:val=\"heading 4\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"3\"/>\n <w:spacing w:before=\"160\" w:after=\"80\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"24\"/>\n <w:szCs w:val=\"24\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\n <w:name w:val=\"heading 5\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"4\"/>\n <w:spacing w:before=\"140\" w:after=\"70\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\n <w:name w:val=\"heading 6\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:uiPriority w:val=\"9\"/>\n <w:qFormat/>\n <w:pPr>\n <w:keepNext/>\n <w:keepLines/>\n <w:outlineLvl w:val=\"5\"/>\n <w:spacing w:before=\"120\" w:after=\"60\" w:line=\"360\" w:lineRule=\"auto\"/>\n </w:pPr>\n <w:rPr>\n <w:b/>\n <w:sz w:val=\"22\"/>\n <w:szCs w:val=\"22\"/>\n </w:rPr>\n </w:style>\n</w:styles>\n`;\n\nconst SETTINGS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:settings xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:themeFontLang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/>\n <w:defaultTabStop w:val=\"720\"/>\n <w:compat/>\n</w:settings>\n`;\n\nconst NUMBERING_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:abstractNum w:abstractNumId=\"1\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"•\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"○\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"■\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:abstractNum w:abstractNumId=\"2\">\n <w:multiLevelType w:val=\"hybridMultilevel\"/>\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.%2.%3.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Times New Roman\" w:hAnsi=\"Times New Roman\" w:eastAsia=\"FangSong_GB2312\" w:cs=\"Times New Roman\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"1\"/></w:num>\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"2\"/></w:num>\n</w:numbering>\n`;\n\nconst HEADER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:hdr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"center\"/></w:pPr>\n <w:r><w:t></w:t></w:r>\n </w:p>\n</w:hdr>\n`;\n\nconst FOOTER1_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:ftr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:p>\n <w:pPr><w:jc w:val=\"right\"/></w:pPr>\n <w:r><w:t>第 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> PAGE </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页 / 共 </w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n <w:r><w:instrText xml:space=\"preserve\"> NUMPAGES </w:instrText></w:r>\n <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n <w:r><w:t>1</w:t></w:r>\n <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n <w:r><w:t> 页</w:t></w:r>\n </w:p>\n</w:ftr>\n`;\n\nconst THEME_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\">\n <a:themeElements>\n <a:clrScheme name=\"Office\">\n <a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n <a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n <a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2>\n <a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2>\n <a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1>\n <a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2>\n <a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3>\n <a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4>\n <a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5>\n <a:accent6><a:srgbClr val=\"F79646\"/></a:accent6>\n <a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink>\n <a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink>\n </a:clrScheme>\n <a:fontScheme name=\"Office\">\n <a:majorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:majorFont>\n <a:minorFont>\n <a:latin typeface=\"Times New Roman\"/>\n <a:ea typeface=\"FangSong_GB2312\"/>\n <a:cs typeface=\"Times New Roman\"/>\n </a:minorFont>\n </a:fontScheme>\n <a:fmtScheme name=\"Office\">\n <a:fillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n <a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"/></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"/></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill>\n </a:fillStyleLst>\n <a:lnStyleLst>\n <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln>\n </a:lnStyleLst>\n <a:effectStyleLst>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n </a:effectStyleLst>\n <a:bgFillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n </a:bgFillStyleLst>\n </a:fmtScheme>\n </a:themeElements>\n <a:objectDefaults/>\n <a:extraClrSchemeLst/>\n</a:theme>\n`;\n\nconst FONT_TABLE_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:fonts xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:font w:name=\"Times New Roman\">\n <w:charset w:val=\"00\"/>\n <w:family w:val=\"roman\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n <w:font w:name=\"FangSong_GB2312\">\n <w:charset w:val=\"86\"/>\n <w:family w:val=\"auto\"/>\n <w:pitch w:val=\"variable\"/>\n </w:font>\n</w:fonts>\n`;\n\nfunction buildContentTypesXml(assets: DocxAsset[]): string {\n const defaults = new Map<string, string>();\n defaults.set(\"rels\", \"application/vnd.openxmlformats-package.relationships+xml\");\n defaults.set(\"xml\", \"application/xml\");\n\n for (const asset of assets) {\n if (!asset.contentType) continue;\n const extMatch = asset.target.match(/\\.([a-zA-Z0-9]+)$/);\n if (!extMatch) continue;\n const ext = extMatch[1].toLowerCase();\n defaults.set(ext, asset.contentType);\n }\n\n const defaultLines = [...defaults.entries()]\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([ext, ct]) => ` <Default Extension=\"${ext}\" ContentType=\"${ct}\"/>`)\n .join(\"\\n\");\n\n const overrides = [\n ' <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>',\n ' <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>',\n ' <Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/>',\n ' <Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>',\n ' <Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/>',\n ' <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>',\n ' <Override PartName=\"/word/header1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\"/>',\n ' <Override PartName=\"/word/footer1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\"/>',\n ].join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\\n${defaultLines}\\n${overrides}\\n</Types>\\n`;\n}\n\nconst ROOT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\"\n Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n Target=\"word/document.xml\"/>\n</Relationships>\n`;\n\nfunction buildDocumentRelsXml(assets: DocxAsset[]): string {\n const relLines = [\n ' <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>',\n ' <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/>',\n ' <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>',\n ' <Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\"/>',\n ' <Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>',\n ' <Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\" Target=\"header1.xml\"/>',\n ' <Relationship Id=\"rId7\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\" Target=\"footer1.xml\"/>',\n ...assets.map(\n (a) =>\n ` <Relationship Id=\"${a.relationshipId}\" Type=\"${a.relationshipType}\" Target=\"${a.target}\"/>`,\n ),\n ].join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n${relLines}\\n</Relationships>\\n`;\n}\n\nexport async function createDocxZipUint8Array(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\", options.page);\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml([]));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml([]));\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n\nexport async function createDocxZipWithAssetsUint8Array(\n xml: string,\n options: XmlToDocxOptions,\n assets: DocxAsset[],\n): Promise<Uint8Array> {\n const documentXml = normalizeDocumentXml(xml, options.inputKind ?? \"auto\", options.page);\n validateXmlIfNeeded(documentXml, options.validateXml ?? true);\n\n const zip = new JSZip();\n zip.file(\"[Content_Types].xml\", buildContentTypesXml(assets));\n\n const relsFolder = zip.folder(\"_rels\");\n relsFolder?.file(\".rels\", ROOT_RELS_XML);\n\n const wordFolder = zip.folder(\"word\");\n wordFolder?.file(\"document.xml\", documentXml);\n wordFolder?.file(\"styles.xml\", STYLES_XML);\n wordFolder?.file(\"settings.xml\", SETTINGS_XML);\n wordFolder?.file(\"fontTable.xml\", FONT_TABLE_XML);\n wordFolder?.folder(\"theme\")?.file(\"theme1.xml\", THEME_XML);\n wordFolder?.file(\"numbering.xml\", NUMBERING_XML);\n wordFolder?.file(\"header1.xml\", HEADER1_XML);\n wordFolder?.file(\"footer1.xml\", FOOTER1_XML);\n\n const wordRelsFolder = wordFolder?.folder(\"_rels\");\n wordRelsFolder?.file(\"document.xml.rels\", buildDocumentRelsXml(assets));\n\n if (assets.length) {\n for (const asset of assets) {\n const targetPath = asset.target.replace(/^\\.\\//, \"\");\n const normalized = targetPath.startsWith(\"word/\") ? targetPath.slice(\"word/\".length) : targetPath;\n wordFolder?.file(normalized, asset.data);\n }\n }\n\n return zip.generateAsync({ type: \"uint8array\" });\n}\n","import { parseDocument } from \"htmlparser2\";\n\ntype HtmlNode = {\n type?: string;\n name?: string;\n data?: string;\n attribs?: Record<string, string | undefined>;\n children?: HtmlNode[];\n};\n\ntype TextStyle = {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n colorHex?: string;\n fontFamily?: string;\n fontSizeHalfPoints?: number;\n};\n\ntype HtmlToWordContext = {\n defaultBaseFontHalfPoints: number;\n defaultBodyCss: Record<string, string>;\n defaultPCss: Record<string, string>;\n tableWrapperCss: Record<string, string>;\n maxTableWidthTwips: number;\n maxImageWidthPx: number;\n maxImageHeightPx: number;\n};\n\nexport type HtmlToWordLayout = {\n maxTableWidthTwips?: number;\n maxImageWidthPx?: number;\n maxImageHeightPx?: number;\n};\n\nfunction escapeXmlText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction shouldPreserveSpace(text: string): boolean {\n if (!text) return false;\n return /^\\s/.test(text) || /\\s$/.test(text) || /\\s{2,}/.test(text);\n}\n\nfunction shouldKeepWhitespaceOnlyRun(text: string): boolean {\n if (!text) return false;\n if (/\\r|\\n/.test(text)) return false;\n if (text.includes(\"\\u00a0\")) return true;\n return /\\s{2,}/.test(text);\n}\n\nfunction parseStyleAttribute(style: string | undefined): Record<string, string> {\n if (!style) return {};\n const normalized = style.replace(/\\r/g, \"\\n\");\n const parts = normalized.split(\";\");\n const entries: [string, string][] = [];\n for (const part of parts) {\n const idx = part.indexOf(\":\");\n if (idx <= 0) continue;\n const key = part.slice(0, idx).trim().toLowerCase();\n const val = part.slice(idx + 1).trim();\n if (!key || !val) continue;\n entries.push([key, val]);\n }\n return Object.fromEntries(entries);\n}\n\nfunction parseRgbToHex(value: string): string | undefined {\n const m = value\n .trim()\n .toLowerCase()\n .match(/^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/);\n if (!m) return undefined;\n const nums = [Number(m[1]), Number(m[2]), Number(m[3])];\n if (nums.some((n) => Number.isNaN(n) || n < 0 || n > 255)) return undefined;\n return nums.map((n) => n.toString(16).padStart(2, \"0\")).join(\"\").toUpperCase();\n}\n\nfunction parseCssColorToHex(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const v = value.trim();\n const hex = v.match(/^#([0-9a-fA-F]{6})$/)?.[1];\n if (hex) return hex.toUpperCase();\n return parseRgbToHex(v);\n}\n\nfunction extractBackgroundFillHex(css: Record<string, string>): string | undefined {\n const raw = (css[\"background-color\"] ?? css.background)?.trim();\n if (!raw) return undefined;\n const direct = parseCssColorToHex(raw);\n if (direct) return direct;\n const hex = raw.match(/#([0-9a-fA-F]{6})/)?.[0];\n if (hex) return parseCssColorToHex(hex);\n const rgb = raw.match(/rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)/)?.[0];\n if (rgb) return parseCssColorToHex(rgb);\n return undefined;\n}\n\nfunction parseFontSizeToHalfPoints(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n const pt = v.match(/^(\\d+(?:\\.\\d+)?)pt$/);\n if (pt) return Math.max(1, Math.round(Number(pt[1]) * 2));\n const px = v.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (px) {\n const ptValue = (Number(px[1]) * 72) / 96;\n return Math.max(1, Math.round(ptValue * 2));\n }\n return undefined;\n}\n\nfunction normalizeFontFamily(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const first = value.split(\",\")[0]?.trim();\n if (!first) return undefined;\n return first.replace(/^[\"']|[\"']$/g, \"\");\n}\n\n/**\n * 判断某条 CSS 规则选择器列表是否“命中”目标 selector。\n * 说明:这里只做非常轻量的匹配(等值 / 目标为前缀),用于从 HTML 内嵌 style 中粗略抽取常见规则。\n */\nfunction cssSelectorsHitTarget(selectorsText: string, targetSelector: string): boolean {\n const target = targetSelector.trim().toLowerCase();\n if (!target) return false;\n\n const selectors = selectorsText\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \" \")\n .split(\",\")\n .map((s) => s.replace(/\\s+/g, \" \").trim().toLowerCase())\n .filter(Boolean);\n\n return selectors.some((s) => {\n if (s === target) return true;\n if (!s.startsWith(target)) return false;\n const rest = s.slice(target.length);\n return rest.startsWith(\".\") || rest.startsWith(\":\") || rest.startsWith(\"#\") || rest.startsWith(\"[\");\n });\n}\n\n/**\n * 从 HTML 的 <style> 中合并提取指定 selector 的规则(后出现的同名属性会覆盖先出现的)。\n */\nfunction parseCssRuleFromHtml(html: string, selector: string): Record<string, string> {\n const styleTagRegex = /<style\\b[^>]*>([\\s\\S]*?)<\\/style>/gi;\n const merged: Record<string, string> = {};\n let m: RegExpExecArray | null;\n while ((m = styleTagRegex.exec(html))) {\n const cssText = m[1] ?? \"\";\n const target = selector.trim().toLowerCase();\n if (!target) continue;\n\n let depth = 0;\n let lastRuleEnd = 0;\n let ruleStart = -1;\n let declStart = -1;\n\n for (let i = 0; i < cssText.length; i++) {\n const ch = cssText[i] as string;\n if (ch === \"{\") {\n if (depth === 0) {\n ruleStart = lastRuleEnd;\n declStart = i + 1;\n }\n depth++;\n continue;\n }\n if (ch === \"}\") {\n if (depth > 0) depth--;\n if (depth === 0 && ruleStart >= 0 && declStart >= 0) {\n const selectorsText = cssText.slice(ruleStart, declStart - 1).trim().toLowerCase();\n const decl = cssText.slice(declStart, i).trim();\n lastRuleEnd = i + 1;\n ruleStart = -1;\n declStart = -1;\n\n const hit = cssSelectorsHitTarget(selectorsText, target);\n if (hit) Object.assign(merged, parseStyleAttribute(decl));\n }\n }\n }\n }\n return merged;\n}\n\n/**\n * 从 HTML 的 <style> 中提取指定 selector 的“第一条命中规则”(不继续向后合并覆盖)。\n * 用途:HTML 里经常混入大量业务 CSS(例如 modal、dropdown),会把全局 p/body 覆盖成不符合预期的值;\n * 这里用“优先早期基础排版规则”的策略,避免被后面的 UI 样式污染。\n */\nfunction parseCssRuleFromHtmlFirst(html: string, selector: string): Record<string, string> {\n const styleTagRegex = /<style\\b[^>]*>([\\s\\S]*?)<\\/style>/gi;\n let m: RegExpExecArray | null;\n while ((m = styleTagRegex.exec(html))) {\n const cssText = m[1] ?? \"\";\n const target = selector.trim().toLowerCase();\n if (!target) continue;\n\n let depth = 0;\n let lastRuleEnd = 0;\n let ruleStart = -1;\n let declStart = -1;\n\n for (let i = 0; i < cssText.length; i++) {\n const ch = cssText[i] as string;\n if (ch === \"{\") {\n if (depth === 0) {\n ruleStart = lastRuleEnd;\n declStart = i + 1;\n }\n depth++;\n continue;\n }\n if (ch === \"}\") {\n if (depth > 0) depth--;\n if (depth === 0 && ruleStart >= 0 && declStart >= 0) {\n const selectorsText = cssText.slice(ruleStart, declStart - 1).trim().toLowerCase();\n const decl = cssText.slice(declStart, i).trim();\n lastRuleEnd = i + 1;\n ruleStart = -1;\n declStart = -1;\n\n const hit = cssSelectorsHitTarget(selectorsText, target);\n if (hit) return parseStyleAttribute(decl);\n }\n }\n }\n }\n return {};\n}\n\nfunction mergeTextStyle(base: TextStyle, patch: TextStyle): TextStyle {\n return {\n bold: patch.bold ?? base.bold,\n italic: patch.italic ?? base.italic,\n underline: patch.underline ?? base.underline,\n colorHex: patch.colorHex ?? base.colorHex,\n fontFamily: patch.fontFamily ?? base.fontFamily,\n fontSizeHalfPoints: patch.fontSizeHalfPoints ?? base.fontSizeHalfPoints,\n };\n}\n\nfunction styleFromElement(node: HtmlNode): TextStyle {\n const tag = node.name?.toLowerCase();\n const styleAttr = node.attribs?.style;\n const css = parseStyleAttribute(styleAttr);\n\n const boldFromCss = (() => {\n const v = css[\"font-weight\"]?.trim().toLowerCase();\n if (!v) return undefined;\n if (v === \"bold\" || v === \"bolder\") return true;\n const n = Number(v);\n if (!Number.isNaN(n)) return n >= 600;\n return undefined;\n })();\n\n const italicFromCss = (() => {\n const v = css[\"font-style\"]?.trim().toLowerCase();\n if (!v) return undefined;\n if (v === \"italic\" || v === \"oblique\") return true;\n return undefined;\n })();\n\n const underlineFromCss = (() => {\n const v = css[\"text-decoration\"]?.trim().toLowerCase();\n if (!v) return undefined;\n return v.includes(\"underline\");\n })();\n\n const tagBold = tag === \"b\" || tag === \"strong\" ? true : undefined;\n const tagItalic = tag === \"i\" || tag === \"em\" ? true : undefined;\n const tagUnderline = tag === \"u\" ? true : undefined;\n\n return {\n bold: tagBold ?? boldFromCss,\n italic: tagItalic ?? italicFromCss,\n underline: tagUnderline ?? underlineFromCss,\n colorHex: parseCssColorToHex(css.color),\n fontFamily: normalizeFontFamily(css[\"font-family\"]),\n fontSizeHalfPoints: parseFontSizeToHalfPoints(css[\"font-size\"]),\n };\n}\n\nfunction getTextContent(node: HtmlNode): string {\n if (node.type === \"text\") return node.data ?? \"\";\n let out = \"\";\n const children = node.children ?? [];\n for (const c of children) out += getTextContent(c);\n return out;\n}\n\ntype RunToken =\n | { kind: \"text\"; text: string; style: TextStyle }\n | { kind: \"br\" }\n | { kind: \"image\"; image: EmbeddedImageRef };\n\ntype EmbeddedImage = {\n relationshipId: string;\n target: string;\n data: Uint8Array;\n contentType: string;\n widthPx: number;\n heightPx: number;\n};\n\nconst IMAGE_RELATIONSHIP_ID_OFFSET = 7;\n\ntype EmbeddedImageRef = {\n relationshipId: string;\n widthPx: number;\n heightPx: number;\n};\n\ntype HtmlToWordResult = {\n bodyXml: string;\n images: EmbeddedImage[];\n};\n\nfunction decodeBase64ToUint8Array(base64: string): Uint8Array {\n const BufferCtor = (globalThis as unknown as { Buffer?: typeof Buffer }).Buffer;\n if (BufferCtor) {\n return new Uint8Array(BufferCtor.from(base64, \"base64\"));\n }\n const atobFn = (globalThis as unknown as { atob?: (data: string) => string }).atob;\n if (!atobFn) {\n throw new Error(\"Base64 decode is not available in this environment.\");\n }\n const bin = atobFn(base64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\nfunction parseImageDataUrl(\n src: string,\n): { contentType: string; data: Uint8Array; extension: \"png\" | \"jpeg\" } | undefined {\n const m = src.match(/^data:(image\\/png|image\\/jpeg);base64,([\\s\\S]+)$/i);\n if (!m) return undefined;\n const contentType = m[1].toLowerCase();\n const base64 = m[2].replace(/\\s+/g, \"\");\n const data = decodeBase64ToUint8Array(base64);\n const extension = contentType === \"image/png\" ? \"png\" : \"jpeg\";\n return { contentType, data, extension };\n}\n\nfunction parseCssLengthToPx(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n const px = v.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (px) return Math.max(1, Math.round(Number(px[1])));\n return undefined;\n}\n\nfunction readUInt32BE(bytes: Uint8Array, offset: number): number | undefined {\n if (offset < 0 || offset + 4 > bytes.length) return undefined;\n return (\n ((bytes[offset] ?? 0) << 24) |\n ((bytes[offset + 1] ?? 0) << 16) |\n ((bytes[offset + 2] ?? 0) << 8) |\n (bytes[offset + 3] ?? 0)\n ) >>> 0;\n}\n\nfunction parsePngDimensions(data: Uint8Array): { widthPx: number; heightPx: number } | undefined {\n if (data.length < 24) return undefined;\n const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (let i = 0; i < signature.length; i++) {\n if ((data[i] ?? 0) !== signature[i]) return undefined;\n }\n const widthPx = readUInt32BE(data, 16);\n const heightPx = readUInt32BE(data, 20);\n if (!widthPx || !heightPx) return undefined;\n return { widthPx, heightPx };\n}\n\nfunction parseJpegDimensions(data: Uint8Array): { widthPx: number; heightPx: number } | undefined {\n if (data.length < 4) return undefined;\n if (data[0] !== 0xff || data[1] !== 0xd8) return undefined;\n\n let offset = 2;\n while (offset + 4 <= data.length) {\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n while (offset < data.length && data[offset] === 0xff) offset++;\n if (offset >= data.length) return undefined;\n\n const marker = data[offset] as number;\n offset++;\n\n const isStandalone = marker === 0xd9 || marker === 0xda;\n if (isStandalone) break;\n if (offset + 2 > data.length) return undefined;\n const length = ((data[offset] as number) << 8) | (data[offset + 1] as number);\n if (length < 2 || offset + length > data.length) return undefined;\n\n const isSof =\n marker === 0xc0 ||\n marker === 0xc1 ||\n marker === 0xc2 ||\n marker === 0xc3 ||\n marker === 0xc5 ||\n marker === 0xc6 ||\n marker === 0xc7 ||\n marker === 0xc9 ||\n marker === 0xca ||\n marker === 0xcb ||\n marker === 0xcd ||\n marker === 0xce ||\n marker === 0xcf;\n if (isSof) {\n if (offset + 7 > data.length) return undefined;\n const heightPx = ((data[offset + 3] as number) << 8) | (data[offset + 4] as number);\n const widthPx = ((data[offset + 5] as number) << 8) | (data[offset + 6] as number);\n if (!widthPx || !heightPx) return undefined;\n return { widthPx, heightPx };\n }\n\n offset += length;\n }\n\n return undefined;\n}\n\nfunction parseIntrinsicImageSizePx(\n contentType: string,\n data: Uint8Array,\n): { widthPx: number; heightPx: number } | undefined {\n if (contentType === \"image/png\") return parsePngDimensions(data);\n if (contentType === \"image/jpeg\") return parseJpegDimensions(data);\n return undefined;\n}\n\nfunction applyMaxBoxPx(\n size: { widthPx: number; heightPx: number },\n maxBox: { maxWidthPx: number; maxHeightPx: number },\n): { widthPx: number; heightPx: number } {\n const w = Math.max(1, Math.round(size.widthPx));\n const h = Math.max(1, Math.round(size.heightPx));\n const scale = Math.min(1, maxBox.maxWidthPx / w, maxBox.maxHeightPx / h);\n return { widthPx: Math.max(1, Math.round(w * scale)), heightPx: Math.max(1, Math.round(h * scale)) };\n}\n\nfunction computeImageSizePx(\n node: HtmlNode,\n intrinsic: { widthPx: number; heightPx: number } | undefined,\n maxBox: { maxWidthPx: number; maxHeightPx: number } | undefined,\n): { widthPx: number; heightPx: number } {\n const wAttr = node.attribs?.width ? Number(node.attribs.width) : undefined;\n const hAttr = node.attribs?.height ? Number(node.attribs.height) : undefined;\n const css = parseStyleAttribute(node.attribs?.style);\n const wCss = parseCssLengthToPx(css.width);\n const hCss = parseCssLengthToPx(css.height);\n\n const widthAttrPx = Number.isFinite(wAttr) && wAttr ? Math.max(1, Math.round(wAttr)) : undefined;\n const heightAttrPx = Number.isFinite(hAttr) && hAttr ? Math.max(1, Math.round(hAttr)) : undefined;\n\n const ratio =\n intrinsic && intrinsic.widthPx > 0 && intrinsic.heightPx > 0\n ? intrinsic.heightPx / intrinsic.widthPx\n : widthAttrPx && heightAttrPx\n ? heightAttrPx / widthAttrPx\n : 0.5;\n\n const widthPx =\n typeof wCss === \"number\"\n ? wCss\n : typeof widthAttrPx === \"number\"\n ? widthAttrPx\n : intrinsic?.widthPx ?? 300;\n const heightPx =\n typeof hCss === \"number\"\n ? hCss\n : typeof heightAttrPx === \"number\"\n ? heightAttrPx\n : intrinsic?.heightPx ?? 150;\n\n const finalSize =\n typeof wCss === \"number\" && typeof hCss !== \"number\"\n ? { widthPx, heightPx: Math.max(1, Math.round(widthPx * ratio)) }\n : typeof hCss === \"number\" && typeof wCss !== \"number\"\n ? { widthPx: Math.max(1, Math.round(heightPx / ratio)), heightPx }\n : typeof widthAttrPx === \"number\" && typeof heightAttrPx !== \"number\" && intrinsic\n ? { widthPx, heightPx: Math.max(1, Math.round(widthPx * ratio)) }\n : typeof heightAttrPx === \"number\" && typeof widthAttrPx !== \"number\" && intrinsic\n ? { widthPx: Math.max(1, Math.round(heightPx / ratio)), heightPx }\n : { widthPx, heightPx };\n\n return applyMaxBoxPx(finalSize, maxBox ?? { maxWidthPx: 624, maxHeightPx: 864 });\n}\n\nfunction collectInlineRuns(\n node: HtmlNode,\n inherited: TextStyle,\n out: RunToken[],\n result: HtmlToWordResult,\n ctx: HtmlToWordContext | undefined,\n): void {\n if (node.type === \"text\") {\n const text = node.data ?? \"\";\n if (text) out.push({ kind: \"text\", text, style: inherited });\n return;\n }\n\n if (node.type === \"tag\") {\n const tag = node.name?.toLowerCase();\n if (tag === \"br\") {\n out.push({ kind: \"br\" });\n return;\n }\n if (tag === \"img\") {\n const src = node.attribs?.src;\n if (!src) return;\n const parsed = parseImageDataUrl(src);\n if (!parsed) return;\n const intrinsic = parseIntrinsicImageSizePx(parsed.contentType, parsed.data);\n const { widthPx, heightPx } = computeImageSizePx(\n node,\n intrinsic,\n ctx ? { maxWidthPx: ctx.maxImageWidthPx, maxHeightPx: ctx.maxImageHeightPx } : undefined,\n );\n const id = result.images.length + 1;\n const relationshipId = `rId${id + IMAGE_RELATIONSHIP_ID_OFFSET}`;\n const target = `media/image${id}.${parsed.extension}`;\n result.images.push({\n relationshipId,\n target,\n data: parsed.data,\n contentType: parsed.contentType,\n widthPx,\n heightPx,\n });\n out.push({ kind: \"image\", image: { relationshipId, widthPx, heightPx } });\n return;\n }\n if (tag === \"canvas\") {\n const dataUrl = node.attribs?.[\"data-image\"] ?? node.attribs?.[\"data-src\"];\n if (!dataUrl) return;\n const parsed = parseImageDataUrl(dataUrl);\n if (!parsed) return;\n const bufferW = node.attribs?.width ? Number(node.attribs.width) : undefined;\n const bufferH = node.attribs?.height ? Number(node.attribs.height) : undefined;\n const intrinsic =\n Number.isFinite(bufferW) && bufferW && Number.isFinite(bufferH) && bufferH\n ? { widthPx: Math.max(1, Math.round(bufferW)), heightPx: Math.max(1, Math.round(bufferH)) }\n : parseIntrinsicImageSizePx(parsed.contentType, parsed.data);\n const { widthPx, heightPx } = computeImageSizePx(\n node,\n intrinsic,\n ctx ? { maxWidthPx: ctx.maxImageWidthPx, maxHeightPx: ctx.maxImageHeightPx } : undefined,\n );\n const id = result.images.length + 1;\n const relationshipId = `rId${id + IMAGE_RELATIONSHIP_ID_OFFSET}`;\n const target = `media/image${id}.${parsed.extension}`;\n result.images.push({\n relationshipId,\n target,\n data: parsed.data,\n contentType: parsed.contentType,\n widthPx,\n heightPx,\n });\n out.push({ kind: \"image\", image: { relationshipId, widthPx, heightPx } });\n return;\n }\n const next = mergeTextStyle(inherited, styleFromElement(node));\n const children = node.children ?? [];\n for (const c of children) collectInlineRuns(c, next, out, result, ctx);\n return;\n }\n\n const children = node.children ?? [];\n for (const c of children) collectInlineRuns(c, inherited, out, result, ctx);\n}\n\nfunction buildRunXml(style: TextStyle, text: string): string {\n const rPrParts: string[] = [];\n if (style.bold) rPrParts.push(\"<w:b/>\");\n if (style.italic) rPrParts.push(\"<w:i/>\");\n if (style.underline) rPrParts.push('<w:u w:val=\"single\"/>');\n if (style.colorHex) rPrParts.push(`<w:color w:val=\"${style.colorHex}\"/>`);\n if (style.fontFamily) {\n const ff = escapeXmlText(style.fontFamily);\n rPrParts.push(`<w:rFonts w:ascii=\"${ff}\" w:hAnsi=\"${ff}\" w:eastAsia=\"${ff}\"/>`);\n }\n if (typeof style.fontSizeHalfPoints === \"number\") {\n const sz = style.fontSizeHalfPoints;\n rPrParts.push(`<w:sz w:val=\"${sz}\"/><w:szCs w:val=\"${sz}\"/>`);\n }\n\n const rPrXml = rPrParts.length ? `<w:rPr>${rPrParts.join(\"\")}</w:rPr>` : \"\";\n const escaped = escapeXmlText(text);\n const preserve = shouldPreserveSpace(text) ? ' xml:space=\"preserve\"' : \"\";\n return `<w:r>${rPrXml}<w:t${preserve}>${escaped}</w:t></w:r>`;\n}\n\nfunction pxToEmu(px: number): number {\n return Math.max(1, Math.round(px * 9525));\n}\n\nfunction buildImageRunXml(image: EmbeddedImageRef): string {\n const cx = pxToEmu(image.widthPx);\n const cy = pxToEmu(image.heightPx);\n const docPrId = image.relationshipId.replace(/^rId/, \"\");\n const name = `Picture ${docPrId}`;\n\n return `<w:r><w:drawing xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"${cx}\" cy=\"${cy}\"/><wp:docPr id=\"${docPrId}\" name=\"${escapeXmlText(name)}\"/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"${escapeXmlText(name)}\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${image.relationshipId}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n}\n\nfunction hasClass(node: HtmlNode, className: string): boolean {\n const cls = node.attribs?.class;\n if (!cls) return false;\n return cls.split(/\\s+/).includes(className);\n}\n\nfunction isSkippableSubtree(node: HtmlNode): boolean {\n if (node.type !== \"tag\") return false;\n const tag = node.name?.toLowerCase();\n if (tag === \"button\") return true;\n if (tag === \"canvas\") {\n const dataUrl = node.attribs?.[\"data-image\"] ?? node.attribs?.[\"data-src\"];\n if (!dataUrl) return true;\n }\n if (tag === \"img\" && hasClass(node, \"ProseMirror-separator\")) return true;\n if (node.attribs?.id === \"pages\") return true;\n if (hasClass(node, \"ProseMirror-widget\")) return true;\n return false;\n}\n\nfunction parseCssLengthToTwips(\n value: string | undefined,\n baseFontHalfPoints: number,\n): number | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n if (!v) return undefined;\n\n const pt = v.match(/^(-?\\d+(?:\\.\\d+)?)pt$/);\n if (pt) return Math.round(Number(pt[1]) * 20);\n\n const px = v.match(/^(-?\\d+(?:\\.\\d+)?)px$/);\n if (px) return Math.round((Number(px[1]) * 72 * 20) / 96);\n\n const em = v.match(/^(-?\\d+(?:\\.\\d+)?)em$/);\n if (em) {\n const basePt = baseFontHalfPoints / 2;\n return Math.round(Number(em[1]) * basePt * 20);\n }\n\n const rem = v.match(/^(-?\\d+(?:\\.\\d+)?)rem$/);\n if (rem) return Math.round((Number(rem[1]) * 16 * 72 * 20) / 96);\n\n const num = v.match(/^(-?\\d+(?:\\.\\d+)?)$/);\n if (num) return Math.round(Number(num[1]));\n\n return undefined;\n}\n\n/**\n * 提取 margin-top / margin-bottom(支持 margin 简写),并转成 twips。\n */\nfunction extractMarginBeforeAfterTwips(\n css: Record<string, string>,\n baseFontHalfPoints: number,\n): { beforeTwips?: number; afterTwips?: number } {\n const before = parseCssLengthToTwips(css[\"margin-top\"], baseFontHalfPoints);\n const after = parseCssLengthToTwips(css[\"margin-bottom\"], baseFontHalfPoints);\n if (typeof before === \"number\" || typeof after === \"number\") {\n return { beforeTwips: before, afterTwips: after };\n }\n\n const m = css.margin?.trim().toLowerCase();\n if (!m) return {};\n const tokens = m.split(/\\s+/).filter(Boolean);\n if (!tokens.length) return {};\n\n const topToken = tokens[0];\n const bottomToken = tokens.length === 1 ? tokens[0] : tokens.length === 2 ? tokens[0] : tokens[2] ?? tokens[0];\n return {\n beforeTwips: parseCssLengthToTwips(topToken, baseFontHalfPoints),\n afterTwips: parseCssLengthToTwips(bottomToken, baseFontHalfPoints),\n };\n}\n\nfunction inferFirstFontSizeHalfPoints(node: HtmlNode): number | undefined {\n const stack: HtmlNode[] = [node];\n while (stack.length) {\n const cur = stack.pop() as HtmlNode;\n if (cur.type === \"tag\") {\n const css = parseStyleAttribute(cur.attribs?.style);\n const sz = parseFontSizeToHalfPoints(css[\"font-size\"]);\n if (typeof sz === \"number\") return sz;\n }\n const children = cur.children ?? [];\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push(children[i] as HtmlNode);\n }\n }\n return undefined;\n}\n\nfunction buildParagraphPrXml(\n node: HtmlNode,\n baseFontHalfPoints: number,\n extraInd?: { leftTwips?: number; hangingTwips?: number },\n pStyleId?: string,\n defaultCss?: Record<string, string>,\n): string {\n const tag = node.type === \"tag\" ? node.name?.toLowerCase() : undefined;\n const inlineCss = parseStyleAttribute(node.attribs?.style);\n const css = defaultCss ? { ...defaultCss, ...inlineCss } : inlineCss;\n const parts: string[] = [];\n\n if (pStyleId) parts.push(`<w:pStyle w:val=\"${escapeXmlText(pStyleId)}\"/>`);\n\n const shdHex = extractBackgroundFillHex(css);\n if (shdHex) parts.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${shdHex}\"/>`);\n\n const align = css[\"text-align\"]?.trim().toLowerCase();\n const jcVal =\n align === \"center\"\n ? \"center\"\n : align === \"right\"\n ? \"right\"\n : align === \"justify\"\n ? \"both\"\n : undefined;\n if (jcVal) parts.push(`<w:jc w:val=\"${jcVal}\"/>`);\n\n const left = (() => {\n const marginLeft = parseCssLengthToTwips(css[\"margin-left\"], baseFontHalfPoints);\n const paddingLeft = parseCssLengthToTwips(css[\"padding-left\"], baseFontHalfPoints);\n const sum = (marginLeft ?? 0) + (paddingLeft ?? 0);\n if (!sum) return undefined;\n return Math.max(0, sum);\n })();\n\n const firstLine = (() => {\n const textIndent = parseCssLengthToTwips(css[\"text-indent\"], baseFontHalfPoints);\n if (typeof textIndent !== \"number\" || !textIndent) return undefined;\n return Math.max(0, textIndent);\n })();\n\n const indAttrs: string[] = [];\n const leftTwips = extraInd?.leftTwips ?? left;\n if (typeof leftTwips === \"number\") indAttrs.push(`w:left=\"${leftTwips}\"`);\n const hangingTwips = extraInd?.hangingTwips;\n if (typeof hangingTwips === \"number\") indAttrs.push(`w:hanging=\"${hangingTwips}\"`);\n if (typeof firstLine === \"number\") indAttrs.push(`w:firstLine=\"${firstLine}\"`);\n if (indAttrs.length) parts.push(`<w:ind ${indAttrs.join(\" \")}/>`);\n\n const hasInlineBefore = inlineCss[\"margin-top\"] != null;\n const hasInlineAfter = inlineCss[\"margin-bottom\"] != null;\n const beforeToken =\n inlineCss[\"margin-top\"] ?? (pStyleId ? undefined : defaultCss?.[\"margin-top\"]);\n const afterToken =\n inlineCss[\"margin-bottom\"] ?? (pStyleId ? undefined : defaultCss?.[\"margin-bottom\"]);\n let before = parseCssLengthToTwips(beforeToken, baseFontHalfPoints);\n let after = parseCssLengthToTwips(afterToken, baseFontHalfPoints);\n if (tag === \"p\" && !hasInlineBefore && typeof before === \"number\") before = Math.min(before, 160);\n if (tag === \"p\" && !hasInlineAfter && typeof after === \"number\") after = Math.min(after, 160);\n const lineHeight = (() => {\n const lhToken =\n inlineCss[\"line-height\"] ?? (pStyleId ? undefined : defaultCss?.[\"line-height\"]);\n const lh = lhToken?.trim().toLowerCase();\n if (!lh || lh === \"normal\") return undefined;\n\n const unitless = lh.match(/^(\\d+(?:\\.\\d+)?)$/);\n if (unitless) {\n const multiplier = Number(unitless[1]);\n if (!Number.isFinite(multiplier) || multiplier <= 0) return undefined;\n const basePt = baseFontHalfPoints / 2;\n return Math.round(basePt * multiplier * 20);\n }\n\n const twips = parseCssLengthToTwips(lh, baseFontHalfPoints);\n if (typeof twips !== \"number\") return undefined;\n return Math.max(1, twips);\n })();\n\n if (\n typeof before === \"number\" ||\n typeof after === \"number\" ||\n typeof lineHeight === \"number\"\n ) {\n const attrs: string[] = [];\n if (typeof before === \"number\") {\n attrs.push(`w:before=\"${Math.max(0, before)}\"`);\n } else if (typeof lineHeight === \"number\") {\n attrs.push('w:before=\"0\"');\n }\n if (typeof after === \"number\") {\n attrs.push(`w:after=\"${Math.max(0, after)}\"`);\n } else if (typeof lineHeight === \"number\") {\n attrs.push('w:after=\"160\"');\n }\n if (typeof lineHeight === \"number\") {\n attrs.push(`w:line=\"${lineHeight}\"`, 'w:lineRule=\"exact\"');\n }\n parts.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n\n if (!parts.length) return \"\";\n return `<w:pPr>${parts.join(\"\")}</w:pPr>`;\n}\n\nfunction buildParagraphXmlFromContainer(\n node: HtmlNode,\n baseStyle: TextStyle,\n extraInd?: { leftTwips?: number; hangingTwips?: number },\n pStyleId?: string,\n result?: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string {\n const seededBaseStyle: TextStyle = ctx\n ? { fontSizeHalfPoints: ctx.defaultBaseFontHalfPoints }\n : {};\n const containerStyle = mergeTextStyle(mergeTextStyle(seededBaseStyle, baseStyle), styleFromElement(node));\n const baseFontHalfPoints =\n containerStyle.fontSizeHalfPoints ?? inferFirstFontSizeHalfPoints(node) ?? 28;\n const computedBaseFontHalfPoints =\n containerStyle.fontSizeHalfPoints ??\n inferFirstFontSizeHalfPoints(node) ??\n ctx?.defaultBaseFontHalfPoints ??\n 28;\n const defaultCss =\n ctx\n ? node.type === \"tag\" && node.name?.toLowerCase() === \"p\"\n ? { ...ctx.defaultBodyCss, ...ctx.defaultPCss }\n : ctx.defaultBodyCss\n : undefined;\n const pPrXml = buildParagraphPrXml(node, computedBaseFontHalfPoints, extraInd, pStyleId, defaultCss);\n\n const runs: RunToken[] = [];\n const res =\n result ??\n ({\n bodyXml: \"\",\n images: [],\n } as HtmlToWordResult);\n for (const c of node.children ?? []) collectInlineRuns(c, containerStyle, runs, res, ctx);\n\n const rXml: string[] = [];\n for (const token of runs) {\n if (token.kind === \"br\") {\n rXml.push(\"<w:r><w:br/></w:r>\");\n continue;\n }\n if (token.kind === \"image\") {\n rXml.push(buildImageRunXml(token.image));\n continue;\n }\n const text = token.text;\n if (!text) continue;\n if (!text.trim() && !shouldKeepWhitespaceOnlyRun(text)) continue;\n rXml.push(buildRunXml(token.style, text));\n }\n\n if (!rXml.length) return \"\";\n return `<w:p>${pPrXml}${rXml.join(\"\")}</w:p>`;\n}\n\nconst PAGE_BREAK_XML = '<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>';\n\n/**\n * 生成一个“间距占位段落”,用于模拟 HTML 元素 margin(例如 tableWrapper 的上下留白)。\n */\nfunction buildSpacerParagraphXml(afterTwips: number): string {\n const after = Math.max(0, Math.round(afterTwips));\n if (!after) return \"\";\n return `<w:p><w:pPr><w:spacing w:before=\"0\" w:after=\"${after}\" w:line=\"1\" w:lineRule=\"exact\"/></w:pPr><w:r><w:rPr><w:sz w:val=\"1\"/><w:szCs w:val=\"1\"/></w:rPr><w:t></w:t></w:r></w:p>`;\n}\n\nfunction isExplicitPageBreak(node: HtmlNode): boolean {\n if (node.type !== \"tag\") return false;\n const tag = node.name?.toLowerCase();\n const css = parseStyleAttribute(node.attribs?.style);\n const cls = node.attribs?.class ?? \"\";\n const classList = cls ? cls.split(/\\s+/) : [];\n\n if (tag === \"hr\" && classList.includes(\"page-break\")) return true;\n if (classList.includes(\"page-break\")) return true;\n if (classList.includes(\"umo-page-break\")) return true;\n if (node.attribs?.[\"data-page-break\"] === \"true\") return true;\n\n const after = css[\"page-break-after\"]?.toLowerCase() ?? css[\"break-after\"]?.toLowerCase();\n const before = css[\"page-break-before\"]?.toLowerCase() ?? css[\"break-before\"]?.toLowerCase();\n if (after?.includes(\"always\") || before?.includes(\"always\")) return true;\n\n return false;\n}\n\nfunction buildHeadingBaseStyle(level: number): TextStyle {\n const size = level === 1 ? 44 : level === 2 ? 32 : level === 3 ? 28 : level === 4 ? 24 : 22;\n return { bold: true, fontSizeHalfPoints: size };\n}\n\nfunction buildListBlocks(\n listNode: HtmlNode,\n ordered: boolean,\n level: number,\n result: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string[] {\n const liNodes = (listNode.children ?? []).filter(\n (c) => c.type === \"tag\" && c.name?.toLowerCase() === \"li\",\n );\n if (!liNodes.length) return [];\n\n const out: string[] = [];\n const numId = ordered ? 2 : 1;\n const ilvl = Math.max(0, Math.min(8, Math.floor(level)));\n const leftTwips = 720 * (ilvl + 1);\n const hangingTwips = 360;\n\n for (const li of liNodes) {\n const nestedLists: HtmlNode[] = [];\n const baseStyle: TextStyle = styleFromElement(li);\n const runs: RunToken[] = [];\n for (const c of li.children ?? []) {\n if (c.type === \"tag\") {\n const tag = c.name?.toLowerCase();\n if (tag === \"ul\" || tag === \"ol\") {\n nestedLists.push(c);\n continue;\n }\n }\n collectInlineRuns(c, baseStyle, runs, result, ctx);\n }\n\n const rXml: string[] = [];\n for (const token of runs) {\n if (token.kind === \"br\") {\n rXml.push(\"<w:r><w:br/></w:r>\");\n continue;\n }\n if (token.kind === \"image\") {\n rXml.push(buildImageRunXml(token.image));\n continue;\n }\n const text = token.text;\n if (!text) continue;\n if (!text.trim() && !shouldKeepWhitespaceOnlyRun(text)) continue;\n rXml.push(buildRunXml(token.style, text));\n }\n\n if (rXml.length) {\n const baseFontHalfPoints = inferFirstFontSizeHalfPoints(li) ?? ctx?.defaultBaseFontHalfPoints ?? 28;\n const pPrXml = buildParagraphPrXml(\n li,\n baseFontHalfPoints,\n { leftTwips, hangingTwips },\n undefined,\n ctx?.defaultBodyCss,\n );\n const numPrXml = `<w:numPr><w:ilvl w:val=\"${ilvl}\"/><w:numId w:val=\"${numId}\"/></w:numPr>`;\n const mergedPPrXml = pPrXml\n ? pPrXml.replace(\"<w:pPr>\", `<w:pPr>${numPrXml}`)\n : `<w:pPr>${numPrXml}<w:ind w:left=\"${leftTwips}\" w:hanging=\"${hangingTwips}\"/></w:pPr>`;\n out.push(`<w:p>${mergedPPrXml}${rXml.join(\"\")}</w:p>`);\n }\n\n for (const nested of nestedLists) {\n const nestedOrdered = nested.name?.toLowerCase() === \"ol\";\n out.push(...buildListBlocks(nested, nestedOrdered, ilvl + 1, result, ctx));\n }\n }\n\n return out;\n}\n\nfunction parseCellWidthTwips(node: HtmlNode): number | undefined {\n const css = parseStyleAttribute(node.attribs?.style);\n const width = parseCssLengthToTwips(css.width, 28);\n if (typeof width !== \"number\" || width <= 0) return undefined;\n return width;\n}\n\nfunction estimateTextWidthTwips(text: string, baseFontHalfPoints: number): number {\n const basePt = baseFontHalfPoints / 2;\n const cjkRegex = /[\\u3400-\\u4dbf\\u4e00-\\u9fff\\u3000-\\u303f\\uff00-\\uffef]/;\n let cjk = 0;\n let latin = 0;\n let spaces = 0;\n for (const ch of text) {\n if (ch === \" \" || ch === \"\\t\") {\n spaces++;\n continue;\n }\n if (cjkRegex.test(ch)) {\n cjk++;\n continue;\n }\n latin++;\n }\n const cjkTwips = Math.round(basePt * 20);\n const latinTwips = Math.round(basePt * 11);\n const spaceTwips = Math.round(basePt * 6);\n return cjk * cjkTwips + latin * latinTwips + spaces * spaceTwips;\n}\n\ntype WordBorder = { val: string; sz: number; colorHex?: string };\n\nfunction parseBorderShorthand(value: string | undefined, baseFontHalfPoints: number): WordBorder | undefined {\n if (!value) return undefined;\n const raw = value.trim().toLowerCase();\n if (!raw) return undefined;\n if (raw === \"none\" || raw === \"0\") return { val: \"nil\", sz: 0 };\n\n const tokens = raw.split(/\\s+/).filter(Boolean);\n if (!tokens.length) return undefined;\n\n const css = Object.fromEntries(tokens.map((t, i) => [`${i}`, t]));\n const widthToken = Object.values(css).find((t) => /^(?:\\d+(?:\\.\\d+)?)(?:px|pt)?$/.test(t));\n const styleToken = Object.values(css).find((t) =>\n [\"none\", \"solid\", \"dashed\", \"dotted\", \"double\", \"hidden\"].includes(t),\n );\n const colorToken = Object.values(css).find((t) => t.startsWith(\"#\") || t.startsWith(\"rgb(\"));\n\n const widthTwips = parseCssLengthToTwips(widthToken, baseFontHalfPoints);\n const sz = (() => {\n if (typeof widthTwips !== \"number\") return 4;\n if (widthTwips <= 0) return 0;\n return Math.max(2, Math.round(widthTwips * 0.4));\n })();\n\n const val = (() => {\n if (!styleToken) return \"single\";\n if (styleToken === \"none\" || styleToken === \"hidden\") return \"nil\";\n if (styleToken === \"solid\") return \"single\";\n if (styleToken === \"dashed\") return \"dashed\";\n if (styleToken === \"dotted\") return \"dotted\";\n if (styleToken === \"double\") return \"double\";\n return \"single\";\n })();\n\n const colorHex = parseCssColorToHex(colorToken);\n return { val, sz, colorHex };\n}\n\nfunction buildBorderTag(tag: string, border: WordBorder | undefined, fallbackColorHex: string): string {\n const b = border ?? { val: \"single\", sz: 4, colorHex: fallbackColorHex };\n const color = (b.colorHex ?? fallbackColorHex).toUpperCase();\n return `<w:${tag} w:val=\"${b.val}\" w:sz=\"${b.sz}\" w:space=\"0\" w:color=\"${color}\"/>`;\n}\n\nfunction injectTableCellParagraphSpacing(pXml: string): string {\n if (!pXml.includes(\"<w:p\")) return pXml;\n if (!pXml.includes(\"<w:p>\")) return pXml;\n const spacingXml = '<w:spacing w:before=\"0\" w:after=\"0\" w:line=\"360\" w:lineRule=\"auto\"/><w:wordWrap w:val=\"1\"/>';\n if (pXml.includes(\"<w:pPr>\")) {\n if (pXml.includes(\"<w:spacing \")) return pXml;\n return pXml.replace(\"<w:pPr>\", `<w:pPr>${spacingXml}`);\n }\n return pXml.replace(\"<w:p>\", `<w:p><w:pPr>${spacingXml}</w:pPr>`);\n}\n\nfunction buildTableCellBlocksXml(\n cell: HtmlNode,\n baseStyle: TextStyle,\n result: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string {\n const children = cell.children ?? [];\n const hasBlocks = children.some((c) => {\n if (c.type !== \"tag\") return false;\n const tag = c.name?.toLowerCase();\n return tag === \"p\" || tag === \"ul\" || tag === \"ol\" || tag === \"img\" || tag === \"canvas\" || /^h[1-6]$/.test(tag ?? \"\");\n });\n\n const out: string[] = [];\n if (!hasBlocks) {\n const p = buildParagraphXmlFromContainer(cell, baseStyle, undefined, undefined, result, ctx);\n if (p) out.push(p);\n return out.length ? out.map(injectTableCellParagraphSpacing).join(\"\") : \"<w:p/>\";\n }\n\n for (const c of children) {\n if (c.type === \"tag\") {\n const tag = c.name?.toLowerCase();\n if (tag === \"p\") {\n const p = buildParagraphXmlFromContainer(c, baseStyle, undefined, undefined, result, ctx);\n if (p) out.push(p);\n continue;\n }\n if (tag && /^h[1-6]$/.test(tag)) {\n const level = Number(tag.slice(1));\n const p = buildParagraphXmlFromContainer(c, baseStyle, undefined, `Heading${level}`, result, ctx);\n if (p) out.push(p);\n continue;\n }\n if (tag === \"ul\" || tag === \"ol\") {\n out.push(...buildListBlocks(c, tag === \"ol\", 0, result, ctx));\n continue;\n }\n if (tag === \"img\" || tag === \"canvas\") {\n const p = buildParagraphXmlFromSingleInlineNode(c, baseStyle, result);\n if (p) out.push(p);\n continue;\n }\n }\n }\n\n if (!out.length) return \"<w:p/>\";\n return out.map(injectTableCellParagraphSpacing).join(\"\");\n}\n\nfunction buildTableXml(tableNode: HtmlNode, result: HtmlToWordResult, ctx?: HtmlToWordContext): string {\n const rows: HtmlNode[] = [];\n const stack: HtmlNode[] = [...(tableNode.children ?? [])];\n while (stack.length) {\n const n = stack.shift() as HtmlNode;\n if (n.type === \"tag\" && n.name?.toLowerCase() === \"tr\") rows.push(n);\n if (n.children?.length) stack.unshift(...n.children);\n }\n\n const rowCells = rows.map((tr) =>\n (tr.children ?? []).filter((c) => c.type === \"tag\" && (c.name === \"td\" || c.name === \"th\")),\n );\n const colCount = Math.max(0, ...rowCells.map((cells) => cells.length));\n const maxTableWidthTwips = ctx?.maxTableWidthTwips ?? 9360;\n\n // Parse colgroup/col widths if present\n const colGroup = (tableNode.children ?? []).find((c) => c.type === \"tag\" && c.name === \"colgroup\");\n const colWidthsFromGroup: (number | undefined)[] = [];\n if (colGroup) {\n const cols = (colGroup.children ?? []).filter((c) => c.type === \"tag\" && c.name === \"col\");\n for (const col of cols) {\n const css = parseStyleAttribute(col.attribs?.style);\n // Check width, then min-width\n const w = parseCssLengthToTwips(css.width ?? css[\"min-width\"], 28);\n colWidthsFromGroup.push(w);\n }\n }\n\n const estimatedColWidths = new Array(colCount).fill(0).map((_, i) => {\n let explicit: number | undefined = colWidthsFromGroup[i];\n let estimated = 0;\n for (const cells of rowCells) {\n const cell = cells[i] as HtmlNode | undefined;\n if (!cell) continue;\n const w = parseCellWidthTwips(cell);\n if (typeof w === \"number\") explicit = explicit ?? w;\n const text = getTextContent(cell).replace(/\\s+/g, \" \").trim();\n if (!text) continue;\n const baseFontHalfPoints = inferFirstFontSizeHalfPoints(cell) ?? 28;\n const wTwips = estimateTextWidthTwips(text, baseFontHalfPoints) + 240;\n estimated = Math.max(estimated, wTwips);\n }\n const base =\n typeof explicit === \"number\"\n ? Math.max(explicit, estimated)\n : estimated || Math.round(maxTableWidthTwips / Math.max(1, colCount));\n \n return Math.max(720, Math.min(6000, Math.round(base)));\n });\n\n const normalizedColWidths = (() => {\n const sum = estimatedColWidths.reduce((a, b) => a + b, 0);\n if (!sum) return estimatedColWidths;\n if (sum <= maxTableWidthTwips) return estimatedColWidths;\n const scaled = estimatedColWidths.map((w) =>\n Math.max(720, Math.floor((w * maxTableWidthTwips) / sum)),\n );\n const scaledSum = scaled.reduce((a, b) => a + b, 0);\n const diff = maxTableWidthTwips - scaledSum;\n if (diff !== 0 && scaled.length) scaled[scaled.length - 1] = Math.max(720, scaled[scaled.length - 1] + diff);\n return scaled;\n })();\n\n const tblGrid = `<w:tblGrid>${normalizedColWidths.map((w) => `<w:gridCol w:w=\"${w}\"/>`).join(\"\")}</w:tblGrid>`;\n\n const rowXml: string[] = [];\n for (let rowIdx = 0; rowIdx < rows.length; rowIdx++) {\n const tr = rows[rowIdx] as HtmlNode;\n const cells = rowCells[rowIdx] ?? [];\n\n const cellXml: string[] = [];\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i] as HtmlNode;\n const isHeader = cell.name === \"th\";\n const baseStyle: TextStyle = isHeader ? { bold: true } : {};\n const paragraphs = buildTableCellBlocksXml(cell, baseStyle, result, ctx);\n const css = parseStyleAttribute(cell.attribs?.style);\n const widthTwips = parseCellWidthTwips(cell) ?? normalizedColWidths[i];\n const tcW =\n typeof widthTwips === \"number\"\n ? `<w:tcW w:w=\"${widthTwips}\" w:type=\"dxa\"/>`\n : `<w:tcW w:w=\"0\" w:type=\"auto\"/>`;\n const vAlign = (() => {\n const v = css[\"vertical-align\"]?.trim().toLowerCase();\n if (!v) return \"\";\n if (v === \"middle\" || v === \"center\") return '<w:vAlign w:val=\"center\"/>';\n if (v === \"bottom\") return '<w:vAlign w:val=\"bottom\"/>';\n if (v === \"top\") return '<w:vAlign w:val=\"top\"/>';\n return \"\";\n })();\n const shd = (() => {\n const hex = parseCssColorToHex(css[\"background-color\"]);\n if (!hex) return \"\";\n return `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${hex}\"/>`;\n })();\n const noWrap = (() => {\n const ws = css[\"white-space\"]?.trim().toLowerCase();\n if (ws?.includes(\"nowrap\")) return \"<w:noWrap/>\";\n return \"\";\n })();\n const cellBorder = (() => {\n const bAll = parseBorderShorthand(css.border, 28);\n const bTop = parseBorderShorthand(css[\"border-top\"] ?? css.border, 28);\n const bLeft = parseBorderShorthand(css[\"border-left\"] ?? css.border, 28);\n const bBottom = parseBorderShorthand(css[\"border-bottom\"] ?? css.border, 28);\n const bRight = parseBorderShorthand(css[\"border-right\"] ?? css.border, 28);\n const any =\n bAll || css.border || css[\"border-top\"] || css[\"border-left\"] || css[\"border-bottom\"] || css[\"border-right\"];\n if (!any) return \"\";\n const fallback = bAll?.colorHex ?? \"D9D9D9\";\n return `<w:tcBorders>${buildBorderTag(\"top\", bTop, fallback)}${buildBorderTag(\n \"left\",\n bLeft,\n fallback,\n )}${buildBorderTag(\"bottom\", bBottom, fallback)}${buildBorderTag(\n \"right\",\n bRight,\n fallback,\n )}</w:tcBorders>`;\n })();\n cellXml.push(`<w:tc><w:tcPr>${tcW}${vAlign}${shd}${noWrap}${cellBorder}</w:tcPr>${paragraphs}</w:tc>`);\n }\n if (cellXml.length) rowXml.push(`<w:tr>${cellXml.join(\"\")}</w:tr>`);\n }\n\n const tblCss = parseStyleAttribute(tableNode.attribs?.style);\n const tblAlign = (() => {\n const ml = tblCss[\"margin-left\"]?.trim().toLowerCase();\n const mr = tblCss[\"margin-right\"]?.trim().toLowerCase();\n const m = tblCss.margin?.trim().toLowerCase();\n if ((ml === \"auto\" && mr === \"auto\") || (m?.includes(\"auto\") ?? false)) return '<w:tblJc w:val=\"center\"/>';\n const ta = tblCss[\"text-align\"]?.trim().toLowerCase();\n if (ta === \"center\") return '<w:tblJc w:val=\"center\"/>';\n if (ta === \"right\") return '<w:tblJc w:val=\"right\"/>';\n return \"\";\n })();\n const tblBorder = (() => {\n const border = parseBorderShorthand(tblCss.border, 28);\n if (tblCss.border) {\n const fallback = border?.colorHex ?? \"D9D9D9\";\n return `<w:tblBorders>${buildBorderTag(\"top\", border, fallback)}${buildBorderTag(\n \"left\",\n border,\n fallback,\n )}${buildBorderTag(\"bottom\", border, fallback)}${buildBorderTag(\n \"right\",\n border,\n fallback,\n )}${buildBorderTag(\"insideH\", border, fallback)}${buildBorderTag(\n \"insideV\",\n border,\n fallback,\n )}</w:tblBorders>`;\n }\n const fallback = \"D9D9D9\";\n return `<w:tblBorders>${buildBorderTag(\"top\", undefined, fallback)}${buildBorderTag(\n \"left\",\n undefined,\n fallback,\n )}${buildBorderTag(\"bottom\", undefined, fallback)}${buildBorderTag(\n \"right\",\n undefined,\n fallback,\n )}${buildBorderTag(\"insideH\", undefined, fallback)}${buildBorderTag(\"insideV\", undefined, fallback)}</w:tblBorders>`;\n })();\n const tblW = `<w:tblW w:w=\"${normalizedColWidths.reduce((a, b) => a + b, 0)}\" w:type=\"dxa\"/>`;\n const tblPr = `<w:tblPr>${tblW}<w:tblLayout w:type=\"fixed\"/>${tblAlign}${tblBorder}</w:tblPr>`;\n return `<w:tbl>${tblPr}${tblGrid}${rowXml.join(\"\")}</w:tbl>`;\n}\n\nfunction buildParagraphXmlFromSingleInlineNode(\n node: HtmlNode,\n baseStyle: TextStyle,\n result: HtmlToWordResult,\n ctx?: HtmlToWordContext,\n): string {\n const wrapper: HtmlNode = {\n type: \"tag\",\n name: \"p\",\n attribs: { style: \"text-align: center;\" },\n children: [node],\n };\n return buildParagraphXmlFromContainer(wrapper, baseStyle, undefined, undefined, result, ctx);\n}\n\nfunction isRecognizedBlockTag(tag: string | undefined): boolean {\n if (!tag) return false;\n if (tag === \"p\") return true;\n if (tag === \"table\") return true;\n if (tag === \"ul\" || tag === \"ol\") return true;\n if (tag === \"img\" || tag === \"canvas\") return true;\n if (/^h[1-6]$/.test(tag)) return true;\n if (tag === \"pre\") return true;\n return false;\n}\n\nfunction subtreeHasRecognizedBlocks(root: HtmlNode): boolean {\n const stack: HtmlNode[] = [root];\n while (stack.length) {\n const cur = stack.pop() as HtmlNode;\n if (cur.type === \"tag\") {\n if (isExplicitPageBreak(cur)) return true;\n if (isRecognizedBlockTag(cur.name?.toLowerCase())) return true;\n }\n const children = cur.children ?? [];\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push(children[i] as HtmlNode);\n }\n }\n return false;\n}\n\nfunction collectDivBlocks(node: HtmlNode, out: string[], result: HtmlToWordResult, ctx: HtmlToWordContext): void {\n const parentStyle = node.attribs?.style;\n const inlineBuffer: HtmlNode[] = [];\n\n const flushInline = () => {\n const wrapper: HtmlNode = {\n type: \"tag\",\n name: \"p\",\n attribs: { style: parentStyle },\n children: inlineBuffer.splice(0),\n };\n const pXml = buildParagraphXmlFromContainer(wrapper, {}, undefined, undefined, result, ctx);\n if (pXml) out.push(pXml);\n };\n\n const children = node.children ?? [];\n for (const child of children) {\n if (child.type === \"tag\") {\n const tag = child.name?.toLowerCase();\n if (isExplicitPageBreak(child)) {\n if (inlineBuffer.length) flushInline();\n out.push(PAGE_BREAK_XML);\n continue;\n }\n if (isRecognizedBlockTag(tag)) {\n if (inlineBuffer.length) flushInline();\n collectBodyBlocks(child, out, result, ctx);\n continue;\n }\n if (subtreeHasRecognizedBlocks(child)) {\n if (inlineBuffer.length) flushInline();\n collectBodyBlocks(child, out, result, ctx);\n continue;\n }\n if (tag === \"div\") {\n if (inlineBuffer.length) flushInline();\n const mergedStyle = [parentStyle, child.attribs?.style].filter(Boolean).join(\";\");\n const wrapper: HtmlNode = {\n type: \"tag\",\n name: \"p\",\n attribs: { style: mergedStyle || undefined },\n children: child.children ?? [],\n };\n const pXml = buildParagraphXmlFromContainer(wrapper, {}, undefined, undefined, result, ctx);\n if (pXml) out.push(pXml);\n continue;\n }\n }\n inlineBuffer.push(child);\n }\n\n if (inlineBuffer.length) flushInline();\n}\n\nfunction collectBodyBlocks(node: HtmlNode, out: string[], result: HtmlToWordResult, ctx: HtmlToWordContext): void {\n if (isSkippableSubtree(node)) return;\n\n if (node.type === \"tag\") {\n const tag = node.name?.toLowerCase();\n\n if (isExplicitPageBreak(node)) {\n out.push(PAGE_BREAK_XML);\n return;\n }\n\n if (tag === \"p\") {\n const pXml = buildParagraphXmlFromContainer(node, {}, undefined, undefined, result, ctx);\n if (pXml) out.push(pXml);\n return;\n }\n\n if (tag === \"img\" || tag === \"canvas\") {\n const pXml = buildParagraphXmlFromSingleInlineNode(node, {}, result, ctx);\n if (pXml) out.push(pXml);\n return;\n }\n\n if (tag && /^h[1-6]$/.test(tag)) {\n const level = Number(tag.slice(1));\n const hXml = buildParagraphXmlFromContainer(node, {}, undefined, `Heading${level}`, result, ctx);\n if (hXml) out.push(hXml);\n return;\n }\n\n if (tag === \"table\") {\n const tblXml = buildTableXml(node, result, ctx);\n if (tblXml) out.push(tblXml);\n return;\n }\n\n if (tag === \"ul\" || tag === \"ol\") {\n out.push(...buildListBlocks(node, tag === \"ol\", 0, result, ctx));\n return;\n }\n\n if (tag === \"div\") {\n if (hasClass(node, \"tableWrapper\")) {\n const display = ctx.tableWrapperCss.display?.trim().toLowerCase();\n if (display !== \"contents\") {\n const baseFontHalfPoints = inferFirstFontSizeHalfPoints(node) ?? ctx.defaultBaseFontHalfPoints;\n const { beforeTwips, afterTwips } = extractMarginBeforeAfterTwips(ctx.tableWrapperCss, baseFontHalfPoints);\n const beforeXml =\n typeof beforeTwips === \"number\" && beforeTwips > 0 ? buildSpacerParagraphXml(beforeTwips) : \"\";\n const afterXml =\n typeof afterTwips === \"number\" && afterTwips > 0 ? buildSpacerParagraphXml(afterTwips) : \"\";\n if (beforeXml) out.push(beforeXml);\n collectDivBlocks(node, out, result, ctx);\n if (afterXml) out.push(afterXml);\n return;\n }\n collectDivBlocks(node, out, result, ctx);\n return;\n }\n collectDivBlocks(node, out, result, ctx);\n return;\n }\n }\n\n for (const c of node.children ?? []) collectBodyBlocks(c, out, result, ctx);\n}\n\nexport function textToWordBodyXml(text: string): string {\n const normalized = text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n if (!normalized.trim()) {\n throw new Error(\"Text is empty.\");\n }\n\n const lines = normalized.split(\"\\n\");\n const out: string[] = [];\n for (const line of lines) {\n if (!line) {\n out.push(\"<w:p/>\");\n continue;\n }\n out.push(`<w:p>${buildRunXml({}, line)}</w:p>`);\n }\n return out.join(\"\");\n}\n\nfunction htmlToWordBody(html: string, layout: HtmlToWordLayout | undefined): HtmlToWordResult {\n const normalized = html.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n const bodyCss = parseCssRuleFromHtmlFirst(normalized, \"body\");\n const pCss = parseCssRuleFromHtmlFirst(normalized, \"p\");\n const defaultBaseFontHalfPoints = parseFontSizeToHalfPoints(bodyCss[\"font-size\"]) ?? 28;\n const defaultBodyCss: Record<string, string> = {};\n if (bodyCss[\"line-height\"]) defaultBodyCss[\"line-height\"] = bodyCss[\"line-height\"];\n\n const defaultPCss: Record<string, string> = {};\n if (pCss[\"line-height\"]) defaultPCss[\"line-height\"] = pCss[\"line-height\"];\n if (pCss[\"margin-top\"]) defaultPCss[\"margin-top\"] = pCss[\"margin-top\"];\n if (pCss[\"margin-bottom\"]) defaultPCss[\"margin-bottom\"] = pCss[\"margin-bottom\"];\n if (pCss[\"text-align\"]) defaultPCss[\"text-align\"] = pCss[\"text-align\"];\n\n const tableWrapperCss = {\n ...parseCssRuleFromHtml(normalized, \".tableWrapper\"),\n ...parseCssRuleFromHtml(normalized, \".tiptap .tableWrapper\"),\n };\n\n const doc = parseDocument(normalized, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n }) as unknown as HtmlNode;\n\n const result: HtmlToWordResult = { bodyXml: \"\", images: [] };\n const out: string[] = [];\n const ctx: HtmlToWordContext = {\n defaultBaseFontHalfPoints,\n defaultBodyCss,\n defaultPCss,\n tableWrapperCss,\n maxTableWidthTwips: layout?.maxTableWidthTwips ?? 9360,\n maxImageWidthPx: layout?.maxImageWidthPx ?? 624,\n maxImageHeightPx: layout?.maxImageHeightPx ?? 864,\n };\n collectBodyBlocks(doc, out, result, ctx);\n result.bodyXml = out.join(\"\");\n return result;\n}\n\n/**\n * 把 HTML 字符串转换成 WordprocessingML 的 body 片段(由 <w:p> / <w:tbl> 等组成)。\n * 说明:\n * - 这个函数只生成 body 内容,不生成完整的 <w:document> 包装\n * - 支持:p/span/strong/br、h1~h6、ul/ol/li、table/tr/td/th、基础分页标记\n * - 不支持:canvas 图表、复杂 CSS、HTML 图片(需要额外提供图片二进制)\n */\nexport function htmlToWordBodyXml(html: string): string {\n const { bodyXml } = htmlToWordBody(html, undefined);\n if (!bodyXml) {\n const text = getTextContent(\n parseDocument(html, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n }) as unknown as HtmlNode,\n );\n return textToWordBodyXml(text);\n }\n return bodyXml;\n}\n\nexport function htmlToWordBodyWithAssets(html: string, layout?: HtmlToWordLayout): HtmlToWordResult {\n const result = htmlToWordBody(html, layout);\n if (!result.bodyXml) {\n const text = getTextContent(\n parseDocument(html, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n }) as unknown as HtmlNode,\n );\n return { bodyXml: textToWordBodyXml(text), images: [] };\n }\n return result;\n}\n","export type XmlToDocxInputKind = \"auto\" | \"document\" | \"body\";\nexport type HtmlToDocxInputFormat = \"auto\" | \"html\" | \"text\";\n\nexport type DocxPageSizePreset = \"A4\" | \"A4_Landscape\" | \"Letter\" | \"Letter_Landscape\";\n\nexport type DocxPageMarginTwips = {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n};\n\nexport type DocxPageSizeTwips = { widthTwips: number; heightTwips: number };\n\nexport interface DocxPageSetupOptions {\n size?: DocxPageSizePreset | DocxPageSizeTwips;\n marginTwips?: number | DocxPageMarginTwips;\n}\n\n/**\n * XML→DOCX 输入类型。\n * - auto: 自动判断是否为完整的 <w:document>;否则按 body 片段处理\n * - document: 你传入的是完整的 WordprocessingML document.xml(必须以 <w:document> 开头)\n * - body: 你传入的是 <w:p> 等正文片段(库会自动包一层 <w:document><w:body>)\n */\nexport interface XmlToDocxOptions {\n inputKind?: XmlToDocxInputKind;\n /**\n * 是否校验 XML 合法性。\n * - true: 发现 XML 不合法会直接抛错(推荐生产开启)\n * - false: 跳过校验(更快,但错误会在 Word 打开时才暴露)\n */\n validateXml?: boolean;\n page?: DocxPageSetupOptions;\n}\n\n/**\n * HTML→DOCX 输入格式。\n * - auto: 自动判断(像 HTML 就按 HTML 解析,否则当纯文本)\n * - html: 强制当 HTML 解析\n * - text: 强制当纯文本处理(按换行拆段)\n */\nexport interface HtmlToDocxOptions {\n inputFormat?: HtmlToDocxInputFormat;\n /**\n * 是否校验最终生成的 document.xml 是否为合法 XML。\n */\n validateXml?: boolean;\n page?: DocxPageSetupOptions;\n}\n\nfunction looksLikeHtml(input: string): boolean {\n const s = input.trim();\n if (!s) return false;\n if (!s.includes(\"<\") || !s.includes(\">\")) return false;\n return /<\\/?[a-zA-Z][\\s\\S]*?>/.test(s);\n}\n\nfunction resolvePageSetupTwips(page: DocxPageSetupOptions | undefined): {\n pageWidthTwips: number;\n pageHeightTwips: number;\n margins: Required<DocxPageMarginTwips>;\n} {\n const size = page?.size;\n const defaultSize: DocxPageSizeTwips = { widthTwips: 11906, heightTwips: 16838 };\n const resolvedSize: DocxPageSizeTwips =\n typeof size === \"object\" && size && \"widthTwips\" in size && \"heightTwips\" in size\n ? { widthTwips: Math.round(size.widthTwips), heightTwips: Math.round(size.heightTwips) }\n : size === \"Letter\"\n ? { widthTwips: 12240, heightTwips: 15840 }\n : size === \"Letter_Landscape\"\n ? { widthTwips: 15840, heightTwips: 12240 }\n : size === \"A4_Landscape\"\n ? { widthTwips: 16838, heightTwips: 11906 }\n : defaultSize;\n\n const defaultMargins: Required<DocxPageMarginTwips> = {\n top: 1440,\n right: 1440,\n bottom: 1440,\n left: 1440,\n header: 708,\n footer: 708,\n gutter: 0,\n };\n const m = page?.marginTwips;\n const mergedMargins: Required<DocxPageMarginTwips> =\n typeof m === \"number\"\n ? { ...defaultMargins, top: m, right: m, bottom: m, left: m }\n : m\n ? {\n ...defaultMargins,\n top: m.top ?? defaultMargins.top,\n right: m.right ?? defaultMargins.right,\n bottom: m.bottom ?? defaultMargins.bottom,\n left: m.left ?? defaultMargins.left,\n header: m.header ?? defaultMargins.header,\n footer: m.footer ?? defaultMargins.footer,\n gutter: m.gutter ?? defaultMargins.gutter,\n }\n : defaultMargins;\n\n return {\n pageWidthTwips: Math.max(1, Math.round(resolvedSize.widthTwips)),\n pageHeightTwips: Math.max(1, Math.round(resolvedSize.heightTwips)),\n margins: mergedMargins,\n };\n}\n\nfunction computeHtmlConversionLayoutFromPage(page: DocxPageSetupOptions | undefined): {\n maxTableWidthTwips: number;\n maxImageWidthPx: number;\n maxImageHeightPx: number;\n} {\n const { pageWidthTwips, pageHeightTwips, margins } = resolvePageSetupTwips(page);\n const contentWidthTwips = Math.max(1, pageWidthTwips - margins.left - margins.right);\n const contentHeightTwips = Math.max(1, pageHeightTwips - margins.top - margins.bottom);\n const twipsToPx = (twips: number) => Math.max(1, Math.round(twips / 15));\n return {\n maxTableWidthTwips: contentWidthTwips,\n maxImageWidthPx: twipsToPx(contentWidthTwips),\n maxImageHeightPx: twipsToPx(contentHeightTwips),\n };\n}\n\n/**\n * 把 WordprocessingML XML 转成 docx(二进制 Uint8Array)。\n * 适合 Node/浏览器通用场景。\n */\nexport async function xmlToDocxUint8Array(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const { createDocxZipUint8Array } = await import(\"./lib/createDocxZip.js\");\n return createDocxZipUint8Array(xml, options);\n}\n\n/**\n * 把 WordprocessingML XML 转成 docx(Blob)。\n * 适合浏览器下载:new File([blob], 'xx.docx') 或 URL.createObjectURL(blob)。\n */\nexport async function xmlToDocxBlob(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Blob> {\n const docx = await xmlToDocxUint8Array(xml, options);\n const bytes = new Uint8Array(docx);\n return new Blob([bytes], {\n type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n });\n}\n\n/**\n * 把 WordprocessingML XML 转成 docx(Buffer)。\n * 仅在 Node 环境可用,适合直接 fs.writeFileSync('xx.docx', buffer)。\n */\nexport async function xmlToDocxBuffer(\n xml: string,\n options: XmlToDocxOptions = {},\n): Promise<Buffer> {\n const docx = await xmlToDocxUint8Array(xml, options);\n const BufferCtor = (globalThis as unknown as { Buffer?: typeof Buffer }).Buffer;\n if (!BufferCtor) {\n throw new Error(\"Buffer is not available. Use xmlToDocxUint8Array or xmlToDocxBlob instead.\");\n }\n return BufferCtor.from(docx);\n}\n\n/**\n * 把 HTML/纯文本字符串转成 docx(二进制 Uint8Array)。\n * - 适合前端直接传入“很长的字符串”(HTML 或纯文本)\n * - inputFormat 默认 auto:像 HTML 就按 HTML 解析,否则按纯文本解析\n */\nexport async function htmlToDocxUint8Array(\n html: string,\n options: HtmlToDocxOptions = {},\n): Promise<Uint8Array> {\n const { htmlToWordBodyWithAssets, htmlToWordBodyXml, textToWordBodyXml } = await import(\n \"./lib/htmlToWordBodyXml.js\"\n );\n const { createDocxZipWithAssetsUint8Array } = await import(\"./lib/createDocxZip.js\");\n const format = options.inputFormat ?? \"auto\";\n const isHtml =\n format === \"html\" ? true : format === \"text\" ? false : looksLikeHtml(html) ? true : false;\n\n if (!isHtml) {\n const bodyXml = textToWordBodyXml(html);\n return xmlToDocxUint8Array(bodyXml, {\n inputKind: \"body\",\n validateXml: options.validateXml,\n page: options.page,\n });\n }\n\n const layout = options.page ? computeHtmlConversionLayoutFromPage(options.page) : undefined;\n const { bodyXml, images } = htmlToWordBodyWithAssets(html, layout);\n if (!images.length) {\n return xmlToDocxUint8Array(bodyXml || htmlToWordBodyXml(html), {\n inputKind: \"body\",\n validateXml: options.validateXml,\n page: options.page,\n });\n }\n\n const assets = images.map((img) => ({\n relationshipId: img.relationshipId,\n relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n target: img.target,\n data: img.data,\n contentType: img.contentType,\n }));\n\n return createDocxZipWithAssetsUint8Array(\n bodyXml,\n { inputKind: \"body\", validateXml: options.validateXml, page: options.page },\n assets,\n );\n}\n\n/**\n * 把 HTML/纯文本字符串转成 docx(Blob)。\n * 适合浏览器下载。\n */\nexport async function htmlToDocxBlob(\n html: string,\n options: HtmlToDocxOptions = {},\n): Promise<Blob> {\n const docx = await htmlToDocxUint8Array(html, options);\n const bytes = new Uint8Array(docx);\n return new Blob([bytes], {\n type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n });\n}\n\n/**\n * 把 HTML/纯文本字符串转成 docx(Buffer)。\n * 仅在 Node 环境可用。\n */\nexport async function htmlToDocxBuffer(\n html: string,\n options: HtmlToDocxOptions = {},\n): Promise<Buffer> {\n const docx = await htmlToDocxUint8Array(html, options);\n const BufferCtor = (globalThis as unknown as { Buffer?: typeof Buffer }).Buffer;\n if (!BufferCtor) {\n throw new Error(\"Buffer is not available. Use htmlToDocxUint8Array or htmlToDocxBlob instead.\");\n }\n return BufferCtor.from(docx);\n}\n"],"mappings":"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","names":["JSZip","children","fallback","resolvePageSetupTwips","createDocxZipUint8Array","htmlToWordBodyWithAssets","htmlToWordBodyXml","textToWordBodyXml","createDocxZipWithAssetsUint8Array","bodyXml"]}
|