ADR-0030: ODF 原生语义 Flash 解析
历史决策记录:保留当时的背景、状态和设计。当前接口与实现归属以 开发入口 和现行规范为准;文中的历史模块路径不保证仍存在。
状态: Accepted,已实现 日期: 2026-08-26 相关文档: ../architecture.md, 0022-doclib-file-type-tier-remote-semantics.md, 0024-file-type-tier-normalization.md
背景
ODT、ODS、ODP 是 ZIP/XML 形式的 OpenDocument 文档。经 LibreOffice 转为 OOXML 会引入外部进程、部署差异和转换损失;把 ODF 交给 CSV、RTF 或 OOXML converter 也会破坏既有格式边界。
决策
- 在
model/flash/office/odf/内直接解析 ODF package、样式、正文、表格、图片、MathML 和图表对象,不依赖外部 Office 套件或第三方文档转换运行时。 FileSuffix、OfficeSuffix和OFFICE_EXTENSIONS追加odt、ods、odp;三个格式经独立OdtModel、OdsModel、OdpModel进入既有analyze_office()与 Middle JSON 2.0 链路。- CSV 继续由独立
analyze_csv()路由,RTF 继续使用原有 lexer/parser/converter;ODF 变更不得重构既有 converter。 - 内容识别顺序保持 PDF、RTF、OOXML 的既有优先级,再检查 ODF
mimetype和 manifest;ODF 是强内容类型,优先于.csv扩展名兜底。 - ODT 按显式分页和 master-page 切分逻辑页,ODP 每张 slide 一页,ODS 每个可见 sheet 一页。三者固定记录
effort="flash"、parse_mode="txt"。 - 加密包不支持;宏、脚本和外部对象不执行或下载。ZIP、XML、表格展开和资源字节均使用固定上限。
结构能力
- ODT 保留标题、段落、富文本、列表、链接、书签、表格、图片、MathML、脚注和页眉页脚。
- ODP 保留 slide 边界、标题、shape 文本、列表、表格、图片、图表和 speaker notes。
- ODS 保留可见 sheet、离散数据区、合并单元格、typed cached value、图片和图表;隐藏 sheet 不输出。
- 图表优先使用 series 的精确范围,只有唯一非空内嵌表时才安全回退;可恢复时同时保留预览和 HTML 数据表。
兼容性
- Middle JSON schema 版本、Block 类型、renderer 和 ParseResult 不变,只扩展合法
file_suffix值。 ott/ots/otp、fodt/fods/fodp、密码解密和像素级版式恢复不属于本决策。- 现代 CLI、API Server、mineru-kit 和 doclib 自动继承 ODF;旧
cli_old不在范围内。