ADR-0085:XML 页区共享来源与模型保存
状态:已采纳。
背景
模型允许同类页区的相等来源在多个节、首页/偶数变体或多个图层位置复用。仅靠根继承无法表达任意节组共享;复制其内容会重复全局块 ID,并重复绑定和计费。因此模型保存需要表达来源共享,同时保留每个位置的独立几何。
决策
扩充现有 version 1 XML 的 header/footer/box,使用可选 source-id 定义完整不可变来源,source-ref 引用前文同类来源。页眉、页脚、背景、前景分别拥有来源命名空间,来源名不占语义块 ID。来源名遵循既有静态 XML ID 语法。
引用只允许指向前文定义,不支持前向、链式别名、循环、跨类或外部来源。引用不能包含子内容、height、gap 或 source-id;header/footer 保留自己的 variant,box 保留自己的 x/y/width。高度及间距来自被引用的完整来源。每个放置位置仍独立验证纸张边界、布局容量及呈现预算。
来源在主源页区声明处编译一次,主题与内容先解析为完整模型值;引用不在使用处重新应用主题。绑定继续使用既有相等来源缓存。源码元素/长度预算照常包含所有引用,源块/文字按唯一来源计费,放置及实际绘制另计。片段、条件和循环不获得声明页区的权限。
XmlTemplateWriter 按四类页区去重,首次写完整定义,后续写引用。保存默认/FIRST/EVEN、显式空对、正高度空区、整层清空、位置/顺序、图片/表格/完整样式和 PAGE/PAGES。新增 from(PageDocument) 直接保存单节带页区文档,分节入口继续保留每节独立声明。
结果
支持的页区可以在严格策略下保存、重开、共享编辑及重导出;诊断保留 HEADER_FIRST/FOREGROUND:index 等真实区域与格路径。没有新增文件类型、模块、依赖或模板解释器。旧语法行为保持;旧编译器无法读取含新增属性的源码,调用方须使用支持此语法的版本。
注释、未映射块及标题/列表外链继续按真实损失策略处理;标准输出内嵌恢复和一般跨格式无损往返继续独立。API 见模型保存,证据见阶段七十九。