feat(wxread): align pagination, rendering, and docs

This commit is contained in:
shen
2026-05-24 15:36:01 +08:00
parent a318c0e3d0
commit 2a94921e88
103 changed files with 6124 additions and 4623 deletions
@@ -1,6 +1,6 @@
# 微信读书 EPUB 阅读器 — 核心架构与数据流图
# 读书 EPUB 阅读器 — 核心架构与数据流图
> 逆向工程目标: WeRead v10.0.3 (Build 79), arm64, 63MB 主二进制
> 目标: WeRead v10.0.3 (Build 79)
---
@@ -10,12 +10,11 @@
```
┌─────────────────────────────────────────────────────────────────────┐
│ WeRead.app (iOS/macOS Catalyst) │
│ 主二进制: 63MB, Mach-O arm64 │
│ WeRead.app (iOS/macOS Catalyst) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 主二进制 (WeRead) │ │
│ │ WeRead │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │
│ │ │ 阅读器模块 │ │ 书架模块 │ │ 其他业务模块 │ │ │
│ │ │ WRReader* │ │ WRBookshelf* │ │ WRDiscover/WRMarket │ │ │
@@ -216,7 +215,7 @@ WRReaderViewController (431 methods, 阅读器主控制器)
```
┌──────────┐ HTTPS ┌──────────────────────────────────────────────────┐
微信读书 │─────────────→│ ① WRBookNetwork.loadTarForEpubBookId:chapter: │
│ 读书 │─────────────→│ ① WRBookNetwork.loadTarForEpubBookId:chapter: │
│ 服务器 │ 加密 ZIP │ isPreload: │
│ │ {bookId}_ │ ↓ │
│ │ DECRYPT.zip │ ② WRBookNetwork.handleUnzipWithBookId: │
@@ -1,4 +1,4 @@
# 微信读书 EPUB 阅读器 — 符号恢复与核心算法
# 读书 EPUB 阅读器 — 符号恢复与核心算法
> 基于 WeRead v10.0.3 (Build 79) 二进制逆向
> 方法签名来源: __objc_methname 段 + binary strings
@@ -254,7 +254,7 @@ def cascade_stylesheets(default_css: str, replace_css: str, dark_css: str,
Args:
default_css: Safari 默认样式 (default.css)
replace_css: 微信读书默认替换 (replace.css)
replace_css: 读书默认替换 (replace.css)
dark_css: 暗黑主题 (dark.css)
epub_css: EPUB 书籍内嵌 CSS
user_settings_css: 用户自定义设置 (字号/行高/主题)
@@ -295,7 +295,7 @@ def cascade_stylesheets(default_css: str, replace_css: str, dark_css: str,
# 按优先级逐层合并
result = parse_css(default_css) # 层1: 基础
result = merge(result, parse_css(replace_css)) # 层2: 微信读书默认
result = merge(result, parse_css(replace_css)) # 层2: 读书默认
result = merge(result, parse_css(dark_css)) # 层3: 暗黑主题
result = merge(result, parse_css(epub_css)) # 层4: EPUB 内嵌
result = merge(result, parse_css(user_settings_css)) # 层5: 用户设置 (最高优先级)
@@ -630,7 +630,7 @@ def convert_hans_to_hant(attributed_string: str) -> str:
# OpenCC: opencc_convert("s2t", text)
# 简化实现: 使用 Unicode 码点映射表
# 微信读书内部可能使用腾讯自研的繁简转换库
# 读书内部可能使用腾讯自研的繁简转换库
conversion_table = load_hans_to_hant_table() # ~8000 个映射
result = []
@@ -1,9 +1,6 @@
# 微信读书 EPUB 阅读器 — 数据结构与 API 协议定义
> 基于 WeRead v10.0.3 (Build 79) 逆向工程
> 数据结构来源: __objc_methtype + class_ro_t ivar 段
> API 来源: WRBookNetwork 44 个 class method 签名
# 读书 EPUB 阅读器 — 数据结构与 API 协议定义
> 基于 WeRead v10.0.3 (Build 79)
---
## 一、关键数据结构定义 (Header Files)
@@ -129,7 +126,7 @@ typedef NS_ENUM(NSInteger, WRChapterFormat) {
// 表格
@property (nonatomic, strong) DTTableStyle *tableStyle; // 表格样式
// 微信读书自定义属性
// 读书自定义属性
@property (nonatomic, assign) NSInteger verticalCenterStyle; // wr-vertical-center-style
@property (nonatomic, assign) BOOL pageRelate; // weread-page-relate
@property (nonatomic, assign) BOOL avoidPageBreakInside; // 断页保护
@@ -185,7 +182,7 @@ typedef NS_ENUM(NSInteger, WRChapterFormat) {
@property (nonatomic, assign) CGFloat maximumLineHeight; // 最大行高
@property (nonatomic, assign) CGFloat lineHeightMultiple; // 行高倍数
// 微信读书扩展
// 读书扩展
@property (nonatomic, assign) CGFloat defaultTabInterval; // 默认制表位
@end
@@ -809,7 +806,7 @@ NSString *const kWRUserVidKey = @"com.weread.user.vid";
### 3.4 NSAttributedString 自定义属性键
```objc
// 微信读书在 NSAttributedString 中注入的自定义属性
// 读书在 NSAttributedString 中注入的自定义属性
// 用于在排版结果中传递页面布局元数据
NSString *const DTPageBackgroundColorAttribute = @"DTPageBackgroundColor";
+10 -10
View File
@@ -1,6 +1,6 @@
# CSS/JS/字体资源分析
本文档对微信读书 EPUB 阅读器的前端资源文件进行全面分析,涵盖 CSS 样式表、JavaScript 脚本和字体文件。
本文档对读书 EPUB 阅读器的前端资源文件进行全面分析,涵盖 CSS 样式表、JavaScript 脚本和字体文件。
---
@@ -8,7 +8,7 @@
### 1.1 样式层叠架构
微信读书的 CSS 采用分层架构:
读书的 CSS 采用分层架构:
```
default.css (基础HTML样式)
@@ -46,7 +46,7 @@ Safari 派生的基础 HTML 默认样式,为 WebView 渲染提供标准化起
**路径**: `output/resources/css/replace.css` (172行)
EPUB 内容的核心替换样式,定义了微信读书特有的排版规则。
EPUB 内容的核心替换样式,定义了读书特有的排版规则。
**字体设置**:
- 标题和版权页使用 `"SourceHanSerifCN-Medium"` 字体
@@ -62,7 +62,7 @@ EPUB 内容的核心替换样式,定义了微信读书特有的排版规则。
| `.fifthTitle` | 1.05em | normal |
| `.sixthTitle` | 1em | normal |
**微信读书自定义CSS属性**:
**读书自定义CSS属性**:
```css
/* 垂直居中样式 - 值2用于正文图片 */
@@ -545,7 +545,7 @@ getAllForwardLinks()
// 转换H5链接为原生数据属性
transferH5Link()
// 解密微信读书加密链接
// 解密读书加密链接
WRLink_decrypt(str)
// type '3' = 数字
// 其他 = 十六进制编码文本
@@ -573,7 +573,7 @@ document.addEventListener("selectionchange", debounce(function(e) {
#### 2.4.1 rangy-highlighter.js (711行)
Rangy 高亮器模块,带微信读书自定义修改。
Rangy 高亮器模块,带读书自定义修改。
**CharacterRange 类**:
```javascript
@@ -1099,7 +1099,7 @@ line-height: 30px;
## 四、关键发现与实现细节
### 4.1 微信读书自定义CSS属性
### 4.1 读书自定义CSS属性
**wr-vertical-center-style**:
-`1``.wr-vertical-center` 类,强制垂直居中
@@ -1137,7 +1137,7 @@ resultIframe.src = 'wereadapijs://private/setresult/' + scene + '&' + encodedDat
2. `rangy-textrange.js` - 字符级范围操作(支持图片文本)
3. `rangy-classapplier.js` - CSS类应用
4. `rangy-highlighter.js` - 高亮管理(序列化/反序列化)
5. `weread-highlighter.js` - 微信读书业务逻辑
5. `weread-highlighter.js` - 读书业务逻辑
**标注持久化**:
```javascript
@@ -1278,13 +1278,13 @@ RE.insertBook = function(id, title, author, cover) {
## 六、总结
微信读书的前端资源架构体现了以下设计特点:
读书的前端资源架构体现了以下设计特点:
1. **分层样式系统**:通过 default.css → replace.css/MediaPlatform.css → dark.css 的层叠,实现内容类型和主题的灵活切换
2. **原生桥接机制**WeReadApi.js 通过 iframe URL scheme 实现 JS 与原生的高效通信,支持异步回调
3. **扩展的Rangy库**:在标准 Rangy 基础上添加了图片文本支持、高亮合并、序列化等微信读书特有功能
3. **扩展的Rangy库**:在标准 Rangy 基础上添加了图片文本支持、高亮合并、序列化等读书特有功能
4. **完整的标注系统**:支持高亮、想法、好友想法、引用、TTS五种标注类型,每种有独立的样式和交互
@@ -1,6 +1,6 @@
# DTCoreText 自定义修改分析
微信读书 (WeRead) 基于开源 DTCoreText 库进行了深度定制,将其从一个通用的 HTML-to-NSAttributedString 转换库改造为一套完整的电子书分页渲染引擎。本文档详细记录所有自定义修改。
读书 (WeRead) 基于开源 DTCoreText 库进行了深度定制,将其从一个通用的 HTML-to-NSAttributedString 转换库改造为一套完整的电子书分页渲染引擎。本文档详细记录所有自定义修改。
---
@@ -1,6 +1,6 @@
# EPUB 渲染管线详解
微信读书 (WeRead) 的 EPUB 渲染管线将原始 XHTML 文件转换为可分页、可交互的阅读视图。本文档完整描述从 EPUB 文件到屏幕像素的每一步。
读书 (WeRead) 的 EPUB 渲染管线将原始 XHTML 文件转换为可分页、可交互的阅读视图。本文档完整描述从 EPUB 文件到屏幕像素的每一步。
---