ReadViewSDK/Doc/ARCHITECTURE-CONTEXT.md

116 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构分析WXRead 参考 vs ReadViewSDK 当前
**分析日期:** 2026-05-23
**分析基础:** `Doc/WXRead/decompiled-doc.md`、`Doc/WXRead/resources-doc.md`、`Doc/WXRead/读书EPUB阅读器实现架构.md`
**状态:** Decisions captured
---
<domain>
## 分析范围
对比读书 (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 层叠加绘制搜索高亮同理
</domain>
<decisions>
## 已决事项
### 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` 到磁盘 |
### Area 2: CSS `<link>` 外部样式表处理P0
| 决策 | 说明 |
|------|------|
| 预处理内联 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 动态下载 |
| 本版本范围:暂不做 | 字体切换功能延迟到后续迭代 |
</decisions>
<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>
<deferred>
## 延迟事项
- **字体系统**:内嵌固定字体集方案已决,延迟到后续版本
- **位置精度提升**字符级锚点P2与 CoreText 迁移关联
- **章节数据模型内聚**WRChapterData 模式P2架构清晰度改进
- **TTS / DRM / Pencil / 多栏排版**P3独立功能模块
- **翻页控制器健壮性**UIPageViewController crash patchP2当前未遇到相关崩溃
</deferred>
---
*分析范围WXRead 逆向文档 → ReadViewSDK 架构差距*
*产出4 个 Area、14 项决策、1 项延迟*