# 写包基础工具

`import fsys.openXml.writer;` 可独立使用，不加载 OpenXML 读取器、MSXML、Office 或 .NET。

`write(path,parts,options)` 输入部件数组，每项 `{name,data,level}`；data 是字符串/buffer 或返回字节串的无参数函数。必须有 `[Content_Types].xml` 与 `_rels/.rels`，两项在 ZIP 中首先写入；其他部件按输入顺序。

- 使用 `fsys.openXml.uri` 校验名称，拒绝大小写等价重复、越界和非法百分号转义。
- level 为 0～9，0 STORE，其他 Deflate，默认 6。
- 默认不覆盖；`overwrite=true` 显式覆盖；`protectPaths` 数组保护源件/别名，提交前再次核对。
- 默认 `maxEntries=10000,maxPartBytes=16777216,maxWriteBytes=134217728`；最高 100000、128 MiB、1 GiB。
- 每件数据完全读入内存，检查公共 zlib.zip 写入/关闭返回值；最终同目录临时 ZIP 提交，失败清理，不提前删除旧目标。
- 成功返回完整路径，失败 null,err；不是内容类型、关系图或 XSD 全面校验器，调用者负责语义。

`escape(text)` 转义 XML 文本/属性的 UTF-8 内容，拒绝 XML 1.0 禁止字符与无效编码；已有实体字符串也按原样转义。

```aardio
import fsys.openXml.writer;
var text,err=fsys.openXml.writer.escape("中文 & <tag>");
if(text===null) return null,err;
return text;
```

纯 PPTX 生成使用 [pptx.builder](../pptx/builder/index.html)，不要为了写 ZIP 自行调用底层 zip API。
