# HTML 子集原生导出 DOCX

`string.html.toDocx` 仅为 `string.markdown.toDocx` 提供有限 HTML 子集适配，不是独立的通用网页转换器或浏览器排版引擎。它将标签解释为结构化 Word 内容，再调用 `fsys.openXml.docx.builder`；样式、Word XML、编号、关系与包结构只由基础库生成，保存统一交给 `fsys.openXml.writer`。

需要 `fsys.openXml` 0.13.0+ 及配套 zlib。生成过程不依赖 Office、MSXML、COM 或 .NET。无需先把 HTML 包装为 RTF，也不使用 altChunk。

```aardio
import string.html.toDocx;

var html = '<h1 id="intro">标题</h1><p>Hello <b>bold</b> world。</p><ol start="3"><li>第三步</li><li>第四步</li></ol><p><a href="#intro">回到标题</a></p>';
var path,err,report=string.html.toDocx.save("/html-output.docx",html);
if(!path){print(err);return;}
raw.explore(path,"/select");
```

## API

- `string.html.toDocx(html,options)`：返回二进制 DOCX、错误、报告。
- `.save(path,html,options)`：返回输出路径、错误、报告。默认不覆盖。
- `.buildParts(html,options)`：返回 XML 部件表、错误、报告；不进行文件 IO。表的键为 DOCX 包内相对路径，值为 UTF-8 XML。用于测试或自定义打包，不是通用 DOCX 编辑器。
- `.defaults`：可修改的默认选项表，与 Markdown 包装共用；与 Word builder 默认表独立。
- `.packParts(parts,options)`：兼容保留的临时包接口，返回临时 DOCX 路径，调用者负责删除。一般应调用 save。

save 直接使用公共 writer 的同目录临时包/原子提交，不创建逐 XML 部件的临时目录。二进制构造入口仍需一个临时 ZIP 文件，读取后删除；buildParts 不进行文件 IO。可在 options 中透传 writer 的 maxEntries/maxPartBytes/maxWriteBytes/level/protectPaths；默认每部件 16 MiB、总写入 128 MiB，超限明确失败。

详细选项、字体说明和降级行为见 [Markdown DOCX 指南](../markdown/toDocx/index.html)。

## HTML 处理约定

- 直接调用 `string.html(html,true)`；文本节点保留空白后，由正文/代码各自处理。不要预先把整段 HTML 再转义一遍。
- 普通正文折叠 ASCII 空白，跨粗体/斜体节点的英文间隔不会丢失；`pre` 和行内 `code` 保留内部空白。
- 文本和属性实体分别处理，写入 XML 时重新转义。非法 XML 1.0 控制字符替换为 U+FFFD。
- 标准小写属性：`align`，以及 `style` 内的 `text-align`。并非通用 CSS 支持。
- 标题/段落及行内元素的 `id` 可以作为内部链接目标；不自动生成 Markdown 标题 slug。
- 外部超链接只接受 `http`、`https`、`mailto`。其它协议保留可见文字并给出警告，不执行脚本。
- 忽略 head/script/style 等非正文内容。
- `ol start` / `li value` 支持数值起始编号，0 保留。Word 编号不支持负起点，负值改从 0 开始并返回 list-start 警告；任务复选框使用 `input type="checkbox"` 与 `checked` 属性存在性判断。
- 普通表格使用真实行列。`th` 具有底色和粗体，第一行表头可跨页重复；过宽或复杂合并单元格按行列展开，不丢内容。
- 图片只输出 alt 与 src；不会读取本地图片或发起下载。
- 最大节点嵌套深度为 128；超过时返回错误，避免输出半成品。

支持范围以 Markdown 输出所需的标签为主，不承诺任意网页及其它富文本软件的逐像素一致性。
