ReadViewSDK/.planning/ARCHITECTURE-CONTEXT.md

5.9 KiB
Raw Blame History

架构分析WXRead 参考 vs ReadViewSDK 当前

分析日期: 2026-05-23 分析基础: Doc/WXRead/decompiled-doc.mdDoc/WXRead/resources-doc.mdDoc/WXRead/读书EPUB阅读器实现架构.md 状态: Decisions captured


## 分析范围

对比读书 (WeRead v10.0.3) 逆向架构与当前 ReadViewSDK 项目的结构性差距聚焦四大方向分页引擎集成、CSS 处理、渲染架构、字体系统。

读书 EPUB 渲染的核心架构特征:

  • Path A (EPUB): 纯 CoreText 渲染 — WRPageView.drawRect:CTFrameDraw,不用 UITextView/UILabel
  • 4 级语义断页:WRCoreTextLayouter + WRCoreTextLayoutFrame (语义边界 > 附件边界 > 块边界 > 帧限制)
  • 5 层 CSS 级联:default.css < replace.css < dark.css < EPUB 内嵌 < 用户设置
  • 字符级位置精度:WREpubPositionConverter (fileIndex, row, column) ↔ 全局字符偏移
  • 标注直接在 CTFrame 层叠加绘制,搜索高亮同理
## 已决事项

Area 1: 分页引擎集成P0

决策 说明
RDEPUBTextLayouter 集成到 RDEPUBTextBookBuilder 内部调用 rd_paginatedFrames(size:) 替代旧的 ss_pageRanges(size:),外部 API 不变
分页元数据暴露到 RDEPUBTextPage 新增 metadata: RDEPUBTextPageMetadata 字段(含 breakReason/blockKinds/semanticHints对外暴露分页质量数据
RDEPUBTextChapterPaginationDiagnostic 增强 透传 RDEPUBTextLayoutFrame 的诊断信息
分页缓存 bookID + fontSize + lineHeightMultiple + contentInsets 生成缓存 key缓存完整 RDEPUBTextBook 到磁盘
决策 说明
预处理内联 CSS 渲染前扫描 HTML 中 <link> 标签,从 EPUB 解压目录读取 CSS 内容,注入 <style> 替换 <link>
实现 5 层 CSS 级联 RDEPUBTextStyleSheetBuilder 实现 default < replace < dark < epub-embedded < user 五层合并,使用已定义的 RDEPUBTextStyleSheetPackage/RDEPUBTextStyleSheetLayer

Area 3: CoreText 直接绘制迁移P1 — 大架构变更)

决策 说明
直接替换 UITextView 新实现完全替代 RDEPUBTextContentView,不保留 UITextView 渐进迁移路径
CoreText 原生选区 CTLineGetStringIndexForPosition 坐标 hit test + 自定义选区绘制,不依赖 UITextView 选区
标注渲染CGContext 装饰层 drawRect 中 CTFrameDraw 绘制文本后,遍历当前页 RDEPUBHighlightCGContext 绘制背景矩形highlight/ 下划线underline
搜索高亮CGContext 叠加绘制 不修改底层 attributedString在 drawRect 中根据匹配范围直接绘制高亮背景

Area 4: 字体系统P1 — 延迟到后续版本)

决策 说明
方案:内嵌固定字体集 SDK bundle 内嵌常用中文字体Settings 面板新增字体选择。不做 CDN 动态下载
本版本范围:暂不做 字体切换功能延迟到后续迭代

<canonical_refs>

关键参考文档

WXRead 逆向参考(必须阅读):

  • Doc/WXRead/decompiled-doc.md — 44 个逆向文件的职责说明
  • Doc/WXRead/resources-doc.md — CSS/JS 资源文件清单与职责
  • Doc/WXRead/读书EPUB阅读器实现架构.md — 双渲染引擎架构总览
  • Doc/WXRead/decompiled/WRCoreTextLayoutFrame.m — 跨页避让、装饰元素、搜索高亮实现
  • Doc/WXRead/decompiled/WRCoreTextLayouter.m — 4 级语义断页配置
  • Doc/WXRead/decompiled/WRPageView.m — CoreText 直接绘制参考
  • Doc/WXRead/decompiled/WREpubTypesetter.m — CSS 级联合并参考
  • Doc/WXRead/resources/css/replace.css — 5 层 CSS 参考

当前项目代码(已有的基础设施):

  • Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayouter.swift — 已实现 4 级语义断页,待集成
  • Sources/RDReaderView/EPUBTextRendering/RDEPUBTextLayoutFrame.swift — 帧模型,含 breakReason/semanticHints
  • Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRenderer.swift — 已定义 RDEPUBTextStyleSheetPackage/RDEPUBTextStyleSheetLayer,未完全使用
  • Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift — 当前可能仍在用旧的 ss_pageRanges
  • Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift — UITextView 实现,待替换为 CoreText

</canonical_refs>

<roadmap_mapping>

与现有 Roadmap 的映射

决策 对应 Phase 说明
RDEPUBTextLayouter 集成 Phase 8 (08-02) 分页质量改善的核心
分页元数据暴露 Phase 8 (08-03) 分页诊断输出的一部分
分页缓存 Phase 8 (08-01) 缓存键与失效策略
CSS <link> 内联 Phase 7 范畴外 当前 Roadmap 未覆盖,需新增 phase 或合并到 Phase 8
5 层 CSS 级联 Phase 7 + Phase 8 Phase 7 已完成属性闭环,级联是后续增强
CoreText 直接绘制 v1.2 或 v2.0 超出 v1.1 Roadmap需要独立 milestone
CoreText 原生选区 随 CoreText 迁移 同上
标注 CGContext 绘制 随 CoreText 迁移 同上
字体系统 未来版本 延迟

关键发现: CoreText 直接绘制迁移是最大的架构变更,超出 v1.1 的增量改进范围。建议作为 v1.2 独立 milestone 规划。

</roadmap_mapping>

## 延迟事项
  • 字体系统:内嵌固定字体集方案已决,延迟到后续版本
  • 位置精度提升字符级锚点P2与 CoreText 迁移关联
  • 章节数据模型内聚WRChapterData 模式P2架构清晰度改进
  • TTS / DRM / Pencil / 多栏排版P3独立功能模块
  • 翻页控制器健壮性UIPageViewController crash patchP2当前未遇到相关崩溃

分析范围WXRead 逆向文档 → ReadViewSDK 架构差距 产出4 个 Area、14 项决策、1 项延迟