feat(wxread): align pagination, rendering, and docs
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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 文件到屏幕像素的每一步。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user