# Phase 7: WXRead 自定义属性闭环 - Patterns ## Reusable Patterns ### Renderer support 已经是语义收口点 - `Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift` 已负责 HTML 预处理、CSS layer 注入、fragment marker 注入和属性归一化。 - 新的 WXRead 语义应优先在这里被提取、标准化并写成统一属性键,而不是散落到 controller 或 view 层。 ### Page metadata 已经是分页结果的公开契约 - `Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift` 的 `RDEPUBTextPageMetadata` 已经对外承载 `breakReason`、`blockRange`、`attachmentKinds` 和 `diagnostics`。 - 新增块类型、附件垂直居中、强制分页、avoid-break 命中等信息时,应继续沿用这个页级元数据汇总口。 ### Layouter 已经掌握分页边界决策 - `Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayouter.swift` 当前决定 attachment boundary、block boundary 和 frame limit。 - 所有“是否提前断页 / 是否避免截断 / 是否记录强制分页原因”的规则都应该在这里收敛,而不是后置到 UI 层补判断。 ### BookBuilder 已经是诊断出口 - `Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift` 会把 frame 元数据提升为 chapter/page,并产出 chapter 级诊断摘要。 - Phase 7 的复杂块分类与附件语义诊断最适合从这里向 demo 和后续回归路径暴露。 ## Closest Existing Analogs - `rdPageAttachmentKind` 是附件语义的最近现有 analog,但只区分 `image/generic`,不够承载 WXRead 风格值。 - `rdPageBlockRange` / `rdPageBlockIndex` 是块级语义的最近现有 analog,可以在此基础上继续引入 block kind 与分页 hint。 - `RDEPUBTextChapterPaginationDiagnostic.sampleNotes` 是最接近“可比对证据”的现有出口,适合扩展为 Phase 7 的语义诊断摘要。 ## Design Guardrails - 不直接搬运读书私有 DTCoreText 魔改实现;只复用公开文档中可验证的语义与行为目标。 - 继续沿用现有 chapter preprocessing、DTCoreText renderer contract 和 page offset 兼容语义。 - 新属性必须可观测:要么进入 attributed string 属性键,要么进入 page metadata / diagnostics,不能只存在于瞬时局部变量。 - 不把 Phase 7 扩展成分页质量全面重写;复杂质量收敛和缓存仍属于 Phase 8。