docs: 同步 Doc 文档与当前代码状态
- 更新模块文件数(EPUBCore 31+2, EPUBTextRendering 13, ReaderView 5, EPUBUI 19) - 更新 Swift 版本(5.10)、iOS 版本(15.0)、行数等基本信息 - 补充新增文件文档(TextAnchor, RenderRequest, WebViewDebug, AssetRepository, TextIndexTable, TextPerformanceSampler, ChapterData, PageInteractionController 等) - 更新 RDEPUBLocation 模型(新增 rangeAnchor 字段) - 更新 RDEPUBReaderConfiguration(13 项配置)、Delegate 签名、Persistence(8 方法) - 修正 RDURLReaderController 归属(ReaderView → EPUBUI) - 移除过时的 LegacyRDReaderController 引用 - 标记 SS→RD 命名迁移为已完成
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
## 1. 范围与目标
|
||||
|
||||
- 代码范围:`Sources/RDReaderView/EPUBTextRendering/`(9 个 Swift 文件)
|
||||
- 代码范围:`Sources/RDReaderView/EPUBTextRendering/`(13 个 Swift 文件)
|
||||
- 目标:说明文本渲染路径如何将 EPUB HTML 转换为 NSAttributedString、按字符范围分页、构建书籍模型,并支持全文搜索与 textReflowable 标注定位。
|
||||
- 主链路关键词:`RDEPUBParser HTML -> DTCoreText 渲染 -> 片段标记注入/提取 -> CoreText 分页 -> RDEPUBTextBook -> 页面查找/位置转换`。
|
||||
- 适用范围:仅用于 `textReflowable` 阅读配置文件(纯文本可重排 EPUB,如小说)。固定版式和交互式 EPUB 使用 WebView 渲染路径。
|
||||
@@ -64,6 +64,14 @@
|
||||
- 在已渲染的 NSAttributedString 纯文本上执行线性搜索
|
||||
- 返回 `RDEPUBSearchMatch` 数组(含 href、progression、预览文本、匹配位置)
|
||||
|
||||
### 2.6.1 章节数据模型 `RDEPUBChapterData`
|
||||
|
||||
- 文件:`EPUBTextRendering/RDEPUBChapterData.swift`
|
||||
- 职责:
|
||||
- 每章节的数据聚合模型,管理高亮、搜索结果和页面查询
|
||||
- 支持按页码范围过滤当前页的高亮列表
|
||||
- 支持搜索结果在章节内的定位和匹配索引计算
|
||||
|
||||
### 2.7 CoreText 分页引擎 `RDEPUBTextLayouter` / `RDEPUBTextLayoutFrame`
|
||||
|
||||
- 文件:`EPUBTextRendering/RDEPUBTextLayouter.swift`、`EPUBTextRendering/RDEPUBTextLayoutFrame.swift`
|
||||
@@ -80,6 +88,28 @@
|
||||
- 将纯文本按段落切分后渲染为 NSAttributedString
|
||||
- 按页面尺寸分页,输出与 EPUB 文本路径一致的书籍模型
|
||||
|
||||
### 2.9 文本索引表 `RDEPUBTextIndexTable`
|
||||
|
||||
- 文件:`EPUBTextRendering/RDEPUBTextIndexTable.swift`
|
||||
- 职责:
|
||||
- 构建全书的文本结构映射:章节起始偏移、href 与章节/spine 索引对应、fragment 偏移映射、行列索引映射
|
||||
- `RDEPUBRowColumnIndex`:行-列索引条目,记录每行的字符范围
|
||||
- 支持锚点与位置之间的双向转换:
|
||||
- `anchor(forAbsoluteIndex:in:)`:绝对索引 → 文本锚点
|
||||
- `anchor(for:)`:阅读位置 → 文本锚点(优先 rangeAnchor,其次 fragment/progression)
|
||||
- `absoluteIndex(for:)`:锚点 → 全书绝对索引
|
||||
- `location(for:in:bookIdentifier:)`:锚点/范围锚点 → 阅读位置
|
||||
- 支持页码查找:`pageNumber(for:in:)` 通过锚点定位到对应页面
|
||||
|
||||
### 2.10 性能采样器 `RDEPUBTextPerformanceSampler`
|
||||
|
||||
- 文件:`EPUBTextRendering/RDEPUBTextPerformanceSampler.swift`
|
||||
- 职责:
|
||||
- `RDEPUBTextPerformanceSample`:单章节性能数据(chapterHref、renderDuration、paginateDuration、pageCount、attributedStringLength、cacheHit)
|
||||
- `RDEPUBTextPerformanceSampler`:书籍构建过程的性能采样器
|
||||
- 由 `RDEPUBTextBookBuilder` 在构建过程中使用,每章记录一个采样点
|
||||
- `summary()` 输出汇总报告:总渲染/分页耗时和缓存命中率
|
||||
|
||||
## 3. 主流程(代码级)
|
||||
|
||||
### 3.1 完整渲染-分页流程
|
||||
@@ -295,7 +325,8 @@ RDEPUBTextBook
|
||||
- **内存**:`RDEPUBTextBook` 同时持有 chapters(含完整 attributedContent)和 pages(含子串切片),存在一定程度的内存重复
|
||||
- **后台执行**:`build` 方法在 `DispatchQueue.global(qos: .userInitiated)` 执行,不阻塞主线程
|
||||
- **搜索性能**:线性扫描每章的 `attributedContent.string`,无索引,搜索时间与总文本量线性相关
|
||||
- **无分页缓存**:字号/行高变化时全书重新渲染和分页,无增量更新
|
||||
- **分页缓存**:`RDEPUBTextBookCache` 支持磁盘缓存分页结果,字号/行高变化时优先从缓存恢复
|
||||
- **性能采样**:`RDEPUBTextPerformanceSampler` 记录每章的渲染和分页耗时,支持缓存命中率统计
|
||||
|
||||
## 9. 联调与排查建议
|
||||
|
||||
|
||||
Reference in New Issue
Block a user