ReadViewSDK/.planning/phases/04-reader-capabilities/04-03-PLAN.md

91 lines
5.1 KiB
Markdown

---
phase: 04-reader-capabilities
plan: 03
type: execute
wave: 3
depends_on:
- "04-02"
files_modified:
- Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift
- Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift
- Sources/RDReaderView/RDURLReaderController.swift
- ReadViewDemo/ReadViewDemo/ViewController.swift
autonomous: true
requirements:
- COMP-04
user_setup: []
must_haves:
truths:
- repagination after font, line-height, theme, or viewport changes restores semantic reading state.
- the demo app remains the primary runtime verification entry point.
- `RDReaderView` does not need modification to validate these flows.
artifacts:
- .planning/phases/04-reader-capabilities/04-03-SUMMARY.md
key_links:
- `RDEPUBReaderController.configuration.didSet`
- `RDEPUBReaderController.handleViewportChangeIfNeeded`
- `RDEPUBReaderController.rebuildExternalTextBook`
---
<objective>
验证并收敛字体、行高、主题和 viewport 变化导致的重新分页与状态恢复,让 reader 在 Phase 4 完成后可以稳定承接 repagination。
Purpose: 证明新 native backend 在真实 reader 交互下能够重新分页而不丢失位置、搜索和高亮上下文。
Output: re-pagination/state-restore fixes, plus demo-visible validation hooks or diagnostics where needed.
</objective>
<context>
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/04-reader-capabilities/04-RESEARCH.md
@.planning/phases/04-reader-capabilities/04-PATTERNS.md
@.planning/phases/03-page-metadata-pagination/03-VERIFICATION.md
@Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift
@Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift
@Sources/RDReaderView/RDURLReaderController.swift
@ReadViewDemo/ReadViewDemo/ViewController.swift
</context>
<tasks>
<task type="auto">
<name>Task 1: 收敛 repagination 触发器与状态恢复逻辑</name>
<files>Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift, Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift, Sources/RDReaderView/RDURLReaderController.swift</files>
<read_first>Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift, Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift, Sources/RDReaderView/RDURLReaderController.swift</read_first>
<action>围绕 `configuration.didSet`、`requiresRepagination`、`refreshVisibleContentPreservingLocation`、`rebuildExternalTextBook`、`handleViewportChangeIfNeeded` 和 TXT/native 入口收敛 repagination 行为,使 reader 在设置变化与 viewport 变化后恢复到语义位置,而不是错误页或空状态。</action>
<acceptance_criteria>
- font size / line height changes trigger repagination through semantic location restore
- theme changes refresh visible content without dropping current reader state
- viewport changes do not require `RDReaderView` changes to preserve location
</acceptance_criteria>
<verify>rg -n "requiresRepagination|refreshVisibleContentPreservingLocation|rebuildExternalTextBook|handleViewportChangeIfNeeded|configuration" Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift Sources/RDReaderView/RDURLReaderController.swift</verify>
<done>repagination triggers are stable and state-preserving.</done>
</task>
<task type="auto">
<name>Task 2: 在 demo 中验证 reader-level repagination 与状态恢复</name>
<files>ReadViewDemo/ReadViewDemo/ViewController.swift, Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift</files>
<read_first>ReadViewDemo/ReadViewDemo/ViewController.swift, Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift, ReadViewDemo/ReadViewDemo/book/</read_first>
<action>用现有 demo 入口补充最小但可观察的 reader-level 验证路径或日志,证明 Phase 4 关注的 repagination / location restore / search-highlight continuity 可以被检查。不要新建并行 demo shell。</action>
<acceptance_criteria>
- demo remains the validation entry point
- runtime checks can confirm at least part of the repagination/state-restore behavior
- sample corpus under `ReadViewDemo/ReadViewDemo/book/` remains the verification source
</acceptance_criteria>
<verify>test -d ReadViewDemo/ReadViewDemo/book && rg -n "restore|repagination|search|highlight|location|theme|font" ReadViewDemo/ReadViewDemo Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift</verify>
<done>Phase 4 finishes with a real runtime path to prove state-preserving repagination.</done>
</task>
</tasks>
<verification>
Before declaring plan complete:
- [ ] `rg -n "requiresRepagination|refreshVisibleContentPreservingLocation|rebuildExternalTextBook|handleViewportChangeIfNeeded|configuration" Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift Sources/RDReaderView/RDURLReaderController.swift`
- [ ] `test -d ReadViewDemo/ReadViewDemo/book`
- [ ] `rg -n "restore|repagination|search|highlight|location|theme|font" ReadViewDemo/ReadViewDemo Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift`
</verification>
<output>
After completion, create `.planning/phases/04-reader-capabilities/04-03-SUMMARY.md`
</output>