跳到正文

ADR-0051:不可变语义编辑与可查询损失报告 ​

状态:已采纳。

背景 ​

Builder 只解决初始编写。导入后的增删、移动、图文修改和跨运行替换需要保留同一棵语义树;把内容转成普通文字会丢失字段、图片、链接和表格来源。警告可见性也不能代表是否发生损失。

决策 ​

  • 在模型模块增加 model.edit,不引入布局、字体或文件后端依赖。标准模型保持不可变,未修改的块继续复用;自定义 Block 仍是调用方可信对象。
  • DocumentEditor 接受 Document、PageDocument 和 SectionedDocument。操作按声明顺序构造候选;全树 ID、表格覆盖、Unicode、字段、列表及显式传入的 Note 在发布候选前验证。中间步骤允许暂时悬空引用,但最终不能悬空。
  • 预检执行有界的纯模型变换并保存确切候选;Prepared.execute() 发布该候选,不接收另一个输入,也不再次执行编辑逻辑。两者均不代表后续文件 I/O 成功。
  • model.processing 提供共享动作、处理方式、位置和报告值。动作优先级为逐操作、逐功能、逐格式、默认;默认 ERROR。WARN 和 IGNORE 采用相同处理,后者只抑制警告。
  • 跳过匹配、整块和整次请求分别定义。整块在内联格中指拥有该格的 Table;块格内段落以自身为块。跳过会撤销相应范围的暂存修改和损失。返回的 issues、losses 和 skipped 始终可查询。
  • 文字匹配为区分大小写、非重叠的字面匹配,不跨段落。跨同样式/同链接运行直接支持;跨不同运行默认失败,明确 DEGRADE 时继承首运行的完整样式与链接。图片、字段和部分字素簇只允许跳过,不能通过降级消费。
  • 字素边界由 Java 21 的 Pattern \X 确定;所有文字及运行须有合法代理对。不将这一入口推广为任意脚本的语义分词或字体塑形保证。
  • 明确的删除、样式修改等是调用方请求的变化,另列 changes。为完成请求而发生的非预期样式/链接继承才列损失。不通过 WARN/IGNORE 放行结构、引用、预算、取消、超时和执行失败。

边界 ​

共享策略值是后续导入和转换的基础,尚不改变旧 Web/DOCX 入口。自定义块只可在原模型中保留,不由此获得任意后端的原样写回能力。Note 必须显式提供;导航、批注和表单等独立引擎配置不在模型编辑结果内,调用方重新导出时仍需提供并验证。

证据见编辑 API与阶段四十四。