ReadViewSDK/.planning/phases/03-page-metadata-pagination/03-PATTERNS.md

3.4 KiB
Raw Blame History

Phase 3: 重构属性体系与复杂分页器 - Pattern Map

Goal

为 Phase 3 执行提供“先看哪里、怎么保持兼容”的最短路径。这个阶段的关键不是改 reader UI而是扩展 page metadata 并把 paginator 从纯 range slicing 升级为可表达页面语义的内部 layouter。

Planned Outputs

Planned file Role Primary evidence Why this is the right analog
.planning/phases/03-page-metadata-pagination/03-01-PLAN.md 页面级 attributed string 元数据与属性键实现计划 Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift, Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift, Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRenderer.swift 这些文件共同定义 page/chapter contract、range info、fragment offsets 与 renderer output。
.planning/phases/03-page-metadata-pagination/03-02-PLAN.md 复杂分页器与 layouter/frame 重构计划 Sources/RDReaderView/EPUBTextRendering/RDEPUBTextPaginationSupport.swift, RDEPUBTextBookBuilder.swift 当前所有分页都在这里Phase 3 必须从这条路径升级,而不是另起 reader shell。
.planning/phases/03-page-metadata-pagination/03-03-PLAN.md 复杂块元素/图片分页验证计划 ReadViewDemo/ReadViewDemo/book/*.epub, ReadViewDemo/ReadViewDemo/ViewController.swift, RDEPUBTextContentView.swift 需要真实样本和现有 demo 入口来证明分页语义变强但 offset compatibility 没坏。

Code Evidence Map

Concern Closest source of truth Evidence to extract
当前 page model 的边界 Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift RDEPUBTextPage / RDEPUBTextChapter 当前只有 offsets、ranges、fragmentOffsets。
当前 paginator 的真实实现 Sources/RDReaderView/EPUBTextRendering/RDEPUBTextPaginationSupport.swift CTFramesetterCreateFrame + CTFrameGetVisibleStringRange 的纯 slicing 逻辑。
位置/导航如何依赖 offsets Sources/RDReaderView/EPUBCore/RDEPUBReadingSession.swift pageIndex(for:)、pending navigation、href/progression 到 page 的映射。
高亮/选区如何依赖 offsets Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift, Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift RDEPUBTextOffsetRangeInfopageStartOffset/pageEndOffset 的 overlap 计算。
搜索如何依赖 chapter text continuity Sources/RDReaderView/EPUBTextRendering/RDEPUBTextSearchEngine.swift chapter-level attributed string 搜索 + rangeLocation/rangeLength。
复杂块元素/图片验证入口 ReadViewDemo/ReadViewDemo/book/, ReadViewDemo/ReadViewDemo/ViewController.swift 现有 demo 与样本 corpus 已经是可运行回归入口。

Writing Guidance

  • 计划必须把 “metadata first, paginator second, validation third” 的顺序写清楚,避免把所有变更压进一个 plan。
  • 任何新分页语义都要同时写出 “增强点” 和 “必须保留的 offset invariant”。
  • 如果引入内部 layouter / layout-frame 类型,职责要落在 EPUBTextRendering 内部,不要扩散到 RDEPUBReaderController
  • 验证计划除了 demo/run还要有源代码断言确保 metadata 与 page-edge reason 真正落盘到模型里。