跳到正文

ADR-0030:组件文字的逐属性继承 ​

日期:2026-10-16。状态:已采纳。实现与验收分别记录,不以决策状态代替验收结果。

背景 ​

阶段十九已把正文默认样式传入组件树,但 .style(callback) 生成一个完整的显式 ParagraphStyle。只设置居中也会固定本地默认字号、行距和缩进;调用方需要重复父级格式。不能通过 12 pt、零缩进或黑色等数值判断设置意图,也不能改变既有完整样式调用的行为。

决策 ​

TextInheritance 保存不可变的逐属性声明集合,覆盖 ParagraphStyle 的字号、固定行距、首行缩进、后续行缩进、对齐及断行策略。保留两参数构造及 NONE/ALL。完整显式样式不同时保存部分声明;逐项恢复继承时,其他五项保持原来的显式意图。

标准文字组件、StyleScope 与网格格 Builder 统一提供六项具名设置和对应 inheritXxx()。部分设置以实际布局上下文为基底,只覆盖已声明属性;解析产生完整 ParagraphStyle 后进入既有测量/分页路径。颜色仍独立声明。包内构建状态复用以保持入口一致,公共签名不引入第三方类型。

.style(value) 与 .style(callback) 继续固定完整样式;之后的 .fontSize(...) 不会自动恢复其他项的继承。.inheritStyle() 清除全部本地文字属性声明;单项恢复只清除所选属性。toBuilder()、网格默认值与逐行快照保留完整声明意图。直接旧构造器仍完全显式。

只改字号不调整继承的行距;无上下文时也继承组件上下文的 12 pt/18 pt 默认样式。固定行框放不下真实字体或图像时明确失败。ParagraphStyle.Builder.fontSize(...) 的本地行距默认策略保持原契约,两种构建入口承担不同职责。

影响 ​

父级可集中设行距、缩进和断行;子级可直接声明字号或对齐,嵌套作用域、短区域、合并格续排、浮动绕排和静态表单使用同一个解析结果。相同数值但不同声明意图仍不相等;style() 返回本地配置,不是脱离上下文计算的有效样式。

不增加自动行高、主题角色、字体角色级联、语义块格式级联或 AcroForm 样式,也不改变布局算法。已构建语义 Table/Paragraph 的格式仍显式。TextInheritance 新增 record 分量改变反射/解构/哈希结构;保留旧构造调用的源码兼容,未发布阶段不承诺二进制兼容。

考虑的替代方案 ​

不改现有回调为部分样式,因为这会改变已有文档几何;不根据默认数值猜测声明,因为显式零/12 pt/LEFT 同样有效;不保存布局时重放的回调,因为它可能携带可变状态、产生非确定结果。也不引入公共泛型 Builder 框架,包内构建状态已经足以保持一致。

验证 ​

验证实际布局、显式默认值、调用顺序、逐项恢复、嵌套隔离、不可变集合、旧入口、网格默认值/工厂/快照、短首区与跨页、OpenType/静态控件及最终页码。独立 PDF 检查字号、颜色、缩进、基线间距、表头重复、来源与尾部;SVG 检查顺序。公开坐标另由隔离 Maven 调用方验证,全部新页双渲染与逐页复查,不刷新历史基线。