string.markdown.toDocx 将 Markdown 转为可编辑的 DOCX。转换链为 Markdown → HTML → Word 内容模型 → DOCX:string.html.toDocx 仅解释 Markdown 所需的有限 HTML 子集,fsys.openXml.docx.builder 生成 WordprocessingML,公共 fsys.openXml.writer 负责 ZIP 和安全保存。生成时不调用 Word、MSXML、COM 或 .NET,不经过 RTF。
需要 fsys.openXml 0.13.0+、配套 zlib,以及支持 string.html(html,true) 的 HTML/XML 库。无需自行预编码空白;原有调用接口和默认选项保持。
import string.markdown.toDocx;
var md = "# 文档标题
Hello **bold** world。
- [x] 已完成
- [ ] 待处理
";
var path,err,report = string.markdown.toDocx.save("/output.docx",md);
if(!path){
print(err);
return;
}
for i,w in report.warnings print(w.message);
raw.explore(path,"/select");
默认不覆盖已有文件。确实需要替换时,给选项添加 overwrite=true。先生成临时文件,再在目标目录替换;失败不会先清空旧文件。
string.markdown.toDocx(markdown,options):返回 DOCX二进制字符串,err,report。可用 string.save 保存。string.markdown.toDocx.save(path,markdown,options):返回 完整路径,err,report,自动创建输出目录,要求 .docx 后缀。成功时 err 为 null。失败时第一个返回值为 null;失败早期可能没有 report。report.warnings 是 {code;message} 数组;还包含 paragraphCount/tableCount/listCount 计数(列表计数对应生成的编号定义,不等于列表项数)。
两个输出入口都透传公共 writer 的写入限额。默认每部件 16 MiB、总写入 128 MiB;可用 maxPartBytes/maxWriteBytes 显式调整,超限返回错误。二进制入口会读取并删除一个临时 ZIP;save 直接在目标目录提交,不再创建临时 XML 部件目录。
import string.markdown.toDocx;
var options = {
font="Microsoft YaHei";
monoFont="Consolas";
symbolFont="Segoe UI Symbol";
fontSize=11;
codeFontSize=10;
lineSpacing=1.15;
codeLineSpacing=1.15;
pageWidth=11906;
pageHeight=16838;
landscape=false;
margins={left=1440;right=1440;top=1440;bottom=1440};
wideTable="stack";
tableMinColumnWidth=720;
checkboxStyle="unicode";
overwrite=false;
title="文档标题";
author="作者";
colors={inlineCodeBackground=0xEFF1F3};
};
var path,err,report=string.markdown.toDocx.save("/configured.docx","# 配置示例",options);
if(!path) print(err);
landscape=true 可将默认 A4 切换为横向。colors 以 0xRRGGBB 表示。支持 text、muted、link、border、codeBackground、codeText、inlineCode、inlineCodeBackground、tableHeaderBackground、mark。inlineCodeBackground=false 关闭行内代码底色;0x000000 是有效的黑色。checkboxStyle="ascii" 使用 [x] / [ ],适合无法保证符号字体的阅读端。默认 wideTable="stack":列数过多、页面放不下最小列宽,或遇到合并单元格时,按行/列展开为段落,并返回 table-stacked 警告。
wideTable="wrap":优先保留表格并收窄列宽、允许单元格换行。若连基本的字符宽度和内边距都无法容纳,仍会展开;不会产生零宽/负宽单元格。可以配合横向页面。
image-alt 警告。不会下载网络图片,也不会读取 HTML 指向的本地文件。fontawesome 警告。本库使用现有 string.markdown 解析器,不改写其语法。当前解析器会将代码块 TAB 转为四空格;3. item 生成的 <ol> 未保留 start,因此输出编号从 1 开始。如必须指定起始编号,可调用 string.html.toDocx 并使用 <ol start="3"> / <li value="7">。
完整可运行范例:~/examples/Text/Markdown/md2docx.aardio。
HTML 子集入口详见 string.html.toDocx。DOCX 库与现有 RTF 库独立,原来的调用不受影响。
实际兼容性验证覆盖本机 Windows 11 + Microsoft Word 16;不把它等同于所有版本 Word、WPS、LibreOffice 或 macOS 的测试结论。