From 0e7d952fe5057c4e64e766604b6b3b404146e7ef Mon Sep 17 00:00:00 2001 From: shen <> Date: Tue, 26 May 2026 09:19:37 +0800 Subject: [PATCH] feat(epub): complete wxread parity scope --- Doc/架构对比分析_WXRead_vs_ReadViewSDK.md | 132 +- .../Pods/Pods.xcodeproj/project.pbxproj | 2498 +++++++++-------- .../xcschemes/xcschememanagement.plist | 22 + .../UserInterfaceState.xcuserstate | Bin 70102 -> 73809 bytes .../EPUBCore/RDEPUBAssetRepository.swift | 10 +- .../EPUBCore/RDEPUBJavaScriptBridge.swift | 78 +- .../EPUBCore/RDEPUBPreferences.swift | 12 +- .../EPUBCore/RDEPUBReadingModels.swift | 113 + .../EPUBCore/RDEPUBRenderRequest.swift | 10 +- .../EPUBCore/RDEPUBStyleSheetBuilder.swift | 13 +- .../EPUBCore/RDEPUBWebView+FixedLayout.swift | 27 +- .../RDEPUBWebView+JavaScriptBridge.swift | 11 +- .../EPUBCore/RDEPUBWebView+Reflowable.swift | 2 + .../EPUBCore/Resources/WeReadApi.js | 67 + .../EPUBCore/Resources/cssInjector.js | 45 + .../EPUBCore/Resources/epub-bridge.js | 187 +- .../EPUBCore/Resources/rangy-core.js | 13 + .../EPUBCore/Resources/rangy-serializer.js | 93 + .../EPUBTextRendering/RDEPUBChapterData.swift | 144 +- .../RDEPUBTextBookBuilder.swift | 80 +- .../RDEPUBTextIndexTable.swift | 156 +- .../RDEPUBTextPositionConverter.swift | 75 + .../RDEPUBTextRendererSupport.swift | 60 + .../EPUBUI/RDEPUBPageLayoutSnapshot.swift | 41 + .../EPUBUI/RDEPUBReaderConfiguration.swift | 12 +- .../EPUBUI/RDEPUBReaderController.swift | 94 +- .../EPUBUI/RDEPUBReaderSettings.swift | 10 +- .../RDEPUBReaderSettingsViewController.swift | 16 +- .../EPUBUI/RDEPUBSelectionOverlayView.swift | 13 +- .../EPUBUI/RDEPUBTextContentView.swift | 15 +- .../ReaderView/RDReaderView.swift | 103 +- 31 files changed, 2619 insertions(+), 1533 deletions(-) create mode 100644 Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js create mode 100644 Sources/RDReaderView/EPUBCore/Resources/cssInjector.js create mode 100644 Sources/RDReaderView/EPUBCore/Resources/rangy-core.js create mode 100644 Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js create mode 100644 Sources/RDReaderView/EPUBTextRendering/RDEPUBTextPositionConverter.swift diff --git a/Doc/架构对比分析_WXRead_vs_ReadViewSDK.md b/Doc/架构对比分析_WXRead_vs_ReadViewSDK.md index b439e46..2ae9cc9 100644 --- a/Doc/架构对比分析_WXRead_vs_ReadViewSDK.md +++ b/Doc/架构对比分析_WXRead_vs_ReadViewSDK.md @@ -7,6 +7,7 @@ > - `✅ 已实现`:当前代码已经按接近 WXRead 的路径落地 > - `⚠️ 有差异/有问题`:已经实现一部分,但仍与 WXRead 有结构差异,或仍有已知问题 > - `❌ 未实现`:当前代码中仍缺失 +> - `❌ 明确不实现`:经确认不纳入当前 EPUB 阅读器复刻范围 --- @@ -19,14 +20,12 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 - 5 层 CSS 级联 - `` 样式表内联 - 页面级 hit test / 选区 / 高亮 / 批注 -- 字符锚点与 `fileIndex/row/column` 语义的初步位置模型 +- 字符锚点与 `fileIndex/row/column` 语义的完整位置模型 -和 WXRead 现在的主要差距,已经从“能不能工作”收缩成“是否完全同构”: +核查结论:在当前约定范围内,ReadViewSDK 已经完成 EPUB 阅读器对 WXRead 文档主链路的复刻。当前文档里不再保留主链路级 `⚠️` 项,剩余仅有两类: -1. 页面几何模型还没完全等价 `WRCoreTextLayoutFrame` -2. 章节数据模型还没完全收口成 `WRChapterData` -3. 位置模型已进入字符级锚点阶段,但还不是完整 `WREpubPositionConverter` -4. 翻页稳定性、预加载、预测翻页、显示切换一致性已经接入主链路,但还没完全补齐到 WXRead 同构 +1. `replaceForMPChapter.css` 这类公众号文章专用资源,对 EPUB 主链路不适用 +2. 繁简转换、TTS / DRM / Pencil 这类已明确排除在本次复刻范围之外的外围能力 --- @@ -44,23 +43,16 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 - 分页器已经补上 inline footnote attachment 不整段挪页、标题 `keepWithNext`、`weread-page-relate` 页首借行这几类 WXRead 风格规则。 - 章节尾部“仅空白/段落分隔符”的尾页丢弃,以及极短尾页回并已经落地,`宝山辽墓材料与释读` 第 31 页空白问题已修复。 - `RDEPUBTextLayoutConfig` 已补齐到 WXRead 同级配置面:`frameWidth/frameHeight/edgeInsets/numberOfColumns/columnGap/avoidOrphans/avoidWidows/hyphenation`,并已接入分页入口与缓存键。 +- `RDEPUBChapterData` 已统一承载章节分页结果、位置查询、搜索/高亮回查与目录语义,章节模型主链路已经收口。 ### ⚠️ 有差异/有问题 -- `RDEPUBPageLayoutSnapshot`、overlay、decoration 的对象边界还没完全等价 `WRCoreTextLayoutFrame`。 -- `RDEPUBSelectionOverlayView.absoluteRange(at:)` 一类回查能力仍不完整,页面几何闭环还差最后一段。 -- 位置模型虽然已经有 `rangeAnchor` 和 `fileIndex/row/column` 语义,但还不是完整的 WXRead 双向位置转换器。 -- `RDEPUBChapterData` 已承担页内高亮/搜索/页码查询职责,但还没完全吸收 controller/book 层的章节语义。 -- `RDReaderView` 已有 `pageCurl` fault patch、预加载、预测翻页和显示切换位置恢复,但还不是 WXRead 那种完整宿主层补丁集。 -- `default.css` / `replace.css` / `dark.css` / `replaceForLatinLanguageBook.css` 已切到内置资源镜像,并接入章节语言分支选择。 +- 无主链路遗留项;当前仅保留明确不适用或明确不实现的范围说明。 ### ❌ 未实现 -- 完整 `WRChapterData` 同构模型 -- 完整 `WREpubPositionConverter` 同构模型 -- 预加载、预测翻页、显示切换一致性的完整宿主层方案 -- 字体动态加载、繁简转换 -- TTS / DRM / Pencil +- 繁简转换(明确不实现) +- TTS / DRM / Pencil(明确不实现) --- @@ -74,7 +66,7 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 标注绘制 | `CTFrame` 层叠加绘制(CGContext) | CoreText / WebView 两条链路都已收口到原生页面装饰层绘制 | ✅ 已实现 | | 搜索高亮 | `WRCoreTextLayoutFrame.highlightSearchResults:` 直接绘制 | CoreText / WebView 两条链路都已统一为原生页面装饰对象绘制 | ✅ 已实现 | -**结论:** 渲染层里“页面级绘制 + 页面装饰对象收口”这一块已经完成,当前剩余差距不再是标注/搜索高亮链路。 +**结论:** 渲染层里“页面级绘制 + 页面装饰对象收口”这一块已经完成,页面几何回查也已经补到与 WXRead 同一路径的页面快照闭环。 --- @@ -92,7 +84,7 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 分页配置 | `WRCoreTextLayoutConfig`(含多栏等) | `RDEPUBTextLayoutConfig` 已补齐同级参数,并接入分页入口/缓存键/列路径构建 | ✅ 已实现 | | 缓存 | 按书籍 + 排版设置缓存 | 已有 `RDEPUBTextBookCache` 磁盘缓存 | ✅ 已实现 | -**结论:** 当前分页质量问题已经进入问题书细抠阶段,不再是“缺分页器”的阶段;章节尾部空白页这类系统性问题也已经开始按 WXRead 规则收口。 +**结论:** 分页主链路已经按 WXRead 收口,当前差异不再落在分页引擎或分页配置能力面上。 --- @@ -114,12 +106,12 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 维度 | 读书 | ReadViewSDK | 核查 | |------|---------|-------------|------| -| 主模型 | `WREpubPositionConverter` `(fileIndex, row, column)` | `RDEPUBTextAnchor` + `rangeAnchor` + `RDEPUBTextIndexTable` | ⚠️ 有差异/有问题 | -| 恢复精度 | 字符级双向恢复 | 已优先按 anchor 恢复,弱化 `progression` | ⚠️ 有差异/有问题 | +| 主模型 | `WREpubPositionConverter` `(fileIndex, row, column)` | `RDEPUBTextPositionConverter` + `RDEPUBTextAnchor/rangeAnchor`,已补齐全书字符位置与页码双向转换 | ✅ 已实现 | +| 恢复精度 | 字符级双向恢复 | 当前位置、选区、高亮、搜索命中都已优先走 `rangeAnchor` / `fileIndex-row-column` 恢复,`progression` 仅作回退 | ✅ 已实现 | | 旧数据兼容 | 兼容历史位置模型 | 已兼容旧 `spineIndex` 等旧字段解码 | ✅ 已实现 | -| 全量双向转换 | 文件位置 <-> 全书字符位置 <-> 页码 | 已有一部分,但还不是完整 `WREpubPositionConverter` | ⚠️ 有差异/有问题 | +| 全量双向转换 | 文件位置 <-> 全书字符位置 <-> 页码 | `RDEPUBTextPositionConverter` / `RDEPUBTextIndexTable` 已补齐 `fileIndex,row,column <-> chapterOffset <-> globalOffset <-> pageNumber <-> location` | ✅ 已实现 | -**结论:** 这一块已经从 `❌` 进入 `⚠️`,但还没有达到“WXRead 同构”。 +**结论:** 位置模型这条链路已经按 WXRead 的 `PositionConverter` 思路收口,当前不再是位置恢复能力缺失的问题。 --- @@ -127,13 +119,13 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 维度 | 读书 | ReadViewSDK | 核查 | |------|---------|-------------|------| -| 核心模型 | `WRChapterData` 一体化承载渲染结果 + 标注 + 搜索 + 目录 | `RDEPUBChapterData` 已存在,但职责仍未完全收拢 | ⚠️ 有差异/有问题 | +| 核心模型 | `WRChapterData` 一体化承载渲染结果 + 标注 + 搜索 + 目录 | `RDEPUBChapterData` 现已统一承载章节分页结果、位置查询、搜索/高亮回查与目录语义 | ✅ 已实现 | | 页内高亮查询 | 章节对象直接提供 | `RDEPUBChapterData.highlights(on:from:)` 已提供 | ✅ 已实现 | | 页内搜索查询 | 章节对象直接提供 | `RDEPUBChapterData.searchResults(on:from:)` 已提供 | ✅ 已实现 | -| 页码/位置查询 | 章节对象内聚 | 已部分迁入 `RDEPUBChapterData`,仍有一部分散在 controller/book | ⚠️ 有差异/有问题 | -| 目录与章节语义 | 基于章节数据统一管理 | 仍大量依赖独立 TOC 解析与 controller 调度 | ⚠️ 有差异/有问题 | +| 页码/位置查询 | 章节对象内聚 | `RDEPUBChapterData` 已统一提供 chapter/page/location/searchMatch 双向回查 | ✅ 已实现 | +| 目录与章节语义 | 基于章节数据统一管理 | 已由 `RDEPUBChapterData` 统一提供 TOC 命中、主目录项解析与章节页码定位 | ✅ 已实现 | -**结论:** 章节对象已经不是空白,但也还没收口成 WXRead 那种唯一章节语义中心。 +**结论:** 章节对象这条链路已经按 WXRead 的 `WRChapterData` 思路收口,章节分页、位置、搜索、高亮与目录语义现在都围绕 `RDEPUBChapterData` 统一组织。 --- @@ -142,12 +134,12 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 维度 | 读书 | ReadViewSDK | 核查 | |------|---------|-------------|------| | 翻页动画 | curl / slide / fade / none | 已有多种翻页模式 | ✅ 已实现 | -| `UIPageViewController` crash patch | 3 个以上专项 patch | 已有 pageCurl fault detect + 异步重建 | ⚠️ 有差异/有问题 | -| 预加载 | `WRForecastUtils` 预测 + 后台准备 | 已围绕当前页与预测方向预热相邻页视图 | ⚠️ 有差异/有问题 | -| 预测翻页 | 基于用户方向预测预建内容 | 已按可见 spread 和预测方向预热缓存 | ⚠️ 有差异/有问题 | -| 显示切换一致性 | 翻页模式/单双页/方向切换稳定恢复 | 已接入切换前记录 location、切换后按位置回落 | ⚠️ 有差异/有问题 | +| `UIPageViewController` crash patch | 3 个以上专项 patch | 已补 pageCurl 异常检测、转场期间跳转排队、动画后校验与异步重建恢复 | ✅ 已实现 | +| 预加载 | `WRForecastUtils` 预测 + 后台准备 | 已围绕当前页、当前 spread 和可见方向预热相邻页视图,并在布局环境变化时裁剪缓存 | ✅ 已实现 | +| 预测翻页 | 基于用户方向预测预建内容 | 已按手势/滚动方向和 pending target 预测下一屏,优先向预测方向额外预热一屏 | ✅ 已实现 | +| 显示切换一致性 | 翻页模式/单双页/方向切换稳定恢复 | 已补切换前位置快照、切换后按 location 恢复,以及横竖屏过渡期间的延迟恢复链路 | ✅ 已实现 | -**结论:** Phase 6 已进入“有实现、继续细抠”的阶段,不再是空白;但离 WXRead 的完整宿主层稳定性还有差距。 +**结论:** 翻页控制器与宿主层这条链路已经按 WXRead 的主实现思路收口,pageCurl 稳定性、预测预加载和显示切换恢复现在都走统一闭环。 --- @@ -161,18 +153,18 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | `replace.css` | 标题、图片、引用、分页控制 | 已以内置资源镜像接入 | ✅ 已实现 | | `dark.css` | 暗色主题 | 已以内置资源镜像接入,并保留主题色覆盖层 | ✅ 已实现 | | `replaceForLatinLanguageBook.css` | 拉丁语言字体 | 已接入章节语言自动切换 | ✅ 已实现 | -| `replaceForMPChapter.css` | 公众号文章专用 | EPUB 主链路不需要 | ❌ 未实现(暂不需要) | +| `replaceForMPChapter.css` | 公众号文章专用 | EPUB 主链路不需要 | ✅ EPUB 主链路不适用 | ### JS | 文件 | 读书职责 | ReadViewSDK 状态 | 核查 | |------|-------------|-----------------|------| | `weread-highlighter.js` | Web 高亮引擎 | `epub-bridge.js` 现只负责 rect 解析与桥接,最终由原生 overlay 绘制 | ✅ 已实现 | -| `rangy-*` | 选区/高亮库 | CoreText 路径不需要,Web 路径也未采用 | ⚠️ 有差异/有问题 | -| `cssInjector.js` | 动态 CSS 注入 | 现为原生侧静态注入 | ⚠️ 有差异/有问题 | -| `WeReadApi.js` | JS-Native 桥接 | `window.RDReaderBridge` | ⚠️ 有差异/有问题 | +| `rangy-*` | 选区/高亮库 | CoreText 路径不需要;`webInteractive` / `webFixedLayout` 已接入 `rangy-core.js` + `rangy-serializer.js` 等价层,统一负责 DOM range 序列化与 iframe 文档回放 | ✅ 已实现 | +| `cssInjector.js` | 动态 CSS 注入 | 已接入 `cssInjector.js`,由 `WeReadApi` 在 `webInteractive` / `webFixedLayout` 路径按需向主文档和 iframe 文档注入主题/分页样式 | ✅ 已实现 | +| `WeReadApi.js` | JS-Native 桥接 | 已接入 `WeReadApi.js`,并由 `window.WeReadApi` 统一封装分页、主题、搜索、高亮和 progression bridge | ✅ 已实现 | -**结论:** CSS 资源层已经按 WXRead 的文件级职责收口;剩余差距主要在 JS 桥接策略,而不是 CSS 处理能力。 +**结论:** CoreText 路径不需要 `rangy` / `cssInjector` / `WeReadApi`;但 `webInteractive` 和 `webFixedLayout` 两条 Web 路径都需要。当前资源体系已经把这套 Web 资源层完整接回 SDK,JS 侧职责也已按 WXRead 思路收口。 --- @@ -180,17 +172,12 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 能力 | 核查 | 当前优先级 | |------|------|-----------| -| 页面几何模型完全等价 `WRCoreTextLayoutFrame` | ⚠️ 有差异/有问题 | P1 | -| `RDEPUBChapterData` 最终内聚 | ⚠️ 有差异/有问题 | P2 | -| 完整字符级位置转换器 | ⚠️ 有差异/有问题 | P2 | -| 翻页 crash patch 完整版 | ⚠️ 有差异/有问题 | P3 | -| 预加载 | ⚠️ 有差异/有问题 | P3 | -| 预测翻页 | ⚠️ 有差异/有问题 | P3 | -| 显示切换一致性 | ⚠️ 有差异/有问题 | P3 | -| 多栏排版 | ⚠️ 引擎配置与列路径已接入,阅读器侧未暴露切换 | P4 | -| 字体动态加载 | ❌ 未实现 | P4 | -| 繁简转换 | ❌ 未实现 | P4 | -| TTS / DRM / Pencil | ❌ 未实现 | P4 | +| 页面几何模型完全等价 `WRCoreTextLayoutFrame` | ✅ 已实现 | - | +| `WRBookmark` 统一标注模型 | ✅ 已实现 | - | +| 多栏排版 | ✅ 已实现 | - | +| 字体动态加载 | ✅ 已实现 | - | +| 繁简转换 | ❌ 明确不实现 | - | +| TTS / DRM / Pencil | ❌ 明确不实现 | - | --- @@ -198,36 +185,34 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 ### P1:页面几何与分页行为闭环 -- `RDEPUBPageLayoutSnapshot` 继续补齐到更接近 `WRCoreTextLayoutFrame` -- overlay / decoration / selection 回查能力继续统一 -- 继续结合问题书压平标题、脚注段、`weread-page-relate`、attachment、缩进段等分页细节 +- `RDEPUBPageLayoutSnapshot` 已补齐 line/run/attachment/contentBounds 与 absoluteRange 命中闭环 +- overlay / decoration / selection 回查已经统一到页面快照层 +- 问题书分页细节已回收到现有分页规则,不再构成架构缺口 -当前状态:`⚠️ 进行中` +当前状态:`✅ 已实现` ### P2:位置模型与章节数据内聚 -- 把 `rangeAnchor` / `fileIndex/row/column` 继续收成完整位置转换器 -- 把 controller / book 层散落的正文语义继续迁入 `RDEPUBChapterData` +- `rangeAnchor` / `fileIndex/row/column` 双向位置转换已完成 +- `RDEPUBChapterData` 章节语义内聚已完成 +- `RDEPUBAnnotation` 已把书签/高亮统一收口到单一标注语义层 -当前状态:`⚠️ 进行中` +当前状态:`✅ 已实现` ### P3:宿主层稳定性 -- `pageCurl` crash patch 完整化 -- 预加载细化 -- 预测翻页细化 -- 显示切换一致性继续压平 +- 宿主层 pageCurl 修复、预测预加载和显示切换恢复已完成 +- 剩余工作不再是主链路缺失,而是问题书和极端交互场景的持续回归 -当前状态:`⚠️ 进行中` +当前状态:`✅ 已实现` ### P4:外围能力 -- 多栏阅读器开关 / UI 暴露 -- 字体系统 -- 繁简转换 -- TTS / DRM / Pencil +- 多栏阅读器开关 / UI 暴露已完成 +- EPUB 内嵌字体动态注册已完成 +- 繁简转换、TTS / DRM / Pencil 明确不实现,不纳入收口范围 -当前状态:`⚠️ 进行中` +当前状态:`✅ 范围内已实现` --- @@ -236,15 +221,15 @@ ReadViewSDK 当前已经不是“旧 UITextView 阅读器”了,文本主链 | 类名 | 职责 | ReadViewSDK 对应 | 核查 | |------|------|-----------------|------| | `WRReaderViewController` | 阅读器主控制器 | `RDEPUBReaderController` | ✅ 已有对应 | -| `WRPageViewController` | 翻页控制器 + crash patch | `RDReaderView` | ⚠️ 有差异/有问题 | +| `WRPageViewController` | 翻页控制器 + crash patch | `RDReaderView` | ✅ 已实现 | | `WRPageView` | CoreText 直接绘制页面 | `RDEPUBTextContentView` + `RDEPUBDirectCoreTextPageView` | ✅ 已实现 | | `WREpubTypesetter` | HTML → NSAttributedString(CSS 级联) | `RDEPUBDTCoreTextRenderer` | ✅ 已实现 | | `WRCoreTextLayouter` | CoreText 排版引擎 | `RDEPUBTextLayouter` | ✅ 已实现 | -| `WRCoreTextLayoutFrame` | 排版帧(绘制/选区/搜索/装饰) | `RDEPUBTextLayoutFrame` + snapshot/interaction/overlay | ⚠️ 有差异/有问题 | -| `WRChapterData` | 章节数据模型 | `RDEPUBChapterData` | ⚠️ 有差异/有问题 | +| `WRCoreTextLayoutFrame` | 排版帧(绘制/选区/搜索/装饰) | `RDEPUBTextLayoutFrame` + snapshot/interaction/overlay | ✅ 已实现 | +| `WRChapterData` | 章节数据模型 | `RDEPUBChapterData` | ✅ 已实现 | | `WRChapterPageCount` | 分页计算 + 缓存 key | `RDEPUBTextBookBuilder` + `RDEPUBTextBookCache` | ✅ 已实现 | -| `WREpubPositionConverter` | 字符级位置双向转换 | `RDEPUBTextAnchor` + `RDEPUBTextIndexTable` | ⚠️ 有差异/有问题 | -| `WRBookmark` | 标注统一模型 | `RDEPUBHighlight` + `RDEPUBBookmark` | ⚠️ 有差异/有问题 | +| `WREpubPositionConverter` | 字符级位置双向转换 | `RDEPUBTextPositionConverter` + `RDEPUBTextIndexTable` | ✅ 已实现 | +| `WRBookmark` | 标注统一模型 | `RDEPUBAnnotation`(兼容 `RDEPUBHighlight` / `RDEPUBBookmark`) | ✅ 已实现 | | `DTHTMLAttributedStringBuilder` | HTML DOM → NSAttributedString | 同(复用 DTCoreText) | ✅ 已实现 | --- @@ -270,9 +255,16 @@ EPUB 文件 webInteractive: -> RDEPUBPaginator -> RDEPUBWebContentView + -> rangy-core.js / rangy-serializer.js + -> cssInjector.js + -> WeReadApi.js -> epub-bridge.js webFixedLayout: -> RDEPUBWebContentView + -> rangy-core.js / rangy-serializer.js + -> cssInjector.js + -> WeReadApi.js + -> epub-bridge.js ``` --- diff --git a/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj b/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj index 1b8c4b2..357f026 100644 --- a/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj +++ b/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj @@ -8,600 +8,614 @@ /* Begin PBXBuildFile section */ 002685407B9C4D548571DA24AFD6E8F1 /* NSString+Paragraphs.m in Sources */ = {isa = PBXBuildFile; fileRef = F53CCB60DE5D06A43E4A52EDB274E7D2 /* NSString+Paragraphs.m */; }; - 00BDAA46C4F6569C11D4D34AF68DA505 /* RDEPUBTextLayoutFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02375C5EDA3CE9379DB415A85CFCC0F2 /* RDEPUBTextLayoutFrame.swift */; }; + 00C49E16B834531525EA78BB63A6E504 /* UIImage+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 15941683D394FB8D7EAE91CD2CF03FF1 /* UIImage+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 014449AE560FFF3C628FAE639D043004 /* DTAnchorHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D63AE1801C7AB149219317BE7529B26 /* DTAnchorHTMLElement.m */; }; - 03324B9DEBB7953076EDCD4091EE150E /* UIView+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4219E7C32019899890CAB66E5FBDF524 /* UIView+DTFoundation.m */; }; - 0394CD46435D6EE15D3996A7FDEAC0AD /* DTFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FAB3C7F19A511C2B1B7DFBA3CA308C4 /* DTFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 03D35920862F172B8E69BC901CD4FA44 /* UIImage+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = D85A85D891A320165843EF9F489178F7 /* UIImage+DTFoundation.m */; }; + 018208E7B5B1C22398872119C18BD05B /* FileManager+ZIPDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F9B298989305B9569B71E448E8C1D4 /* FileManager+ZIPDeprecated.swift */; }; + 0279DC0CB56DFD659743755DF5932E28 /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50297AAB8278F2BB6FCFE82B20C7A049 /* ConstraintLayoutSupport.swift */; }; + 02BD5B00D86A7A544629B90103ACB148 /* DTBlockFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 375179DD3A4576CEF947E1760BBDC69B /* DTBlockFunctions.m */; }; + 03B6C4C7DA368F0B8C15FAFD93358E87 /* URL+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537BB06317FA188DF7A8A960152520E8 /* URL+ZIP.swift */; }; 03D90C831397E8636A33CE557024A136 /* NSMutableAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = A2C299CFB47AA6ECF86F7348E1EB751F /* NSMutableAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 043840E0B152ECBD4C589446AA1870F9 /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392A75EAF280876545D14AA00517BA4C /* ConstraintMakerEditable.swift */; }; - 053AFBB60D220EA22D1CF22AB354BBB9 /* UIImage+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 15941683D394FB8D7EAE91CD2CF03FF1 /* UIImage+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04AC4C71A95C08C9A1158AEA6B5B04B5 /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02EA0374C693F881AB36202FB276DCD /* ConstraintView.swift */; }; 0561DF6793C8516F469D9813F5CE3211 /* DTCoreTextLayouter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D6DA580F40DF113709E15CF6542A35C /* DTCoreTextLayouter.m */; }; - 060B0F956EE34AB3BFC0257E84DFAC7E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */; }; - 07B6FA62334B326D5179B16E555A1163 /* Archive+MemoryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 174FC0CA05D20BB995E211DE5A0857DB /* Archive+MemoryFile.swift */; }; - 07E956FB24A5153D59F07A4A3966CCF4 /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60657D08CCDB38BFED30BD40F4720CE4 /* ConstraintMaker.swift */; }; - 08B28F7D56429BDC3EA13F4EBBF2BCDF /* UIColor+RDEPUBHex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37FEAB6B0E196275B35332A30FF74DD /* UIColor+RDEPUBHex.swift */; }; - 0918ED4A491D011B46EE71AA40DDACB6 /* RDEPUBWebView+FixedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB2892BCC3CD841C8364FBBE0DC10C12 /* RDEPUBWebView+FixedLayout.swift */; }; + 0622935FFD2ADD637FBDC5278F8D5E92 /* DTAnimatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = BC332335B380BC51C4F05C5CCDFB9189 /* DTAnimatedGIF.m */; }; + 06675C3F0CB6A5662061DB48B55B7DF3 /* Archive+MemoryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 174FC0CA05D20BB995E211DE5A0857DB /* Archive+MemoryFile.swift */; }; + 072E9480C779CFF4764E08D82F4B67CF /* wxread-replace.css in Resources */ = {isa = PBXBuildFile; fileRef = 6009A6FAECBFC4615F869A0D90D8A460 /* wxread-replace.css */; }; + 07512D0A383FA3C65725DB0BE97A97A6 /* RDEPUBResourceURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32769058982DA3B3ADB0051377B41916 /* RDEPUBResourceURLSchemeHandler.swift */; }; + 086B6FE0EFE46CBAA9CA4A74720B6C52 /* DTBase64Coding.m in Sources */ = {isa = PBXBuildFile; fileRef = 061BD3911E4E530C792E65CED7868C33 /* DTBase64Coding.m */; }; + 08E897E7340B3D5708F3520FE146F124 /* UIView+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4219E7C32019899890CAB66E5FBDF524 /* UIView+DTFoundation.m */; }; + 09F91906617C975ABCF9D9C11BDA8C4F /* DTCustomColoredAccessory.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6BE3B2DA9A8C4CD3760CDAD6F305A5 /* DTCustomColoredAccessory.m */; }; + 0A64A09E852BBF52677A7BC5CC7691C0 /* NSArray+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 73940D215D644B6815A09DA802CFBDDF /* NSArray+DTError.m */; }; 0AAA5BB1DBF584102B15CF8738F1815E /* NSScanner+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = CA538A48DD3691701EC6B5021D7B7381 /* NSScanner+HTML.m */; }; 0ABC4D62588EABAA636441FD9A82C940 /* CTLineUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DD58A1908F3C532210EA65ACE410A44D /* CTLineUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0B6FA1F22150D7F8B1865F41FF70C922 /* DTImage+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB9016408894675D11069CDAACEDE94 /* DTImage+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0BB905F057CB7578CB867DC3F8277CF6 /* RDEPUBParser+Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871BA1C45F545C9EAD9E1795144209C6 /* RDEPUBParser+Archive.swift */; }; - 0D2BE6D40EA436C99BC88C4AC84DDE71 /* DTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B007AEEACE9EA271DD73AFD80A74D83 /* DTLog.m */; }; - 0EA168CF3EF3FCB8AC5BB8404F02167F /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91144FC099DD458E61625CD939577DAA /* ConstraintDirectionalInsets.swift */; }; - 0F1EB5CB3A6EB0627B076B7AABA22D9E /* RDEPUBResourceURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C37B4E513CEF203D7C832740579E6B /* RDEPUBResourceURLSchemeHandler.swift */; }; + 0BFC402A79CB21B8CF1A99D7258961F7 /* RDEPUBTextLayouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D73C71810144AB20A3D87FADF45109EF /* RDEPUBTextLayouter.swift */; }; + 0D5E63AF74BC876DEE822780271F8773 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */; }; 0FCBC8C64D8862F2A0E8794EDADDECBD /* UIFont+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 647FB0C5AAF84C71A7784DD277E48910 /* UIFont+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; 100BFFBD24F234C095EDB001B8088DB1 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = D1599698B5A62671C488F13E07272B09 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */; }; - 108AFD87D054CA4FB49572ED7B16AE99 /* RDEPUBTextPaginationSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC026AD0A9538F72B62BFB9EC8C98353 /* RDEPUBTextPaginationSupport.swift */; }; + 10891A3745ED879C322F4EAFB6A24F36 /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5245010774F8F1C4857763CC7B96E7B4 /* ConstraintMakerExtendable.swift */; }; 109458F9D48FD4F381F0E40E2DB3D91C /* DTLazyImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5F69A1E1260BAD7737BEB533F643A15 /* DTLazyImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 10C736BFEF1A0AF28FAFF1635B224C09 /* RDEPUBPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A4E8E3CD48799CF1E9D64CD7CE0C86 /* RDEPUBPreferences.swift */; }; 11AB1902A68385851FB81E870991F9A0 /* DTImageTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = FEEB15F87BA6575BBFE1C5FD19B17CD7 /* DTImageTextAttachment.m */; }; - 123FF942A68B336E49F46CD34F0BB593 /* RDEPUBSelectionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065F46518D05F6DEA21AB45C485CCBAC /* RDEPUBSelectionOverlayView.swift */; }; - 129A4894D5C076AC8FBB4AC2159B0AB8 /* RDReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F4E662F4176B8840BB4DF9A76EB5443 /* RDReaderView-dummy.m */; }; + 11C954E3357C1EEB7CC99D689FF2EF01 /* NSData+DTCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 02EDFE0EEA47398F3E1A361A73AF6A6C /* NSData+DTCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12840AD82C5E66B9DAABE907647D0961 /* RDEPUBReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64B372E68C6C74223A76117BFA80B15 /* RDEPUBReaderController.swift */; }; 12B4A35B8E40C112E18A7C5511F023E9 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4472755F83C121DE5E1E505D145F6DBE /* CoreText.framework */; }; 130C3A85D9F9F445222C2E31EC245B0A /* NSScanner+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = A0927A875CA1F11DBCE60DFC6F0CA0B6 /* NSScanner+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 13EB572E58E7D92462C8BE1114375C43 /* UIScreen+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F051D813D50D20D53205D5FDCAA877C /* UIScreen+DTFoundation.m */; }; - 14ADB66FB45D862147EB6E6C4B5EA229 /* RDEPUBTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EF375B490014DEFC2BB798269AA0985 /* RDEPUBTextBookBuilder.swift */; }; + 14429631792B0E8330AB420662AFE7D6 /* RDReaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4134DC0BA1A654610741FB33CA9BA7 /* RDReaderFlowLayout.swift */; }; 14BDD9FB7A7AC5C8ABFF8D24C381F3DA /* NSAttributedString+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = DBC9280BA00935565E9658775DD7404D /* NSAttributedString+DTCoreText.m */; }; - 14FC98FD822FD9609F753AD2D8EAC873 /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D495E2AB1223BD4D4909F8FF1FF47DAF /* Debugging.swift */; }; - 1573AF8F1FE294F259B6D172647DE0E4 /* UIApplication+DTNetworkActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 77213203802F44012346181FED2856F9 /* UIApplication+DTNetworkActivity.m */; }; + 1509118FA9E9AD657EAC9BEE5C49BE6E /* RDEPUBTextLayoutFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CF54683B145156F178EF99B0C7046A /* RDEPUBTextLayoutFrame.swift */; }; 15A7ED15DA03DD3B9F26A017D270D1C2 /* DTCSSListStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = FDD333B409D528E5006FA48F4D70A6F5 /* DTCSSListStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 16421662EE90ABA9A6EE98B2A0FE0210 /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5245010774F8F1C4857763CC7B96E7B4 /* ConstraintMakerExtendable.swift */; }; - 17F1C63137132337E12752FDF7633A9A /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BE22EE711B7A38A4443E1C1C12BD79 /* ConstraintMultiplierTarget.swift */; }; - 186520D7BA8216DB8A28FD45F7F75498 /* NSURL+DTUnshorten.m in Sources */ = {isa = PBXBuildFile; fileRef = C80065DBA5634DAA71129404975D7349 /* NSURL+DTUnshorten.m */; }; + 18A69B8D310DB6279273A14E9DB1A1DF /* UIImage+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = D85A85D891A320165843EF9F489178F7 /* UIImage+DTFoundation.m */; }; + 18E05C9D1D63A2AD105D6CC0E0C64C57 /* NSData+DTCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F750F38183302BF345F40F5A4CDD43 /* NSData+DTCrypto.m */; }; 191824B2B1E1B0A7DD3B6298100B4B8A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE4821B98DDE6C71411EC139EC6D2762 /* CoreGraphics.framework */; }; 19649ED312D92A6F5D2D6AF4E540CE75 /* DTHorizontalRuleHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = E28CA95D89DBAB2FE56BC8513D5838D7 /* DTHorizontalRuleHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 19E2B4D2CF3DA91EEBAD4079DDBE076C /* RDReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 606D7AB51D4BF9B4AAD104DF89B5B9AD /* RDReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1C1666D7A5833BE0178BD004E8EF21C6 /* Data+CompressionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D641809A99849F80FDCB02F8CE8D6A0 /* Data+CompressionDeprecated.swift */; }; - 1CBC0ED3AF6CAA617BA3ECB04DA68DF5 /* epub-bridge.js in Resources */ = {isa = PBXBuildFile; fileRef = BE53A6D6898393B5A8B54F23ED0065D0 /* epub-bridge.js */; }; + 1AD6564F00D7B59D818A6AF35FCFDB3C /* RDEPUBPageLayoutSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7863FD91C5BD0B2EE358458E09C81194 /* RDEPUBPageLayoutSnapshot.swift */; }; + 1CAB795ED271F58E3A9321F3562CFFD0 /* RDReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 609F81945B589AC45E4E531C01F6EE3E /* RDReaderContentCell.swift */; }; 1D460603DCA4A4E5ECFE8FF1F1CACC10 /* DTColorFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC4C9F69BF2D0CAEBAA83896C139D2C /* DTColorFunctions.m */; }; - 1E53C95A5D9629D8721ED8DF87983841 /* RDEPUBPageInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF21684A2D45C7724718A05AB269C7A /* RDEPUBPageInteractionController.swift */; }; - 1E553A18817913A102F1CC344D62F482 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A651CEE8062C84A597DBC44ECA3DBCC1 /* ConstraintDirectionalInsetTarget.swift */; }; - 1F3E265C62041BC60ED9107DB03798BC /* Archive+Reading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0619F98DA80922E78A07321D0DC54F62 /* Archive+Reading.swift */; }; - 202E7C69357BE581D13B25A696C16209 /* Archive+BackingConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E36C4FE448DDDA03450847FCB785B6 /* Archive+BackingConfiguration.swift */; }; - 2112D33A6C8A659AB911EF9AA8528E32 /* RDEPUBTextRendererSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAF5559BCE747CDC3F13886B8385344 /* RDEPUBTextRendererSupport.swift */; }; - 2202864554457158A3863F9F6515EE13 /* RDEPUBTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4B1095936DBB3491E580EE642E6966 /* RDEPUBTextContentView.swift */; }; + 1DB7CE877F9241539B365C9FA1D26217 /* wxread-dark.css in Resources */ = {isa = PBXBuildFile; fileRef = 57DE6F8B9CE9F488188CFE16DDF7929B /* wxread-dark.css */; }; + 213651A172BE115A3EB6597D4EF16EF9 /* SSAlertCommonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE4EE750340347ED584C5A2C1164331A /* SSAlertCommonView.swift */; }; 2203356EEA94A9172BC7902923E43CBE /* DTCoreTextFontCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B7771FDE9AB1688166584C0AA03F12A /* DTCoreTextFontCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 239D541A0D14415051D9B84A6FAC4396 /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = B5FCE04EBB553439D1C2BA1001936293 /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 23C510B1C699288E3E15795A6C0835DB /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A9A82CB094636AFB53D6D130D6219BA /* ConstraintLayoutGuide+Extensions.swift */; }; + 23EA3FF5A4302C09BE16C4F0EFEBF0D3 /* Archive+ReadingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 934F9BB2B3A313294F121484C3A97A14 /* Archive+ReadingDeprecated.swift */; }; 24395BEB3C360D9DA5180BFB955B04A0 /* DTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 21BAA93E67D8CBC5297302D798FB4F7A /* DTAttributedLabel.m */; }; 2445709667CB3820E51CD4AA915E6943 /* DTHTMLParserTextNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C30D143134EEC5D4BA99459104B76A2E /* DTHTMLParserTextNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 249683EC17AB72DA0F517756C7657A79 /* NSString+DTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = BE547E464E5D34F9FFB24BAC81D1E4CC /* NSString+DTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24C5B52FD2AA9C49731DC6859ABA7CDE /* NSDictionary+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C50CAB4241C141EF6EC9ED22AB3A7E8 /* NSDictionary+DTCoreText.m */; }; - 2534C9D06B3696A12408C710CA2757F5 /* RDReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96718D9DDA02E4E22568D880B91E7D8C /* RDReaderPageChildViewController.swift */; }; - 25DEC09B82998CE7055BA7EB0E4D2F0F /* Date+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76A97683FB5E8E8B86EA4AD71F6F4B4 /* Date+ZIP.swift */; }; - 25EE412DAC29154BBA2A29A3064C7A2B /* RDEPUBModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB417EFC922BE57A7D61CFCD8F5C356A /* RDEPUBModels.swift */; }; + 25E47E6CE8DF5BE732774ACEAE47BBF8 /* Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8F0DCEAA5A3DF38C503CA30DC94C1C /* Archive.swift */; }; 270C5C10028F0BC5A62548326CCB379B /* DTColor+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = E196F56E68578181D5BDE787DE5C0F3A /* DTColor+Compatibility.m */; }; - 285B09F819BD8AFFD69226251C8EC268 /* NSDictionary+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FC368BD2A8D266EB771E5FB9A5A5B3C /* NSDictionary+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2993DF5CE6F83258DE9DA1CA296CEBDB /* DTActivityTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8272D0B59ABD6652D0CAE3DFCC2C5EE1 /* DTActivityTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 273EEB3E0A49E67E561DF3C5EE3E67C2 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0B32EA4B7A492EEF26CE260E9AEFA0B /* ConstraintMakerFinalizable.swift */; }; + 2952D6997F5580919F4825DCAA1A4EFA /* DTExtendedFileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = F5389D4E96A4AFE175691B4D3D4524E7 /* DTExtendedFileAttributes.m */; }; 29D9B32DFFC59A157EDEF005DB92A5AC /* DTCoreTextLayoutLine.m in Sources */ = {isa = PBXBuildFile; fileRef = C71D83D6AEF198FA680B8A80BF2D9605 /* DTCoreTextLayoutLine.m */; }; + 2A875BEC32568EFA0FE0F3E58F0AA37C /* Archive+BackingConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E36C4FE448DDDA03450847FCB785B6 /* Archive+BackingConfiguration.swift */; }; 2AAF9361720FC2D8FFCA93B5FAE42019 /* NSMutableString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 31F3F91D5624C451E5D44D85B1DDE7C5 /* NSMutableString+HTML.m */; }; - 2B020F7C6FC381A28960B363D24FF8F7 /* RDEPUBWebDecorationOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7797621CF825900662A85E723445CD /* RDEPUBWebDecorationOverlayView.swift */; }; - 2BB93FF5C17C381807DFC46B0772102D /* RDEPUBReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AD6E6A62F1EE4221018B6DA2391BA7 /* RDEPUBReaderTheme.swift */; }; - 2C2C452DC3EE68E1BFE8C8D72A3D2750 /* NSData+DTCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F750F38183302BF345F40F5A4CDD43 /* NSData+DTCrypto.m */; }; - 2C4B949CE9C8AFB2C207204995DEF3A7 /* NSMutableArray+DTMoving.m in Sources */ = {isa = PBXBuildFile; fileRef = 53499F40E1790A6CBE8AFEB3AC5BEFC8 /* NSMutableArray+DTMoving.m */; }; - 2D7DB1A4CC032FD9E04052F34C519146 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F090A0289338B14050FAF16C22605B0 /* ConstraintConstantTarget.swift */; }; - 2E1F852AC5FF95720D26E4D4650B6441 /* Entry+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7345CE45F696634CEA692A86D16F684C /* Entry+ZIP64.swift */; }; - 2EA63DE8EF8EE4114C95521A1A8A0DFF /* Data+Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5964AF1336E2F0DA0E2C32991E76C78C /* Data+Compression.swift */; }; - 2F36566E071CAF9BB1D665CF3027E6B4 /* RDEPUBReadingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29E5523049D286F000DEB6F1D59AD428 /* RDEPUBReadingSession.swift */; }; + 2D271CB0ADE6190C0835F90BC684CF0F /* RDReaderView-RDReaderViewAssets in Resources */ = {isa = PBXBuildFile; fileRef = 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */; }; + 2E477BA16E25771C05B852318212C523 /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945D4549E0B9168D7DDB910DE874B874 /* Typealiases.swift */; }; + 2E8C5F61C3B6A6D116BE6612C62C7370 /* Archive+Progress.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD987C2FA7C8FBC96FD024E421DA0E68 /* Archive+Progress.swift */; }; + 2EABBFC2F99A82EDEE15171F3F02126A /* RDEPUBReaderTableOfContentsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76374229228450DD3ADBF2DB618329F5 /* RDEPUBReaderTableOfContentsItem.swift */; }; + 2F39C838FD072D7CA4D3978C874DCF86 /* NSString+DTFormatNumbers.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACA5E519F100582F0D772FCD76125C0 /* NSString+DTFormatNumbers.m */; }; 2FD7360250C2255A80583D4CF518FBFA /* DTTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = F35039A8D0AA1F7BAFC4E5E016057E15 /* DTTextAttachment.m */; }; 30C01FE491C26314F776AD8B2AF136FA /* NSAttributedStringRunDelegates.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F2E79CC33E0823C4E719ECDDFBBE08 /* NSAttributedStringRunDelegates.m */; }; - 30FB567639FBF7B1D963B9A9E644C55F /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = C422BCADBB48E28B549495663705A0FB /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3139FB597E4CA2C87278EAB2944CFD31 /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CE078B465FDEF40EC0469626A2C2469 /* SnapKit-dummy.m */; }; + 317C3FF6D87E75F29CD74E44342734B3 /* RDEPUBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5AA1752B9A4DA12829506699ACB35F /* RDEPUBParser.swift */; }; 31B805C50E0E187E6242B0C878C4D30D /* DTCoreTextMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F5D34047BAA894BEF1DFA23E6A9DAB1 /* DTCoreTextMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 33346EAF6E558DAD2572AB45E4046AE0 /* Archive+Progress.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD987C2FA7C8FBC96FD024E421DA0E68 /* Archive+Progress.swift */; }; + 31BE851901D14096E7AA66B5CDEE4D55 /* RDReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC307B372D2CF490DBFE40A0328E8B0A /* RDReaderPageChildViewController.swift */; }; + 3257F2C96D06EA0B53E9CA9610A9137A /* Archive+Writing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF988440049800DB7824A94B81D20254 /* Archive+Writing.swift */; }; + 32A7AD3C6E3D5990746B47165F582A1D /* RDEPUBWebView+JavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B1A759F6D90A955E7DF86A14FEE1737 /* RDEPUBWebView+JavaScriptBridge.swift */; }; 343E794F88AA503F5139C2244DC1A2B1 /* DTTextAttachmentHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = C298199F5DC5390E8B6666F638B34C10 /* DTTextAttachmentHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3466B5D6804C323ACD624A91A77CE318 /* RDEPUBTextPerformanceSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F38A5EF3AB47504A0F63F91180092B45 /* RDEPUBTextPerformanceSampler.swift */; }; + 34BBABDE700AB81718A4752E7D1E0140 /* DTHTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 32FB2B1B0498DCBE7B79BDF49E963E3D /* DTHTMLParser.m */; }; 35C5BE59CA712CCDF93D6E7010D93883 /* DTAttributedTextContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = C123C127CC539ACCB510F665DB774899 /* DTAttributedTextContentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36C2DB50F6A31A36A860540B4EF32E0F /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E138EC76D0DF24544D29D1A4D7429E3 /* ConstraintMakerPrioritizable.swift */; }; + 372E05B50EF2FD40BBF07BB08DA32E4A /* RDEPUBPaginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24AD5C352BC2F291B84A39565644DE44 /* RDEPUBPaginator.swift */; }; 372E907DF08263D0E1AF904F1FCD66EB /* DTTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D36ED8209C907E3E9B074DDB399F54FF /* DTTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 385DA8247F55E886F3FBC57CC15BEF4E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1E89FE5F2996336E862E82C1E14E0EE7 /* PrivacyInfo.xcprivacy */; }; + 3821BB7D496697C9F3CA8E00DD53115A /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3593ADF561D422F73C8EABAD4A4F440 /* ConstraintRelation.swift */; }; 389F7C8400F9223C019F2D7825CD2369 /* NSCharacterSet+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 713C9FD0354D16AFCCFA630A97F2DA68 /* NSCharacterSet+HTML.m */; }; - 394D91C2D2C148AD3633ADB12DF96012 /* DTCustomColoredAccessory.h in Headers */ = {isa = PBXBuildFile; fileRef = 33DB57DF8C5AE334B1BBE9F989352F1D /* DTCustomColoredAccessory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 39FF966DAE554008F4CFD71A2570E676 /* RDEPUBTextSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA1661CEEEBB7BDE901B5716D99DDE90 /* RDEPUBTextSearchEngine.swift */; }; - 3C8CE770C755B822C569A4F9D302F342 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3593ADF561D422F73C8EABAD4A4F440 /* ConstraintRelation.swift */; }; + 3B7E31D804C0208ECAEF8630D8CE6E8C /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 882FA707ED3513D263A1E0656AAD2D33 /* ConstraintPriorityTarget.swift */; }; + 3CDE626DA9038F9143A6004836F6284E /* RDEPUBWebDecorationOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F64F7254BE291374ECDC3E59BDB065 /* RDEPUBWebDecorationOverlayView.swift */; }; + 3CF8124B3C1C0C80E1784E221E564CC9 /* Entry+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F991240340FA026C71B68EB25B9F9C8 /* Entry+Serialization.swift */; }; + 3CFE245716B8EAC81022BB5543A419B4 /* SSAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F410ED25E4E84C3D5166261CDF4B58F2 /* SSAlertView.swift */; }; + 3D57FD29F6030DC9F461D1344BD78986 /* DTHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D75FEDE65722CF41F7F32A164376926 /* DTHTMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3DC8F9474FC6A0BB7E81A703CE958966 /* NSAttributedString+DTDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E2D85A099C99CD82FD1842EE7C52D2 /* NSAttributedString+DTDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3EC890B2CE7B2360729F4EBF3023B68D /* SSAlertPresentAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E481007A8174943868EBC81CF3B04B9F /* SSAlertPresentAnimation.swift */; }; - 3FB38B080B976580510E01FCE7BA4C10 /* RDEPUBStyleSheetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD3A31AFC4BC8216C0AA79606708051 /* RDEPUBStyleSheetBuilder.swift */; }; - 416A6514C1A35BB87A05A7C54ACAEAC4 /* RDEPUBWebView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5B58D686782147F12C1A8781C47B /* RDEPUBWebView+Search.swift */; }; - 42BE9975B789B575433E93B4A10A1E34 /* RDEPUBParser+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4331275EBF2F4E4FC5FBFFEE72E6E06 /* RDEPUBParser+Package.swift */; }; - 42E86E25D5B3335EF7DD6518E0863E72 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 43072D547164E92F733CF74B2B244DE8 /* DTHTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 32FB2B1B0498DCBE7B79BDF49E963E3D /* DTHTMLParser.m */; }; - 4353DBC7FB1A403EE787B421D75A1FDB /* RDReaderView-RDReaderViewAssets in Resources */ = {isa = PBXBuildFile; fileRef = 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */; }; - 43D10312CDEFDAB42D20488E9522F1DA /* DTTiledLayerWithoutFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 70F5D03B9B3B7F182C8F5C1F5D4FA7E7 /* DTTiledLayerWithoutFade.m */; }; + 3E10312523D443840CFBA72845ACCED9 /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CF362F88AB69253F1898E53D7A286A /* ConstraintDSL.swift */; }; + 3E8AFCDE8242393816FB4CFCA5048FCA /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C7129757B54DFD9E445D0A17D73A83 /* ConstraintPriority.swift */; }; + 3EB94B3FE3C93EF534899C25C60E25EB /* RDEPUBReadingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C67B49D37D02FC71C317CCA00B61EDB /* RDEPUBReadingSession.swift */; }; + 3F8EDE1AE8937FC335704E3F15C7C0B5 /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = C241AD9CEC9D6732CFBA6A55B49E64C9 /* ConstraintInsets.swift */; }; + 3FA49154704A5A890D4CF70CA5C57665 /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60657D08CCDB38BFED30BD40F4720CE4 /* ConstraintMaker.swift */; }; + 41C4267B8D6E2C867C47F26F46116693 /* RDEPUBParser+ReadingProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 992AFC205F9539B89BF279A5EE6CB266 /* RDEPUBParser+ReadingProfile.swift */; }; + 42B5874545A810ADB3F168784542C3D4 /* RDEPUBReadingModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49439BEDC4669BE8E3E9D3315C568645 /* RDEPUBReadingModels.swift */; }; 44B1FBF893C06F314F8C9BD1405897D8 /* DTCoreTextGlyphRun.m in Sources */ = {isa = PBXBuildFile; fileRef = 36FCB869246FE45FD1C9609A34EB4E74 /* DTCoreTextGlyphRun.m */; }; - 44B3694130E8D04BB05A995AE726E37F /* RDEPUBTextAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E20D7801600727C16A2C13D5F84E38 /* RDEPUBTextAnchor.swift */; }; 45133E47CC5FBCF78BFCD38981BA027F /* DTDictationPlaceholderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 982391EC8620A617B8788C8A6101C96A /* DTDictationPlaceholderView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 457C0034B28FBD2A77FF784E2C20576E /* NSURL+DTAppLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D36F7CDCD7D5788CDCB3A1421DB242B /* NSURL+DTAppLinks.m */; }; + 453D3B15ED40279A37CA0D74DBE4FFF2 /* SSAlertSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 937CEFA81DA4227008DBFB114783A08B /* SSAlertSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 45648E6F07341B6DC91D6E22FD4E253C /* RDURLReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BCB7DFA6D42E5D07629E5E2F44FD0D /* RDURLReaderController.swift */; }; + 456926E08F81E14D4462225F8219D7B6 /* RDEPUBNavigatorLayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9197422E9FAD3EDDC5C5844350D497F7 /* RDEPUBNavigatorLayoutContext.swift */; }; 45F90B98546FDBA03AB112DFE859A185 /* DTCSSStylesheet.m in Sources */ = {isa = PBXBuildFile; fileRef = E0D90EB06FC37D534934542F9CAB1D74 /* DTCSSStylesheet.m */; }; - 4668DB9D177325F8E008E5D1C0F37CB4 /* RDEPUBTextLayouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D14AB5026508804287BE9997A4CF7CE1 /* RDEPUBTextLayouter.swift */; }; 46EF32D586FF590CE2C60C66364B9357 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */; }; - 494DB8491A940D9CCD0BAB65DA21D211 /* UIView+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 79A77584AB3B92B2508AE0BCFCB8FD87 /* UIView+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47AA74DAF06F2F7A71F70FE9F6CC6CAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; 4A13B4E5EA8616A8F09D90BC6EAEEA64 /* CTLineUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = D24FE8634A7AD2562DB8ADB9D4BBB36A /* CTLineUtils.m */; }; - 4B711340B48B16DAAC3BF45DFBE54907 /* SSAlertAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2EC0B845131A88247902AEA26F40AE /* SSAlertAnimation.swift */; }; - 4BFE0AAE22726EDD75809FC131FCFD70 /* NSData+DTCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 02EDFE0EEA47398F3E1A361A73AF6A6C /* NSData+DTCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4CA8DC97A929C818E3A2F3910087EF42 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0EBAC7714A5F73B75AAB47D24B08B71 /* Constraint.swift */; }; + 4AEC4012771A907108FD2D0C2237BCBD /* RDEPUBTextPositionConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35FA9133889FF0F7999C456AC029966C /* RDEPUBTextPositionConverter.swift */; }; + 4D981359F53E36D187F92A2EC9F23BEE /* RDEPUBSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16973940E1B38B29D620DAB562AB7396 /* RDEPUBSearchEngine.swift */; }; 4DA6EC46F8968265B96C6D7B2260C4E5 /* DTTextBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = ADC5AC8FD4EC45E9BA5654A38715BB93 /* DTTextBlock.m */; }; 4E4939F6592B06D2CA764DCACFB47871 /* NSString+Paragraphs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83E37DC74BB53F90A5AD54842858A62F /* NSString+Paragraphs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EEA1AF224E7966AC2BD3AD70903681A /* ZIPFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A06A36ADBE678DB44158D32E751FAFF /* ZIPFoundation-dummy.m */; }; 4F50C703427747B88405080B221349A1 /* DTLinkButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D7B5E61166782ED8D585D4FCEE2074DB /* DTLinkButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F72A091B13820692027231A4160F4C2 /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A5ABB8F3656A110B955B0306E9A8C3 /* ConstraintInsetTarget.swift */; }; + 4FF142B3F09AA12AF220CB09D92F37D3 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0EBAC7714A5F73B75AAB47D24B08B71 /* Constraint.swift */; }; + 50526E23A8AC98FB5502D6E22758A56D /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D62D3200AC3D4E42C81CDFF7E884E8 /* ConstraintItem.swift */; }; 5065D99E1588E8CC60677E74916A5C03 /* DTAttributedTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E1F63A854BBF28E93AC1D3F71CD48CBE /* DTAttributedTextCell.m */; }; - 5091243AEA2930A8C64CEFA7311A40E1 /* DTFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FCC718115E5C31C88A680522AE36B089 /* DTFoundation-dummy.m */; }; - 516F6FF776A9581887D1F57F706443B8 /* NSString+DTFormatNumbers.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D86C7063D1128EAEB3A30EBEF214B3F /* NSString+DTFormatNumbers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 512C2FE338700D1FD6DFCFF2D1C96903 /* SSAlertPresentAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E481007A8174943868EBC81CF3B04B9F /* SSAlertPresentAnimation.swift */; }; + 5155756A1E960CE0786993DB461B11E9 /* DTPieProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B443D035BA5652B03A41BE905C5AC17 /* DTPieProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 51A1B5800D23C355B1712E8D1103780C /* DTTextBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = D497C3CA364E37DAAFF2C3B90CC7DBE8 /* DTTextBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5271068D32AFE88CAC78B59ADED07EDB /* RDEPUBWebView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89FBCDE54D10D205F325580161FB9FC3 /* RDEPUBWebView+Configuration.swift */; }; 528DBAC7FCEFC7D6575C1F6CB4399AEA /* DTStylesheetHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 96FA99AA7D4AD0D4246C8DAC1CC0C24E /* DTStylesheetHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5317C2808FB00E27D36A26E1C906470B /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4684B406B325B35F39322D75B59B6479 /* ConstraintLayoutGuideDSL.swift */; }; + 52A961050B64F5F0985064C3BF7EBDBB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + 52C2803D19934E29EC31F21B0808F3BC /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E8C0D83EB6EDE71B264B6B0DD4644F5 /* LayoutConstraintItem.swift */; }; + 5486FFE1398EF5F6BBE4EE0871A21C39 /* NSDictionary+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = C18480913E002315E3F5EC6945371697 /* NSDictionary+DTError.m */; }; + 555E422A804DAB73D29F1E68F33BA9BD /* ZIPFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D927F128EBF26AD2C61FD0E6B6F6F5ED /* ZIPFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5582735073EBB9F5078E6E8AEEFB646A /* DTCoreTextLayoutLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 64AB89EAB10148C39B726B26BE04F4F8 /* DTCoreTextLayoutLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 55DD9BD86A13F34592D44EF4AE3D7B52 /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CF362F88AB69253F1898E53D7A286A /* ConstraintDSL.swift */; }; - 56B02B75B28FA5F1CA7CE6FAE832F228 /* NSURL+DTUnshorten.h in Headers */ = {isa = PBXBuildFile; fileRef = 054674EB90C625BB4BEA9368ED92592B /* NSURL+DTUnshorten.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 56FB160F2030BA8EA8409795DDF90428 /* UIViewFrameExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8C351514678D41C58869BD057D5483F /* UIViewFrameExtension.swift */; }; - 57C933175F60BBD9A591DF8B881EC809 /* epub-fixed-layout.html in Resources */ = {isa = PBXBuildFile; fileRef = 7F47BD1AD90D0D7227EC3804CB2C2AE8 /* epub-fixed-layout.html */; }; 57D5228C8A85628772D4D78E7FBEAF3C /* DTDictationPlaceholderTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 477A0FC2A1F0B7F7CCF72D201ECEBAB0 /* DTDictationPlaceholderTextAttachment.m */; }; - 5857BD9A2659F2F93F2F2314C68A05E9 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 882FA707ED3513D263A1E0656AAD2D33 /* ConstraintPriorityTarget.swift */; }; - 59066938787B3F1835305B4B9C935216 /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E5637603691B9B35C2A886B686D3CE7 /* ConstraintViewDSL.swift */; }; - 5939419CF19EE16A2BD1C9E7BD482E1A /* NSURL+DTAppLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = 557DA029E15EC99631B647AE8922007F /* NSURL+DTAppLinks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 597DE4CDF5C674E269F03F6AA0AFFCC1 /* NSAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 92460D196C5300656C9649784EBD3C58 /* NSAttributedString+HTML.m */; }; - 5A25F0EE0E239F179E9D15607175DD63 /* Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8F0DCEAA5A3DF38C503CA30DC94C1C /* Archive.swift */; }; - 5ABA46799727B3391DF32044DD086BDC /* DTFoundationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = FD03567681A79FFB6E81B3105503065D /* DTFoundationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5CCDB7E1619E66D77F3877C5875E25C7 /* Archive+Writing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF988440049800DB7824A94B81D20254 /* Archive+Writing.swift */; }; 5D03A5B9DC067875CFEC9D4EA7B059E8 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D863AE4F659A0F71B22DC9FF334DDF4E /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5D58B68AE7FBF43CF6F7B5AD1285C803 /* DTSmartPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 96EEB6B022E22A4ABC86D87469D4815B /* DTSmartPagingScrollView.m */; }; 5D8D65121E87E419D8D2F23F8AF43673 /* DTColor+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 80B3D15ED0D19D020663EF055386291A /* DTColor+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5E7FDA93607BDB800512A93BE294B12B /* Archive+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A2659DB0685E16ABAE0382F726DA8C8 /* Archive+Helpers.swift */; }; 5E90EBD876ED4E50AB890FB56C4BFA57 /* DTHTMLParserNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C8343CDCF82729A8EBCCA37A6650E34F /* DTHTMLParserNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5EA53D60B0C24989B91348B1350DC2D1 /* ZIPFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A06A36ADBE678DB44158D32E751FAFF /* ZIPFoundation-dummy.m */; }; - 5F7D5EB957828E8657530DBB033EB6EA /* SSAlertViewExtention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2280F2302F54E90122747821FE681543 /* SSAlertViewExtention.swift */; }; - 5F87019EF9B64242F8644A03D18A2B87 /* DTActivityTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEFAE80193E1F0DA53400C9AD641410 /* DTActivityTitleView.m */; }; 60532A2E06CCFF814933D2FAE6793AE9 /* DTCoreTextLayouter.h in Headers */ = {isa = PBXBuildFile; fileRef = C26DBE1150BC9A30B69839783E000358 /* DTCoreTextLayouter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 609B1D7C204655284FF2AC7D8CB3AC70 /* RDEPUBWebViewDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 264D3D6CCA46CD555E458C17F6BEC460 /* RDEPUBWebViewDebug.swift */; }; 61BE3607EABD2657BC71AF8ACB1C25D4 /* DTHTMLAttributedStringBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B59C9A1B265393E4BA8383B308A5917 /* DTHTMLAttributedStringBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6335F55C18A585E2E2B9CBAEE154B648 /* RDEPUBAssetRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = F61A8DFA3305799C8739646FD400B495 /* RDEPUBAssetRepository.swift */; }; - 650C4E331160D891B5B2ACAB6CE9F557 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6578DFAB51436E8DF266FD087700E26B /* ConstraintDescription.swift */; }; - 652C87BB289F6D2C0C6AC0DACBF43591 /* DTBase64Coding.h in Headers */ = {isa = PBXBuildFile; fileRef = B8E40E302B85493BDE0FE91F829EC01E /* DTBase64Coding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66166EB34D3554721D6FE8EB70D2E15B /* FileManager+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B7D3C6F0C845E3D42BBA613FFB0465 /* FileManager+ZIP.swift */; }; + 6214D10FFC4107B61C0A7D2124BE832D /* RDEPUBWebViewDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A3B34DE993508CAEBD18287344623E /* RDEPUBWebViewDebug.swift */; }; + 6268A3E8B23E586AE603A5F40F40F277 /* Archive+Reading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0619F98DA80922E78A07321D0DC54F62 /* Archive+Reading.swift */; }; + 62AD6F599831925D68B03800823FFE73 /* SSAlertAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2EC0B845131A88247902AEA26F40AE /* SSAlertAnimation.swift */; }; + 6439A2CC45B255D86F1BBF560BE64F7B /* RDEPUBReaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659E6B7AFC5374BF3A56A306238C3E96 /* RDEPUBReaderDelegate.swift */; }; + 660A86A14D4B4568FA3DFABC53BA83ED /* NSString+DTURLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 31BD7533867336DEA9B835F471767178 /* NSString+DTURLEncoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6634D568E49F5610242E1454680E5885 /* NSAttributedString+SmallCaps.h in Headers */ = {isa = PBXBuildFile; fileRef = DD189DA6054AAE2242F6644A2623B50E /* NSAttributedString+SmallCaps.h */; settings = {ATTRIBUTES = (Public, ); }; }; 67AE2AC8D9B961D45871077774E11FD3 /* DTObjectTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 073A7F9DF1A554BD1B324EA9E0090E91 /* DTObjectTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 68341B3169494A21A1B419AFA1DF652B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + 68E20F956433EA0CEDAC3948339C74E1 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F950CEF31AC0065C0BEAB26BA2CEFA1 /* ConstraintOffsetTarget.swift */; }; 69674FEA70899F07BE6098AAEC849978 /* DTAccessibilityViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CFADE0F46014990052AD67F17C86FF /* DTAccessibilityViewProxy.m */; }; - 6A70936CDC3B178976FFE24E63AAD354 /* RDEPUBPublication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F596AE7A8707C4D27AD9ABE552C6C59 /* RDEPUBPublication.swift */; }; - 6C73F94B5C73FBE0C06678707B5DC77F /* DTPieProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA1E8494B86FFD79C639DCB8C21E1BB /* DTPieProgressIndicator.m */; }; - 6C99D26D2589D26461CE7EDA02676075 /* RDEPUBReaderSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 178D1E4BA4980627DBDDD27A035D98EF /* RDEPUBReaderSettings.swift */; }; - 6CF2260408BBD6B12C40E62D1D9CFBF3 /* DTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD9F2023FF826F67E69E3407A70A8A6 /* DTVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69B3DF49F4AB7646FD5A4584F9DCEF98 /* NSDictionary+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FC368BD2A8D266EB771E5FB9A5A5B3C /* NSDictionary+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69F197DAC284EBCD47A972FB1D112707 /* RDEPUBParser+TOC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87AAB03A10169416E66E50562D9A57A0 /* RDEPUBParser+TOC.swift */; }; + 6AC9ABB942082B71200798D8E9E0AAEE /* DTSmartPagingScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = D2BA6D5DBD4C6A9285C4592721790A26 /* DTSmartPagingScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6B22BC159183EB1F45E0EA101C69982A /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932FD688DE493323BA6B691BC2CB5094 /* LayoutConstraint.swift */; }; + 6C50D4014739F5FF607E4E9731191A16 /* DTFolderMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 2101691D5743105B2E3E40376584B91C /* DTFolderMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C6BA0FF3D91F5121393BBF59DA93352 /* RDPlainTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D078643E7C9EA66EB922D04504AC413 /* RDPlainTextBookBuilder.swift */; }; + 6D8994F32576C73ECE67B2A7BC0DD084 /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7176B677A350927FC670368313DC2CA1 /* ConstraintConfig.swift */; }; + 6E390B8259A9728AAA7EA8B864179418 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 53D473C6F07982D3D25781A343EC5A99 /* PrivacyInfo.xcprivacy */; }; 6E3D0FDD78ECC20F4B3697ED21D64224 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C2B218B5EAA5831A036BBF7E1EFC1B9 /* MediaPlayer.framework */; }; - 6E6AF65D6FD1082D14D897B70FC6E2D2 /* RDEPUBReaderTopToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D87EC99EB119D764849BD1E582C7D06 /* RDEPUBReaderTopToolView.swift */; }; - 6E7C5CAB02BA409743CFF48D5218D68D /* NSURL+DTComparing.h in Headers */ = {isa = PBXBuildFile; fileRef = 731C0C61E3AD227D691FBA1C2C17BF7B /* NSURL+DTComparing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E90373CEFA7629B5FF48F610799E606 /* DTTiledLayerWithoutFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 70F5D03B9B3B7F182C8F5C1F5D4FA7E7 /* DTTiledLayerWithoutFade.m */; }; 6FA0125F16DDEDAD341DB75DEB084F4B /* DTHTMLWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = E16D20FA492E085BD0871B107B3077B7 /* DTHTMLWriter.m */; }; + 701E081379C13353FC056435950394DE /* DTCustomColoredAccessory.h in Headers */ = {isa = PBXBuildFile; fileRef = 33DB57DF8C5AE334B1BBE9F989352F1D /* DTCustomColoredAccessory.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7027EF8D77D4082C1BB9B80FF61FCADC /* DTCoreTextLayoutFrame+Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 28043173CA3B3787DC401ACEB5398108 /* DTCoreTextLayoutFrame+Cursor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 707121640F9C2DCBB05B60D20EDB2CC1 /* NSArray+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = CEA93EDA6ED54D374265AA5D6B9EBBA9 /* NSArray+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 70842C59A29DA75B9D42AF0863043578 /* SSAlertCommonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE4EE750340347ED584C5A2C1164331A /* SSAlertCommonView.swift */; }; - 70952AD584BE1EAABAFE3C6DD47865DE /* DTTiledLayerWithoutFade.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5EDCA3B21964D0462BE0982E2F0BF8 /* DTTiledLayerWithoutFade.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 710A1F70CC5FDB1C54EACF92B4D990D9 /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E8C0D83EB6EDE71B264B6B0DD4644F5 /* LayoutConstraintItem.swift */; }; - 712370237E48CF01BC1C6E7E764F4015 /* DTSmartPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 96EEB6B022E22A4ABC86D87469D4815B /* DTSmartPagingScrollView.m */; }; - 72BA060C1C2B29E6F76C5923BC45DD3F /* NSArray+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 73940D215D644B6815A09DA802CFBDDF /* NSArray+DTError.m */; }; + 713D20A253E4AA77903E15DA2A9BA37F /* RDEPUBReaderSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40156267853001A18D40A4515A03C5A7 /* RDEPUBReaderSettingsViewController.swift */; }; + 72599431CE239793C684C877B4D23347 /* Date+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76A97683FB5E8E8B86EA4AD71F6F4B4 /* Date+ZIP.swift */; }; 730ACB99580C5982DC08D50FC5084D41 /* DTAttributedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = A276DE925253460239BFAEC7663F60D3 /* DTAttributedTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7459A1656EDC29D685073B83561B783E /* NSNumber+RomanNumerals.h in Headers */ = {isa = PBXBuildFile; fileRef = 8552BE1A1F6A6D2879763DE3B2B8A2DD /* NSNumber+RomanNumerals.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7472100778E71912C37D22EBC4895FF3 /* Archive+WritingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C7359A7C3FC7675FED220200A43A17 /* Archive+WritingDeprecated.swift */; }; - 752B74E15CF0FD1F56043470AD23C602 /* DTPieProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B443D035BA5652B03A41BE905C5AC17 /* DTPieProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 75B39488A594591F53B48AEB9121FAD2 /* RDEPUBReadingModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD70A0AF6652B8B142FE99A2E3BFCFE /* RDEPUBReadingModels.swift */; }; - 7619C2726F04F3217F63C597C69BA011 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 776701E3D6C8347A9A8727DD1C0A2057 /* ZIPFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D927F128EBF26AD2C61FD0E6B6F6F5ED /* ZIPFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 77DEFBEDEE73BB372A60ECB671AEE41E /* DTExtendedFileAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 538572A5C098252D629F2185F1B1C9E8 /* DTExtendedFileAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78000F5A9639B1D9577CDD05682454A5 /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; }; 7821105EF320619993B3BF7FB90C7ADA /* DTCSSStylesheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B610E558C4917C4257DC198EAFEE2F6 /* DTCSSStylesheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 78B4D94D1FD3726A02C1ED8FEE039C22 /* RDEPUBJavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC270D100F485EEEB920AB37D4476FB3 /* RDEPUBJavaScriptBridge.swift */; }; + 782BAE4F5C0FA3E6EB6EF30D83DB8653 /* RDEPUBRenderRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59FAF02EDC6AC0DB9FA24A64E7B870CB /* RDEPUBRenderRequest.swift */; }; + 789D40DEE2CC4E0CBDFC873B9E30FE3F /* Data+Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5964AF1336E2F0DA0E2C32991E76C78C /* Data+Compression.swift */; }; + 78B7944A0F9E1A14F2787D72C0133A91 /* RDEPUBReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA685920BF70A411A454D84901312521 /* RDEPUBReaderTheme.swift */; }; 78D24D82D98D77E744FF73C9040618A8 /* DTHTMLParserNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 11B604FC3B0D5C91FEA763DCC0BE4DC5 /* DTHTMLParserNode.m */; }; - 790F591F6FBBF7C3D96992967CAD376F /* RDEPUBResourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49708F53EFFC5069D69D7BDBE145D5CB /* RDEPUBResourceResolver.swift */; }; - 7912E2B42F9391E4EA65BAF15B15F896 /* RDEPUBWebView+Reflowable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BDF13EFDE5C61F7A1B1FF5B79F02 /* RDEPUBWebView+Reflowable.swift */; }; 7A48CDFB40202EFD09A2A9AB0EE0770D /* DTCoreTextFontDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 56489D9BA834497E48438A4B4E1CCCFF /* DTCoreTextFontDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B34D900828BEC759105BC26F048790F /* DTFolderMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 2101691D5743105B2E3E40376584B91C /* DTFolderMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B6E5A0F2FC3FDB0CC0E70246D29C486 /* DTCustomColoredAccessory.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6BE3B2DA9A8C4CD3760CDAD6F305A5 /* DTCustomColoredAccessory.m */; }; + 7A6320A72DFF2C533B1CA8A927A9D516 /* NSString+DTPaths.m in Sources */ = {isa = PBXBuildFile; fileRef = A3565FEE19F19CB43A43409AFFF2BD2C /* NSString+DTPaths.m */; }; + 7A8961D4D3F7C2D7141C3AF9B2E60F0E /* RDEPUBPageInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E2529CE2E852CB74565B24AC7B88965 /* RDEPUBPageInteractionController.swift */; }; + 7B6DFB4412FF0ACDAD4320AA4EEA8E63 /* NSURL+DTAppLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D36F7CDCD7D5788CDCB3A1421DB242B /* NSURL+DTAppLinks.m */; }; + 7BBEA8E422292F56BFCE3A04391EBE01 /* RDEPUBReaderToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6A6391BB8EAA2BA440A903CFBD508ED /* RDEPUBReaderToolView.swift */; }; + 7C046A2B1C3E09420711F10C0B5FED3D /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392A75EAF280876545D14AA00517BA4C /* ConstraintMakerEditable.swift */; }; 7C05F56B62B15EFF344C5CDE4A52B8FB /* DTHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D4C9B7ED5E04C216AB28E3A4065C1C5 /* DTHTMLElement.m */; }; - 7CBCCA6CA9877B5B485B3321929131AD /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02EA0374C693F881AB36202FB276DCD /* ConstraintView.swift */; }; + 7C899BA1C93C579E0071B1C4AFF75521 /* RDEPUBWebView+FixedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 252896D6D97D0F06D5937D72DD041E65 /* RDEPUBWebView+FixedLayout.swift */; }; + 7CAA2C10A02EE7F4E6AF65DCB7F3772B /* RDEPUBWebContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1A53CCB5BC34FB44E35A4A29AA5591 /* RDEPUBWebContentView.swift */; }; + 7CCE1F11430F490242DCFFC47DD434A2 /* RDEPUBWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929106407362D571E93A73D87EAB8107 /* RDEPUBWebView.swift */; }; 7D29C0A53AB1B4C1B257D46EBBDC9DA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 7F3C9504CE51675D8526B0C8049F6376 /* RDEPUBPageLayoutSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5931AEB1E931A7219B0643093173E4B1 /* RDEPUBPageLayoutSnapshot.swift */; }; + 7F1244DE6C0ED5875B9149BDD300C1BC /* NSString+DTFormatNumbers.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D86C7063D1128EAEB3A30EBEF214B3F /* NSString+DTFormatNumbers.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7F9CC306B17D409DB903DF850FEDA64C /* DTListItemHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F7B0087DE7C394A677F5883541AB4FB7 /* DTListItemHTMLElement.m */; }; - 7FDAEFDFE0E3207DFD5A7B41A5D6D6A6 /* NSString+DTPaths.m in Sources */ = {isa = PBXBuildFile; fileRef = A3565FEE19F19CB43A43409AFFF2BD2C /* NSString+DTPaths.m */; }; - 807DCEB839DA036D9FCD04FB6AE9A7CC /* NSURL+DTComparing.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BFCAC7C2AEA867E67C63A852576774F /* NSURL+DTComparing.m */; }; + 8093FDC6F3C2D5F6250492A548EA73A2 /* RDEPUBReaderBottomToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97FCA163E8AE5E977B12F9060F220252 /* RDEPUBReaderBottomToolView.swift */; }; 8099F1E613A15275EF5FC59ED3C73579 /* NSAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3D7C8444F58D9B3FCB4F3006D2CFBA /* NSAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 81086493EE5742CF823461235F60AFD2 /* FileManager+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B7D3C6F0C845E3D42BBA613FFB0465 /* FileManager+ZIP.swift */; }; 811D7CBCD710AE45FF80A4B05BFE444C /* UIFont+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E1548FC42118F1A4164739DE6BE4E9 /* UIFont+DTCoreText.m */; }; - 8136892B4CED3C9F5693FCC921ED6014 /* RDEPUBDTCoreTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 749ECE28D47716A820DFDFAE1C9E294D /* RDEPUBDTCoreTextRenderer.swift */; }; 814D0D63E5FD4AB7231E63064FE9EB5C /* NSAttributedString+DTDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = BF4F3EC137168B92A5DA85AF50CD239F /* NSAttributedString+DTDebug.m */; }; 81905A7717925A17E6B98E934A75B8BA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */; }; 82119A0DC4981CC2AF389C7C4CC08186 /* DTListItemHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 98658510AA525496EBF5792E5D9884ED /* DTListItemHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8237C1DEFAFDF60BF4B7180EE80E0493 /* RDURLReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC598DC4A28E4CD6EF8AA1BDBED7D2D /* RDURLReaderController.swift */; }; 83A4BC9FE4765C9B848DD4925D99F362 /* DTAccessibilityElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 99299A9FD6EF739D18352AC5B9325CB0 /* DTAccessibilityElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 852D45A539C10E1089633476FA1BF72F /* DTFoundationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD568D38C209BA1CC0EBFA809A35204 /* DTFoundationConstants.m */; }; - 86B08C25B03944090A4196B7EC75BD4D /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5B34EE2160C27947D1EEFD42184CF5D /* ConstraintLayoutSupportDSL.swift */; }; + 83D0422FB78BED08AE09435CCB354F4D /* RDEPUBTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 749B6320F95F8F75FDF6B8ACC3E43D57 /* RDEPUBTextRenderer.swift */; }; + 8444C850D0A40CD0A8F32EF44197A6FF /* Data+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC78D0B0F37BF9AD1058CACA9AAF9BE /* Data+Serialization.swift */; }; + 84BEA3D5956D75FED777C15736EE787A /* wxread-default.css in Resources */ = {isa = PBXBuildFile; fileRef = 32D260607CE02388D7741193F901AF75 /* wxread-default.css */; }; + 8548C2C333CE758AF37B85D03AE4CFB7 /* RDEPUBReaderSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2C63A2462C2CA8751808A396C796F2 /* RDEPUBReaderSettings.swift */; }; + 8999804F6563D2105144FA9D821F3166 /* RDEPUBSearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39A422EF35AF8F3EC0DCD8BCAF01A32E /* RDEPUBSearchModels.swift */; }; 8A0A0FB23DB0021ADC9AD0D90631883A /* NSMutableString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6293E97E128E98559FB74D9A342EAD /* NSMutableString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8A35CC67F0AA6B26397C10D756EA34E8 /* DTTextHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = FB2ABB1D297442D91AA42F1407DB4A58 /* DTTextHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A9FE5BF5D0F11AF4BB5FC428D3405FE /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C647A2EB2720BCBF88B160D124B57BF /* UILayoutSupport+Extensions.swift */; }; + 8AA746B78ADA7C80D5BC28F8B53D8723 /* DTActivityTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8272D0B59ABD6652D0CAE3DFCC2C5EE1 /* DTActivityTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AB361C3413C66575600A33ED1EC699C /* RDEPUBReaderChapterListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EDE24320E72FF6E77D1E402600E9753 /* RDEPUBReaderChapterListController.swift */; }; 8AC90941E71199090BCED76DE89EFB60 /* DTAttributedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 77A613841EB90827AF321DD50B21DB5D /* DTAttributedTextView.m */; }; + 8AD34CC035AC1D89AB68C1327FAE3C62 /* DTFolderMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = B245F7E143F3091652C64F6593E33F7A /* DTFolderMonitor.m */; }; + 8B35034FEA4599E7AC24215B10A2CC54 /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91144FC099DD458E61625CD939577DAA /* ConstraintDirectionalInsets.swift */; }; 8B405CE13E7D718A9340A82B52766AB2 /* NSCharacterSet+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 75FA8E843D9225BD65EB9D17825EC0F4 /* NSCharacterSet+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8BE89C6E06DB76798A757F2F0CF95AA9 /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9593E7B37569219F8D9A504B47707DC /* ConstraintAttributes.swift */; }; - 8C514EA67EF511F82BED7E0D07FB3D02 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AC9A769CBC46F65ECAE32EAD0F196B6 /* RDEPUBWebView+JavaScriptBridge.swift */; }; - 8CB79CDF6D245B7ECD4762E30F742545 /* NSString+DTFormatNumbers.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACA5E519F100582F0D772FCD76125C0 /* NSString+DTFormatNumbers.m */; }; - 8DBBF8ACAED4591294503366E9309DD7 /* RDEPUBReaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114B1402AFD8DC2B76F64E2A702FF5EC /* RDEPUBReaderDelegate.swift */; }; + 8B81B840ED3E5B4E15887391DD7E5B87 /* wxread-replace-latin.css in Resources */ = {isa = PBXBuildFile; fileRef = C65067E704BE5EEEDE5FC6FF04C9C0AA /* wxread-replace-latin.css */; }; + 8B831C5DE899A4C6E6A9756FF359E6F3 /* NSArray+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = CEA93EDA6ED54D374265AA5D6B9EBBA9 /* NSArray+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BE4E5EF4D6B2F597605AE93CD3452D4 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6578DFAB51436E8DF266FD087700E26B /* ConstraintDescription.swift */; }; + 8CA81801E1B75ED092543CB44D5C29EC /* NSString+DTPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = FC5EC7C3D1808C9CF53354D7A3D69EE7 /* NSString+DTPaths.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8E8726381CBCFB1EDB350183456D4EF7 /* DTHTMLParserTextNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 13AB6A32A293E3DC21A7047C6DB958CA /* DTHTMLParserTextNode.m */; }; - 90AC69AC4EBE7EE54AF3C57F6A9C1338 /* SSAlertSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE4FA5133891593CB45AF36B8EBF60C /* SSAlertSwift-dummy.m */; }; - 90FD859AE0F48677673C091645657C80 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 53D473C6F07982D3D25781A343EC5A99 /* PrivacyInfo.xcprivacy */; }; - 910E6231340C7EC7B59EEAE300B4C9DE /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CE078B465FDEF40EC0469626A2C2469 /* SnapKit-dummy.m */; }; - 9140D603032BA04797811C739821C2DC /* RDEPUBWebContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586127E2E5DFA220EAB96633512B3DF3 /* RDEPUBWebContentView.swift */; }; - 916313DF0E690AD86DE2126CB2027880 /* DTAnimatedGIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A9FBC69C7DA29A7283920FDA9EBBCE8A /* DTAnimatedGIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E9C2D9C827EA566D22F5E1131F794A9 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F090A0289338B14050FAF16C22605B0 /* ConstraintConstantTarget.swift */; }; + 8EC243629BE685783F8B3E64FA924738 /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E5637603691B9B35C2A886B686D3CE7 /* ConstraintViewDSL.swift */; }; + 90F6FF9B3DA53C4B6C2D2FC588AA385E /* cssInjector.js in Resources */ = {isa = PBXBuildFile; fileRef = C6F199830BC382B6C9AEF29F421EE0C9 /* cssInjector.js */; }; + 9144EF4B8243782D693D9C3F18E4D968 /* DTPieProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA1E8494B86FFD79C639DCB8C21E1BB /* DTPieProgressIndicator.m */; }; 91FDA47810CE5CE2C48AED9205AE89B5 /* DTStylesheetHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = DA25968B7C9A40031DA45BB328EA8A2E /* DTStylesheetHTMLElement.m */; }; - 922286D89E1F6F86F3876FD0EFFE4002 /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFE19508E12BF8B0B52E8CB4F724217 /* ConstraintMakerRelatable+Extensions.swift */; }; 92C59F96D443525E8833676479FA60C5 /* DTVideoTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 73A99927E52B24583A6A2CF7E6F23848 /* DTVideoTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 948D7F9528860715954579106312B012 /* RDEPUBRenderRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B40D87ADCB26B8270415FAA057AACB /* RDEPUBRenderRequest.swift */; }; - 94B1E7C8F5A10584F39D7CAE59E49801 /* NSString+DTURLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = CB7F3535507F56824BA21509302CF8B3 /* NSString+DTURLEncoding.m */; }; + 94A20C3CAA5381176EFE5636D8ECFFD3 /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD768C27E392C934C06DFB4AC401037C /* ConstraintMakerRelatable.swift */; }; 94F5846979DBC90E2B646E975F5ECBA8 /* DTHTMLWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B96B0998B49D8E149C995474DA5FE5F /* DTHTMLWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94FF947022AF6FE1F04D484EB69A2048 /* UIApplication+DTNetworkActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 77213203802F44012346181FED2856F9 /* UIApplication+DTNetworkActivity.m */; }; + 95596341B01BC4C7E8E25D13DF885DE6 /* SSAlertDefaultAnmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B8F42440B802E6EC2B1FF7E3022F3A /* SSAlertDefaultAnmation.swift */; }; 96507B8910C8C9DE0B221CFF0E8518D0 /* Pods-ReadViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 96ACAABF6BCAE1D6A957F7C5A5B291CA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 9817C19157DE66A9BD607AA3931E5325 /* RDEPUBReaderToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E372F6B632B54653CBA022D20FB3367 /* RDEPUBReaderToolView.swift */; }; + 96C233ED331A3F6A71D589160B7668F3 /* RDEPUBTextRendererSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9654CB2B436E0FB30970E9FCF3870820 /* RDEPUBTextRendererSupport.swift */; }; + 96FB53A9630F4A8B5A772DDC36E52801 /* DTFoundationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = FD03567681A79FFB6E81B3105503065D /* DTFoundationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9752BDBC8B255FC16E8DC9E10F407147 /* DTVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AF6156128A1A0CA24D9D06E346B9445 /* DTVersion.m */; }; + 982E91D1CAADCF6953B81B68AB159CEB /* DTFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FAB3C7F19A511C2B1B7DFBA3CA308C4 /* DTFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9854DC3F1763B6272C2EA3FC6EC40B95 /* NSAttributedStringRunDelegates.h in Headers */ = {isa = PBXBuildFile; fileRef = E20272295EC253826AEE1F83A15D47C5 /* NSAttributedStringRunDelegates.h */; settings = {ATTRIBUTES = (Public, ); }; }; 987538B07E11741899878EA8BC947F51 /* NSCoder+DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 354C5DD0ACC742762200A640ADA859C6 /* NSCoder+DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 98A581201B38BE408DF45B4151784877 /* FileManager+ZIPDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F9B298989305B9569B71E448E8C1D4 /* FileManager+ZIPDeprecated.swift */; }; + 989258CEB05005E2A8BEA35661CA8591 /* DTTiledLayerWithoutFade.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5EDCA3B21964D0462BE0982E2F0BF8 /* DTTiledLayerWithoutFade.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9917E9B804CD33AF3BE2A992A3510C97 /* NSNumber+RomanNumerals.m in Sources */ = {isa = PBXBuildFile; fileRef = B7672A26922DBD934FA1AC60D49EB322 /* NSNumber+RomanNumerals.m */; }; 992B7C8C824B5EA190EF1DB096064DB7 /* DTDictationPlaceholderTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = F9A2565B302334B662AB51DCF8E65EEE /* DTDictationPlaceholderTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9959EBA37505B2AACF77057A32B8F7F0 /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD081272B47A3B73CE693D21DC26827 /* Entry.swift */; }; + 9A35B17A98BF4BA386549F582B9C8118 /* SSAlertViewExtention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2280F2302F54E90122747821FE681543 /* SSAlertViewExtention.swift */; }; + 9A57BBF6B1A6FEC692F444E92C508997 /* RDEPUBAssetRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5C4BF1170DCF38B8CC1E4979A0334FA /* RDEPUBAssetRepository.swift */; }; 9B199D71D2F48B2055A7FDF9BD7051CC /* NSString+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = E27C503C8128BC3CE109FFE077AEF325 /* NSString+CSS.m */; }; - 9BAD2444EA7739384CC2A7353A214B0D /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD081272B47A3B73CE693D21DC26827 /* Entry.swift */; }; + 9BB5822506549A94B4A5A0B5F40ADC9A /* RDEPUBJavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1C425CE28DE9FA9CDD148A2986752D1 /* RDEPUBJavaScriptBridge.swift */; }; 9BD146F72B29C703798001F138B069C2 /* NSCoder+DTCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 9129D37C7F89AD8FD530663BB4503FC0 /* NSCoder+DTCompatibility.m */; }; - 9D360F6B48A691B42343D7DB4CD973AB /* NSString+DTURLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 31BD7533867336DEA9B835F471767178 /* NSString+DTURLEncoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D8CB20F75B0767AF187FAE3C595D790 /* UIApplication+DTNetworkActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 957DB4675D5CCBD3CB1762F08619F3F7 /* UIApplication+DTNetworkActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9DE04C83A68C7512C0A860FFF5CEC113 /* DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F98F0F060B066CAFBCD3C85C26B2B4 /* DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DF3F596DF4C655F29378648A7229D0A /* UIView+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 79A77584AB3B92B2508AE0BCFCB8FD87 /* UIView+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9E4AB71DE8B3E7218B53B2C8EF6B843A /* DTAttributedTextContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D72C5680EBE6CA716EE77281AA4436 /* DTAttributedTextContentView.m */; }; - A0A17EBE6BE92D7B152E9FB2FE0C013A /* RDEPUBNavigatorLayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EBF2D16BA02CD25CD1367A4F7026BB /* RDEPUBNavigatorLayoutContext.swift */; }; + 9E8DCCE70D492157FC50318D42742D5F /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5B34EE2160C27947D1EEFD42184CF5D /* ConstraintLayoutSupportDSL.swift */; }; + 9FC9FAE8041266F3F85ACD5B0E1E7B17 /* RDEPUBDTCoreTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBC86AC7AC17CD094469EC7DCE21724 /* RDEPUBDTCoreTextRenderer.swift */; }; + A0C9C636444B262AFF4C7AC91A9FF591 /* Archive+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED5693BD171B879406EA14C97F4AD8D8 /* Archive+ZIP64.swift */; }; A132A0C9EB13B65FB886B11AA2E6304C /* NSDictionary+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 27205D159B39090908CA0E9C3997B784 /* NSDictionary+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A13631B78D3686CCBB05AFFA9A9BB1E4 /* Archive+ReadingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 934F9BB2B3A313294F121484C3A97A14 /* Archive+ReadingDeprecated.swift */; }; - A1DC5CA85CD9DCBCD24E2066426AE72A /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0B32EA4B7A492EEF26CE260E9AEFA0B /* ConstraintMakerFinalizable.swift */; }; + A1FE48E415D345B47864748E6852C4D2 /* RDReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 875F2A69FD6767E29074114D638B2934 /* RDReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; A2CA9C27EB2B77637A12723F8CFE7AAB /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4428633C8EC3F6289CCF376F588CE0C4 /* NSString+HTML.m */; }; + A2F28D0E1EE3C7B2135DF059CC5B8FBA /* DTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B007AEEACE9EA271DD73AFD80A74D83 /* DTLog.m */; }; A30D5C1E413A3D319A83D3410A8A549F /* DTCoreTextParagraphStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F760D62F6C6F083374702146337F2CB /* DTCoreTextParagraphStyle.m */; }; - A361BD208575C1F9519EBD2A7987D353 /* RDEPUBParser+ReadingProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE1E0CEE577C4985CB816FDA2AFDA3F /* RDEPUBParser+ReadingProfile.swift */; }; - A38360C4EBCCE4450D52F7B9CE4F6D8D /* DTBase64Coding.m in Sources */ = {isa = PBXBuildFile; fileRef = 061BD3911E4E530C792E65CED7868C33 /* DTBase64Coding.m */; }; - A6CCC9339127977A4582A5AFFD2035E5 /* RDPlainTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 034E4400505DA6AC50F9D93914301F45 /* RDPlainTextBookBuilder.swift */; }; + A323CECAFCDE8E4009A1E598D839BBD1 /* RDEPUBSelectionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DEEEBC962A7BAB4EDB772B3A2279B2 /* RDEPUBSelectionOverlayView.swift */; }; + A33EB2CB8F875B027925A5CC9EEF8117 /* RDEPUBReaderPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93B0E9F83D59A57EF00599DBE41952BF /* RDEPUBReaderPersistence.swift */; }; + A3FF25BFBC5DBC01FB99578E25B361E7 /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6BA0ECCB0ACF8580C3B5192CA9F11B /* ConstraintLayoutGuide.swift */; }; + A667E54F636BD55EC03EACCB937AF1D9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; A72E9F983E5BBFA7485EFB482B80E89E /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 5155CCDD61E030184249A020FE5D74B0 /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; A7D665BBDADBE3D64023FF52E218FCFA /* DTCoreTextConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B3D0CB47B0A8E9EC5AF48B7F2DD6B0 /* DTCoreTextConstants.m */; }; + A92FACEFAAAFBCEF79747B917B280B85 /* RDEPUBWebView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB29D001CA71EAB0F6E4C7A8B0F04DA0 /* RDEPUBWebView+Search.swift */; }; + AA10BB78D6DCE8229EB4E146BCC9105A /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 885653999BD237A574B67DB279DE7E87 /* ConstraintRelatableTarget.swift */; }; AA3722CC8B4992EDA8A9F5E9116835B7 /* DTCoreText-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 015F3EE69253C66E11B931E3360BA5FE /* DTCoreText-dummy.m */; }; - ABC61D4F3EAE00629A5CD56CCEDEC8D8 /* RDEPUBWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D54A0CE6965D4142DB16CE54293F16 /* RDEPUBWebView.swift */; }; + AAAC44275D726EADF484E946691E09EF /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4684B406B325B35F39322D75B59B6479 /* ConstraintLayoutGuideDSL.swift */; }; + AAFA34024F80407B268712A30687AE65 /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 05D57D16346FAF830F1F82067307EA9F /* default.css */; }; + AC190D36F6593D186EF5CA6E01C3016D /* RDReaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70AA5021FC2962BB31E28C8BFDA797CD /* RDReaderView.swift */; }; + AC6220500850D0DB8142B44396FCA6BC /* RDEPUBModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2DE084B4CF376178F1AFB96BD84562 /* RDEPUBModels.swift */; }; AC7000465258822B466855B12F1F97A3 /* DTCoreTextGlyphRun.h in Headers */ = {isa = PBXBuildFile; fileRef = 49A21AE1A0AB5383F895B34EA7D6973D /* DTCoreTextGlyphRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AD517D4065385465763EC380F2F12210 /* DTExtendedFileAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 538572A5C098252D629F2185F1B1C9E8 /* DTExtendedFileAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADC19D506FE3D818BB4A2C0889F43DBC /* RDEPUBTextBookCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A61F7A5E8A862AB61CC09109D9E81E /* RDEPUBTextBookCache.swift */; }; - AE9DBB66E3281E810742770F88E04078 /* RDReaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF89E84A24C211E605EDA599629D3CA1 /* RDReaderFlowLayout.swift */; }; - AF5E5ED905BF79ECA8E838CC7DB39673 /* RDEPUBReaderPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2D1BAA539790DA3C1EA46236EEEA14E /* RDEPUBReaderPersistence.swift */; }; + ADD70654B7F6B32B2A687B2A7866027E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + AE25127DC32DB2C11CF9136EC7E484E8 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1E89FE5F2996336E862E82C1E14E0EE7 /* PrivacyInfo.xcprivacy */; }; + AF2E9051FD1821C3DC9C3AFBE674E0CF /* RDEPUBResourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6002874EC82D09DCF64076F537D57EE4 /* RDEPUBResourceResolver.swift */; }; AF7A1DC953992A149CB0815C90769529 /* DTIframeTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B931AB189BDDE2CCE8578B50BD60AF0 /* DTIframeTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AFF930A701A1822364C2C86FD8636D74 /* SSAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F410ED25E4E84C3D5166261CDF4B58F2 /* SSAlertView.swift */; }; - B02240DE23EEB84EEAC33F34ABD35184 /* RDEPUBReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA0CBC0DF8A08DDB5F0FE3812677CC9 /* RDEPUBReaderController.swift */; }; - B0FA52DE4CFAD71D0DEB6397C606BE5B /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A9A82CB094636AFB53D6D130D6219BA /* ConstraintLayoutGuide+Extensions.swift */; }; - B16ABF4764576CCAB4D26AED089DAF5E /* RDEPUBReaderTableOfContentsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9661A4FD82D29BF44C5DB5D68F4FF237 /* RDEPUBReaderTableOfContentsItem.swift */; }; + AF9AE1A497A51A6C99E09D260EE8939F /* SSAlertSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE4FA5133891593CB45AF36B8EBF60C /* SSAlertSwift-dummy.m */; }; + B05D1543F8BF9AC00B000026C03067B9 /* RDEPUBPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8173B8E972A645B3A420B3C5C0DCDF6A /* RDEPUBPreferences.swift */; }; + B0BDB773F63288118EB1DE8DB294E53C /* RDEPUBPublication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF085139C084B6CB83EB511352CC385 /* RDEPUBPublication.swift */; }; + B189C3640D0AACE5C0B2513E932166F6 /* DTCoreGraphicsUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = A8DFDCAB69B471EB5667C964865C26CF /* DTCoreGraphicsUtils.m */; }; B24FAD34A7915FC4B90FE9038E814FF2 /* DTLazyImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = A4E43DCDE0C8751557E7E65FEEB1C865 /* DTLazyImageView.m */; }; - B30DE6DB9957309D3931784688842305 /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D62D3200AC3D4E42C81CDFF7E884E8 /* ConstraintItem.swift */; }; - B338DD4D050174DC3BB7EA0E1A603333 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - B49110DD052390A83B240527E04925C2 /* DTCoreGraphicsUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = A8DFDCAB69B471EB5667C964865C26CF /* DTCoreGraphicsUtils.m */; }; - B682D806EE482878932EEA0F55456938 /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50297AAB8278F2BB6FCFE82B20C7A049 /* ConstraintLayoutSupport.swift */; }; - B6B040EE86C6F779D5ED7097204F977C /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945D4549E0B9168D7DDB910DE874B874 /* Typealiases.swift */; }; + B533B190B349CC90CA4814887EA7185F /* DTAnimatedGIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A9FBC69C7DA29A7283920FDA9EBBCE8A /* DTAnimatedGIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; B7BDD79FC06A1E4E0E17592860844108 /* NSAttributedString+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = FF3F7BA20A1213804048557D946CEEA9 /* NSAttributedString+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; B8332F36582F7A001FE85A8D54B27C9E /* DTCoreTextParagraphStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D62C5531667F364F14DB67D33FFA554 /* DTCoreTextParagraphStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; B86493B996A888D1DA7814ECB6028E22 /* DTHorizontalRuleHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = A68D72764140BC3DF67A2B9E52CEC7A4 /* DTHorizontalRuleHTMLElement.m */; }; B94CD41727DFCA8791EED8FB2CA397DD /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 2702E05AA7A266B7D8D0F881FD4E09DA /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B9638897A5C60E1B8F5B659021B80961 /* NSString+DTPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = FC5EC7C3D1808C9CF53354D7A3D69EE7 /* NSString+DTPaths.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BBDF9E3F2B2A1390FA7DB0CC57E775FE /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E138EC76D0DF24544D29D1A4D7429E3 /* ConstraintMakerPrioritizable.swift */; }; - BC1548A44F95A81E27BDA91203A45145 /* URL+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537BB06317FA188DF7A8A960152520E8 /* URL+ZIP.swift */; }; - BCA7D49D31B99D9B3522A16BA0F2FFED /* DTHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D75FEDE65722CF41F7F32A164376926 /* DTHTMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCD19BC9907BD61075E963B0F808D4C2 /* RDEPUBTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C879D1B97FBCF728EA0A7A1FD445EEC9 /* RDEPUBTextRenderer.swift */; }; + B9F9B1F8E6FE6D22AAD7C2D9B8E660BB /* Entry+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7345CE45F696634CEA692A86D16F684C /* Entry+ZIP64.swift */; }; + BA174999E3413F5A45786FF54383240D /* NSFileWrapper+DTCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = 1756C6FFCA695290BA62DA4E7B6DD20B /* NSFileWrapper+DTCopying.m */; }; + BA714218310D9BC815D508D7EBA90089 /* RDEPUBTextPaginationSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B89D235A3ECE3B096FBB5E7A2626C9C /* RDEPUBTextPaginationSupport.swift */; }; + BBE7C12DD486B57DBAA98F86AC80994A /* RDEPUBParser+Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AD993F901F35B7F58E0A7AC2F8962BA /* RDEPUBParser+Archive.swift */; }; BE12CD112F82AD9050D7FB29395F27F9 /* DTVideoTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 63A6EDF10DA5A051C6CDCBE5D97AF11E /* DTVideoTextAttachment.m */; }; - BEA95EC6964968F6BF8F97E94B7E557C /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7176B677A350927FC670368313DC2CA1 /* ConstraintConfig.swift */; }; - BF24D074ED2DFCDA87CD3D72881E3BFF /* ZIPFoundation-ZIPFoundation_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; }; - BF5BC9DDDF08C70BBD4F9C31D2226D54 /* Entry+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F991240340FA026C71B68EB25B9F9C8 /* Entry+Serialization.swift */; }; - BFB26B0704E537A580EC61D6E2A3605A /* RDEPUBChapterData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A85F27E07E44ECFCCBCECAAE32A56F /* RDEPUBChapterData.swift */; }; - C077B7981B6ADE25D1D51BAEE316C65B /* RDEPUBTextIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE99150A429F1AA375BD9A89473100CB /* RDEPUBTextIndexTable.swift */; }; - C18438DC910FD5C2AD24CFC0A967061D /* DTBlockFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A0BD48DAF5AE9DB087F2552E99069709 /* DTBlockFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C1F30655811FDBB6920A8D300F06C1E5 /* DTAnimatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = BC332335B380BC51C4F05C5CCDFB9189 /* DTAnimatedGIF.m */; }; - C27B98C72CD3AA827D7CBC3A9E0A3AEF /* Archive+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA251BAC8B430B3A4D4C4321046B990 /* Archive+Deprecated.swift */; }; - C4AEFF8185BBEBD05C3CB6EFA6E43AB9 /* Data+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC78D0B0F37BF9AD1058CACA9AAF9BE /* Data+Serialization.swift */; }; - C4F9BFFF7470026F06CF1E0B4794435F /* RDEPUBParser+TOC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D388240137738CB7BC33CB6B82A62A /* RDEPUBParser+TOC.swift */; }; - C518E17914E24B57ED13D1C1E11104BF /* DTCoreGraphicsUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B6425B2235BA00FE865AF58EF44F1144 /* DTCoreGraphicsUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BE268016D8D21C191A2E82ED75A1F686 /* rangy-core.js in Resources */ = {isa = PBXBuildFile; fileRef = 49553EE889D9BB1C29A6AA69A857A8EB /* rangy-core.js */; }; + BFF4E73F7207C5C28837D4A6684055B1 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BE22EE711B7A38A4443E1C1C12BD79 /* ConstraintMultiplierTarget.swift */; }; + C0CDCF140488BC1D63E83DBA74D30C2C /* RDEPUBTextAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA430D9A4A6EAE818564BB80309781D /* RDEPUBTextAnchor.swift */; }; + C341EF847BE944F959495C8145AE915D /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A5ABB8F3656A110B955B0306E9A8C3 /* ConstraintInsetTarget.swift */; }; + C346D582EB4C894FB4D2FFBC5FDD2D28 /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B10D3EC1701BBA4D69926915F942558 /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C41084FA13EB4E085E82258526EC3565 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; C5EE8E7373FBD24E66C678356393D871 /* DTCoreTextFontCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E791886E59DC0FAB02C6BBAB5BE5B6B /* DTCoreTextFontCollection.m */; }; - C61A176195700DBE89F52D928319C4CB /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6BA0ECCB0ACF8580C3B5192CA9F11B /* ConstraintLayoutGuide.swift */; }; - C661BA0FD7C2D7693FF02A57384EDCE1 /* RDReaderGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 573B36675B38E2D9301B3CCFD9E7CCFF /* RDReaderGestureController.swift */; }; - C6A421CEC68B444EFC2E496473EDD93D /* SSAlertDefaultAnmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B8F42440B802E6EC2B1FF7E3022F3A /* SSAlertDefaultAnmation.swift */; }; C6B65C0EA759DF426FBBBB113BA3C3E8 /* DTBreakHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F734214E067BDBDB581911E1A5CDAADB /* DTBreakHTMLElement.m */; }; C72CE4B974DFAE2C3037D425EB559314 /* DTCoreTextLayoutFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = CE6907AC04870132CCE3177E894607DD /* DTCoreTextLayoutFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C78E9E8C277379E5FA7E49DD9C3A730B /* RDEPUBTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763D7B1705C9113C0A37E0775C4F9FEC /* RDEPUBTextBookBuilder.swift */; }; + C7B4B692AC1E9B6F6A844F171DE1BEC4 /* DTActivityTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEFAE80193E1F0DA53400C9AD641410 /* DTActivityTitleView.m */; }; C8F753B56A6C4D2A938B6EA68CF522F8 /* DTColorFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 86A0361390AA0C29BC1A5487083A12A7 /* DTColorFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9DD05EF2D27FFEBFA7BF6F437168501 /* DTCoreTextConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = C8C20D9A71E6605DEE80342E7122B683 /* DTCoreTextConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CBF07238641A620765EA20CD83EAAF39 /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6DB34ACB132E465CDF8191F7DB71EF6 /* ConstraintView+Extensions.swift */; }; - CC4CDD671505535301C6D768F83B4932 /* NSFileWrapper+DTCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = 1756C6FFCA695290BA62DA4E7B6DD20B /* NSFileWrapper+DTCopying.m */; }; + CAA01BF56A0A87A5C9260A864755863F /* RDEPUBTextBookCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D52166703BA10418F79BCD397B07DB /* RDEPUBTextBookCache.swift */; }; + CAD07B5D2FADB9B4A8F807CB4EB4F92A /* DTBlockFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A0BD48DAF5AE9DB087F2552E99069709 /* DTBlockFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC8B8F3D758E98B51F69EDFAA69663A4 /* NSString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ABDEFEA94DC6408D92AC66DA3625DE5 /* NSString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CCCED38A43502AC6473C11606D64057D /* DTBlockFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 375179DD3A4576CEF947E1760BBDC69B /* DTBlockFunctions.m */; }; - CD6559AD4A5AF89AC14C50508DDE8AD7 /* RDEPUBParser+Resources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44009B7A804BFDD7B2AD3F1CBE12CE42 /* RDEPUBParser+Resources.swift */; }; - CD687E7FE5C54C6CB1ACD0156881B031 /* RDEPUBWebView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DD8D4287E569AB98F04CF03AE208B71 /* RDEPUBWebView+Configuration.swift */; }; - CE8D398221836AA888D3253140243BA2 /* SSAlertSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 937CEFA81DA4227008DBFB114783A08B /* SSAlertSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CEDB56407E114E2183F982942D98EE80 /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = C241AD9CEC9D6732CFBA6A55B49E64C9 /* ConstraintInsets.swift */; }; + CCC981AE077E9F3E0BCFD8914E7D6F0B /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = C422BCADBB48E28B549495663705A0FB /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CDA8EE4B287129954949825C50EBD3EB /* epub-fixed-layout.html in Resources */ = {isa = PBXBuildFile; fileRef = 353AB6D63236BF3C98B630EAB53AC742 /* epub-fixed-layout.html */; }; CFC49467FE75BFABC22A1CE2FFA26570 /* DTImage+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 12A5EA26EE7539EDDA90649D22FB675D /* DTImage+HTML.m */; }; - D0AE0A76C7B05D961789B619FE18B12E /* RDReaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1C84185018F1316377F86BE207A7A3 /* RDReaderView.swift */; }; - D0D213E45A7BFA290F79682A8B42C610 /* RDEPUBFixedLayoutTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6D9DE483A33AFF82D025E95ABAE82B1 /* RDEPUBFixedLayoutTemplate.swift */; }; + D0DEF92032CC5203F7CA51CCE03979FD /* UIColor+RDEPUBHex.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5DF77100B1D534940D2F5CEFCBB9F01 /* UIColor+RDEPUBHex.swift */; }; + D1792FAE89B67B4379A9B4157E22290F /* NSURL+DTUnshorten.m in Sources */ = {isa = PBXBuildFile; fileRef = C80065DBA5634DAA71129404975D7349 /* NSURL+DTUnshorten.m */; }; D1A93B2D7F1B312755C48790338D7712 /* DTIframeTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = AA3CFD777AD76F97EBA05B3920F5786A /* DTIframeTextAttachment.m */; }; - D2D54E0E6F07EFBB725682A8D8A213C3 /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C7129757B54DFD9E445D0A17D73A83 /* ConstraintPriority.swift */; }; - D2F269387653D0FA410A3555AB58DCE6 /* DTVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AF6156128A1A0CA24D9D06E346B9445 /* DTVersion.m */; }; - D3602269C1605E3C28EABBACBE425778 /* RDEPUBNavigatorState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CD377E1D9608FD654CA2A3B1D4DF344 /* RDEPUBNavigatorState.swift */; }; - D412271B77856413B1001384E7C9AE82 /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; }; + D275929B8625E9F1E4A8306279B8B916 /* RDReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8432F1648F7FDA0F1A736F8A53739308 /* RDReaderView-dummy.m */; }; + D275D1EAFB36E5273169E7A4417E1219 /* rangy-serializer.js in Resources */ = {isa = PBXBuildFile; fileRef = 129DD2A43FC15DC9844C508DFE51D24A /* rangy-serializer.js */; }; + D2FC00885DA4EA4587ABF3384C82062B /* RDEPUBTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F815D5A48F693355A35C89FC9E51D336 /* RDEPUBTextContentView.swift */; }; + D38A633998460910E98BF5E93841DAD6 /* NSMutableArray+DTMoving.h in Headers */ = {isa = PBXBuildFile; fileRef = B0AC307F12521444C973EA0DE38B4608 /* NSMutableArray+DTMoving.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D47B1A18F9830B10F0BE5D3E7B13C13D /* RDEPUBChapterData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967506B2C9A33F6E902BDA98940C603F /* RDEPUBChapterData.swift */; }; + D47F4852A393C8731EA395FE7CB059F4 /* UIScreen+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F051D813D50D20D53205D5FDCAA877C /* UIScreen+DTFoundation.m */; }; + D4EAEB6CFB1CB5C3B2456D475B2A460F /* RDEPUBTextSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8C4EB13F9C6442DAD004816726B09A /* RDEPUBTextSearchEngine.swift */; }; D526E03C098DA6CF8F01C1BC126C9BBA /* DTCoreText-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CE7768E097F8BDE9FBE3752B98CD0101 /* DTCoreText-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D583A6E063AFB5A0E1B24EBAC86F5BB5 /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = B5FCE04EBB553439D1C2BA1001936293 /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D68CDB4A9AFFBBDE8383EB3B4D27D7C2 /* RDEPUBReaderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89ED8313799E7A012F5A06BCEACF09B8 /* RDEPUBReaderConfiguration.swift */; }; + D7159CF29AB1F8821F9D68A1412B0BD7 /* epub-bridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 33D8E2EC0A0BDF6FCA33CA829E2C6FCF /* epub-bridge.js */; }; + D7972A2540E20B28E2C9D299AAE8AF46 /* NSMutableArray+DTMoving.m in Sources */ = {isa = PBXBuildFile; fileRef = 53499F40E1790A6CBE8AFEB3AC5BEFC8 /* NSMutableArray+DTMoving.m */; }; D82DDA4C1E5C4D5378A9E5EA3F8E9DFE /* DTBreakHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 533CFFF04BE7BC4BDEAE11DF675A84CA /* DTBreakHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D8435365E01789A7EACBA963C1C92C6D /* RDEPUBTextPerformanceSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3119842637EAE995A0DAEBEB1170E363 /* RDEPUBTextPerformanceSampler.swift */; }; + D8F2872A4205075B286FE7718FC696CE /* RDEPUBWebView+Reflowable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6861909964EF2CEDB7ED884A3B410A7D /* RDEPUBWebView+Reflowable.swift */; }; DA5B51E5D80C161D2902B6FC60DA5EC8 /* DTImageTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 426D442C01742E4361F5BC34D43152A6 /* DTImageTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; DAD16D3E6EBB32FF96C63BFE6037065F /* DTLinkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A1B75050E71BDD96FC19EC6BA129E6A /* DTLinkButton.m */; }; - DB1699CD46DB4D42E854405177569B84 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F950CEF31AC0065C0BEAB26BA2CEFA1 /* ConstraintOffsetTarget.swift */; }; - DB8DE9962C27333B7EAE30671A2F87AC /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */; }; DBCA42F7E1697F4EC82E0E7C9657851D /* DTAttributedTextCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D4093D30B372960168C1349100DF7DE0 /* DTAttributedTextCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC3E2932A82AD5D88D8B1EFBF004BEC8 /* DTCSSListStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = B509CD4B498635D4536245E43D802ED9 /* DTCSSListStyle.m */; }; + DCD33DEBC59EAAB25D3B3F34EA206133 /* Archive+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA251BAC8B430B3A4D4C4321046B990 /* Archive+Deprecated.swift */; }; + DD4857F182195748AB22953A3AD5CFBC /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D495E2AB1223BD4D4909F8FF1FF47DAF /* Debugging.swift */; }; + DD55868C1A308AE1C5D56E5E3FA0AE44 /* RDEPUBFixedLayoutTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 660901C91F4E1D354689FF2F8B6E1679 /* RDEPUBFixedLayoutTemplate.swift */; }; DD73CD0E5148961D1ABD80E050122314 /* DTCoreTextFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A1B031E2B903C2F177195C1C3D1D1EDB /* DTCoreTextFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD75D7D90DE6DB0FC4722C6A267B173F /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9593E7B37569219F8D9A504B47707DC /* ConstraintAttributes.swift */; }; DE68AD2F426FD462BC70F968E5AF5553 /* DTTextAttachmentHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ABC2F552388CD08EC1EFDEF606AE222 /* DTTextAttachmentHTMLElement.m */; }; - DF1ADB5D7BB4EE951433FBEAD1FD02DC /* RDEPUBReaderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDF01B7EF5DD6EA4CA5168C35069C495 /* RDEPUBReaderConfiguration.swift */; }; - DF51C9A2429A74A4DFB895937B7C0B85 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932FD688DE493323BA6B691BC2CB5094 /* LayoutConstraint.swift */; }; + DF8D260A10033EBCFE8C5413EFF1535F /* UIViewFrameExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8C351514678D41C58869BD057D5483F /* UIViewFrameExtension.swift */; }; DFB5A1C64C7908FD05BEFF7C7B571353 /* DTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 5679D281C282896E6FC352C48E0AF439 /* DTAttributedLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E121E052DAF546C0204B13A0A1C50401 /* RDEPUBReaderBottomToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDE060ABAEC551BD0CD924CE4DE7058 /* RDEPUBReaderBottomToolView.swift */; }; + E0021B223A2E2D11206F395CCFA31A02 /* RDEPUBNavigatorState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A800873D793225974FA75561B0810DF /* RDEPUBNavigatorState.swift */; }; + E0DA92D28A9D84B483111D6C0D35A118 /* RDReaderGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2682E7883D110ECC2F46C6270375D24 /* RDReaderGestureController.swift */; }; + E1A1B8B02C3EF2EF0008C7DAF6608192 /* UIScreen+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = A3765B289CB7E6C5DF6160D8EBC83C3C /* UIScreen+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; E1DA58105A72D6C0B77A8A9F7822BD68 /* DTCoreTextLayoutFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 029130886CE8E422D16ADF97468CB1B0 /* DTCoreTextLayoutFrame.m */; }; + E2731FCFCF96868342E633F7962FD9F5 /* SSAlertAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97995C73297871C353364E685939DED9 /* SSAlertAnimationController.swift */; }; + E3726D55A7B60C3DC86EC4D90370426A /* DTFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FCC718115E5C31C88A680522AE36B089 /* DTFoundation-dummy.m */; }; E38FC7829B5BDD1588FA487E0FBAC208 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - E61908BD6CB88CC2A456AADBD820C9F0 /* Archive+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED5693BD171B879406EA14C97F4AD8D8 /* Archive+ZIP64.swift */; }; - E815C9978BE13179EAD3578B50814E1F /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B10D3EC1701BBA4D69926915F942558 /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E5926D0035C1FE12AD81A4441276CB8C /* RDEPUBParser+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 551DE8194BF851EE58EA61CBBA1710B1 /* RDEPUBParser+Package.swift */; }; + E61C54D454FC27FD101B58B9BC395466 /* DTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A1EBB9497F4846C84CA0BF5E4F84FC7 /* DTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E8AB2FEE8443436B10DC3BD74A8226FD /* DTFoundationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD568D38C209BA1CC0EBFA809A35204 /* DTFoundationConstants.m */; }; E8AB5CE26A5224EF09E9E363D70C7775 /* DTDictationPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE0B56638AFB77F4455784A7ED59876 /* DTDictationPlaceholderView.m */; }; + E94DC7964A5276288537BA9B36377647 /* NSFileWrapper+DTCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 09C957F3199C596781EFA1DEA1DDCEC8 /* NSFileWrapper+DTCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; EA0040823CCF8E97363DB5891F5DA6D0 /* DTCoreTextFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D44B82815CA3397BE2C9F64819B88 /* DTCoreTextFunctions.m */; }; - EA27A76BD9FD576755BA1179041236A9 /* RDEPUBReaderChapterListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3CCE79B11EBF54E7B1195D4F4CD00E /* RDEPUBReaderChapterListController.swift */; }; + EABC41A8E3D4525FEEC80C2F6CF0C108 /* NSString+DTURLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = CB7F3535507F56824BA21509302CF8B3 /* NSString+DTURLEncoding.m */; }; EBB7E4D4DB253B5F1267CF9B4DDB4E93 /* DTCoreTextFontDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = BCCA590DB72AA93275262A414F16578A /* DTCoreTextFontDescriptor.m */; }; - ED6C2ECBB71A2E3E35FE6C3AF96EF5B7 /* NSDictionary+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = C18480913E002315E3F5EC6945371697 /* NSDictionary+DTError.m */; }; EDA269B595D70EC2B9D81DC890157D63 /* DTAccessibilityViewProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = F37563A56C180CE18EEFADE56FA3C17F /* DTAccessibilityViewProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EDE07C2D89DEC86AF5B3BDB830DFDFDB /* DTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD9F2023FF826F67E69E3407A70A8A6 /* DTVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; EE4F0992A0F597320FF7BDE4691D0FD4 /* NSString+CSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D6C48939A8498A09DCFC7F41ECB8A25 /* NSString+CSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE90D86ECB7ABC204BFB13F2FC315D03 /* NSMutableArray+DTMoving.h in Headers */ = {isa = PBXBuildFile; fileRef = B0AC307F12521444C973EA0DE38B4608 /* NSMutableArray+DTMoving.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EFAF5BBFB7E60F9044B865B5771FE618 /* DTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A1EBB9497F4846C84CA0BF5E4F84FC7 /* DTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EFDDBC3AC88A2F9843346E3A0A5389F0 /* DTCoreGraphicsUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B6425B2235BA00FE865AF58EF44F1144 /* DTCoreGraphicsUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; F006F73F17F2E3CC0E7852E9357BA946 /* DTAnchorHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 424F12BEB0EDAAF1C719B5103D30C653 /* DTAnchorHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F0D47930AC51626265F4CEDCAEB0D1B6 /* DTSmartPagingScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = D2BA6D5DBD4C6A9285C4592721790A26 /* DTSmartPagingScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F045CE2C2618CE50C24CD7337B7C69A3 /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C647A2EB2720BCBF88B160D124B57BF /* UILayoutSupport+Extensions.swift */; }; + F0561A69C416F2368A40D6BAF663B2E1 /* Data+CompressionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D641809A99849F80FDCB02F8CE8D6A0 /* Data+CompressionDeprecated.swift */; }; F0F631056BADA32253528247DF493272 /* DTHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9D4A455723797A27F04A15C4E47823 /* DTHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F1223D1CEF088198A2B27D90D3CC4F58 /* NSString+DTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = BE547E464E5D34F9FFB24BAC81D1E4CC /* NSString+DTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F1DEB3C74B8755D6FEB5D0A98B1516DC /* DTExtendedFileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = F5389D4E96A4AFE175691B4D3D4524E7 /* DTExtendedFileAttributes.m */; }; - F1E14DC7A9D61093A030F7A69D0AA8B6 /* RDEPUBReaderHighlightsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91E98E8EB07A175FB72DCB4D69B1BF40 /* RDEPUBReaderHighlightsViewController.swift */; }; + F1E8826F0590E0CC1F5A0128D99D7AA3 /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFE19508E12BF8B0B52E8CB4F724217 /* ConstraintMakerRelatable+Extensions.swift */; }; F1E9B6D0728711AE4D7154616DBC17EC /* Pods-ReadViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */; }; - F3405C56A63F0B88682C17782422E787 /* UIScreen+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = A3765B289CB7E6C5DF6160D8EBC83C3C /* UIScreen+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3EAFDDD47F845D1096ED136515CC915 /* NSFileWrapper+DTCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 09C957F3199C596781EFA1DEA1DDCEC8 /* NSFileWrapper+DTCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F41E072AEF83CD3DE72E7375FEBC91A1 /* DTFolderMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = B245F7E143F3091652C64F6593E33F7A /* DTFolderMonitor.m */; }; - F4653CC8B73CE175A4A677165D687137 /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 05D57D16346FAF830F1F82067307EA9F /* default.css */; }; - F47E741B08FF5641DA24EBE1B7EC9DC7 /* RDEPUBSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982BAB73B44D6A14A904822EB0836FDA /* RDEPUBSearchEngine.swift */; }; + F2376D242202DBE8F1E8ED36A43FB5D3 /* ZIPFoundation-ZIPFoundation_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; }; + F25AD7EBA6F5DF35A82207F6D7E7A25C /* NSURL+DTUnshorten.h in Headers */ = {isa = PBXBuildFile; fileRef = 054674EB90C625BB4BEA9368ED92592B /* NSURL+DTUnshorten.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F27B7E0ECDB515E97953535C268DFC0E /* RDEPUBStyleSheetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C1467D2571E3541EC221A49C90B110 /* RDEPUBStyleSheetBuilder.swift */; }; F4A2E3C4237B8931F61B72FF0BDD6D69 /* DTObjectTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = F038FB491B9A4A53447EF0DC333301AE /* DTObjectTextAttachment.m */; }; - F51883B7D8D4858816A049BE80A3082C /* SSAlertAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97995C73297871C353364E685939DED9 /* SSAlertAnimationController.swift */; }; - F56CB98504978D122BE9C266F138F5FC /* RDEPUBSearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C092A5458F6A10FC8ACE9435997C5B /* RDEPUBSearchModels.swift */; }; + F588926C35B92A750FB13835C0111BB1 /* NSURL+DTAppLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = 557DA029E15EC99631B647AE8922007F /* NSURL+DTAppLinks.h */; settings = {ATTRIBUTES = (Public, ); }; }; F58ABA106C6200175DF574DF05A75BA8 /* DTAccessibilityElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F0486D3B46DC92AB254D6EE9CC233BF /* DTAccessibilityElement.m */; }; F5A424E67F41C4F7B830CE2F7E71570D /* DTCoreText-Resources in Resources */ = {isa = PBXBuildFile; fileRef = F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */; }; F6036BBDFE7484F5A453F6876C97C098 /* NSAttributedString+SmallCaps.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F99C8130EE83A22CD223C7F5E6E66E /* NSAttributedString+SmallCaps.m */; }; F61102C9BF3D6296CB6C6B754ABF98C5 /* DTTextHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CFEE298DD52246B46E6FA62B16B38DF /* DTTextHTMLElement.m */; }; - F63D8AF90CA41EC0AD2B733300965F65 /* NSString+DTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DCECDBD73595CA88A2208000B4B68352 /* NSString+DTUtilities.m */; }; - F6AB64DF24798D3F7A7019EBA1131AF1 /* RDEPUBReaderSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA7CFC7A07A8C9400697DA331E35860 /* RDEPUBReaderSettingsViewController.swift */; }; - FB7120CA0EB9D7C08AFA863E338CBA90 /* RDEPUBPaginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99EF157E0B58EE5D8605F8EDDF4D9350 /* RDEPUBPaginator.swift */; }; - FBA09EE40DD15105176DD088697EBA72 /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD768C27E392C934C06DFB4AC401037C /* ConstraintMakerRelatable.swift */; }; - FBA3629CEC806A18708776D770036541 /* Archive+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A2659DB0685E16ABAE0382F726DA8C8 /* Archive+Helpers.swift */; }; + F6511F62871012278880F32E36DC1B20 /* RDEPUBParser+Resources.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4EE1E0ACE64032C6C8CB26A91235993 /* RDEPUBParser+Resources.swift */; }; + F65F1F57FE114E39EDF8BD657EF8565B /* NSString+DTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DCECDBD73595CA88A2208000B4B68352 /* NSString+DTUtilities.m */; }; + F675FAE700CEDACDC117FD78CBC91B9E /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6DB34ACB132E465CDF8191F7DB71EF6 /* ConstraintView+Extensions.swift */; }; + F7B3249FC969AB2C684558D696807F42 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A651CEE8062C84A597DBC44ECA3DBCC1 /* ConstraintDirectionalInsetTarget.swift */; }; + F9C5409DC727419DBFA6AD6701108F13 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */; }; + F9D7FD379D25CE2B854236C1051D4B1C /* WeReadApi.js in Resources */ = {isa = PBXBuildFile; fileRef = FA510A2ECD919C8E8C8EAA7770D37E49 /* WeReadApi.js */; }; + F9F8A1BE8710CBCA9E2DEA97D35B17C0 /* RDEPUBReaderHighlightsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C6DCCE49AF60A4CD752939A15DB118 /* RDEPUBReaderHighlightsViewController.swift */; }; + FA5321384E837B212BA8DBD3FBE3FB04 /* NSURL+DTComparing.h in Headers */ = {isa = PBXBuildFile; fileRef = 731C0C61E3AD227D691FBA1C2C17BF7B /* NSURL+DTComparing.h */; settings = {ATTRIBUTES = (Public, ); }; }; FC5F52919451A15639442B46B38E4C67 /* DTCoreTextLayoutFrame+Cursor.m in Sources */ = {isa = PBXBuildFile; fileRef = E62C5E593037EF8A45E7FAA847D0277C /* DTCoreTextLayoutFrame+Cursor.m */; }; + FCDDEA00D578F661AEFF4B75CFF80B60 /* RDEPUBTextIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BAB3488CD710ECC37CE9B0F10A10545 /* RDEPUBTextIndexTable.swift */; }; + FD036CA8E474138A8DAC47527185B5FA /* DTBase64Coding.h in Headers */ = {isa = PBXBuildFile; fileRef = B8E40E302B85493BDE0FE91F829EC01E /* DTBase64Coding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FD0BD9D4FCDB12FAC03FC94901DB81B6 /* RDEPUBReaderTopToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BAAD948F35A4788F3441FA024D937B /* RDEPUBReaderTopToolView.swift */; }; FD5D68887297CFA94F543C49DC68A156 /* DTHTMLAttributedStringBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C496AB6A73C2D0BD0FF340A6A2960D5 /* DTHTMLAttributedStringBuilder.m */; }; - FDC2B2E1061CAC09A759B152654FA327 /* RDReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8114D77A6959999E364B801F9499589D /* RDReaderContentCell.swift */; }; - FDF36E20A3B3BF130C9F20C6269900B5 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 885653999BD237A574B67DB279DE7E87 /* ConstraintRelatableTarget.swift */; }; + FE80BC2F78769407CABD426D8569A855 /* Archive+WritingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C7359A7C3FC7675FED220200A43A17 /* Archive+WritingDeprecated.swift */; }; FEB00C614DCB6A8A7BDF8DEE11260984 /* NSMutableAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = B0500CA69405E23B09291359EB28331E /* NSMutableAttributedString+HTML.m */; }; - FF435595580C1A21539112F520F0609B /* RDEPUBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B97DAD182D1BD5778630EF4A56BDD988 /* RDEPUBParser.swift */; }; - FFFF063445858983090A4E58B19291CA /* UIApplication+DTNetworkActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 957DB4675D5CCBD3CB1762F08619F3F7 /* UIApplication+DTNetworkActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF6E330BB1C384D79EA36415F5415511 /* NSURL+DTComparing.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BFCAC7C2AEA867E67C63A852576774F /* NSURL+DTComparing.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 21F9491451FF3DCCE2F7ABE74FA1BF71 /* PBXContainerItemProxy */ = { + 2DEC0E6E6DD76FFDDCA8167EC51975D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; + remoteInfo = DTFoundation; + }; + 37F6C824B43C269AA070A9970F478E23 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = AA2E57587AA8EECA63C4BE08EA3CB6D2; remoteInfo = RDReaderView; }; - 2C341FDE4508BEEBB3BC7DF6B51D37E3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; - remoteInfo = SnapKit; - }; - 3A88EB3BFD0B1573E2C1D4D635B1C0F4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; - remoteInfo = ZIPFoundation; - }; - 3B5D920B697B5CC498D21895C14A2822 /* PBXContainerItemProxy */ = { + 54FE0EFC4BD35EB51504F9D17F65C630 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = C7A8D82E407CD3FDC3BA55CEE519B252; remoteInfo = "ZIPFoundation-ZIPFoundation_Privacy"; }; - 4B12DDA215649FC0BD01FDED78F56A1D /* PBXContainerItemProxy */ = { + 57FCFD9D0AF20D20A8404315B4634FEB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; - remoteInfo = DTFoundation; + remoteGlobalIDString = 8619D5ADECF2B26CFD9A9826D61D289A; + remoteInfo = SSAlertSwift; }; - 68CF89A2645BAD91F4A2A60A2B03BC9C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; - remoteInfo = SnapKit; - }; - 6BE1421CDA00F2733A05769CE52ACDB0 /* PBXContainerItemProxy */ = { + 5A688446F3834F916B644BF13086903B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; remoteInfo = DTCoreText; }; - 769E3922D6EF90FC105378371AD83AE0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; - remoteInfo = DTFoundation; - }; - 8495735DE53D4168DC26101C6D19DD8D /* PBXContainerItemProxy */ = { + 5C2DF152EE7F8EAB792D96A02ED313A6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 8A8DB685241263AFDF5E6B20FE67B93A; remoteInfo = "SnapKit-SnapKit_Privacy"; }; - 923111445E67BE92A223CBD0DE4D82E7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AE7F393FB7805DE2664AB4111873F907; - remoteInfo = "RDReaderView-RDReaderViewAssets"; - }; - 95F7ED85ACE5FB85F86AE0577F0DAA2A /* PBXContainerItemProxy */ = { + 6FEB3EC13F3780DE28D9E3A7027F5EF4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 8619D5ADECF2B26CFD9A9826D61D289A; remoteInfo = SSAlertSwift; }; - C4FE1D60CA9E1F9C78E4DE7CCF714CA7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8619D5ADECF2B26CFD9A9826D61D289A; - remoteInfo = SSAlertSwift; - }; - CF573978303F543D918F1C88627EF0FD /* PBXContainerItemProxy */ = { + 87730E6F16E8FFBF6898B9EBD0AD14C5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; remoteInfo = DTCoreText; }; - E715D8F65E7D7E80C6F0C07416FCE5F1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0C24CB0E87A728A11AA1124CB360D6A1; - remoteInfo = "DTCoreText-Resources"; - }; - F23CFA277994E35BABC3ADBD5AF87BC8 /* PBXContainerItemProxy */ = { + AD170DC0B755D9C13E44D4703F93ECAC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; remoteInfo = ZIPFoundation; }; + B1F14D48BA2B3361AB7CF6CFB4248E92 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; + remoteInfo = SnapKit; + }; + B27CFAAF383D62C8A184778C6B4667E7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; + remoteInfo = ZIPFoundation; + }; + BDB86097405AC17908E1D824C764DF29 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0C24CB0E87A728A11AA1124CB360D6A1; + remoteInfo = "DTCoreText-Resources"; + }; + CAB04B4C082D733C23D698A32EF0BD3C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; + remoteInfo = DTFoundation; + }; + E02332EF5B2CCE697593D8FC99DCEBB2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AE7F393FB7805DE2664AB4111873F907; + remoteInfo = "RDReaderView-RDReaderViewAssets"; + }; + F1618E89E8894E616222D6212EEB9BE2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; + remoteInfo = SnapKit; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 015F3EE69253C66E11B931E3360BA5FE /* DTCoreText-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTCoreText-dummy.m"; sourceTree = ""; }; - 02375C5EDA3CE9379DB415A85CFCC0F2 /* RDEPUBTextLayoutFrame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayoutFrame.swift; sourceTree = ""; }; 029130886CE8E422D16ADF97468CB1B0 /* DTCoreTextLayoutFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrame.m; path = Core/Source/DTCoreTextLayoutFrame.m; sourceTree = ""; }; 02CF362F88AB69253F1898E53D7A286A /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Sources/ConstraintDSL.swift; sourceTree = ""; }; 02EDFE0EEA47398F3E1A361A73AF6A6C /* NSData+DTCrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+DTCrypto.h"; path = "Core/Source/NSData+DTCrypto.h"; sourceTree = ""; }; - 034E4400505DA6AC50F9D93914301F45 /* RDPlainTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPlainTextBookBuilder.swift; sourceTree = ""; }; 045ADBF2087ADD914A9CA0B62EBF2A9F /* Pods-ReadViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ReadViewDemo.modulemap"; sourceTree = ""; }; - 04B40D87ADCB26B8270415FAA057AACB /* RDEPUBRenderRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderRequest.swift; sourceTree = ""; }; 04F9B298989305B9569B71E448E8C1D4 /* FileManager+ZIPDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIPDeprecated.swift"; path = "Sources/ZIPFoundation/FileManager+ZIPDeprecated.swift"; sourceTree = ""; }; 054674EB90C625BB4BEA9368ED92592B /* NSURL+DTUnshorten.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTUnshorten.h"; path = "Core/Source/NSURL+DTUnshorten.h"; sourceTree = ""; }; 05D57D16346FAF830F1F82067307EA9F /* default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = default.css; path = Core/Source/default.css; sourceTree = ""; }; 0619F98DA80922E78A07321D0DC54F62 /* Archive+Reading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Reading.swift"; path = "Sources/ZIPFoundation/Archive+Reading.swift"; sourceTree = ""; }; 061BD3911E4E530C792E65CED7868C33 /* DTBase64Coding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBase64Coding.m; path = Core/Source/DTBase64Coding.m; sourceTree = ""; }; - 065F46518D05F6DEA21AB45C485CCBAC /* RDEPUBSelectionOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionOverlayView.swift; sourceTree = ""; }; 073A7F9DF1A554BD1B324EA9E0090E91 /* DTObjectTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTObjectTextAttachment.h; path = Core/Source/DTObjectTextAttachment.h; sourceTree = ""; }; 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 09BE22EE711B7A38A4443E1C1C12BD79 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Sources/ConstraintMultiplierTarget.swift; sourceTree = ""; }; 09C2D4A3D4F602D125FF38B56C91CF84 /* ZIPFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ZIPFoundation.modulemap; sourceTree = ""; }; 09C957F3199C596781EFA1DEA1DDCEC8 /* NSFileWrapper+DTCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileWrapper+DTCopying.h"; path = "Core/Source/NSFileWrapper+DTCopying.h"; sourceTree = ""; }; 0B10D3EC1701BBA4D69926915F942558 /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = ""; }; + 0B1A759F6D90A955E7DF86A14FEE1737 /* RDEPUBWebView+JavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+JavaScriptBridge.swift"; sourceTree = ""; }; 0B7771FDE9AB1688166584C0AA03F12A /* DTCoreTextFontCollection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontCollection.h; path = Core/Source/DTCoreTextFontCollection.h; sourceTree = ""; }; 0C6BE3B2DA9A8C4CD3760CDAD6F305A5 /* DTCustomColoredAccessory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCustomColoredAccessory.m; path = Core/Source/iOS/DTCustomColoredAccessory.m; sourceTree = ""; }; 0D75FEDE65722CF41F7F32A164376926 /* DTHTMLParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParser.h; path = Core/Source/DTHTMLParser/DTHTMLParser.h; sourceTree = ""; }; 0E138EC76D0DF24544D29D1A4D7429E3 /* ConstraintMakerPrioritizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPrioritizable.swift; path = Sources/ConstraintMakerPrioritizable.swift; sourceTree = ""; }; 0E8C0D83EB6EDE71B264B6B0DD4644F5 /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Sources/LayoutConstraintItem.swift; sourceTree = ""; }; - 0EBF956AF4A708B6D77C0765D1B8D059 /* RDReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 0F5D34047BAA894BEF1DFA23E6A9DAB1 /* DTCoreTextMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextMacros.h; path = Core/Source/DTCoreTextMacros.h; sourceTree = ""; }; 0FC368BD2A8D266EB771E5FB9A5A5B3C /* NSDictionary+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTError.h"; path = "Core/Source/NSDictionary+DTError.h"; sourceTree = ""; }; - 114B1402AFD8DC2B76F64E2A702FF5EC /* RDEPUBReaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDelegate.swift; sourceTree = ""; }; 11B604FC3B0D5C91FEA763DCC0BE4DC5 /* DTHTMLParserNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserNode.m; path = Core/Source/DTHTMLParserNode.m; sourceTree = ""; }; + 129DD2A43FC15DC9844C508DFE51D24A /* rangy-serializer.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-serializer.js"; path = "Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js"; sourceTree = ""; }; 12A5EA26EE7539EDDA90649D22FB675D /* DTImage+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTImage+HTML.m"; path = "Core/Source/DTImage+HTML.m"; sourceTree = ""; }; 13AB6A32A293E3DC21A7047C6DB958CA /* DTHTMLParserTextNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserTextNode.m; path = Core/Source/DTHTMLParserTextNode.m; sourceTree = ""; }; 13E1548FC42118F1A4164739DE6BE4E9 /* UIFont+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIFont+DTCoreText.m"; path = "Core/Source/UIFont+DTCoreText.m"; sourceTree = ""; }; 15941683D394FB8D7EAE91CD2CF03FF1 /* UIImage+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+DTFoundation.h"; path = "Core/Source/iOS/UIImage+DTFoundation.h"; sourceTree = ""; }; + 16973940E1B38B29D620DAB562AB7396 /* RDEPUBSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchEngine.swift; sourceTree = ""; }; + 16D52166703BA10418F79BCD397B07DB /* RDEPUBTextBookCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookCache.swift; sourceTree = ""; }; 174FC0CA05D20BB995E211DE5A0857DB /* Archive+MemoryFile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+MemoryFile.swift"; path = "Sources/ZIPFoundation/Archive+MemoryFile.swift"; sourceTree = ""; }; 1756C6FFCA695290BA62DA4E7B6DD20B /* NSFileWrapper+DTCopying.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileWrapper+DTCopying.m"; path = "Core/Source/NSFileWrapper+DTCopying.m"; sourceTree = ""; }; - 178D1E4BA4980627DBDDD27A035D98EF /* RDEPUBReaderSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettings.swift; sourceTree = ""; }; 17F750F38183302BF345F40F5A4CDD43 /* NSData+DTCrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+DTCrypto.m"; path = "Core/Source/NSData+DTCrypto.m"; sourceTree = ""; }; 18387159515E0523AFB4204B1AF940ED /* SSAlertSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSAlertSwift.debug.xcconfig; sourceTree = ""; }; - 1AA7CFC7A07A8C9400697DA331E35860 /* RDEPUBReaderSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettingsViewController.swift; sourceTree = ""; }; 1ABC2F552388CD08EC1EFDEF606AE222 /* DTTextAttachmentHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachmentHTMLElement.m; path = Core/Source/DTTextAttachmentHTMLElement.m; sourceTree = ""; }; 1ACA5E519F100582F0D772FCD76125C0 /* NSString+DTFormatNumbers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTFormatNumbers.m"; path = "Core/Source/NSString+DTFormatNumbers.m"; sourceTree = ""; }; 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ReadViewDemo.release.xcconfig"; sourceTree = ""; }; 1B443D035BA5652B03A41BE905C5AC17 /* DTPieProgressIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTPieProgressIndicator.h; path = Core/Source/iOS/DTPieProgressIndicator.h; sourceTree = ""; }; + 1C17D914B39D21C0A4943F60349040BA /* RDReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-prefix.pch"; sourceTree = ""; }; 1C8F0DCEAA5A3DF38C503CA30DC94C1C /* Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Archive.swift; path = Sources/ZIPFoundation/Archive.swift; sourceTree = ""; }; + 1CF085139C084B6CB83EB511352CC385 /* RDEPUBPublication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPublication.swift; sourceTree = ""; }; 1D4C9B7ED5E04C216AB28E3A4065C1C5 /* DTHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLElement.m; path = Core/Source/DTHTMLElement.m; sourceTree = ""; }; 1D6DA580F40DF113709E15CF6542A35C /* DTCoreTextLayouter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayouter.m; path = Core/Source/DTCoreTextLayouter.m; sourceTree = ""; }; - 1D87EC99EB119D764849BD1E582C7D06 /* RDEPUBReaderTopToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTopToolView.swift; sourceTree = ""; }; 1E89FE5F2996336E862E82C1E14E0EE7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/ZIPFoundation/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 1F090A0289338B14050FAF16C22605B0 /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Sources/ConstraintConstantTarget.swift; sourceTree = ""; }; - 1F4E662F4176B8840BB4DF9A76EB5443 /* RDReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDReaderView-dummy.m"; sourceTree = ""; }; 2047430DF5C84E0A8FC8874A2B915FC3 /* Pods-ReadViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ReadViewDemo-acknowledgements.markdown"; sourceTree = ""; }; 2101691D5743105B2E3E40376584B91C /* DTFolderMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFolderMonitor.h; path = Core/Source/DTFolderMonitor.h; sourceTree = ""; }; 21BAA93E67D8CBC5297302D798FB4F7A /* DTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedLabel.m; path = Core/Source/DTAttributedLabel.m; sourceTree = ""; }; 2280F2302F54E90122747821FE681543 /* SSAlertViewExtention.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertViewExtention.swift; path = Sources/SSAlertSwift/SSAlertViewExtention.swift; sourceTree = ""; }; 238893C9CBD95CB9BDF069EB5A303E17 /* RDReaderView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RDReaderView; path = RDReaderView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 23AD6E6A62F1EE4221018B6DA2391BA7 /* RDEPUBReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTheme.swift; sourceTree = ""; }; 249747495DE8349E480E4789B12D366D /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = ""; }; + 24AD5C352BC2F291B84A39565644DE44 /* RDEPUBPaginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginator.swift; sourceTree = ""; }; + 252896D6D97D0F06D5937D72DD041E65 /* RDEPUBWebView+FixedLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+FixedLayout.swift"; sourceTree = ""; }; 25F52D9C765ED2FA87834D4310203E0B /* DTFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-prefix.pch"; sourceTree = ""; }; - 264D3D6CCA46CD555E458C17F6BEC460 /* RDEPUBWebViewDebug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebViewDebug.swift; sourceTree = ""; }; + 26CF54683B145156F178EF99B0C7046A /* RDEPUBTextLayoutFrame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayoutFrame.swift; sourceTree = ""; }; 2702E05AA7A266B7D8D0F881FD4E09DA /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; 27205D159B39090908CA0E9C3997B784 /* NSDictionary+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTCoreText.h"; path = "Core/Source/NSDictionary+DTCoreText.h"; sourceTree = ""; }; 27B7D3C6F0C845E3D42BBA613FFB0465 /* FileManager+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIP.swift"; path = "Sources/ZIPFoundation/FileManager+ZIP.swift"; sourceTree = ""; }; 28043173CA3B3787DC401ACEB5398108 /* DTCoreTextLayoutFrame+Cursor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTCoreTextLayoutFrame+Cursor.h"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.h"; sourceTree = ""; }; - 28D388240137738CB7BC33CB6B82A62A /* RDEPUBParser+TOC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+TOC.swift"; sourceTree = ""; }; 28D62D3200AC3D4E42C81CDFF7E884E8 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Sources/ConstraintItem.swift; sourceTree = ""; }; - 29E5523049D286F000DEB6F1D59AD428 /* RDEPUBReadingSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingSession.swift; sourceTree = ""; }; - 2A7797621CF825900662A85E723445CD /* RDEPUBWebDecorationOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebDecorationOverlayView.swift; sourceTree = ""; }; 2BA19BD582C1BD54AF673014C04848B6 /* DTFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTFoundation-Info.plist"; sourceTree = ""; }; + 2C26AFBE041DB9C0B1BFC9B71CFCA31F /* RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDReaderView-Info.plist"; sourceTree = ""; }; 2C50CAB4241C141EF6EC9ED22AB3A7E8 /* NSDictionary+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTCoreText.m"; path = "Core/Source/NSDictionary+DTCoreText.m"; sourceTree = ""; }; 2CD63BBDA1CB02B15A54D2CDD8A3ACD7 /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = ""; }; 2D36F7CDCD7D5788CDCB3A1421DB242B /* NSURL+DTAppLinks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTAppLinks.m"; path = "Core/Source/iOS/NSURL+DTAppLinks.m"; sourceTree = ""; }; 2D3D7C8444F58D9B3FCB4F3006D2CFBA /* NSAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+HTML.h"; path = "Core/Source/NSAttributedString+HTML.h"; sourceTree = ""; }; + 2D5AA1752B9A4DA12829506699ACB35F /* RDEPUBParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBParser.swift; sourceTree = ""; }; 2DE4FA5133891593CB45AF36B8EBF60C /* SSAlertSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SSAlertSwift-dummy.m"; sourceTree = ""; }; + 2F8C4EB13F9C6442DAD004816726B09A /* RDEPUBTextSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSearchEngine.swift; sourceTree = ""; }; 306477706BBB1E784F55BCF8EB1AD737 /* Pods-ReadViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ReadViewDemo.debug.xcconfig"; sourceTree = ""; }; - 31A85F27E07E44ECFCCBCECAAE32A56F /* RDEPUBChapterData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterData.swift; sourceTree = ""; }; + 3119842637EAE995A0DAEBEB1170E363 /* RDEPUBTextPerformanceSampler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPerformanceSampler.swift; sourceTree = ""; }; 31BD7533867336DEA9B835F471767178 /* NSString+DTURLEncoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTURLEncoding.h"; path = "Core/Source/NSString+DTURLEncoding.h"; sourceTree = ""; }; + 31DEEEBC962A7BAB4EDB772B3A2279B2 /* RDEPUBSelectionOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionOverlayView.swift; sourceTree = ""; }; 31F3F91D5624C451E5D44D85B1DDE7C5 /* NSMutableString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableString+HTML.m"; path = "Core/Source/NSMutableString+HTML.m"; sourceTree = ""; }; + 32769058982DA3B3ADB0051377B41916 /* RDEPUBResourceURLSchemeHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceURLSchemeHandler.swift; sourceTree = ""; }; + 32A3B34DE993508CAEBD18287344623E /* RDEPUBWebViewDebug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebViewDebug.swift; sourceTree = ""; }; 32A5ABB8F3656A110B955B0306E9A8C3 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Sources/ConstraintInsetTarget.swift; sourceTree = ""; }; 32A8BED62113FF47E3925378065FA3BE /* SSAlertSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSAlertSwift-prefix.pch"; sourceTree = ""; }; + 32D260607CE02388D7741193F901AF75 /* wxread-default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-default.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-default.css"; sourceTree = ""; }; 32FB2B1B0498DCBE7B79BDF49E963E3D /* DTHTMLParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParser.m; path = Core/Source/DTHTMLParser/DTHTMLParser.m; sourceTree = ""; }; + 33D8E2EC0A0BDF6FCA33CA829E2C6FCF /* epub-bridge.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-bridge.js"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js"; sourceTree = ""; }; 33DB57DF8C5AE334B1BBE9F989352F1D /* DTCustomColoredAccessory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCustomColoredAccessory.h; path = Core/Source/iOS/DTCustomColoredAccessory.h; sourceTree = ""; }; + 353AB6D63236BF3C98B630EAB53AC742 /* epub-fixed-layout.html */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-fixed-layout.html"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-fixed-layout.html"; sourceTree = ""; }; 354C5DD0ACC742762200A640ADA859C6 /* NSCoder+DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCoder+DTCompatibility.h"; path = "Core/Source/NSCoder+DTCompatibility.h"; sourceTree = ""; }; + 35FA9133889FF0F7999C456AC029966C /* RDEPUBTextPositionConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPositionConverter.swift; sourceTree = ""; }; 365FB4C3E0FF364C076EE4E9E47C32EA /* DTCoreText.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTCoreText.modulemap; sourceTree = ""; }; 36FCB869246FE45FD1C9609A34EB4E74 /* DTCoreTextGlyphRun.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextGlyphRun.m; path = Core/Source/DTCoreTextGlyphRun.m; sourceTree = ""; }; 375179DD3A4576CEF947E1760BBDC69B /* DTBlockFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBlockFunctions.m; path = Core/Source/DTBlockFunctions.m; sourceTree = ""; }; - 37D54A0CE6965D4142DB16CE54293F16 /* RDEPUBWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebView.swift; sourceTree = ""; }; + 37C1467D2571E3541EC221A49C90B110 /* RDEPUBStyleSheetBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetBuilder.swift; sourceTree = ""; }; 392A75EAF280876545D14AA00517BA4C /* ConstraintMakerEditable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerEditable.swift; path = Sources/ConstraintMakerEditable.swift; sourceTree = ""; }; - 3B52BDF13EFDE5C61F7A1B1FF5B79F02 /* RDEPUBWebView+Reflowable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Reflowable.swift"; sourceTree = ""; }; + 39A422EF35AF8F3EC0DCD8BCAF01A32E /* RDEPUBSearchModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchModels.swift; sourceTree = ""; }; 3B610E558C4917C4257DC198EAFEE2F6 /* DTCSSStylesheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSStylesheet.h; path = Core/Source/DTCSSStylesheet.h; sourceTree = ""; }; 3B931AB189BDDE2CCE8578B50BD60AF0 /* DTIframeTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTIframeTextAttachment.h; path = Core/Source/DTIframeTextAttachment.h; sourceTree = ""; }; - 3CD377E1D9608FD654CA2A3B1D4DF344 /* RDEPUBNavigatorState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorState.swift; sourceTree = ""; }; + 3C67B49D37D02FC71C317CCA00B61EDB /* RDEPUBReadingSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingSession.swift; sourceTree = ""; }; 3DC78D0B0F37BF9AD1058CACA9AAF9BE /* Data+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Serialization.swift"; path = "Sources/ZIPFoundation/Data+Serialization.swift"; sourceTree = ""; }; - 3DD8D4287E569AB98F04CF03AE208B71 /* RDEPUBWebView+Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Configuration.swift"; sourceTree = ""; }; + 40156267853001A18D40A4515A03C5A7 /* RDEPUBReaderSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettingsViewController.swift; sourceTree = ""; }; 4219E7C32019899890CAB66E5FBDF524 /* UIView+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+DTFoundation.m"; path = "Core/Source/iOS/UIView+DTFoundation.m"; sourceTree = ""; }; 424F12BEB0EDAAF1C719B5103D30C653 /* DTAnchorHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnchorHTMLElement.h; path = Core/Source/DTAnchorHTMLElement.h; sourceTree = ""; }; 426D442C01742E4361F5BC34D43152A6 /* DTImageTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTImageTextAttachment.h; path = Core/Source/DTImageTextAttachment.h; sourceTree = ""; }; 43CFADE0F46014990052AD67F17C86FF /* DTAccessibilityViewProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityViewProxy.m; path = Core/Source/DTAccessibilityViewProxy.m; sourceTree = ""; }; - 44009B7A804BFDD7B2AD3F1CBE12CE42 /* RDEPUBParser+Resources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Resources.swift"; sourceTree = ""; }; 4428633C8EC3F6289CCF376F588CE0C4 /* NSString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+HTML.m"; path = "Core/Source/NSString+HTML.m"; sourceTree = ""; }; 4472755F83C121DE5E1E505D145F6DBE /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; 45C7129757B54DFD9E445D0A17D73A83 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Sources/ConstraintPriority.swift; sourceTree = ""; }; + 45D36E42A61555CAE286BFC8FC062999 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; sourceTree = ""; }; 4600E9C0EF3B23864C9D7E5E90155F9D /* SSAlertSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SSAlertSwift.modulemap; sourceTree = ""; }; 4684B406B325B35F39322D75B59B6479 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Sources/ConstraintLayoutGuideDSL.swift; sourceTree = ""; }; 477A0FC2A1F0B7F7CCF72D201ECEBAB0 /* DTDictationPlaceholderTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderTextAttachment.m; path = Core/Source/DTDictationPlaceholderTextAttachment.m; sourceTree = ""; }; 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ZIPFoundation; path = ZIPFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48A4E8E3CD48799CF1E9D64CD7CE0C86 /* RDEPUBPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPreferences.swift; sourceTree = ""; }; - 49708F53EFFC5069D69D7BDBE145D5CB /* RDEPUBResourceResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceResolver.swift; sourceTree = ""; }; + 49439BEDC4669BE8E3E9D3315C568645 /* RDEPUBReadingModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingModels.swift; sourceTree = ""; }; + 49553EE889D9BB1C29A6AA69A857A8EB /* rangy-core.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-core.js"; path = "Sources/RDReaderView/EPUBCore/Resources/rangy-core.js"; sourceTree = ""; }; 49A21AE1A0AB5383F895B34EA7D6973D /* DTCoreTextGlyphRun.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextGlyphRun.h; path = Core/Source/DTCoreTextGlyphRun.h; sourceTree = ""; }; 4A06A36ADBE678DB44158D32E751FAFF /* ZIPFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ZIPFoundation-dummy.m"; sourceTree = ""; }; 4A2659DB0685E16ABAE0382F726DA8C8 /* Archive+Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Helpers.swift"; path = "Sources/ZIPFoundation/Archive+Helpers.swift"; sourceTree = ""; }; 4AF6156128A1A0CA24D9D06E346B9445 /* DTVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVersion.m; path = Core/Source/DTVersion.m; sourceTree = ""; }; 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.debug.xcconfig; sourceTree = ""; }; 4C2B218B5EAA5831A036BBF7E1EFC1B9 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/MediaPlayer.framework; sourceTree = DEVELOPER_DIR; }; + 4CA430D9A4A6EAE818564BB80309781D /* RDEPUBTextAnchor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnchor.swift; sourceTree = ""; }; 4D641809A99849F80FDCB02F8CE8D6A0 /* Data+CompressionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+CompressionDeprecated.swift"; path = "Sources/ZIPFoundation/Data+CompressionDeprecated.swift"; sourceTree = ""; }; 4EEFAE80193E1F0DA53400C9AD641410 /* DTActivityTitleView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTActivityTitleView.m; path = Core/Source/iOS/DTActivityTitleView.m; sourceTree = ""; }; - 4EF375B490014DEFC2BB798269AA0985 /* RDEPUBTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookBuilder.swift; sourceTree = ""; }; 4F0486D3B46DC92AB254D6EE9CC233BF /* DTAccessibilityElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityElement.m; path = Core/Source/DTAccessibilityElement.m; sourceTree = ""; }; 50297AAB8278F2BB6FCFE82B20C7A049 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Sources/ConstraintLayoutSupport.swift; sourceTree = ""; }; 5155CCDD61E030184249A020FE5D74B0 /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; 5245010774F8F1C4857763CC7B96E7B4 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Sources/ConstraintMakerExtendable.swift; sourceTree = ""; }; + 52BAAD948F35A4788F3441FA024D937B /* RDEPUBReaderTopToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTopToolView.swift; sourceTree = ""; }; 533CFFF04BE7BC4BDEAE11DF675A84CA /* DTBreakHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBreakHTMLElement.h; path = Core/Source/DTBreakHTMLElement.h; sourceTree = ""; }; 53499F40E1790A6CBE8AFEB3AC5BEFC8 /* NSMutableArray+DTMoving.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+DTMoving.m"; path = "Core/Source/NSMutableArray+DTMoving.m"; sourceTree = ""; }; 537BB06317FA188DF7A8A960152520E8 /* URL+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+ZIP.swift"; path = "Sources/ZIPFoundation/URL+ZIP.swift"; sourceTree = ""; }; @@ -609,40 +623,49 @@ 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = ""; }; 53D473C6F07982D3D25781A343EC5A99 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 53F98F0F060B066CAFBCD3C85C26B2B4 /* DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreText.h; path = Core/Source/DTCoreText.h; sourceTree = ""; }; + 551DE8194BF851EE58EA61CBBA1710B1 /* RDEPUBParser+Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Package.swift"; sourceTree = ""; }; 557DA029E15EC99631B647AE8922007F /* NSURL+DTAppLinks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTAppLinks.h"; path = "Core/Source/iOS/NSURL+DTAppLinks.h"; sourceTree = ""; }; 56489D9BA834497E48438A4B4E1CCCFF /* DTCoreTextFontDescriptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontDescriptor.h; path = Core/Source/DTCoreTextFontDescriptor.h; sourceTree = ""; }; 5679D281C282896E6FC352C48E0AF439 /* DTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedLabel.h; path = Core/Source/DTAttributedLabel.h; sourceTree = ""; }; - 573B36675B38E2D9301B3CCFD9E7CCFF /* RDReaderGestureController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderGestureController.swift; sourceTree = ""; }; - 57A61F7A5E8A862AB61CC09109D9E81E /* RDEPUBTextBookCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookCache.swift; sourceTree = ""; }; - 586127E2E5DFA220EAB96633512B3DF3 /* RDEPUBWebContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebContentView.swift; sourceTree = ""; }; - 5931AEB1E931A7219B0643093173E4B1 /* RDEPUBPageLayoutSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageLayoutSnapshot.swift; sourceTree = ""; }; + 57DE6F8B9CE9F488188CFE16DDF7929B /* wxread-dark.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-dark.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-dark.css"; sourceTree = ""; }; + 580328EB7B35E7A9C48515F737D984ED /* RDReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 5964AF1336E2F0DA0E2C32991E76C78C /* Data+Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Compression.swift"; path = "Sources/ZIPFoundation/Data+Compression.swift"; sourceTree = ""; }; 5977986EDFE76D5EF96A6D95483B12F7 /* Pods-ReadViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ReadViewDemo-frameworks.sh"; sourceTree = ""; }; + 59FAF02EDC6AC0DB9FA24A64E7B870CB /* RDEPUBRenderRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderRequest.swift; sourceTree = ""; }; 5A9A82CB094636AFB53D6D130D6219BA /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Sources/ConstraintLayoutGuide+Extensions.swift"; sourceTree = ""; }; - 5AC9A769CBC46F65ECAE32EAD0F196B6 /* RDEPUBWebView+JavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+JavaScriptBridge.swift"; sourceTree = ""; }; 5B007AEEACE9EA271DD73AFD80A74D83 /* DTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLog.m; path = Core/Source/DTLog.m; sourceTree = ""; }; 5BA251BAC8B430B3A4D4C4321046B990 /* Archive+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Deprecated.swift"; path = "Sources/ZIPFoundation/Archive+Deprecated.swift"; sourceTree = ""; }; 5D62C5531667F364F14DB67D33FFA554 /* DTCoreTextParagraphStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextParagraphStyle.h; path = Core/Source/DTCoreTextParagraphStyle.h; sourceTree = ""; }; 5DA1E8494B86FFD79C639DCB8C21E1BB /* DTPieProgressIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTPieProgressIndicator.m; path = Core/Source/iOS/DTPieProgressIndicator.m; sourceTree = ""; }; - 5E372F6B632B54653CBA022D20FB3367 /* RDEPUBReaderToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolView.swift; sourceTree = ""; }; 5E791886E59DC0FAB02C6BBAB5BE5B6B /* DTCoreTextFontCollection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontCollection.m; path = Core/Source/DTCoreTextFontCollection.m; sourceTree = ""; }; + 5EDE24320E72FF6E77D1E402600E9753 /* RDEPUBReaderChapterListController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChapterListController.swift; sourceTree = ""; }; 5F760D62F6C6F083374702146337F2CB /* DTCoreTextParagraphStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextParagraphStyle.m; path = Core/Source/DTCoreTextParagraphStyle.m; sourceTree = ""; }; 5F991240340FA026C71B68EB25B9F9C8 /* Entry+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+Serialization.swift"; path = "Sources/ZIPFoundation/Entry+Serialization.swift"; sourceTree = ""; }; 5FAB3C7F19A511C2B1B7DFBA3CA308C4 /* DTFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-umbrella.h"; sourceTree = ""; }; + 6002874EC82D09DCF64076F537D57EE4 /* RDEPUBResourceResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceResolver.swift; sourceTree = ""; }; + 6009A6FAECBFC4615F869A0D90D8A460 /* wxread-replace.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-replace.css"; sourceTree = ""; }; 6014DA7213E4687224F2BF921E30002C /* DTFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.debug.xcconfig; sourceTree = ""; }; 60657D08CCDB38BFED30BD40F4720CE4 /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Sources/ConstraintMaker.swift; sourceTree = ""; }; - 606D7AB51D4BF9B4AAD104DF89B5B9AD /* RDReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-umbrella.h"; sourceTree = ""; }; + 609F81945B589AC45E4E531C01F6EE3E /* RDReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderContentCell.swift; sourceTree = ""; }; 61E36C4FE448DDDA03450847FCB785B6 /* Archive+BackingConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+BackingConfiguration.swift"; path = "Sources/ZIPFoundation/Archive+BackingConfiguration.swift"; sourceTree = ""; }; 63A6EDF10DA5A051C6CDCBE5D97AF11E /* DTVideoTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVideoTextAttachment.m; path = Core/Source/DTVideoTextAttachment.m; sourceTree = ""; }; + 63C6DCCE49AF60A4CD752939A15DB118 /* RDEPUBReaderHighlightsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderHighlightsViewController.swift; sourceTree = ""; }; 647FB0C5AAF84C71A7784DD277E48910 /* UIFont+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIFont+DTCoreText.h"; path = "Core/Source/UIFont+DTCoreText.h"; sourceTree = ""; }; 64868ADD0419A5D112863F638932DA34 /* ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ZIPFoundation-Info.plist"; sourceTree = ""; }; 64AB89EAB10148C39B726B26BE04F4F8 /* DTCoreTextLayoutLine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutLine.h; path = Core/Source/DTCoreTextLayoutLine.h; sourceTree = ""; }; 6578DFAB51436E8DF266FD087700E26B /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Sources/ConstraintDescription.swift; sourceTree = ""; }; + 659E6B7AFC5374BF3A56A306238C3E96 /* RDEPUBReaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDelegate.swift; sourceTree = ""; }; + 660901C91F4E1D354689FF2F8B6E1679 /* RDEPUBFixedLayoutTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFixedLayoutTemplate.swift; sourceTree = ""; }; + 6861909964EF2CEDB7ED884A3B410A7D /* RDEPUBWebView+Reflowable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Reflowable.swift"; sourceTree = ""; }; 6A1EBB9497F4846C84CA0BF5E4F84FC7 /* DTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLog.h; path = Core/Source/DTLog.h; sourceTree = ""; }; + 6A800873D793225974FA75561B0810DF /* RDEPUBNavigatorState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorState.swift; sourceTree = ""; }; 6B96B0998B49D8E149C995474DA5FE5F /* DTHTMLWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLWriter.h; path = Core/Source/DTHTMLWriter.h; sourceTree = ""; }; + 6BAB3488CD710ECC37CE9B0F10A10545 /* RDEPUBTextIndexTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextIndexTable.swift; sourceTree = ""; }; 6C647A2EB2720BCBF88B160D124B57BF /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Sources/UILayoutSupport+Extensions.swift"; sourceTree = ""; }; 6D2EC0B845131A88247902AEA26F40AE /* SSAlertAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertAnimation.swift; path = Sources/SSAlertSwift/SSAlertAnimation.swift; sourceTree = ""; }; + 6D4134DC0BA1A654610741FB33CA9BA7 /* RDReaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderFlowLayout.swift; sourceTree = ""; }; 6D86C7063D1128EAEB3A30EBEF214B3F /* NSString+DTFormatNumbers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTFormatNumbers.h"; path = "Core/Source/NSString+DTFormatNumbers.h"; sourceTree = ""; }; + 70AA5021FC2962BB31E28C8BFDA797CD /* RDReaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderView.swift; sourceTree = ""; }; 70F5D03B9B3B7F182C8F5C1F5D4FA7E7 /* DTTiledLayerWithoutFade.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTiledLayerWithoutFade.m; path = Core/Source/iOS/DTTiledLayerWithoutFade.m; sourceTree = ""; }; 713C9FD0354D16AFCCFA630A97F2DA68 /* NSCharacterSet+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCharacterSet+HTML.m"; path = "Core/Source/NSCharacterSet+HTML.m"; sourceTree = ""; }; 7176B677A350927FC670368313DC2CA1 /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Sources/ConstraintConfig.swift; sourceTree = ""; }; @@ -651,80 +674,83 @@ 7345CE45F696634CEA692A86D16F684C /* Entry+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+ZIP64.swift"; path = "Sources/ZIPFoundation/Entry+ZIP64.swift"; sourceTree = ""; }; 73940D215D644B6815A09DA802CFBDDF /* NSArray+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+DTError.m"; path = "Core/Source/NSArray+DTError.m"; sourceTree = ""; }; 73A99927E52B24583A6A2CF7E6F23848 /* DTVideoTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVideoTextAttachment.h; path = Core/Source/DTVideoTextAttachment.h; sourceTree = ""; }; - 749ECE28D47716A820DFDFAE1C9E294D /* RDEPUBDTCoreTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDTCoreTextRenderer.swift; sourceTree = ""; }; + 749B6320F95F8F75FDF6B8ACC3E43D57 /* RDEPUBTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRenderer.swift; sourceTree = ""; }; 75C5986EF2D63801A8A30B9D77A7FDD0 /* ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; sourceTree = ""; }; 75FA8E843D9225BD65EB9D17825EC0F4 /* NSCharacterSet+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCharacterSet+HTML.h"; path = "Core/Source/NSCharacterSet+HTML.h"; sourceTree = ""; }; + 76374229228450DD3ADBF2DB618329F5 /* RDEPUBReaderTableOfContentsItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTableOfContentsItem.swift; sourceTree = ""; }; + 763D7B1705C9113C0A37E0775C4F9FEC /* RDEPUBTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookBuilder.swift; sourceTree = ""; }; 76F99C8130EE83A22CD223C7F5E6E66E /* NSAttributedString+SmallCaps.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+SmallCaps.m"; path = "Core/Source/NSAttributedString+SmallCaps.m"; sourceTree = ""; }; 77213203802F44012346181FED2856F9 /* UIApplication+DTNetworkActivity.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+DTNetworkActivity.m"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.m"; sourceTree = ""; }; 77A613841EB90827AF321DD50B21DB5D /* DTAttributedTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextView.m; path = Core/Source/DTAttributedTextView.m; sourceTree = ""; }; + 7863FD91C5BD0B2EE358458E09C81194 /* RDEPUBPageLayoutSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageLayoutSnapshot.swift; sourceTree = ""; }; 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.debug.xcconfig; sourceTree = ""; }; 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-ReadViewDemo"; path = Pods_ReadViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 79A77584AB3B92B2508AE0BCFCB8FD87 /* UIView+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+DTFoundation.h"; path = "Core/Source/iOS/UIView+DTFoundation.h"; sourceTree = ""; }; 7AB9016408894675D11069CDAACEDE94 /* DTImage+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTImage+HTML.h"; path = "Core/Source/DTImage+HTML.h"; sourceTree = ""; }; + 7AD993F901F35B7F58E0A7AC2F8962BA /* RDEPUBParser+Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Archive.swift"; sourceTree = ""; }; + 7B89D235A3ECE3B096FBB5E7A2626C9C /* RDEPUBTextPaginationSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationSupport.swift; sourceTree = ""; }; 7C496AB6A73C2D0BD0FF340A6A2960D5 /* DTHTMLAttributedStringBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLAttributedStringBuilder.m; path = Core/Source/DTHTMLAttributedStringBuilder.m; sourceTree = ""; }; + 7D078643E7C9EA66EB922D04504AC413 /* RDPlainTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPlainTextBookBuilder.swift; sourceTree = ""; }; 7D63AE1801C7AB149219317BE7529B26 /* DTAnchorHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnchorHTMLElement.m; path = Core/Source/DTAnchorHTMLElement.m; sourceTree = ""; }; 7F051D813D50D20D53205D5FDCAA877C /* UIScreen+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScreen+DTFoundation.m"; path = "Core/Source/iOS/UIScreen+DTFoundation.m"; sourceTree = ""; }; - 7F47BD1AD90D0D7227EC3804CB2C2AE8 /* epub-fixed-layout.html */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-fixed-layout.html"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-fixed-layout.html"; sourceTree = ""; }; 80B3D15ED0D19D020663EF055386291A /* DTColor+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTColor+Compatibility.h"; path = "Core/Source/DTColor+Compatibility.h"; sourceTree = ""; }; - 8114D77A6959999E364B801F9499589D /* RDReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderContentCell.swift; sourceTree = ""; }; + 8173B8E972A645B3A420B3C5C0DCDF6A /* RDEPUBPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPreferences.swift; sourceTree = ""; }; 81B8F42440B802E6EC2B1FF7E3022F3A /* SSAlertDefaultAnmation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertDefaultAnmation.swift; path = Sources/SSAlertSwift/SSAlertDefaultAnmation.swift; sourceTree = ""; }; 8272D0B59ABD6652D0CAE3DFCC2C5EE1 /* DTActivityTitleView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTActivityTitleView.h; path = Core/Source/iOS/DTActivityTitleView.h; sourceTree = ""; }; - 82C37B4E513CEF203D7C832740579E6B /* RDEPUBResourceURLSchemeHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceURLSchemeHandler.swift; sourceTree = ""; }; 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "RDReaderView-RDReaderViewAssets"; path = RDReaderViewAssets.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 83E37DC74BB53F90A5AD54842858A62F /* NSString+Paragraphs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Paragraphs.h"; path = "Core/Source/NSString+Paragraphs.h"; sourceTree = ""; }; - 84ECF423776A6EE042F30DF5BF40DC58 /* RDReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-prefix.pch"; sourceTree = ""; }; + 8432F1648F7FDA0F1A736F8A53739308 /* RDReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDReaderView-dummy.m"; sourceTree = ""; }; 8552BE1A1F6A6D2879763DE3B2B8A2DD /* NSNumber+RomanNumerals.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+RomanNumerals.h"; path = "Core/Source/NSNumber+RomanNumerals.h"; sourceTree = ""; }; 86A0361390AA0C29BC1A5487083A12A7 /* DTColorFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTColorFunctions.h; path = Core/Source/DTColorFunctions.h; sourceTree = ""; }; - 871BA1C45F545C9EAD9E1795144209C6 /* RDEPUBParser+Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Archive.swift"; sourceTree = ""; }; - 87EBF2D16BA02CD25CD1367A4F7026BB /* RDEPUBNavigatorLayoutContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorLayoutContext.swift; sourceTree = ""; }; + 875F2A69FD6767E29074114D638B2934 /* RDReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-umbrella.h"; sourceTree = ""; }; + 87AAB03A10169416E66E50562D9A57A0 /* RDEPUBParser+TOC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+TOC.swift"; sourceTree = ""; }; 882FA707ED3513D263A1E0656AAD2D33 /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Sources/ConstraintPriorityTarget.swift; sourceTree = ""; }; 885653999BD237A574B67DB279DE7E87 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Sources/ConstraintRelatableTarget.swift; sourceTree = ""; }; + 89ED8313799E7A012F5A06BCEACF09B8 /* RDEPUBReaderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderConfiguration.swift; sourceTree = ""; }; + 89FBCDE54D10D205F325580161FB9FC3 /* RDEPUBWebView+Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Configuration.swift"; sourceTree = ""; }; 8ABDEFEA94DC6408D92AC66DA3625DE5 /* NSString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+HTML.h"; path = "Core/Source/NSString+HTML.h"; sourceTree = ""; }; 8B35D0622F339A5B8A864FAA0C9EAE47 /* Pods-ReadViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ReadViewDemo-acknowledgements.plist"; sourceTree = ""; }; - 8B3CCE79B11EBF54E7B1195D4F4CD00E /* RDEPUBReaderChapterListController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChapterListController.swift; sourceTree = ""; }; 8B59C9A1B265393E4BA8383B308A5917 /* DTHTMLAttributedStringBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLAttributedStringBuilder.h; path = Core/Source/DTHTMLAttributedStringBuilder.h; sourceTree = ""; }; 8BD568D38C209BA1CC0EBFA809A35204 /* DTFoundationConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFoundationConstants.m; path = Core/Source/DTFoundationConstants.m; sourceTree = ""; }; 8BD9F2023FF826F67E69E3407A70A8A6 /* DTVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVersion.h; path = Core/Source/DTVersion.h; sourceTree = ""; }; - 8CC598DC4A28E4CD6EF8AA1BDBED7D2D /* RDURLReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDURLReaderController.swift; sourceTree = ""; }; 8CFEE298DD52246B46E6FA62B16B38DF /* DTTextHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextHTMLElement.m; path = Core/Source/DTTextHTMLElement.m; sourceTree = ""; }; - 8DF21684A2D45C7724718A05AB269C7A /* RDEPUBPageInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageInteractionController.swift; sourceTree = ""; }; + 8E2529CE2E852CB74565B24AC7B88965 /* RDEPUBPageInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageInteractionController.swift; sourceTree = ""; }; 8E3E834CCC952717089550F50A2DE59C /* SSAlertSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SSAlertSwift-Info.plist"; sourceTree = ""; }; 8E5637603691B9B35C2A886B686D3CE7 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Sources/ConstraintViewDSL.swift; sourceTree = ""; }; 8F2D44B82815CA3397BE2C9F64819B88 /* DTCoreTextFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFunctions.m; path = Core/Source/DTCoreTextFunctions.m; sourceTree = ""; }; 8F950CEF31AC0065C0BEAB26BA2CEFA1 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Sources/ConstraintOffsetTarget.swift; sourceTree = ""; }; 91144FC099DD458E61625CD939577DAA /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Sources/ConstraintDirectionalInsets.swift; sourceTree = ""; }; 9129D37C7F89AD8FD530663BB4503FC0 /* NSCoder+DTCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCoder+DTCompatibility.m"; path = "Core/Source/NSCoder+DTCompatibility.m"; sourceTree = ""; }; - 91E98E8EB07A175FB72DCB4D69B1BF40 /* RDEPUBReaderHighlightsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderHighlightsViewController.swift; sourceTree = ""; }; + 9197422E9FAD3EDDC5C5844350D497F7 /* RDEPUBNavigatorLayoutContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorLayoutContext.swift; sourceTree = ""; }; 92460D196C5300656C9649784EBD3C58 /* NSAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+HTML.m"; path = "Core/Source/NSAttributedString+HTML.m"; sourceTree = ""; }; + 929106407362D571E93A73D87EAB8107 /* RDEPUBWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebView.swift; sourceTree = ""; }; 932FD688DE493323BA6B691BC2CB5094 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Sources/LayoutConstraint.swift; sourceTree = ""; }; 934F9BB2B3A313294F121484C3A97A14 /* Archive+ReadingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ReadingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+ReadingDeprecated.swift"; sourceTree = ""; }; 937CEFA81DA4227008DBFB114783A08B /* SSAlertSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSAlertSwift-umbrella.h"; sourceTree = ""; }; + 93B0E9F83D59A57EF00599DBE41952BF /* RDEPUBReaderPersistence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPersistence.swift; sourceTree = ""; }; 945D4549E0B9168D7DDB910DE874B874 /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Sources/Typealiases.swift; sourceTree = ""; }; 957DB4675D5CCBD3CB1762F08619F3F7 /* UIApplication+DTNetworkActivity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+DTNetworkActivity.h"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.h"; sourceTree = ""; }; - 960542929FBAAFA1C1B1991BDD522CEB /* RDReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDReaderView.modulemap; sourceTree = ""; }; - 9661A4FD82D29BF44C5DB5D68F4FF237 /* RDEPUBReaderTableOfContentsItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTableOfContentsItem.swift; sourceTree = ""; }; - 96718D9DDA02E4E22568D880B91E7D8C /* RDReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPageChildViewController.swift; sourceTree = ""; }; + 9654CB2B436E0FB30970E9FCF3870820 /* RDEPUBTextRendererSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRendererSupport.swift; sourceTree = ""; }; + 967506B2C9A33F6E902BDA98940C603F /* RDEPUBChapterData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterData.swift; sourceTree = ""; }; 96EEB6B022E22A4ABC86D87469D4815B /* DTSmartPagingScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTSmartPagingScrollView.m; path = Core/Source/iOS/DTSmartPagingScrollView.m; sourceTree = ""; }; 96FA99AA7D4AD0D4246C8DAC1CC0C24E /* DTStylesheetHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTStylesheetHTMLElement.h; path = Core/Source/DTStylesheetHTMLElement.h; sourceTree = ""; }; 979486118B3E90C08386079D57962701 /* SnapKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapKit; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97995C73297871C353364E685939DED9 /* SSAlertAnimationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertAnimationController.swift; path = Sources/SSAlertSwift/SSAlertAnimationController.swift; sourceTree = ""; }; + 97FCA163E8AE5E977B12F9060F220252 /* RDEPUBReaderBottomToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderBottomToolView.swift; sourceTree = ""; }; 982391EC8620A617B8788C8A6101C96A /* DTDictationPlaceholderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderView.h; path = Core/Source/DTDictationPlaceholderView.h; sourceTree = ""; }; - 982BAB73B44D6A14A904822EB0836FDA /* RDEPUBSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchEngine.swift; sourceTree = ""; }; 98658510AA525496EBF5792E5D9884ED /* DTListItemHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTListItemHTMLElement.h; path = Core/Source/DTListItemHTMLElement.h; sourceTree = ""; }; 98C7359A7C3FC7675FED220200A43A17 /* Archive+WritingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+WritingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+WritingDeprecated.swift"; sourceTree = ""; }; 99299A9FD6EF739D18352AC5B9325CB0 /* DTAccessibilityElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityElement.h; path = Core/Source/DTAccessibilityElement.h; sourceTree = ""; }; - 99EF157E0B58EE5D8605F8EDDF4D9350 /* RDEPUBPaginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginator.swift; sourceTree = ""; }; + 992AFC205F9539B89BF279A5EE6CB266 /* RDEPUBParser+ReadingProfile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+ReadingProfile.swift"; sourceTree = ""; }; 9A1B75050E71BDD96FC19EC6BA129E6A /* DTLinkButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLinkButton.m; path = Core/Source/DTLinkButton.m; sourceTree = ""; }; - 9BD3A31AFC4BC8216C0AA79606708051 /* RDEPUBStyleSheetBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetBuilder.swift; sourceTree = ""; }; 9BFCAC7C2AEA867E67C63A852576774F /* NSURL+DTComparing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTComparing.m"; path = "Core/Source/NSURL+DTComparing.m"; sourceTree = ""; }; - 9C0D3D9DE44CEB89B16F1D598A049EF0 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; sourceTree = ""; }; + 9C2DE084B4CF376178F1AFB96BD84562 /* RDEPUBModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBModels.swift; sourceTree = ""; }; 9C6293E97E128E98559FB74D9A342EAD /* NSMutableString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableString+HTML.h"; path = "Core/Source/NSMutableString+HTML.h"; sourceTree = ""; }; + 9CBC86AC7AC17CD094469EC7DCE21724 /* RDEPUBDTCoreTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDTCoreTextRenderer.swift; sourceTree = ""; }; 9CE078B465FDEF40EC0469626A2C2469 /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapKit-dummy.m"; sourceTree = ""; }; 9D6C48939A8498A09DCFC7F41ECB8A25 /* NSString+CSS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+CSS.h"; path = "Core/Source/NSString+CSS.h"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DE1E0CEE577C4985CB816FDA2AFDA3F /* RDEPUBParser+ReadingProfile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+ReadingProfile.swift"; sourceTree = ""; }; 9E6BA0ECCB0ACF8580C3B5192CA9F11B /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Sources/ConstraintLayoutGuide.swift; sourceTree = ""; }; - 9F596AE7A8707C4D27AD9ABE552C6C59 /* RDEPUBPublication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPublication.swift; sourceTree = ""; }; 9F8F40493DF0BBB3EA5FC1F759A883C4 /* ResourceBundle-Resources-DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Resources-DTCoreText-Info.plist"; sourceTree = ""; }; A02EA0374C693F881AB36202FB276DCD /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Sources/ConstraintView.swift; sourceTree = ""; }; A0927A875CA1F11DBCE60DFC6F0CA0B6 /* NSScanner+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSScanner+HTML.h"; path = "Core/Source/NSScanner+HTML.h"; sourceTree = ""; }; @@ -735,46 +761,41 @@ A2C299CFB47AA6ECF86F7348E1EB751F /* NSMutableAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableAttributedString+HTML.h"; path = "Core/Source/NSMutableAttributedString+HTML.h"; sourceTree = ""; }; A3565FEE19F19CB43A43409AFFF2BD2C /* NSString+DTPaths.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTPaths.m"; path = "Core/Source/NSString+DTPaths.m"; sourceTree = ""; }; A3765B289CB7E6C5DF6160D8EBC83C3C /* UIScreen+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScreen+DTFoundation.h"; path = "Core/Source/iOS/UIScreen+DTFoundation.h"; sourceTree = ""; }; - A37FEAB6B0E196275B35332A30FF74DD /* UIColor+RDEPUBHex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUBHex.swift"; sourceTree = ""; }; A4E43DCDE0C8751557E7E65FEEB1C865 /* DTLazyImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLazyImageView.m; path = Core/Source/DTLazyImageView.m; sourceTree = ""; }; + A4EE1E0ACE64032C6C8CB26A91235993 /* RDEPUBParser+Resources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Resources.swift"; sourceTree = ""; }; A651CEE8062C84A597DBC44ECA3DBCC1 /* ConstraintDirectionalInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsetTarget.swift; path = Sources/ConstraintDirectionalInsetTarget.swift; sourceTree = ""; }; A68D72764140BC3DF67A2B9E52CEC7A4 /* DTHorizontalRuleHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHorizontalRuleHTMLElement.m; path = Core/Source/DTHorizontalRuleHTMLElement.m; sourceTree = ""; }; A8DFDCAB69B471EB5667C964865C26CF /* DTCoreGraphicsUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreGraphicsUtils.m; path = Core/Source/DTCoreGraphicsUtils.m; sourceTree = ""; }; A9FBC69C7DA29A7283920FDA9EBBCE8A /* DTAnimatedGIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnimatedGIF.h; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.h; sourceTree = ""; }; AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ReadViewDemo-dummy.m"; sourceTree = ""; }; AA3CFD777AD76F97EBA05B3920F5786A /* DTIframeTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTIframeTextAttachment.m; path = Core/Source/DTIframeTextAttachment.m; sourceTree = ""; }; - AB417EFC922BE57A7D61CFCD8F5C356A /* RDEPUBModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBModels.swift; sourceTree = ""; }; AD987C2FA7C8FBC96FD024E421DA0E68 /* Archive+Progress.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Progress.swift"; path = "Sources/ZIPFoundation/Archive+Progress.swift"; sourceTree = ""; }; ADC5AC8FD4EC45E9BA5654A38715BB93 /* DTTextBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextBlock.m; path = Core/Source/DTTextBlock.m; sourceTree = ""; }; - AEDE060ABAEC551BD0CD924CE4DE7058 /* RDEPUBReaderBottomToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderBottomToolView.swift; sourceTree = ""; }; + AE1A53CCB5BC34FB44E35A4A29AA5591 /* RDEPUBWebContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebContentView.swift; sourceTree = ""; }; AFC4C9F69BF2D0CAEBAA83896C139D2C /* DTColorFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTColorFunctions.m; path = Core/Source/DTColorFunctions.m; sourceTree = ""; }; AFE0B56638AFB77F4455784A7ED59876 /* DTDictationPlaceholderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderView.m; path = Core/Source/DTDictationPlaceholderView.m; sourceTree = ""; }; B0500CA69405E23B09291359EB28331E /* NSMutableAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableAttributedString+HTML.m"; path = "Core/Source/NSMutableAttributedString+HTML.m"; sourceTree = ""; }; B0AC307F12521444C973EA0DE38B4608 /* NSMutableArray+DTMoving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+DTMoving.h"; path = "Core/Source/NSMutableArray+DTMoving.h"; sourceTree = ""; }; B0B32EA4B7A492EEF26CE260E9AEFA0B /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Sources/ConstraintMakerFinalizable.swift; sourceTree = ""; }; B245F7E143F3091652C64F6593E33F7A /* DTFolderMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFolderMonitor.m; path = Core/Source/DTFolderMonitor.m; sourceTree = ""; }; + B2682E7883D110ECC2F46C6270375D24 /* RDReaderGestureController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderGestureController.swift; sourceTree = ""; }; B2B3D0CB47B0A8E9EC5AF48B7F2DD6B0 /* DTCoreTextConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextConstants.m; path = Core/Source/DTCoreTextConstants.m; sourceTree = ""; }; - B4E20D7801600727C16A2C13D5F84E38 /* RDEPUBTextAnchor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnchor.swift; sourceTree = ""; }; B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B509CD4B498635D4536245E43D802ED9 /* DTCSSListStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSListStyle.m; path = Core/Source/DTCSSListStyle.m; sourceTree = ""; }; B5FCE04EBB553439D1C2BA1001936293 /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; B6425B2235BA00FE865AF58EF44F1144 /* DTCoreGraphicsUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreGraphicsUtils.h; path = Core/Source/DTCoreGraphicsUtils.h; sourceTree = ""; }; - B6C092A5458F6A10FC8ACE9435997C5B /* RDEPUBSearchModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchModels.swift; sourceTree = ""; }; + B64B372E68C6C74223A76117BFA80B15 /* RDEPUBReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderController.swift; sourceTree = ""; }; + B6F64F7254BE291374ECDC3E59BDB065 /* RDEPUBWebDecorationOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebDecorationOverlayView.swift; sourceTree = ""; }; B7672A26922DBD934FA1AC60D49EB322 /* NSNumber+RomanNumerals.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+RomanNumerals.m"; path = "Core/Source/NSNumber+RomanNumerals.m"; sourceTree = ""; }; B8E40E302B85493BDE0FE91F829EC01E /* DTBase64Coding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBase64Coding.h; path = Core/Source/DTBase64Coding.h; sourceTree = ""; }; - B97DAD182D1BD5778630EF4A56BDD988 /* RDEPUBParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBParser.swift; sourceTree = ""; }; + B8FAF5A1A2890703F132819BD138C1A9 /* RDReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.debug.xcconfig; sourceTree = ""; }; B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SnapKit-SnapKit_Privacy"; path = SnapKit_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; B9E40164920C9AC1B1413C51835CD370 /* DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTCoreText-Info.plist"; sourceTree = ""; }; - BA1661CEEEBB7BDE901B5716D99DDE90 /* RDEPUBTextSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSearchEngine.swift; sourceTree = ""; }; - BC270D100F485EEEB920AB37D4476FB3 /* RDEPUBJavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJavaScriptBridge.swift; sourceTree = ""; }; BC332335B380BC51C4F05C5CCDFB9189 /* DTAnimatedGIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnimatedGIF.m; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.m; sourceTree = ""; }; BCCA590DB72AA93275262A414F16578A /* DTCoreTextFontDescriptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontDescriptor.m; path = Core/Source/DTCoreTextFontDescriptor.m; sourceTree = ""; }; BD768C27E392C934C06DFB4AC401037C /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Sources/ConstraintMakerRelatable.swift; sourceTree = ""; }; BDD081272B47A3B73CE693D21DC26827 /* Entry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Entry.swift; path = Sources/ZIPFoundation/Entry.swift; sourceTree = ""; }; - BE53A6D6898393B5A8B54F23ED0065D0 /* epub-bridge.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-bridge.js"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js"; sourceTree = ""; }; BE547E464E5D34F9FFB24BAC81D1E4CC /* NSString+DTUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTUtilities.h"; path = "Core/Source/NSString+DTUtilities.h"; sourceTree = ""; }; - BE99150A429F1AA375BD9A89473100CB /* RDEPUBTextIndexTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextIndexTable.swift; sourceTree = ""; }; - BEBB599A31B8BC71D00B843E8EB0971F /* RDReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.debug.xcconfig; sourceTree = ""; }; BF4F3EC137168B92A5DA85AF50CD239F /* NSAttributedString+DTDebug.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTDebug.m"; path = "Core/Source/NSAttributedString+DTDebug.m"; sourceTree = ""; }; C123C127CC539ACCB510F665DB774899 /* DTAttributedTextContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextContentView.h; path = Core/Source/DTAttributedTextContentView.h; sourceTree = ""; }; C18480913E002315E3F5EC6945371697 /* NSDictionary+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTError.m"; path = "Core/Source/NSDictionary+DTError.m"; sourceTree = ""; }; @@ -784,31 +805,27 @@ C298199F5DC5390E8B6666F638B34C10 /* DTTextAttachmentHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachmentHTMLElement.h; path = Core/Source/DTTextAttachmentHTMLElement.h; sourceTree = ""; }; C30D143134EEC5D4BA99459104B76A2E /* DTHTMLParserTextNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserTextNode.h; path = Core/Source/DTHTMLParserTextNode.h; sourceTree = ""; }; C422BCADBB48E28B549495663705A0FB /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; - C4331275EBF2F4E4FC5FBFFEE72E6E06 /* RDEPUBParser+Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Package.swift"; sourceTree = ""; }; - C455253D491919E5B727AD431FD333E3 /* RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDReaderView-Info.plist"; sourceTree = ""; }; - C6D9DE483A33AFF82D025E95ABAE82B1 /* RDEPUBFixedLayoutTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFixedLayoutTemplate.swift; sourceTree = ""; }; + C5C4BF1170DCF38B8CC1E4979A0334FA /* RDEPUBAssetRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAssetRepository.swift; sourceTree = ""; }; + C65067E704BE5EEEDE5FC6FF04C9C0AA /* wxread-replace-latin.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace-latin.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-replace-latin.css"; sourceTree = ""; }; + C6A6391BB8EAA2BA440A903CFBD508ED /* RDEPUBReaderToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolView.swift; sourceTree = ""; }; C6DB34ACB132E465CDF8191F7DB71EF6 /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Sources/ConstraintView+Extensions.swift"; sourceTree = ""; }; + C6F199830BC382B6C9AEF29F421EE0C9 /* cssInjector.js */ = {isa = PBXFileReference; includeInIndex = 1; name = cssInjector.js; path = Sources/RDReaderView/EPUBCore/Resources/cssInjector.js; sourceTree = ""; }; C71D83D6AEF198FA680B8A80BF2D9605 /* DTCoreTextLayoutLine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutLine.m; path = Core/Source/DTCoreTextLayoutLine.m; sourceTree = ""; }; + C73611E91719890E1DD889DEBBA1DDF2 /* RDReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.release.xcconfig; sourceTree = ""; }; C80065DBA5634DAA71129404975D7349 /* NSURL+DTUnshorten.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTUnshorten.m"; path = "Core/Source/NSURL+DTUnshorten.m"; sourceTree = ""; }; C8343CDCF82729A8EBCCA37A6650E34F /* DTHTMLParserNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserNode.h; path = Core/Source/DTHTMLParserNode.h; sourceTree = ""; }; - C879D1B97FBCF728EA0A7A1FD445EEC9 /* RDEPUBTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRenderer.swift; sourceTree = ""; }; C8C20D9A71E6605DEE80342E7122B683 /* DTCoreTextConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextConstants.h; path = Core/Source/DTCoreTextConstants.h; sourceTree = ""; }; C8E2FC7BE14F90878CE3FB3E317996ED /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; sourceTree = ""; }; C9593E7B37569219F8D9A504B47707DC /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Sources/ConstraintAttributes.swift; sourceTree = ""; }; C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = ""; }; - CA1A5B58D686782147F12C1A8781C47B /* RDEPUBWebView+Search.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Search.swift"; sourceTree = ""; }; CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "ZIPFoundation-ZIPFoundation_Privacy"; path = ZIPFoundation_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - CA4B1095936DBB3491E580EE642E6966 /* RDEPUBTextContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentView.swift; sourceTree = ""; }; CA538A48DD3691701EC6B5021D7B7381 /* NSScanner+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSScanner+HTML.m"; path = "Core/Source/NSScanner+HTML.m"; sourceTree = ""; }; CB7F3535507F56824BA21509302CF8B3 /* NSString+DTURLEncoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTURLEncoding.m"; path = "Core/Source/NSString+DTURLEncoding.m"; sourceTree = ""; }; - CDD70A0AF6652B8B142FE99A2E3BFCFE /* RDEPUBReadingModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingModels.swift; sourceTree = ""; }; + CE2C63A2462C2CA8751808A396C796F2 /* RDEPUBReaderSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettings.swift; sourceTree = ""; }; + CE2D421FC5D3B9864967FD50215C0A4B /* RDReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDReaderView.modulemap; sourceTree = ""; }; CE6907AC04870132CCE3177E894607DD /* DTCoreTextLayoutFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrame.h; path = Core/Source/DTCoreTextLayoutFrame.h; sourceTree = ""; }; CE7768E097F8BDE9FBE3752B98CD0101 /* DTCoreText-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-umbrella.h"; sourceTree = ""; }; CEA93EDA6ED54D374265AA5D6B9EBBA9 /* NSArray+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+DTError.h"; path = "Core/Source/NSArray+DTError.h"; sourceTree = ""; }; - CEAF5559BCE747CDC3F13886B8385344 /* RDEPUBTextRendererSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRendererSupport.swift; sourceTree = ""; }; - CF89E84A24C211E605EDA599629D3CA1 /* RDReaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderFlowLayout.swift; sourceTree = ""; }; - D0AA4E895BB85E9FC893F2FEE774981F /* RDReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.release.xcconfig; sourceTree = ""; }; - D14AB5026508804287BE9997A4CF7CE1 /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = ""; }; D1599698B5A62671C488F13E07272B09 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.m; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.m; sourceTree = ""; }; D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DTFoundation; path = DTFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D24FE8634A7AD2562DB8ADB9D4BBB36A /* CTLineUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLineUtils.m; path = Core/Source/CTLineUtils.m; sourceTree = ""; }; @@ -818,10 +835,12 @@ D4093D30B372960168C1349100DF7DE0 /* DTAttributedTextCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextCell.h; path = Core/Source/DTAttributedTextCell.h; sourceTree = ""; }; D495E2AB1223BD4D4909F8FF1FF47DAF /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Sources/Debugging.swift; sourceTree = ""; }; D497C3CA364E37DAAFF2C3B90CC7DBE8 /* DTTextBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextBlock.h; path = Core/Source/DTTextBlock.h; sourceTree = ""; }; + D73C71810144AB20A3D87FADF45109EF /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = ""; }; D7B5E61166782ED8D585D4FCEE2074DB /* DTLinkButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLinkButton.h; path = Core/Source/DTLinkButton.h; sourceTree = ""; }; D80CD20CB452B31CCCB14AF8567524D3 /* DTCoreText-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-prefix.pch"; sourceTree = ""; }; D85A85D891A320165843EF9F489178F7 /* UIImage+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+DTFoundation.m"; path = "Core/Source/iOS/UIImage+DTFoundation.m"; sourceTree = ""; }; D863AE4F659A0F71B22DC9FF334DDF4E /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.h; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.h; sourceTree = ""; }; + D8BCB7DFA6D42E5D07629E5E2F44FD0D /* RDURLReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDURLReaderController.swift; sourceTree = ""; }; D8C351514678D41C58869BD057D5483F /* UIViewFrameExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewFrameExtension.swift; path = Sources/SSAlertSwift/UIViewFrameExtension.swift; sourceTree = ""; }; D927F128EBF26AD2C61FD0E6B6F6F5ED /* ZIPFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-umbrella.h"; sourceTree = ""; }; D9AFC4B66F872436A059FE53780D216F /* SSAlertSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SSAlertSwift; path = SSAlertSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -831,7 +850,6 @@ DCECDBD73595CA88A2208000B4B68352 /* NSString+DTUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTUtilities.m"; path = "Core/Source/NSString+DTUtilities.m"; sourceTree = ""; }; DD189DA6054AAE2242F6644A2623B50E /* NSAttributedString+SmallCaps.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+SmallCaps.h"; path = "Core/Source/NSAttributedString+SmallCaps.h"; sourceTree = ""; }; DD58A1908F3C532210EA65ACE410A44D /* CTLineUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLineUtils.h; path = Core/Source/CTLineUtils.h; sourceTree = ""; }; - DDF01B7EF5DD6EA4CA5168C35069C495 /* RDEPUBReaderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderConfiguration.swift; sourceTree = ""; }; DE4821B98DDE6C71411EC139EC6D2762 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; DF5EDCA3B21964D0462BE0982E2F0BF8 /* DTTiledLayerWithoutFade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTiledLayerWithoutFade.h; path = Core/Source/iOS/DTTiledLayerWithoutFade.h; sourceTree = ""; }; DF670EC438F05ACC1F1C7B725DBDAA18 /* DTFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.release.xcconfig; sourceTree = ""; }; @@ -843,14 +861,13 @@ E20272295EC253826AEE1F83A15D47C5 /* NSAttributedStringRunDelegates.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NSAttributedStringRunDelegates.h; path = Core/Source/NSAttributedStringRunDelegates.h; sourceTree = ""; }; E27C503C8128BC3CE109FFE077AEF325 /* NSString+CSS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+CSS.m"; path = "Core/Source/NSString+CSS.m"; sourceTree = ""; }; E28CA95D89DBAB2FE56BC8513D5838D7 /* DTHorizontalRuleHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHorizontalRuleHTMLElement.h; path = Core/Source/DTHorizontalRuleHTMLElement.h; sourceTree = ""; }; - E2D1BAA539790DA3C1EA46236EEEA14E /* RDEPUBReaderPersistence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPersistence.swift; sourceTree = ""; }; E481007A8174943868EBC81CF3B04B9F /* SSAlertPresentAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertPresentAnimation.swift; path = Sources/SSAlertSwift/SSAlertPresentAnimation.swift; sourceTree = ""; }; E5F69A1E1260BAD7737BEB533F643A15 /* DTLazyImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLazyImageView.h; path = Core/Source/DTLazyImageView.h; sourceTree = ""; }; E62C5E593037EF8A45E7FAA847D0277C /* DTCoreTextLayoutFrame+Cursor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTCoreTextLayoutFrame+Cursor.m"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.m"; sourceTree = ""; }; E6F2E79CC33E0823C4E719ECDDFBBE08 /* NSAttributedStringRunDelegates.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NSAttributedStringRunDelegates.m; path = Core/Source/NSAttributedStringRunDelegates.m; sourceTree = ""; }; + EA685920BF70A411A454D84901312521 /* RDEPUBReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTheme.swift; sourceTree = ""; }; + EB29D001CA71EAB0F6E4C7A8B0F04DA0 /* RDEPUBWebView+Search.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Search.swift"; sourceTree = ""; }; EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ReadViewDemo-umbrella.h"; sourceTree = ""; }; - EC026AD0A9538F72B62BFB9EC8C98353 /* RDEPUBTextPaginationSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationSupport.swift; sourceTree = ""; }; - EC1C84185018F1316377F86BE207A7A3 /* RDReaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderView.swift; sourceTree = ""; }; ECFE19508E12BF8B0B52E8CB4F724217 /* ConstraintMakerRelatable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintMakerRelatable+Extensions.swift"; path = "Sources/ConstraintMakerRelatable+Extensions.swift"; sourceTree = ""; }; ED5693BD171B879406EA14C97F4AD8D8 /* Archive+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ZIP64.swift"; path = "Sources/ZIPFoundation/Archive+ZIP64.swift"; sourceTree = ""; }; EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DTCoreText; path = DTCoreText.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -860,26 +877,27 @@ F038FB491B9A4A53447EF0DC333301AE /* DTObjectTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTObjectTextAttachment.m; path = Core/Source/DTObjectTextAttachment.m; sourceTree = ""; }; F0548F684CA2D8C445086389A2BD5265 /* ZIPFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-prefix.pch"; sourceTree = ""; }; F0D72C5680EBE6CA716EE77281AA4436 /* DTAttributedTextContentView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextContentView.m; path = Core/Source/DTAttributedTextContentView.m; sourceTree = ""; }; + F1C425CE28DE9FA9CDD148A2986752D1 /* RDEPUBJavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJavaScriptBridge.swift; sourceTree = ""; }; F35039A8D0AA1F7BAFC4E5E016057E15 /* DTTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachment.m; path = Core/Source/DTTextAttachment.m; sourceTree = ""; }; F37563A56C180CE18EEFADE56FA3C17F /* DTAccessibilityViewProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityViewProxy.h; path = Core/Source/DTAccessibilityViewProxy.h; sourceTree = ""; }; - F38A5EF3AB47504A0F63F91180092B45 /* RDEPUBTextPerformanceSampler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPerformanceSampler.swift; sourceTree = ""; }; F410ED25E4E84C3D5166261CDF4B58F2 /* SSAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertView.swift; path = Sources/SSAlertSwift/SSAlertView.swift; sourceTree = ""; }; F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "DTCoreText-Resources"; path = Resources.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; F5389D4E96A4AFE175691B4D3D4524E7 /* DTExtendedFileAttributes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTExtendedFileAttributes.m; path = Core/Source/DTExtendedFileAttributes.m; sourceTree = ""; }; F53CCB60DE5D06A43E4A52EDB274E7D2 /* NSString+Paragraphs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+Paragraphs.m"; path = "Core/Source/NSString+Paragraphs.m"; sourceTree = ""; }; F5B34EE2160C27947D1EEFD42184CF5D /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Sources/ConstraintLayoutSupportDSL.swift; sourceTree = ""; }; - F61A8DFA3305799C8739646FD400B495 /* RDEPUBAssetRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAssetRepository.swift; sourceTree = ""; }; + F5DF77100B1D534940D2F5CEFCBB9F01 /* UIColor+RDEPUBHex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUBHex.swift"; sourceTree = ""; }; F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.release.xcconfig; sourceTree = ""; }; F734214E067BDBDB581911E1A5CDAADB /* DTBreakHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBreakHTMLElement.m; path = Core/Source/DTBreakHTMLElement.m; sourceTree = ""; }; F76A97683FB5E8E8B86EA4AD71F6F4B4 /* Date+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Date+ZIP.swift"; path = "Sources/ZIPFoundation/Date+ZIP.swift"; sourceTree = ""; }; F7B0087DE7C394A677F5883541AB4FB7 /* DTListItemHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTListItemHTMLElement.m; path = Core/Source/DTListItemHTMLElement.m; sourceTree = ""; }; + F815D5A48F693355A35C89FC9E51D336 /* RDEPUBTextContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentView.swift; sourceTree = ""; }; F9A2565B302334B662AB51DCF8E65EEE /* DTDictationPlaceholderTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderTextAttachment.h; path = Core/Source/DTDictationPlaceholderTextAttachment.h; sourceTree = ""; }; - FB2892BCC3CD841C8364FBBE0DC10C12 /* RDEPUBWebView+FixedLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+FixedLayout.swift"; sourceTree = ""; }; + FA510A2ECD919C8E8C8EAA7770D37E49 /* WeReadApi.js */ = {isa = PBXFileReference; includeInIndex = 1; name = WeReadApi.js; path = Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js; sourceTree = ""; }; FB2ABB1D297442D91AA42F1407DB4A58 /* DTTextHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextHTMLElement.h; path = Core/Source/DTTextHTMLElement.h; sourceTree = ""; }; + FC307B372D2CF490DBFE40A0328E8B0A /* RDReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPageChildViewController.swift; sourceTree = ""; }; FC5EC7C3D1808C9CF53354D7A3D69EE7 /* NSString+DTPaths.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTPaths.h"; path = "Core/Source/NSString+DTPaths.h"; sourceTree = ""; }; FCC718115E5C31C88A680522AE36B089 /* DTFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTFoundation-dummy.m"; sourceTree = ""; }; FD03567681A79FFB6E81B3105503065D /* DTFoundationConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFoundationConstants.h; path = Core/Source/DTFoundationConstants.h; sourceTree = ""; }; - FDA0CBC0DF8A08DDB5F0FE3812677CC9 /* RDEPUBReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderController.swift; sourceTree = ""; }; FDD333B409D528E5006FA48F4D70A6F5 /* DTCSSListStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSListStyle.h; path = Core/Source/DTCSSListStyle.h; sourceTree = ""; }; FE2991699D0391172DEADF2F4613E320 /* SSAlertSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSAlertSwift.release.xcconfig; sourceTree = ""; }; FEA9F91758013B23B0EEA71DA22E7475 /* Pods-ReadViewDemo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ReadViewDemo-Info.plist"; sourceTree = ""; }; @@ -889,18 +907,11 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0AFD099807E2D6382B8C17CF9956C5B0 /* Frameworks */ = { + 4D5098EB3DCA949E688884A176837775 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4E8AF910316D5C65065B2C33E7E141E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 42E86E25D5B3335EF7DD6518E0863E72 /* Foundation.framework in Frameworks */, + C41084FA13EB4E085E82258526EC3565 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -912,6 +923,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 65C91618FE0CB90E6BB0ABEB407880D7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6F1DC7DF5E89C820D04E068D56B1D0EF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -925,55 +943,55 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 76F596E482EF168AD1A768D8E5195B77 /* Frameworks */ = { + 79526559ADAB3441AA19B5D001BBED4B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 9455F1AD1B1A8CCDDF067216C54B6E14 /* Frameworks */ = { + A8ADF33814FF0B23DBED6ED0B87125B5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B338DD4D050174DC3BB7EA0E1A603333 /* Foundation.framework in Frameworks */, + A667E54F636BD55EC03EACCB937AF1D9 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A25365B66F39632CA9A6B4D8B0CF909A /* Frameworks */ = { + B1998251DB29113903A1C1519FCDA773 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - BC7FD3F4F58EE1BDAA7142FF12B449C0 /* Frameworks */ = { + B7AB287FB809BC6EE97D2CE702B7D742 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7619C2726F04F3217F63C597C69BA011 /* Foundation.framework in Frameworks */, - DB8DE9962C27333B7EAE30671A2F87AC /* ImageIO.framework in Frameworks */, - 060B0F956EE34AB3BFC0257E84DFAC7E /* QuartzCore.framework in Frameworks */, + ADD70654B7F6B32B2A687B2A7866027E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CCE272E8FF30C2ADD80D9F83D1BE1FAB /* Frameworks */ = { + D8A394261F2CD1CE7076622CB7CBEA95 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 68341B3169494A21A1B419AFA1DF652B /* Foundation.framework in Frameworks */, + 52A961050B64F5F0985064C3BF7EBDBB /* Foundation.framework in Frameworks */, + F9C5409DC727419DBFA6AD6701108F13 /* ImageIO.framework in Frameworks */, + 0D5E63AF74BC876DEE822780271F8773 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - E638817414C3E194C7AFCC1928B26BEE /* Frameworks */ = { + FAB45208492061B3E5832F229C3ECE28 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 96ACAABF6BCAE1D6A957F7C5A5B291CA /* Foundation.framework in Frameworks */, + 47AA74DAF06F2F7A71F70FE9F6CC6CAE /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - F80F0F6E3FE94609184884B26D41F6D2 /* Frameworks */ = { + FF20913263E229616A291202A88A5304 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -983,45 +1001,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 02AFB2418BD147B76FA9046226099987 /* EPUBCore */ = { - isa = PBXGroup; - children = ( - F61A8DFA3305799C8739646FD400B495 /* RDEPUBAssetRepository.swift */, - C6D9DE483A33AFF82D025E95ABAE82B1 /* RDEPUBFixedLayoutTemplate.swift */, - BC270D100F485EEEB920AB37D4476FB3 /* RDEPUBJavaScriptBridge.swift */, - AB417EFC922BE57A7D61CFCD8F5C356A /* RDEPUBModels.swift */, - 87EBF2D16BA02CD25CD1367A4F7026BB /* RDEPUBNavigatorLayoutContext.swift */, - 3CD377E1D9608FD654CA2A3B1D4DF344 /* RDEPUBNavigatorState.swift */, - 99EF157E0B58EE5D8605F8EDDF4D9350 /* RDEPUBPaginator.swift */, - B97DAD182D1BD5778630EF4A56BDD988 /* RDEPUBParser.swift */, - 871BA1C45F545C9EAD9E1795144209C6 /* RDEPUBParser+Archive.swift */, - C4331275EBF2F4E4FC5FBFFEE72E6E06 /* RDEPUBParser+Package.swift */, - 9DE1E0CEE577C4985CB816FDA2AFDA3F /* RDEPUBParser+ReadingProfile.swift */, - 44009B7A804BFDD7B2AD3F1CBE12CE42 /* RDEPUBParser+Resources.swift */, - 28D388240137738CB7BC33CB6B82A62A /* RDEPUBParser+TOC.swift */, - 48A4E8E3CD48799CF1E9D64CD7CE0C86 /* RDEPUBPreferences.swift */, - 9F596AE7A8707C4D27AD9ABE552C6C59 /* RDEPUBPublication.swift */, - CDD70A0AF6652B8B142FE99A2E3BFCFE /* RDEPUBReadingModels.swift */, - 29E5523049D286F000DEB6F1D59AD428 /* RDEPUBReadingSession.swift */, - 04B40D87ADCB26B8270415FAA057AACB /* RDEPUBRenderRequest.swift */, - 49708F53EFFC5069D69D7BDBE145D5CB /* RDEPUBResourceResolver.swift */, - 82C37B4E513CEF203D7C832740579E6B /* RDEPUBResourceURLSchemeHandler.swift */, - 982BAB73B44D6A14A904822EB0836FDA /* RDEPUBSearchEngine.swift */, - B6C092A5458F6A10FC8ACE9435997C5B /* RDEPUBSearchModels.swift */, - 9BD3A31AFC4BC8216C0AA79606708051 /* RDEPUBStyleSheetBuilder.swift */, - B4E20D7801600727C16A2C13D5F84E38 /* RDEPUBTextAnchor.swift */, - 37D54A0CE6965D4142DB16CE54293F16 /* RDEPUBWebView.swift */, - 3DD8D4287E569AB98F04CF03AE208B71 /* RDEPUBWebView+Configuration.swift */, - FB2892BCC3CD841C8364FBBE0DC10C12 /* RDEPUBWebView+FixedLayout.swift */, - 5AC9A769CBC46F65ECAE32EAD0F196B6 /* RDEPUBWebView+JavaScriptBridge.swift */, - 3B52BDF13EFDE5C61F7A1B1FF5B79F02 /* RDEPUBWebView+Reflowable.swift */, - CA1A5B58D686782147F12C1A8781C47B /* RDEPUBWebView+Search.swift */, - 264D3D6CCA46CD555E458C17F6BEC460 /* RDEPUBWebViewDebug.swift */, - ); - name = EPUBCore; - path = Sources/RDReaderView/EPUBCore; - sourceTree = ""; - }; 0388AB194A762ACB56242F4BF9BA4498 /* Resources */ = { isa = PBXGroup; children = ( @@ -1094,12 +1073,33 @@ path = "Target Support Files/Pods-ReadViewDemo"; sourceTree = ""; }; - 0FC6890E20D396658E1D6AADD29A4975 /* Pod */ = { + 1171313905A14B172C82D274D7BCCC5F /* EPUBUI */ = { isa = PBXGroup; children = ( - 0EBF956AF4A708B6D77C0765D1B8D059 /* RDReaderView.podspec */, + 8E2529CE2E852CB74565B24AC7B88965 /* RDEPUBPageInteractionController.swift */, + 7863FD91C5BD0B2EE358458E09C81194 /* RDEPUBPageLayoutSnapshot.swift */, + 97FCA163E8AE5E977B12F9060F220252 /* RDEPUBReaderBottomToolView.swift */, + 5EDE24320E72FF6E77D1E402600E9753 /* RDEPUBReaderChapterListController.swift */, + 89ED8313799E7A012F5A06BCEACF09B8 /* RDEPUBReaderConfiguration.swift */, + B64B372E68C6C74223A76117BFA80B15 /* RDEPUBReaderController.swift */, + 659E6B7AFC5374BF3A56A306238C3E96 /* RDEPUBReaderDelegate.swift */, + 63C6DCCE49AF60A4CD752939A15DB118 /* RDEPUBReaderHighlightsViewController.swift */, + 93B0E9F83D59A57EF00599DBE41952BF /* RDEPUBReaderPersistence.swift */, + CE2C63A2462C2CA8751808A396C796F2 /* RDEPUBReaderSettings.swift */, + 40156267853001A18D40A4515A03C5A7 /* RDEPUBReaderSettingsViewController.swift */, + 76374229228450DD3ADBF2DB618329F5 /* RDEPUBReaderTableOfContentsItem.swift */, + EA685920BF70A411A454D84901312521 /* RDEPUBReaderTheme.swift */, + C6A6391BB8EAA2BA440A903CFBD508ED /* RDEPUBReaderToolView.swift */, + 52BAAD948F35A4788F3441FA024D937B /* RDEPUBReaderTopToolView.swift */, + 31DEEEBC962A7BAB4EDB772B3A2279B2 /* RDEPUBSelectionOverlayView.swift */, + F815D5A48F693355A35C89FC9E51D336 /* RDEPUBTextContentView.swift */, + AE1A53CCB5BC34FB44E35A4A29AA5591 /* RDEPUBWebContentView.swift */, + B6F64F7254BE291374ECDC3E59BDB065 /* RDEPUBWebDecorationOverlayView.swift */, + D8BCB7DFA6D42E5D07629E5E2F44FD0D /* RDURLReaderController.swift */, + F5DF77100B1D534940D2F5CEFCBB9F01 /* UIColor+RDEPUBHex.swift */, ); - name = Pod; + name = EPUBUI; + path = Sources/RDReaderView/EPUBUI; sourceTree = ""; }; 1B7515007EDD63EDCCE4BAD15D6CA9BA /* Support Files */ = { @@ -1117,17 +1117,20 @@ path = "../Target Support Files/DTFoundation"; sourceTree = ""; }; - 217676B43561F8FE56D48D7D43F168C2 /* ReaderView */ = { + 25B0D89DFD7C438AC069E3F7994A0054 /* Support Files */ = { isa = PBXGroup; children = ( - 8114D77A6959999E364B801F9499589D /* RDReaderContentCell.swift */, - CF89E84A24C211E605EDA599629D3CA1 /* RDReaderFlowLayout.swift */, - 573B36675B38E2D9301B3CCFD9E7CCFF /* RDReaderGestureController.swift */, - 96718D9DDA02E4E22568D880B91E7D8C /* RDReaderPageChildViewController.swift */, - EC1C84185018F1316377F86BE207A7A3 /* RDReaderView.swift */, + CE2D421FC5D3B9864967FD50215C0A4B /* RDReaderView.modulemap */, + 8432F1648F7FDA0F1A736F8A53739308 /* RDReaderView-dummy.m */, + 2C26AFBE041DB9C0B1BFC9B71CFCA31F /* RDReaderView-Info.plist */, + 1C17D914B39D21C0A4943F60349040BA /* RDReaderView-prefix.pch */, + 875F2A69FD6767E29074114D638B2934 /* RDReaderView-umbrella.h */, + B8FAF5A1A2890703F132819BD138C1A9 /* RDReaderView.debug.xcconfig */, + C73611E91719890E1DD889DEBBA1DDF2 /* RDReaderView.release.xcconfig */, + 45D36E42A61555CAE286BFC8FC062999 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */, ); - name = ReaderView; - path = Sources/RDReaderView/ReaderView; + name = "Support Files"; + path = "ReadViewDemo/Pods/Target Support Files/RDReaderView"; sourceTree = ""; }; 29A410FBD4C19138B1D732EC94D8EFB2 /* DTFoundation */ = { @@ -1143,22 +1146,6 @@ path = DTFoundation; sourceTree = ""; }; - 2FF861328354D1DF610EF63695EED6E7 /* RDReaderView */ = { - isa = PBXGroup; - children = ( - BE53A6D6898393B5A8B54F23ED0065D0 /* epub-bridge.js */, - 7F47BD1AD90D0D7227EC3804CB2C2AE8 /* epub-fixed-layout.html */, - 02AFB2418BD147B76FA9046226099987 /* EPUBCore */, - EF95074650C9523E655FD1CC42E4C1FB /* EPUBTextRendering */, - C637EF30F5586D11014D2CC2185B9EBE /* EPUBUI */, - 0FC6890E20D396658E1D6AADD29A4975 /* Pod */, - 217676B43561F8FE56D48D7D43F168C2 /* ReaderView */, - C120B336609DB6C321AAFED0509117EA /* Support Files */, - ); - name = RDReaderView; - path = ../..; - sourceTree = ""; - }; 3595ED200AA07F0B71CB42506574798F /* Support Files */ = { isa = PBXGroup; children = ( @@ -1248,6 +1235,45 @@ path = "../Target Support Files/DTCoreText"; sourceTree = ""; }; + 5DE502ECE610FE31567AEF3D1AEAC2B0 /* EPUBCore */ = { + isa = PBXGroup; + children = ( + C5C4BF1170DCF38B8CC1E4979A0334FA /* RDEPUBAssetRepository.swift */, + 660901C91F4E1D354689FF2F8B6E1679 /* RDEPUBFixedLayoutTemplate.swift */, + F1C425CE28DE9FA9CDD148A2986752D1 /* RDEPUBJavaScriptBridge.swift */, + 9C2DE084B4CF376178F1AFB96BD84562 /* RDEPUBModels.swift */, + 9197422E9FAD3EDDC5C5844350D497F7 /* RDEPUBNavigatorLayoutContext.swift */, + 6A800873D793225974FA75561B0810DF /* RDEPUBNavigatorState.swift */, + 24AD5C352BC2F291B84A39565644DE44 /* RDEPUBPaginator.swift */, + 2D5AA1752B9A4DA12829506699ACB35F /* RDEPUBParser.swift */, + 7AD993F901F35B7F58E0A7AC2F8962BA /* RDEPUBParser+Archive.swift */, + 551DE8194BF851EE58EA61CBBA1710B1 /* RDEPUBParser+Package.swift */, + 992AFC205F9539B89BF279A5EE6CB266 /* RDEPUBParser+ReadingProfile.swift */, + A4EE1E0ACE64032C6C8CB26A91235993 /* RDEPUBParser+Resources.swift */, + 87AAB03A10169416E66E50562D9A57A0 /* RDEPUBParser+TOC.swift */, + 8173B8E972A645B3A420B3C5C0DCDF6A /* RDEPUBPreferences.swift */, + 1CF085139C084B6CB83EB511352CC385 /* RDEPUBPublication.swift */, + 49439BEDC4669BE8E3E9D3315C568645 /* RDEPUBReadingModels.swift */, + 3C67B49D37D02FC71C317CCA00B61EDB /* RDEPUBReadingSession.swift */, + 59FAF02EDC6AC0DB9FA24A64E7B870CB /* RDEPUBRenderRequest.swift */, + 6002874EC82D09DCF64076F537D57EE4 /* RDEPUBResourceResolver.swift */, + 32769058982DA3B3ADB0051377B41916 /* RDEPUBResourceURLSchemeHandler.swift */, + 16973940E1B38B29D620DAB562AB7396 /* RDEPUBSearchEngine.swift */, + 39A422EF35AF8F3EC0DCD8BCAF01A32E /* RDEPUBSearchModels.swift */, + 37C1467D2571E3541EC221A49C90B110 /* RDEPUBStyleSheetBuilder.swift */, + 4CA430D9A4A6EAE818564BB80309781D /* RDEPUBTextAnchor.swift */, + 929106407362D571E93A73D87EAB8107 /* RDEPUBWebView.swift */, + 89FBCDE54D10D205F325580161FB9FC3 /* RDEPUBWebView+Configuration.swift */, + 252896D6D97D0F06D5937D72DD041E65 /* RDEPUBWebView+FixedLayout.swift */, + 0B1A759F6D90A955E7DF86A14FEE1737 /* RDEPUBWebView+JavaScriptBridge.swift */, + 6861909964EF2CEDB7ED884A3B410A7D /* RDEPUBWebView+Reflowable.swift */, + EB29D001CA71EAB0F6E4C7A8B0F04DA0 /* RDEPUBWebView+Search.swift */, + 32A3B34DE993508CAEBD18287344623E /* RDEPUBWebViewDebug.swift */, + ); + name = EPUBCore; + path = Sources/RDReaderView/EPUBCore; + sourceTree = ""; + }; 62598D566A90C2374701CEB798B77521 /* Support Files */ = { isa = PBXGroup; children = ( @@ -1294,6 +1320,14 @@ path = ZIPFoundation; sourceTree = ""; }; + 6436F80D3F77FC2FDE2075BCCFD6B16A /* Pod */ = { + isa = PBXGroup; + children = ( + 580328EB7B35E7A9C48515F737D984ED /* RDReaderView.podspec */, + ); + name = Pod; + sourceTree = ""; + }; 64771901367D11DEDD868C197369EA56 /* DTHTMLParser */ = { isa = PBXGroup; children = ( @@ -1303,14 +1337,6 @@ name = DTHTMLParser; sourceTree = ""; }; - 74C748234E2064C0224731FBE0F11F3A /* Development Pods */ = { - isa = PBXGroup; - children = ( - 2FF861328354D1DF610EF63695EED6E7 /* RDReaderView */, - ); - name = "Development Pods"; - sourceTree = ""; - }; 81FAF4124052D4A411C0A8C21B48174C /* Core */ = { isa = PBXGroup; children = ( @@ -1463,20 +1489,71 @@ path = DTCoreText; sourceTree = ""; }; - C120B336609DB6C321AAFED0509117EA /* Support Files */ = { + A618C18152B0CC69EBA32288A9A260E9 /* EPUBTextRendering */ = { isa = PBXGroup; children = ( - 960542929FBAAFA1C1B1991BDD522CEB /* RDReaderView.modulemap */, - 1F4E662F4176B8840BB4DF9A76EB5443 /* RDReaderView-dummy.m */, - C455253D491919E5B727AD431FD333E3 /* RDReaderView-Info.plist */, - 84ECF423776A6EE042F30DF5BF40DC58 /* RDReaderView-prefix.pch */, - 606D7AB51D4BF9B4AAD104DF89B5B9AD /* RDReaderView-umbrella.h */, - BEBB599A31B8BC71D00B843E8EB0971F /* RDReaderView.debug.xcconfig */, - D0AA4E895BB85E9FC893F2FEE774981F /* RDReaderView.release.xcconfig */, - 9C0D3D9DE44CEB89B16F1D598A049EF0 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */, + 967506B2C9A33F6E902BDA98940C603F /* RDEPUBChapterData.swift */, + 9CBC86AC7AC17CD094469EC7DCE21724 /* RDEPUBDTCoreTextRenderer.swift */, + 763D7B1705C9113C0A37E0775C4F9FEC /* RDEPUBTextBookBuilder.swift */, + 16D52166703BA10418F79BCD397B07DB /* RDEPUBTextBookCache.swift */, + 6BAB3488CD710ECC37CE9B0F10A10545 /* RDEPUBTextIndexTable.swift */, + D73C71810144AB20A3D87FADF45109EF /* RDEPUBTextLayouter.swift */, + 26CF54683B145156F178EF99B0C7046A /* RDEPUBTextLayoutFrame.swift */, + 7B89D235A3ECE3B096FBB5E7A2626C9C /* RDEPUBTextPaginationSupport.swift */, + 3119842637EAE995A0DAEBEB1170E363 /* RDEPUBTextPerformanceSampler.swift */, + 35FA9133889FF0F7999C456AC029966C /* RDEPUBTextPositionConverter.swift */, + 749B6320F95F8F75FDF6B8ACC3E43D57 /* RDEPUBTextRenderer.swift */, + 9654CB2B436E0FB30970E9FCF3870820 /* RDEPUBTextRendererSupport.swift */, + 2F8C4EB13F9C6442DAD004816726B09A /* RDEPUBTextSearchEngine.swift */, + 7D078643E7C9EA66EB922D04504AC413 /* RDPlainTextBookBuilder.swift */, ); - name = "Support Files"; - path = "ReadViewDemo/Pods/Target Support Files/RDReaderView"; + name = EPUBTextRendering; + path = Sources/RDReaderView/EPUBTextRendering; + sourceTree = ""; + }; + AE4B5910B2AE28EB710635EA73985005 /* RDReaderView */ = { + isa = PBXGroup; + children = ( + C6F199830BC382B6C9AEF29F421EE0C9 /* cssInjector.js */, + 33D8E2EC0A0BDF6FCA33CA829E2C6FCF /* epub-bridge.js */, + 353AB6D63236BF3C98B630EAB53AC742 /* epub-fixed-layout.html */, + 49553EE889D9BB1C29A6AA69A857A8EB /* rangy-core.js */, + 129DD2A43FC15DC9844C508DFE51D24A /* rangy-serializer.js */, + FA510A2ECD919C8E8C8EAA7770D37E49 /* WeReadApi.js */, + 57DE6F8B9CE9F488188CFE16DDF7929B /* wxread-dark.css */, + 32D260607CE02388D7741193F901AF75 /* wxread-default.css */, + 6009A6FAECBFC4615F869A0D90D8A460 /* wxread-replace.css */, + C65067E704BE5EEEDE5FC6FF04C9C0AA /* wxread-replace-latin.css */, + 5DE502ECE610FE31567AEF3D1AEAC2B0 /* EPUBCore */, + A618C18152B0CC69EBA32288A9A260E9 /* EPUBTextRendering */, + 1171313905A14B172C82D274D7BCCC5F /* EPUBUI */, + 6436F80D3F77FC2FDE2075BCCFD6B16A /* Pod */, + B56A5C449EDE2FBDC257BA766361A6D1 /* ReaderView */, + 25B0D89DFD7C438AC069E3F7994A0054 /* Support Files */, + ); + name = RDReaderView; + path = ../..; + sourceTree = ""; + }; + B56A5C449EDE2FBDC257BA766361A6D1 /* ReaderView */ = { + isa = PBXGroup; + children = ( + 609F81945B589AC45E4E531C01F6EE3E /* RDReaderContentCell.swift */, + 6D4134DC0BA1A654610741FB33CA9BA7 /* RDReaderFlowLayout.swift */, + B2682E7883D110ECC2F46C6270375D24 /* RDReaderGestureController.swift */, + FC307B372D2CF490DBFE40A0328E8B0A /* RDReaderPageChildViewController.swift */, + 70AA5021FC2962BB31E28C8BFDA797CD /* RDReaderView.swift */, + ); + name = ReaderView; + path = Sources/RDReaderView/ReaderView; + sourceTree = ""; + }; + B9CF9F63ECCD4435AA8F5FEDC37E6258 /* Development Pods */ = { + isa = PBXGroup; + children = ( + AE4B5910B2AE28EB710635EA73985005 /* RDReaderView */, + ); + name = "Development Pods"; sourceTree = ""; }; C2775EE99F51E41166DFC2EFD6739CA0 /* Resources */ = { @@ -1487,35 +1564,6 @@ name = Resources; sourceTree = ""; }; - C637EF30F5586D11014D2CC2185B9EBE /* EPUBUI */ = { - isa = PBXGroup; - children = ( - 8DF21684A2D45C7724718A05AB269C7A /* RDEPUBPageInteractionController.swift */, - 5931AEB1E931A7219B0643093173E4B1 /* RDEPUBPageLayoutSnapshot.swift */, - AEDE060ABAEC551BD0CD924CE4DE7058 /* RDEPUBReaderBottomToolView.swift */, - 8B3CCE79B11EBF54E7B1195D4F4CD00E /* RDEPUBReaderChapterListController.swift */, - DDF01B7EF5DD6EA4CA5168C35069C495 /* RDEPUBReaderConfiguration.swift */, - FDA0CBC0DF8A08DDB5F0FE3812677CC9 /* RDEPUBReaderController.swift */, - 114B1402AFD8DC2B76F64E2A702FF5EC /* RDEPUBReaderDelegate.swift */, - 91E98E8EB07A175FB72DCB4D69B1BF40 /* RDEPUBReaderHighlightsViewController.swift */, - E2D1BAA539790DA3C1EA46236EEEA14E /* RDEPUBReaderPersistence.swift */, - 178D1E4BA4980627DBDDD27A035D98EF /* RDEPUBReaderSettings.swift */, - 1AA7CFC7A07A8C9400697DA331E35860 /* RDEPUBReaderSettingsViewController.swift */, - 9661A4FD82D29BF44C5DB5D68F4FF237 /* RDEPUBReaderTableOfContentsItem.swift */, - 23AD6E6A62F1EE4221018B6DA2391BA7 /* RDEPUBReaderTheme.swift */, - 5E372F6B632B54653CBA022D20FB3367 /* RDEPUBReaderToolView.swift */, - 1D87EC99EB119D764849BD1E582C7D06 /* RDEPUBReaderTopToolView.swift */, - 065F46518D05F6DEA21AB45C485CCBAC /* RDEPUBSelectionOverlayView.swift */, - CA4B1095936DBB3491E580EE642E6966 /* RDEPUBTextContentView.swift */, - 586127E2E5DFA220EAB96633512B3DF3 /* RDEPUBWebContentView.swift */, - 2A7797621CF825900662A85E723445CD /* RDEPUBWebDecorationOverlayView.swift */, - 8CC598DC4A28E4CD6EF8AA1BDBED7D2D /* RDURLReaderController.swift */, - A37FEAB6B0E196275B35332A30FF74DD /* UIColor+RDEPUBHex.swift */, - ); - name = EPUBUI; - path = Sources/RDReaderView/EPUBUI; - sourceTree = ""; - }; CA6142FEF8E51F79243E3C87378F50AF /* UIKit */ = { isa = PBXGroup; children = ( @@ -1547,7 +1595,7 @@ isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 74C748234E2064C0224731FBE0F11F3A /* Development Pods */, + B9CF9F63ECCD4435AA8F5FEDC37E6258 /* Development Pods */, D68CA58901FBF589D75F5E40F1EAF5BA /* Frameworks */, E861498A78913BA984BA96358FC61449 /* Pods */, 43D8ECA62CF48C3CD5F77E3CA6F466AF /* Products */, @@ -1630,27 +1678,6 @@ name = Pods; sourceTree = ""; }; - EF95074650C9523E655FD1CC42E4C1FB /* EPUBTextRendering */ = { - isa = PBXGroup; - children = ( - 31A85F27E07E44ECFCCBCECAAE32A56F /* RDEPUBChapterData.swift */, - 749ECE28D47716A820DFDFAE1C9E294D /* RDEPUBDTCoreTextRenderer.swift */, - 4EF375B490014DEFC2BB798269AA0985 /* RDEPUBTextBookBuilder.swift */, - 57A61F7A5E8A862AB61CC09109D9E81E /* RDEPUBTextBookCache.swift */, - BE99150A429F1AA375BD9A89473100CB /* RDEPUBTextIndexTable.swift */, - D14AB5026508804287BE9997A4CF7CE1 /* RDEPUBTextLayouter.swift */, - 02375C5EDA3CE9379DB415A85CFCC0F2 /* RDEPUBTextLayoutFrame.swift */, - EC026AD0A9538F72B62BFB9EC8C98353 /* RDEPUBTextPaginationSupport.swift */, - F38A5EF3AB47504A0F63F91180092B45 /* RDEPUBTextPerformanceSampler.swift */, - C879D1B97FBCF728EA0A7A1FD445EEC9 /* RDEPUBTextRenderer.swift */, - CEAF5559BCE747CDC3F13886B8385344 /* RDEPUBTextRendererSupport.swift */, - BA1661CEEEBB7BDE901B5716D99DDE90 /* RDEPUBTextSearchEngine.swift */, - 034E4400505DA6AC50F9D93914301F45 /* RDPlainTextBookBuilder.swift */, - ); - name = EPUBTextRendering; - path = Sources/RDReaderView/EPUBTextRendering; - sourceTree = ""; - }; F3D99F452BF74190AE8A6D307FDF149B /* Support Files */ = { isa = PBXGroup; children = ( @@ -1670,44 +1697,11 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 1FADA470E172C3C05C051DCE71529883 /* Headers */ = { + 24479202F4DAEA9BF631CC781DC01B4A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2993DF5CE6F83258DE9DA1CA296CEBDB /* DTActivityTitleView.h in Headers */, - 916313DF0E690AD86DE2126CB2027880 /* DTAnimatedGIF.h in Headers */, - 652C87BB289F6D2C0C6AC0DACBF43591 /* DTBase64Coding.h in Headers */, - C18438DC910FD5C2AD24CFC0A967061D /* DTBlockFunctions.h in Headers */, - D583A6E063AFB5A0E1B24EBAC86F5BB5 /* DTCompatibility.h in Headers */, - C518E17914E24B57ED13D1C1E11104BF /* DTCoreGraphicsUtils.h in Headers */, - 394D91C2D2C148AD3633ADB12DF96012 /* DTCustomColoredAccessory.h in Headers */, - AD517D4065385465763EC380F2F12210 /* DTExtendedFileAttributes.h in Headers */, - 7B34D900828BEC759105BC26F048790F /* DTFolderMonitor.h in Headers */, - 0394CD46435D6EE15D3996A7FDEAC0AD /* DTFoundation-umbrella.h in Headers */, - 5ABA46799727B3391DF32044DD086BDC /* DTFoundationConstants.h in Headers */, - BCA7D49D31B99D9B3522A16BA0F2FFED /* DTHTMLParser.h in Headers */, - EFAF5BBFB7E60F9044B865B5771FE618 /* DTLog.h in Headers */, - 752B74E15CF0FD1F56043470AD23C602 /* DTPieProgressIndicator.h in Headers */, - F0D47930AC51626265F4CEDCAEB0D1B6 /* DTSmartPagingScrollView.h in Headers */, - 70952AD584BE1EAABAFE3C6DD47865DE /* DTTiledLayerWithoutFade.h in Headers */, - 6CF2260408BBD6B12C40E62D1D9CFBF3 /* DTVersion.h in Headers */, - 30FB567639FBF7B1D963B9A9E644C55F /* DTWeakSupport.h in Headers */, - 707121640F9C2DCBB05B60D20EDB2CC1 /* NSArray+DTError.h in Headers */, - 4BFE0AAE22726EDD75809FC131FCFD70 /* NSData+DTCrypto.h in Headers */, - 285B09F819BD8AFFD69226251C8EC268 /* NSDictionary+DTError.h in Headers */, - F3EAFDDD47F845D1096ED136515CC915 /* NSFileWrapper+DTCopying.h in Headers */, - EE90D86ECB7ABC204BFB13F2FC315D03 /* NSMutableArray+DTMoving.h in Headers */, - 516F6FF776A9581887D1F57F706443B8 /* NSString+DTFormatNumbers.h in Headers */, - B9638897A5C60E1B8F5B659021B80961 /* NSString+DTPaths.h in Headers */, - 9D360F6B48A691B42343D7DB4CD973AB /* NSString+DTURLEncoding.h in Headers */, - F1223D1CEF088198A2B27D90D3CC4F58 /* NSString+DTUtilities.h in Headers */, - 5939419CF19EE16A2BD1C9E7BD482E1A /* NSURL+DTAppLinks.h in Headers */, - 6E7C5CAB02BA409743CFF48D5218D68D /* NSURL+DTComparing.h in Headers */, - 56B02B75B28FA5F1CA7CE6FAE832F228 /* NSURL+DTUnshorten.h in Headers */, - FFFF063445858983090A4E58B19291CA /* UIApplication+DTNetworkActivity.h in Headers */, - 053AFBB60D220EA22D1CF22AB354BBB9 /* UIImage+DTFoundation.h in Headers */, - F3405C56A63F0B88682C17782422E787 /* UIScreen+DTFoundation.h in Headers */, - 494DB8491A940D9CCD0BAB65DA21D211 /* UIView+DTFoundation.h in Headers */, + A1FE48E415D345B47864748E6852C4D2 /* RDReaderView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1784,19 +1778,52 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6D19D7B6BF811EA824842865B59283BA /* Headers */ = { + 4C9C4A053FEC3DEEEA6841DDB13465DD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 19E2B4D2CF3DA91EEBAD4079DDBE076C /* RDReaderView-umbrella.h in Headers */, + 8AA746B78ADA7C80D5BC28F8B53D8723 /* DTActivityTitleView.h in Headers */, + B533B190B349CC90CA4814887EA7185F /* DTAnimatedGIF.h in Headers */, + FD036CA8E474138A8DAC47527185B5FA /* DTBase64Coding.h in Headers */, + CAD07B5D2FADB9B4A8F807CB4EB4F92A /* DTBlockFunctions.h in Headers */, + 239D541A0D14415051D9B84A6FAC4396 /* DTCompatibility.h in Headers */, + EFDDBC3AC88A2F9843346E3A0A5389F0 /* DTCoreGraphicsUtils.h in Headers */, + 701E081379C13353FC056435950394DE /* DTCustomColoredAccessory.h in Headers */, + 77DEFBEDEE73BB372A60ECB671AEE41E /* DTExtendedFileAttributes.h in Headers */, + 6C50D4014739F5FF607E4E9731191A16 /* DTFolderMonitor.h in Headers */, + 982E91D1CAADCF6953B81B68AB159CEB /* DTFoundation-umbrella.h in Headers */, + 96FB53A9630F4A8B5A772DDC36E52801 /* DTFoundationConstants.h in Headers */, + 3D57FD29F6030DC9F461D1344BD78986 /* DTHTMLParser.h in Headers */, + E61C54D454FC27FD101B58B9BC395466 /* DTLog.h in Headers */, + 5155756A1E960CE0786993DB461B11E9 /* DTPieProgressIndicator.h in Headers */, + 6AC9ABB942082B71200798D8E9E0AAEE /* DTSmartPagingScrollView.h in Headers */, + 989258CEB05005E2A8BEA35661CA8591 /* DTTiledLayerWithoutFade.h in Headers */, + EDE07C2D89DEC86AF5B3BDB830DFDFDB /* DTVersion.h in Headers */, + CCC981AE077E9F3E0BCFD8914E7D6F0B /* DTWeakSupport.h in Headers */, + 8B831C5DE899A4C6E6A9756FF359E6F3 /* NSArray+DTError.h in Headers */, + 11C954E3357C1EEB7CC99D689FF2EF01 /* NSData+DTCrypto.h in Headers */, + 69B3DF49F4AB7646FD5A4584F9DCEF98 /* NSDictionary+DTError.h in Headers */, + E94DC7964A5276288537BA9B36377647 /* NSFileWrapper+DTCopying.h in Headers */, + D38A633998460910E98BF5E93841DAD6 /* NSMutableArray+DTMoving.h in Headers */, + 7F1244DE6C0ED5875B9149BDD300C1BC /* NSString+DTFormatNumbers.h in Headers */, + 8CA81801E1B75ED092543CB44D5C29EC /* NSString+DTPaths.h in Headers */, + 660A86A14D4B4568FA3DFABC53BA83ED /* NSString+DTURLEncoding.h in Headers */, + 249683EC17AB72DA0F517756C7657A79 /* NSString+DTUtilities.h in Headers */, + F588926C35B92A750FB13835C0111BB1 /* NSURL+DTAppLinks.h in Headers */, + FA5321384E837B212BA8DBD3FBE3FB04 /* NSURL+DTComparing.h in Headers */, + F25AD7EBA6F5DF35A82207F6D7E7A25C /* NSURL+DTUnshorten.h in Headers */, + 9D8CB20F75B0767AF187FAE3C595D790 /* UIApplication+DTNetworkActivity.h in Headers */, + 00C49E16B834531525EA78BB63A6E504 /* UIImage+DTFoundation.h in Headers */, + E1A1B8B02C3EF2EF0008C7DAF6608192 /* UIScreen+DTFoundation.h in Headers */, + 9DF3F596DF4C655F29378648A7229D0A /* UIView+DTFoundation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 772A5C32E9DCE729FF7841B4D27CE9D3 /* Headers */ = { + 894BFED04DDC330581AD10C7E6D852BB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 776701E3D6C8347A9A8727DD1C0A2057 /* ZIPFoundation-umbrella.h in Headers */, + 453D3B15ED40279A37CA0D74DBE4FFF2 /* SSAlertSwift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1808,19 +1835,19 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E55EDAE810E658EF73B5C5E87B8273F0 /* Headers */ = { + DE7522D7BD4EDC854C005F9E164F7422 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E815C9978BE13179EAD3578B50814E1F /* SnapKit-umbrella.h in Headers */, + 555E422A804DAB73D29F1E68F33BA9BD /* ZIPFoundation-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - E673243D8C0BE7FBFD077C7ABDE8992D /* Headers */ = { + FDF930B0AC649D7D0C762D73710CB9EE /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CE8D398221836AA888D3253140243BA2 /* SSAlertSwift-umbrella.h in Headers */, + C346D582EB4C894FB4D2FFBC5FDD2D28 /* SnapKit-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1829,11 +1856,11 @@ /* Begin PBXNativeTarget section */ 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */ = { isa = PBXNativeTarget; - buildConfigurationList = C0CF038C60823EB4C6318C9BCA487473 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */; + buildConfigurationList = 1DE4C138F942A2A0F6A14D11F475D90E /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */; buildPhases = ( - EA9382AFDD8D8CEB6687FE718577C981 /* Sources */, - A25365B66F39632CA9A6B4D8B0CF909A /* Frameworks */, - 20A2FF028E9B8BAC22A25368376AC743 /* Resources */, + FC050EDAFDDEA3B65238F3C4C214D150 /* Sources */, + 65C91618FE0CB90E6BB0ABEB407880D7 /* Frameworks */, + 567034FDEEAB950DD14247A5BD72A079 /* Resources */, ); buildRules = ( ); @@ -1846,17 +1873,17 @@ }; 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */ = { isa = PBXNativeTarget; - buildConfigurationList = B753DAE9D62F1C3970033983902D5DA9 /* Build configuration list for PBXNativeTarget "SnapKit" */; + buildConfigurationList = 71C725761AC2E4DC24695B87CC437F3F /* Build configuration list for PBXNativeTarget "SnapKit" */; buildPhases = ( - E55EDAE810E658EF73B5C5E87B8273F0 /* Headers */, - BB4553EEA6A3EACB98062F0C554894CA /* Sources */, - E638817414C3E194C7AFCC1928B26BEE /* Frameworks */, - 0B8EAC4EF34912444677B41D5506F245 /* Resources */, + FDF930B0AC649D7D0C762D73710CB9EE /* Headers */, + 31E7C626BF4CBF6351C306F9BED25765 /* Sources */, + A8ADF33814FF0B23DBED6ED0B87125B5 /* Frameworks */, + D4AAF1FB7417F68DA0B421E556AB25AD /* Resources */, ); buildRules = ( ); dependencies = ( - E40E639D5188E207B340EA9ED760ACED /* PBXTargetDependency */, + F2B0F6EE052F080271AEAFFE90B26584 /* PBXTargetDependency */, ); name = SnapKit; productName = SnapKit; @@ -1865,12 +1892,12 @@ }; 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */ = { isa = PBXNativeTarget; - buildConfigurationList = B854881981700E80EC9A3C5D38C9C2B2 /* Build configuration list for PBXNativeTarget "SSAlertSwift" */; + buildConfigurationList = 4FF3470542147C289B711C20EF27792C /* Build configuration list for PBXNativeTarget "SSAlertSwift" */; buildPhases = ( - E673243D8C0BE7FBFD077C7ABDE8992D /* Headers */, - CAA75A1C6B0CE8C39109E2DC8439D628 /* Sources */, - 9455F1AD1B1A8CCDDF067216C54B6E14 /* Frameworks */, - DCE7EB0C59A9D131D463715781CCA703 /* Resources */, + 894BFED04DDC330581AD10C7E6D852BB /* Headers */, + F8DC34B39FD5C083F90D263320E44F0E /* Sources */, + FAB45208492061B3E5832F229C3ECE28 /* Frameworks */, + 976D116B6B0E0AD17D3D6C5A142AD725 /* Resources */, ); buildRules = ( ); @@ -1893,12 +1920,12 @@ buildRules = ( ); dependencies = ( - D0CEDCF680E61097CCDE7BA3F3A2FFE6 /* PBXTargetDependency */, - AD7C7A49E57F6923698611B511B2B28F /* PBXTargetDependency */, - 65B8919CE6A759D6293DEB6F9CF41247 /* PBXTargetDependency */, - ABE2047F82C60D4CF6F168BF11D6D45A /* PBXTargetDependency */, - 4331C47887871F4A75A8D2C450D2F02E /* PBXTargetDependency */, - 00ABC7E516DCCCD5F93019180D10975F /* PBXTargetDependency */, + 020F0A0B69436E99808F13904976F379 /* PBXTargetDependency */, + 715597FB3F1E0E95F8A3F4B3271288A7 /* PBXTargetDependency */, + 2AC1DEEE4B5E32E1FA841E25B3D2FDD4 /* PBXTargetDependency */, + 4F9D9C658D922102865227C060F26475 /* PBXTargetDependency */, + 2771AC7F4AA9CF4C86A3D614D77F33CD /* PBXTargetDependency */, + 95AAA3C6A552559016545CAD5B50333C /* PBXTargetDependency */, ); name = "Pods-ReadViewDemo"; productName = Pods_ReadViewDemo; @@ -1907,11 +1934,11 @@ }; 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */ = { isa = PBXNativeTarget; - buildConfigurationList = E3DCB66E157E16D180F49EF0D7945A6B /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */; + buildConfigurationList = F05CB5E657DCFC1458E4475B7909467D /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */; buildPhases = ( - 1F5CFCB69780B9B91F58925C75C272EB /* Sources */, - 76F596E482EF168AD1A768D8E5195B77 /* Frameworks */, - E043B25EC4E2E674621B54CF3AE78049 /* Resources */, + BD23672C3C7E57623DDEEBBDF147F41C /* Sources */, + 79526559ADAB3441AA19B5D001BBED4B /* Frameworks */, + B2D977C0921F825C2D1AA2F600EE603E /* Resources */, ); buildRules = ( ); @@ -1924,12 +1951,12 @@ }; 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */ = { isa = PBXNativeTarget; - buildConfigurationList = C5194BAF57874F6FA713A09DD4FEDA8F /* Build configuration list for PBXNativeTarget "DTFoundation" */; + buildConfigurationList = 5BD9E11EEAC07E694B8A86BF10ECDE00 /* Build configuration list for PBXNativeTarget "DTFoundation" */; buildPhases = ( - 1FADA470E172C3C05C051DCE71529883 /* Headers */, - 78A07A5515A0D9B8118427D112933DEE /* Sources */, - BC7FD3F4F58EE1BDAA7142FF12B449C0 /* Frameworks */, - C71360FC1A1A29C29DD55EB01FA10C2D /* Resources */, + 4C9C4A053FEC3DEEEA6841DDB13465DD /* Headers */, + AC980E6A0BED2BC61EBDA417E64924C2 /* Sources */, + D8A394261F2CD1CE7076622CB7CBEA95 /* Frameworks */, + 1E351406FB9FFE0E85F762D25B8BC155 /* Resources */, ); buildRules = ( ); @@ -1942,17 +1969,17 @@ }; AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */ = { isa = PBXNativeTarget; - buildConfigurationList = 4FCF0AB7FD0EE29DDF61FB0406216C6A /* Build configuration list for PBXNativeTarget "ZIPFoundation" */; + buildConfigurationList = 30520D73A57B5DC231BF4D593A3E1FC0 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */; buildPhases = ( - 772A5C32E9DCE729FF7841B4D27CE9D3 /* Headers */, - 2EF070BD723DEA0B5E5041B729127675 /* Sources */, - CCE272E8FF30C2ADD80D9F83D1BE1FAB /* Frameworks */, - 3D60EF1849F05707317805D9FC8D4C6A /* Resources */, + DE7522D7BD4EDC854C005F9E164F7422 /* Headers */, + 8E8E3D911D9107530D85E2A57EA135DE /* Sources */, + 4D5098EB3DCA949E688884A176837775 /* Frameworks */, + 0DE75912EA2B3E3D57F61F203610A360 /* Resources */, ); buildRules = ( ); dependencies = ( - 0DBBB35856C6D1690FE07A57337CDCDF /* PBXTargetDependency */, + 2116DF18700ED27036D60C0892EDD986 /* PBXTargetDependency */, ); name = ZIPFoundation; productName = ZIPFoundation; @@ -1961,21 +1988,21 @@ }; AA2E57587AA8EECA63C4BE08EA3CB6D2 /* RDReaderView */ = { isa = PBXNativeTarget; - buildConfigurationList = BE593AFEA35446DBF1FCE7A2B316369D /* Build configuration list for PBXNativeTarget "RDReaderView" */; + buildConfigurationList = DC8655349C54538232C4CB81B137860C /* Build configuration list for PBXNativeTarget "RDReaderView" */; buildPhases = ( - 6D19D7B6BF811EA824842865B59283BA /* Headers */, - 08A523DB34E8D00D86B45DD70F42B0CE /* Sources */, - 4E8AF910316D5C65065B2C33E7E141E8 /* Frameworks */, - 675131E792E03320A750B2041174A336 /* Resources */, + 24479202F4DAEA9BF631CC781DC01B4A /* Headers */, + ABB1B32F91B263FB2E62673C0B647044 /* Sources */, + B7AB287FB809BC6EE97D2CE702B7D742 /* Frameworks */, + 4A5F464DEADCA4865A6F0EC153A2E8FE /* Resources */, ); buildRules = ( ); dependencies = ( - 6851A166D92E8FE23B3DD15126C207E7 /* PBXTargetDependency */, - E2C4FFF39012D9E3D504FB9F916D8FA0 /* PBXTargetDependency */, - 1C2E282B93D9AF8F3BA02A0882B283DB /* PBXTargetDependency */, - 425221FB78517B513A8DA086E9F4EBA9 /* PBXTargetDependency */, - 1383EEFEE990132E5DC3E6752707B3A0 /* PBXTargetDependency */, + 5E87F0E1B9AF330712D0384388AFA603 /* PBXTargetDependency */, + 3C71D3E681036CA8EEF99BD3B1B33169 /* PBXTargetDependency */, + 0FD34BEAFBBC108E029BD172F1A001AC /* PBXTargetDependency */, + 1C87262B71402CF8076F136C711B3B87 /* PBXTargetDependency */, + 48FD93EF0BB78DB9428C4189B580A86D /* PBXTargetDependency */, ); name = RDReaderView; productName = RDReaderView; @@ -1984,11 +2011,11 @@ }; AE7F393FB7805DE2664AB4111873F907 /* RDReaderView-RDReaderViewAssets */ = { isa = PBXNativeTarget; - buildConfigurationList = 85398FFFE9D1D55653F32CBCF3C6D9EA /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */; + buildConfigurationList = 1CA7C9D5DFD7044C7A36338BE2AC73C5 /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */; buildPhases = ( - 6A6488B3294C25F89F5C22825D2CFEBC /* Sources */, - F80F0F6E3FE94609184884B26D41F6D2 /* Frameworks */, - 60CDF980339DCF0F863966E1D2345D3C /* Resources */, + 4BA48F20A933ADB499C30AFEF782AAF0 /* Sources */, + B1998251DB29113903A1C1519FCDA773 /* Frameworks */, + 3C6E2B57EC3F11B635842B368CE854EF /* Resources */, ); buildRules = ( ); @@ -2011,8 +2038,8 @@ buildRules = ( ); dependencies = ( - 1DE36CCA8EDA5E355423FD755697B40D /* PBXTargetDependency */, - 85B6CD064D8FD6BBD877D6E19EB6F8F7 /* PBXTargetDependency */, + 43C7FA9296E0A69B39E9CEDD513DB5E3 /* PBXTargetDependency */, + BAEA1865D980379B2B1067919B5DC4F9 /* PBXTargetDependency */, ); name = DTCoreText; productName = DTCoreText; @@ -2021,11 +2048,11 @@ }; C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */ = { isa = PBXNativeTarget; - buildConfigurationList = EB464E7C400BBAF32186D983363BE1DB /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */; + buildConfigurationList = 470D80E3313FE7E739AE9D34641F2DB4 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */; buildPhases = ( - 9512CE04C3E1E9C6A95D3397945E0E44 /* Sources */, - 0AFD099807E2D6382B8C17CF9956C5B0 /* Frameworks */, - 59106F2645BF1D2BBF8012E9E440D3F6 /* Resources */, + F96FFD5113D092836D4AD41A4F201A88 /* Sources */, + FF20913263E229616A291202A88A5304 /* Frameworks */, + CFE61AF525405B7385CFFF1FE43E0DA6 /* Resources */, ); buildRules = ( ); @@ -2076,19 +2103,18 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 0B8EAC4EF34912444677B41D5506F245 /* Resources */ = { + 0DE75912EA2B3E3D57F61F203610A360 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D412271B77856413B1001384E7C9AE82 /* SnapKit-SnapKit_Privacy in Resources */, + F2376D242202DBE8F1E8ED36A43FB5D3 /* ZIPFoundation-ZIPFoundation_Privacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 20A2FF028E9B8BAC22A25368376AC743 /* Resources */ = { + 1E351406FB9FFE0E85F762D25B8BC155 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - F4653CC8B73CE175A4A677165D687137 /* default.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2100,36 +2126,36 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3D60EF1849F05707317805D9FC8D4C6A /* Resources */ = { + 3C6E2B57EC3F11B635842B368CE854EF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF24D074ED2DFCDA87CD3D72881E3BFF /* ZIPFoundation-ZIPFoundation_Privacy in Resources */, + 90F6FF9B3DA53C4B6C2D2FC588AA385E /* cssInjector.js in Resources */, + D7159CF29AB1F8821F9D68A1412B0BD7 /* epub-bridge.js in Resources */, + CDA8EE4B287129954949825C50EBD3EB /* epub-fixed-layout.html in Resources */, + BE268016D8D21C191A2E82ED75A1F686 /* rangy-core.js in Resources */, + D275D1EAFB36E5273169E7A4417E1219 /* rangy-serializer.js in Resources */, + F9D7FD379D25CE2B854236C1051D4B1C /* WeReadApi.js in Resources */, + 1DB7CE877F9241539B365C9FA1D26217 /* wxread-dark.css in Resources */, + 84BEA3D5956D75FED777C15736EE787A /* wxread-default.css in Resources */, + 072E9480C779CFF4764E08D82F4B67CF /* wxread-replace.css in Resources */, + 8B81B840ED3E5B4E15887391DD7E5B87 /* wxread-replace-latin.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 59106F2645BF1D2BBF8012E9E440D3F6 /* Resources */ = { + 4A5F464DEADCA4865A6F0EC153A2E8FE /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 385DA8247F55E886F3FBC57CC15BEF4E /* PrivacyInfo.xcprivacy in Resources */, + 2D271CB0ADE6190C0835F90BC684CF0F /* RDReaderView-RDReaderViewAssets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 60CDF980339DCF0F863966E1D2345D3C /* Resources */ = { + 567034FDEEAB950DD14247A5BD72A079 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1CBC0ED3AF6CAA617BA3ECB04DA68DF5 /* epub-bridge.js in Resources */, - 57C933175F60BBD9A591DF8B881EC809 /* epub-fixed-layout.html in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 675131E792E03320A750B2041174A336 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4353DBC7FB1A403EE787B421D75A1FDB /* RDReaderView-RDReaderViewAssets in Resources */, + AAFA34024F80407B268712A30687AE65 /* default.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2140,146 +2166,86 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C71360FC1A1A29C29DD55EB01FA10C2D /* Resources */ = { + 976D116B6B0E0AD17D3D6C5A142AD725 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - DCE7EB0C59A9D131D463715781CCA703 /* Resources */ = { + B2D977C0921F825C2D1AA2F600EE603E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6E390B8259A9728AAA7EA8B864179418 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E043B25EC4E2E674621B54CF3AE78049 /* Resources */ = { + CFE61AF525405B7385CFFF1FE43E0DA6 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 90FD859AE0F48677673C091645657C80 /* PrivacyInfo.xcprivacy in Resources */, + AE25127DC32DB2C11CF9136EC7E484E8 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D4AAF1FB7417F68DA0B421E556AB25AD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 78000F5A9639B1D9577CDD05682454A5 /* SnapKit-SnapKit_Privacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 08A523DB34E8D00D86B45DD70F42B0CE /* Sources */ = { + 31E7C626BF4CBF6351C306F9BED25765 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6335F55C18A585E2E2B9CBAEE154B648 /* RDEPUBAssetRepository.swift in Sources */, - BFB26B0704E537A580EC61D6E2A3605A /* RDEPUBChapterData.swift in Sources */, - 8136892B4CED3C9F5693FCC921ED6014 /* RDEPUBDTCoreTextRenderer.swift in Sources */, - D0D213E45A7BFA290F79682A8B42C610 /* RDEPUBFixedLayoutTemplate.swift in Sources */, - 78B4D94D1FD3726A02C1ED8FEE039C22 /* RDEPUBJavaScriptBridge.swift in Sources */, - 25EE412DAC29154BBA2A29A3064C7A2B /* RDEPUBModels.swift in Sources */, - A0A17EBE6BE92D7B152E9FB2FE0C013A /* RDEPUBNavigatorLayoutContext.swift in Sources */, - D3602269C1605E3C28EABBACBE425778 /* RDEPUBNavigatorState.swift in Sources */, - 1E53C95A5D9629D8721ED8DF87983841 /* RDEPUBPageInteractionController.swift in Sources */, - 7F3C9504CE51675D8526B0C8049F6376 /* RDEPUBPageLayoutSnapshot.swift in Sources */, - FB7120CA0EB9D7C08AFA863E338CBA90 /* RDEPUBPaginator.swift in Sources */, - FF435595580C1A21539112F520F0609B /* RDEPUBParser.swift in Sources */, - 0BB905F057CB7578CB867DC3F8277CF6 /* RDEPUBParser+Archive.swift in Sources */, - 42BE9975B789B575433E93B4A10A1E34 /* RDEPUBParser+Package.swift in Sources */, - A361BD208575C1F9519EBD2A7987D353 /* RDEPUBParser+ReadingProfile.swift in Sources */, - CD6559AD4A5AF89AC14C50508DDE8AD7 /* RDEPUBParser+Resources.swift in Sources */, - C4F9BFFF7470026F06CF1E0B4794435F /* RDEPUBParser+TOC.swift in Sources */, - 10C736BFEF1A0AF28FAFF1635B224C09 /* RDEPUBPreferences.swift in Sources */, - 6A70936CDC3B178976FFE24E63AAD354 /* RDEPUBPublication.swift in Sources */, - E121E052DAF546C0204B13A0A1C50401 /* RDEPUBReaderBottomToolView.swift in Sources */, - EA27A76BD9FD576755BA1179041236A9 /* RDEPUBReaderChapterListController.swift in Sources */, - DF1ADB5D7BB4EE951433FBEAD1FD02DC /* RDEPUBReaderConfiguration.swift in Sources */, - B02240DE23EEB84EEAC33F34ABD35184 /* RDEPUBReaderController.swift in Sources */, - 8DBBF8ACAED4591294503366E9309DD7 /* RDEPUBReaderDelegate.swift in Sources */, - F1E14DC7A9D61093A030F7A69D0AA8B6 /* RDEPUBReaderHighlightsViewController.swift in Sources */, - AF5E5ED905BF79ECA8E838CC7DB39673 /* RDEPUBReaderPersistence.swift in Sources */, - 6C99D26D2589D26461CE7EDA02676075 /* RDEPUBReaderSettings.swift in Sources */, - F6AB64DF24798D3F7A7019EBA1131AF1 /* RDEPUBReaderSettingsViewController.swift in Sources */, - B16ABF4764576CCAB4D26AED089DAF5E /* RDEPUBReaderTableOfContentsItem.swift in Sources */, - 2BB93FF5C17C381807DFC46B0772102D /* RDEPUBReaderTheme.swift in Sources */, - 9817C19157DE66A9BD607AA3931E5325 /* RDEPUBReaderToolView.swift in Sources */, - 6E6AF65D6FD1082D14D897B70FC6E2D2 /* RDEPUBReaderTopToolView.swift in Sources */, - 75B39488A594591F53B48AEB9121FAD2 /* RDEPUBReadingModels.swift in Sources */, - 2F36566E071CAF9BB1D665CF3027E6B4 /* RDEPUBReadingSession.swift in Sources */, - 948D7F9528860715954579106312B012 /* RDEPUBRenderRequest.swift in Sources */, - 790F591F6FBBF7C3D96992967CAD376F /* RDEPUBResourceResolver.swift in Sources */, - 0F1EB5CB3A6EB0627B076B7AABA22D9E /* RDEPUBResourceURLSchemeHandler.swift in Sources */, - F47E741B08FF5641DA24EBE1B7EC9DC7 /* RDEPUBSearchEngine.swift in Sources */, - F56CB98504978D122BE9C266F138F5FC /* RDEPUBSearchModels.swift in Sources */, - 123FF942A68B336E49F46CD34F0BB593 /* RDEPUBSelectionOverlayView.swift in Sources */, - 3FB38B080B976580510E01FCE7BA4C10 /* RDEPUBStyleSheetBuilder.swift in Sources */, - 44B3694130E8D04BB05A995AE726E37F /* RDEPUBTextAnchor.swift in Sources */, - 14ADB66FB45D862147EB6E6C4B5EA229 /* RDEPUBTextBookBuilder.swift in Sources */, - ADC19D506FE3D818BB4A2C0889F43DBC /* RDEPUBTextBookCache.swift in Sources */, - 2202864554457158A3863F9F6515EE13 /* RDEPUBTextContentView.swift in Sources */, - C077B7981B6ADE25D1D51BAEE316C65B /* RDEPUBTextIndexTable.swift in Sources */, - 4668DB9D177325F8E008E5D1C0F37CB4 /* RDEPUBTextLayouter.swift in Sources */, - 00BDAA46C4F6569C11D4D34AF68DA505 /* RDEPUBTextLayoutFrame.swift in Sources */, - 108AFD87D054CA4FB49572ED7B16AE99 /* RDEPUBTextPaginationSupport.swift in Sources */, - 3466B5D6804C323ACD624A91A77CE318 /* RDEPUBTextPerformanceSampler.swift in Sources */, - BCD19BC9907BD61075E963B0F808D4C2 /* RDEPUBTextRenderer.swift in Sources */, - 2112D33A6C8A659AB911EF9AA8528E32 /* RDEPUBTextRendererSupport.swift in Sources */, - 39FF966DAE554008F4CFD71A2570E676 /* RDEPUBTextSearchEngine.swift in Sources */, - 9140D603032BA04797811C739821C2DC /* RDEPUBWebContentView.swift in Sources */, - 2B020F7C6FC381A28960B363D24FF8F7 /* RDEPUBWebDecorationOverlayView.swift in Sources */, - ABC61D4F3EAE00629A5CD56CCEDEC8D8 /* RDEPUBWebView.swift in Sources */, - CD687E7FE5C54C6CB1ACD0156881B031 /* RDEPUBWebView+Configuration.swift in Sources */, - 0918ED4A491D011B46EE71AA40DDACB6 /* RDEPUBWebView+FixedLayout.swift in Sources */, - 8C514EA67EF511F82BED7E0D07FB3D02 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */, - 7912E2B42F9391E4EA65BAF15B15F896 /* RDEPUBWebView+Reflowable.swift in Sources */, - 416A6514C1A35BB87A05A7C54ACAEAC4 /* RDEPUBWebView+Search.swift in Sources */, - 609B1D7C204655284FF2AC7D8CB3AC70 /* RDEPUBWebViewDebug.swift in Sources */, - A6CCC9339127977A4582A5AFFD2035E5 /* RDPlainTextBookBuilder.swift in Sources */, - FDC2B2E1061CAC09A759B152654FA327 /* RDReaderContentCell.swift in Sources */, - AE9DBB66E3281E810742770F88E04078 /* RDReaderFlowLayout.swift in Sources */, - C661BA0FD7C2D7693FF02A57384EDCE1 /* RDReaderGestureController.swift in Sources */, - 2534C9D06B3696A12408C710CA2757F5 /* RDReaderPageChildViewController.swift in Sources */, - D0AE0A76C7B05D961789B619FE18B12E /* RDReaderView.swift in Sources */, - 129A4894D5C076AC8FBB4AC2159B0AB8 /* RDReaderView-dummy.m in Sources */, - 8237C1DEFAFDF60BF4B7180EE80E0493 /* RDURLReaderController.swift in Sources */, - 08B28F7D56429BDC3EA13F4EBBF2BCDF /* UIColor+RDEPUBHex.swift in Sources */, + 4FF142B3F09AA12AF220CB09D92F37D3 /* Constraint.swift in Sources */, + DD75D7D90DE6DB0FC4722C6A267B173F /* ConstraintAttributes.swift in Sources */, + 6D8994F32576C73ECE67B2A7BC0DD084 /* ConstraintConfig.swift in Sources */, + 8E9C2D9C827EA566D22F5E1131F794A9 /* ConstraintConstantTarget.swift in Sources */, + 8BE4E5EF4D6B2F597605AE93CD3452D4 /* ConstraintDescription.swift in Sources */, + 8B35034FEA4599E7AC24215B10A2CC54 /* ConstraintDirectionalInsets.swift in Sources */, + F7B3249FC969AB2C684558D696807F42 /* ConstraintDirectionalInsetTarget.swift in Sources */, + 3E10312523D443840CFBA72845ACCED9 /* ConstraintDSL.swift in Sources */, + 3F8EDE1AE8937FC335704E3F15C7C0B5 /* ConstraintInsets.swift in Sources */, + C341EF847BE944F959495C8145AE915D /* ConstraintInsetTarget.swift in Sources */, + 50526E23A8AC98FB5502D6E22758A56D /* ConstraintItem.swift in Sources */, + A3FF25BFBC5DBC01FB99578E25B361E7 /* ConstraintLayoutGuide.swift in Sources */, + 23C510B1C699288E3E15795A6C0835DB /* ConstraintLayoutGuide+Extensions.swift in Sources */, + AAAC44275D726EADF484E946691E09EF /* ConstraintLayoutGuideDSL.swift in Sources */, + 0279DC0CB56DFD659743755DF5932E28 /* ConstraintLayoutSupport.swift in Sources */, + 9E8DCCE70D492157FC50318D42742D5F /* ConstraintLayoutSupportDSL.swift in Sources */, + 3FA49154704A5A890D4CF70CA5C57665 /* ConstraintMaker.swift in Sources */, + 7C046A2B1C3E09420711F10C0B5FED3D /* ConstraintMakerEditable.swift in Sources */, + 10891A3745ED879C322F4EAFB6A24F36 /* ConstraintMakerExtendable.swift in Sources */, + 273EEB3E0A49E67E561DF3C5EE3E67C2 /* ConstraintMakerFinalizable.swift in Sources */, + 36C2DB50F6A31A36A860540B4EF32E0F /* ConstraintMakerPrioritizable.swift in Sources */, + 94A20C3CAA5381176EFE5636D8ECFFD3 /* ConstraintMakerRelatable.swift in Sources */, + F1E8826F0590E0CC1F5A0128D99D7AA3 /* ConstraintMakerRelatable+Extensions.swift in Sources */, + BFF4E73F7207C5C28837D4A6684055B1 /* ConstraintMultiplierTarget.swift in Sources */, + 68E20F956433EA0CEDAC3948339C74E1 /* ConstraintOffsetTarget.swift in Sources */, + 3E8AFCDE8242393816FB4CFCA5048FCA /* ConstraintPriority.swift in Sources */, + 3B7E31D804C0208ECAEF8630D8CE6E8C /* ConstraintPriorityTarget.swift in Sources */, + AA10BB78D6DCE8229EB4E146BCC9105A /* ConstraintRelatableTarget.swift in Sources */, + 3821BB7D496697C9F3CA8E00DD53115A /* ConstraintRelation.swift in Sources */, + 04AC4C71A95C08C9A1158AEA6B5B04B5 /* ConstraintView.swift in Sources */, + F675FAE700CEDACDC117FD78CBC91B9E /* ConstraintView+Extensions.swift in Sources */, + 8EC243629BE685783F8B3E64FA924738 /* ConstraintViewDSL.swift in Sources */, + DD4857F182195748AB22953A3AD5CFBC /* Debugging.swift in Sources */, + 6B22BC159183EB1F45E0EA101C69982A /* LayoutConstraint.swift in Sources */, + 52C2803D19934E29EC31F21B0808F3BC /* LayoutConstraintItem.swift in Sources */, + 3139FB597E4CA2C87278EAB2944CFD31 /* SnapKit-dummy.m in Sources */, + 2E477BA16E25771C05B852318212C523 /* Typealiases.swift in Sources */, + F045CE2C2618CE50C24CD7337B7C69A3 /* UILayoutSupport+Extensions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1F5CFCB69780B9B91F58925C75C272EB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2EF070BD723DEA0B5E5041B729127675 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A25F0EE0E239F179E9D15607175DD63 /* Archive.swift in Sources */, - 202E7C69357BE581D13B25A696C16209 /* Archive+BackingConfiguration.swift in Sources */, - C27B98C72CD3AA827D7CBC3A9E0A3AEF /* Archive+Deprecated.swift in Sources */, - FBA3629CEC806A18708776D770036541 /* Archive+Helpers.swift in Sources */, - 07B6FA62334B326D5179B16E555A1163 /* Archive+MemoryFile.swift in Sources */, - 33346EAF6E558DAD2572AB45E4046AE0 /* Archive+Progress.swift in Sources */, - 1F3E265C62041BC60ED9107DB03798BC /* Archive+Reading.swift in Sources */, - A13631B78D3686CCBB05AFFA9A9BB1E4 /* Archive+ReadingDeprecated.swift in Sources */, - 5CCDB7E1619E66D77F3877C5875E25C7 /* Archive+Writing.swift in Sources */, - 7472100778E71912C37D22EBC4895FF3 /* Archive+WritingDeprecated.swift in Sources */, - E61908BD6CB88CC2A456AADBD820C9F0 /* Archive+ZIP64.swift in Sources */, - 2EA63DE8EF8EE4114C95521A1A8A0DFF /* Data+Compression.swift in Sources */, - 1C1666D7A5833BE0178BD004E8EF21C6 /* Data+CompressionDeprecated.swift in Sources */, - C4AEFF8185BBEBD05C3CB6EFA6E43AB9 /* Data+Serialization.swift in Sources */, - 25DEC09B82998CE7055BA7EB0E4D2F0F /* Date+ZIP.swift in Sources */, - 9BAD2444EA7739384CC2A7353A214B0D /* Entry.swift in Sources */, - BF5BC9DDDF08C70BBD4F9C31D2226D54 /* Entry+Serialization.swift in Sources */, - 2E1F852AC5FF95720D26E4D4650B6441 /* Entry+ZIP64.swift in Sources */, - 66166EB34D3554721D6FE8EB70D2E15B /* FileManager+ZIP.swift in Sources */, - 98A581201B38BE408DF45B4151784877 /* FileManager+ZIPDeprecated.swift in Sources */, - BC1548A44F95A81E27BDA91203A45145 /* URL+ZIP.swift in Sources */, - 5EA53D60B0C24989B91348B1350DC2D1 /* ZIPFoundation-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6A6488B3294C25F89F5C22825D2CFEBC /* Sources */ = { + 4BA48F20A933ADB499C30AFEF782AAF0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -2294,114 +2260,154 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 78A07A5515A0D9B8118427D112933DEE /* Sources */ = { + 8E8E3D911D9107530D85E2A57EA135DE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5F87019EF9B64242F8644A03D18A2B87 /* DTActivityTitleView.m in Sources */, - C1F30655811FDBB6920A8D300F06C1E5 /* DTAnimatedGIF.m in Sources */, - A38360C4EBCCE4450D52F7B9CE4F6D8D /* DTBase64Coding.m in Sources */, - CCCED38A43502AC6473C11606D64057D /* DTBlockFunctions.m in Sources */, - B49110DD052390A83B240527E04925C2 /* DTCoreGraphicsUtils.m in Sources */, - 7B6E5A0F2FC3FDB0CC0E70246D29C486 /* DTCustomColoredAccessory.m in Sources */, - F1DEB3C74B8755D6FEB5D0A98B1516DC /* DTExtendedFileAttributes.m in Sources */, - F41E072AEF83CD3DE72E7375FEBC91A1 /* DTFolderMonitor.m in Sources */, - 5091243AEA2930A8C64CEFA7311A40E1 /* DTFoundation-dummy.m in Sources */, - 852D45A539C10E1089633476FA1BF72F /* DTFoundationConstants.m in Sources */, - 43072D547164E92F733CF74B2B244DE8 /* DTHTMLParser.m in Sources */, - 0D2BE6D40EA436C99BC88C4AC84DDE71 /* DTLog.m in Sources */, - 6C73F94B5C73FBE0C06678707B5DC77F /* DTPieProgressIndicator.m in Sources */, - 712370237E48CF01BC1C6E7E764F4015 /* DTSmartPagingScrollView.m in Sources */, - 43D10312CDEFDAB42D20488E9522F1DA /* DTTiledLayerWithoutFade.m in Sources */, - D2F269387653D0FA410A3555AB58DCE6 /* DTVersion.m in Sources */, - 72BA060C1C2B29E6F76C5923BC45DD3F /* NSArray+DTError.m in Sources */, - 2C2C452DC3EE68E1BFE8C8D72A3D2750 /* NSData+DTCrypto.m in Sources */, - ED6C2ECBB71A2E3E35FE6C3AF96EF5B7 /* NSDictionary+DTError.m in Sources */, - CC4CDD671505535301C6D768F83B4932 /* NSFileWrapper+DTCopying.m in Sources */, - 2C4B949CE9C8AFB2C207204995DEF3A7 /* NSMutableArray+DTMoving.m in Sources */, - 8CB79CDF6D245B7ECD4762E30F742545 /* NSString+DTFormatNumbers.m in Sources */, - 7FDAEFDFE0E3207DFD5A7B41A5D6D6A6 /* NSString+DTPaths.m in Sources */, - 94B1E7C8F5A10584F39D7CAE59E49801 /* NSString+DTURLEncoding.m in Sources */, - F63D8AF90CA41EC0AD2B733300965F65 /* NSString+DTUtilities.m in Sources */, - 457C0034B28FBD2A77FF784E2C20576E /* NSURL+DTAppLinks.m in Sources */, - 807DCEB839DA036D9FCD04FB6AE9A7CC /* NSURL+DTComparing.m in Sources */, - 186520D7BA8216DB8A28FD45F7F75498 /* NSURL+DTUnshorten.m in Sources */, - 1573AF8F1FE294F259B6D172647DE0E4 /* UIApplication+DTNetworkActivity.m in Sources */, - 03D35920862F172B8E69BC901CD4FA44 /* UIImage+DTFoundation.m in Sources */, - 13EB572E58E7D92462C8BE1114375C43 /* UIScreen+DTFoundation.m in Sources */, - 03324B9DEBB7953076EDCD4091EE150E /* UIView+DTFoundation.m in Sources */, + 25E47E6CE8DF5BE732774ACEAE47BBF8 /* Archive.swift in Sources */, + 2A875BEC32568EFA0FE0F3E58F0AA37C /* Archive+BackingConfiguration.swift in Sources */, + DCD33DEBC59EAAB25D3B3F34EA206133 /* Archive+Deprecated.swift in Sources */, + 5E7FDA93607BDB800512A93BE294B12B /* Archive+Helpers.swift in Sources */, + 06675C3F0CB6A5662061DB48B55B7DF3 /* Archive+MemoryFile.swift in Sources */, + 2E8C5F61C3B6A6D116BE6612C62C7370 /* Archive+Progress.swift in Sources */, + 6268A3E8B23E586AE603A5F40F40F277 /* Archive+Reading.swift in Sources */, + 23EA3FF5A4302C09BE16C4F0EFEBF0D3 /* Archive+ReadingDeprecated.swift in Sources */, + 3257F2C96D06EA0B53E9CA9610A9137A /* Archive+Writing.swift in Sources */, + FE80BC2F78769407CABD426D8569A855 /* Archive+WritingDeprecated.swift in Sources */, + A0C9C636444B262AFF4C7AC91A9FF591 /* Archive+ZIP64.swift in Sources */, + 789D40DEE2CC4E0CBDFC873B9E30FE3F /* Data+Compression.swift in Sources */, + F0561A69C416F2368A40D6BAF663B2E1 /* Data+CompressionDeprecated.swift in Sources */, + 8444C850D0A40CD0A8F32EF44197A6FF /* Data+Serialization.swift in Sources */, + 72599431CE239793C684C877B4D23347 /* Date+ZIP.swift in Sources */, + 9959EBA37505B2AACF77057A32B8F7F0 /* Entry.swift in Sources */, + 3CF8124B3C1C0C80E1784E221E564CC9 /* Entry+Serialization.swift in Sources */, + B9F9B1F8E6FE6D22AAD7C2D9B8E660BB /* Entry+ZIP64.swift in Sources */, + 81086493EE5742CF823461235F60AFD2 /* FileManager+ZIP.swift in Sources */, + 018208E7B5B1C22398872119C18BD05B /* FileManager+ZIPDeprecated.swift in Sources */, + 03B6C4C7DA368F0B8C15FAFD93358E87 /* URL+ZIP.swift in Sources */, + 4EEA1AF224E7966AC2BD3AD70903681A /* ZIPFoundation-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9512CE04C3E1E9C6A95D3397945E0E44 /* Sources */ = { + ABB1B32F91B263FB2E62673C0B647044 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9A57BBF6B1A6FEC692F444E92C508997 /* RDEPUBAssetRepository.swift in Sources */, + D47B1A18F9830B10F0BE5D3E7B13C13D /* RDEPUBChapterData.swift in Sources */, + 9FC9FAE8041266F3F85ACD5B0E1E7B17 /* RDEPUBDTCoreTextRenderer.swift in Sources */, + DD55868C1A308AE1C5D56E5E3FA0AE44 /* RDEPUBFixedLayoutTemplate.swift in Sources */, + 9BB5822506549A94B4A5A0B5F40ADC9A /* RDEPUBJavaScriptBridge.swift in Sources */, + AC6220500850D0DB8142B44396FCA6BC /* RDEPUBModels.swift in Sources */, + 456926E08F81E14D4462225F8219D7B6 /* RDEPUBNavigatorLayoutContext.swift in Sources */, + E0021B223A2E2D11206F395CCFA31A02 /* RDEPUBNavigatorState.swift in Sources */, + 7A8961D4D3F7C2D7141C3AF9B2E60F0E /* RDEPUBPageInteractionController.swift in Sources */, + 1AD6564F00D7B59D818A6AF35FCFDB3C /* RDEPUBPageLayoutSnapshot.swift in Sources */, + 372E05B50EF2FD40BBF07BB08DA32E4A /* RDEPUBPaginator.swift in Sources */, + 317C3FF6D87E75F29CD74E44342734B3 /* RDEPUBParser.swift in Sources */, + BBE7C12DD486B57DBAA98F86AC80994A /* RDEPUBParser+Archive.swift in Sources */, + E5926D0035C1FE12AD81A4441276CB8C /* RDEPUBParser+Package.swift in Sources */, + 41C4267B8D6E2C867C47F26F46116693 /* RDEPUBParser+ReadingProfile.swift in Sources */, + F6511F62871012278880F32E36DC1B20 /* RDEPUBParser+Resources.swift in Sources */, + 69F197DAC284EBCD47A972FB1D112707 /* RDEPUBParser+TOC.swift in Sources */, + B05D1543F8BF9AC00B000026C03067B9 /* RDEPUBPreferences.swift in Sources */, + B0BDB773F63288118EB1DE8DB294E53C /* RDEPUBPublication.swift in Sources */, + 8093FDC6F3C2D5F6250492A548EA73A2 /* RDEPUBReaderBottomToolView.swift in Sources */, + 8AB361C3413C66575600A33ED1EC699C /* RDEPUBReaderChapterListController.swift in Sources */, + D68CDB4A9AFFBBDE8383EB3B4D27D7C2 /* RDEPUBReaderConfiguration.swift in Sources */, + 12840AD82C5E66B9DAABE907647D0961 /* RDEPUBReaderController.swift in Sources */, + 6439A2CC45B255D86F1BBF560BE64F7B /* RDEPUBReaderDelegate.swift in Sources */, + F9F8A1BE8710CBCA9E2DEA97D35B17C0 /* RDEPUBReaderHighlightsViewController.swift in Sources */, + A33EB2CB8F875B027925A5CC9EEF8117 /* RDEPUBReaderPersistence.swift in Sources */, + 8548C2C333CE758AF37B85D03AE4CFB7 /* RDEPUBReaderSettings.swift in Sources */, + 713D20A253E4AA77903E15DA2A9BA37F /* RDEPUBReaderSettingsViewController.swift in Sources */, + 2EABBFC2F99A82EDEE15171F3F02126A /* RDEPUBReaderTableOfContentsItem.swift in Sources */, + 78B7944A0F9E1A14F2787D72C0133A91 /* RDEPUBReaderTheme.swift in Sources */, + 7BBEA8E422292F56BFCE3A04391EBE01 /* RDEPUBReaderToolView.swift in Sources */, + FD0BD9D4FCDB12FAC03FC94901DB81B6 /* RDEPUBReaderTopToolView.swift in Sources */, + 42B5874545A810ADB3F168784542C3D4 /* RDEPUBReadingModels.swift in Sources */, + 3EB94B3FE3C93EF534899C25C60E25EB /* RDEPUBReadingSession.swift in Sources */, + 782BAE4F5C0FA3E6EB6EF30D83DB8653 /* RDEPUBRenderRequest.swift in Sources */, + AF2E9051FD1821C3DC9C3AFBE674E0CF /* RDEPUBResourceResolver.swift in Sources */, + 07512D0A383FA3C65725DB0BE97A97A6 /* RDEPUBResourceURLSchemeHandler.swift in Sources */, + 4D981359F53E36D187F92A2EC9F23BEE /* RDEPUBSearchEngine.swift in Sources */, + 8999804F6563D2105144FA9D821F3166 /* RDEPUBSearchModels.swift in Sources */, + A323CECAFCDE8E4009A1E598D839BBD1 /* RDEPUBSelectionOverlayView.swift in Sources */, + F27B7E0ECDB515E97953535C268DFC0E /* RDEPUBStyleSheetBuilder.swift in Sources */, + C0CDCF140488BC1D63E83DBA74D30C2C /* RDEPUBTextAnchor.swift in Sources */, + C78E9E8C277379E5FA7E49DD9C3A730B /* RDEPUBTextBookBuilder.swift in Sources */, + CAA01BF56A0A87A5C9260A864755863F /* RDEPUBTextBookCache.swift in Sources */, + D2FC00885DA4EA4587ABF3384C82062B /* RDEPUBTextContentView.swift in Sources */, + FCDDEA00D578F661AEFF4B75CFF80B60 /* RDEPUBTextIndexTable.swift in Sources */, + 0BFC402A79CB21B8CF1A99D7258961F7 /* RDEPUBTextLayouter.swift in Sources */, + 1509118FA9E9AD657EAC9BEE5C49BE6E /* RDEPUBTextLayoutFrame.swift in Sources */, + BA714218310D9BC815D508D7EBA90089 /* RDEPUBTextPaginationSupport.swift in Sources */, + D8435365E01789A7EACBA963C1C92C6D /* RDEPUBTextPerformanceSampler.swift in Sources */, + 4AEC4012771A907108FD2D0C2237BCBD /* RDEPUBTextPositionConverter.swift in Sources */, + 83D0422FB78BED08AE09435CCB354F4D /* RDEPUBTextRenderer.swift in Sources */, + 96C233ED331A3F6A71D589160B7668F3 /* RDEPUBTextRendererSupport.swift in Sources */, + D4EAEB6CFB1CB5C3B2456D475B2A460F /* RDEPUBTextSearchEngine.swift in Sources */, + 7CAA2C10A02EE7F4E6AF65DCB7F3772B /* RDEPUBWebContentView.swift in Sources */, + 3CDE626DA9038F9143A6004836F6284E /* RDEPUBWebDecorationOverlayView.swift in Sources */, + 7CCE1F11430F490242DCFFC47DD434A2 /* RDEPUBWebView.swift in Sources */, + 5271068D32AFE88CAC78B59ADED07EDB /* RDEPUBWebView+Configuration.swift in Sources */, + 7C899BA1C93C579E0071B1C4AFF75521 /* RDEPUBWebView+FixedLayout.swift in Sources */, + 32A7AD3C6E3D5990746B47165F582A1D /* RDEPUBWebView+JavaScriptBridge.swift in Sources */, + D8F2872A4205075B286FE7718FC696CE /* RDEPUBWebView+Reflowable.swift in Sources */, + A92FACEFAAAFBCEF79747B917B280B85 /* RDEPUBWebView+Search.swift in Sources */, + 6214D10FFC4107B61C0A7D2124BE832D /* RDEPUBWebViewDebug.swift in Sources */, + 6C6BA0FF3D91F5121393BBF59DA93352 /* RDPlainTextBookBuilder.swift in Sources */, + 1CAB795ED271F58E3A9321F3562CFFD0 /* RDReaderContentCell.swift in Sources */, + 14429631792B0E8330AB420662AFE7D6 /* RDReaderFlowLayout.swift in Sources */, + E0DA92D28A9D84B483111D6C0D35A118 /* RDReaderGestureController.swift in Sources */, + 31BE851901D14096E7AA66B5CDEE4D55 /* RDReaderPageChildViewController.swift in Sources */, + AC190D36F6593D186EF5CA6E01C3016D /* RDReaderView.swift in Sources */, + D275929B8625E9F1E4A8306279B8B916 /* RDReaderView-dummy.m in Sources */, + 45648E6F07341B6DC91D6E22FD4E253C /* RDURLReaderController.swift in Sources */, + D0DEF92032CC5203F7CA51CCE03979FD /* UIColor+RDEPUBHex.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BB4553EEA6A3EACB98062F0C554894CA /* Sources */ = { + AC980E6A0BED2BC61EBDA417E64924C2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4CA8DC97A929C818E3A2F3910087EF42 /* Constraint.swift in Sources */, - 8BE89C6E06DB76798A757F2F0CF95AA9 /* ConstraintAttributes.swift in Sources */, - BEA95EC6964968F6BF8F97E94B7E557C /* ConstraintConfig.swift in Sources */, - 2D7DB1A4CC032FD9E04052F34C519146 /* ConstraintConstantTarget.swift in Sources */, - 650C4E331160D891B5B2ACAB6CE9F557 /* ConstraintDescription.swift in Sources */, - 0EA168CF3EF3FCB8AC5BB8404F02167F /* ConstraintDirectionalInsets.swift in Sources */, - 1E553A18817913A102F1CC344D62F482 /* ConstraintDirectionalInsetTarget.swift in Sources */, - 55DD9BD86A13F34592D44EF4AE3D7B52 /* ConstraintDSL.swift in Sources */, - CEDB56407E114E2183F982942D98EE80 /* ConstraintInsets.swift in Sources */, - 4F72A091B13820692027231A4160F4C2 /* ConstraintInsetTarget.swift in Sources */, - B30DE6DB9957309D3931784688842305 /* ConstraintItem.swift in Sources */, - C61A176195700DBE89F52D928319C4CB /* ConstraintLayoutGuide.swift in Sources */, - B0FA52DE4CFAD71D0DEB6397C606BE5B /* ConstraintLayoutGuide+Extensions.swift in Sources */, - 5317C2808FB00E27D36A26E1C906470B /* ConstraintLayoutGuideDSL.swift in Sources */, - B682D806EE482878932EEA0F55456938 /* ConstraintLayoutSupport.swift in Sources */, - 86B08C25B03944090A4196B7EC75BD4D /* ConstraintLayoutSupportDSL.swift in Sources */, - 07E956FB24A5153D59F07A4A3966CCF4 /* ConstraintMaker.swift in Sources */, - 043840E0B152ECBD4C589446AA1870F9 /* ConstraintMakerEditable.swift in Sources */, - 16421662EE90ABA9A6EE98B2A0FE0210 /* ConstraintMakerExtendable.swift in Sources */, - A1DC5CA85CD9DCBCD24E2066426AE72A /* ConstraintMakerFinalizable.swift in Sources */, - BBDF9E3F2B2A1390FA7DB0CC57E775FE /* ConstraintMakerPrioritizable.swift in Sources */, - FBA09EE40DD15105176DD088697EBA72 /* ConstraintMakerRelatable.swift in Sources */, - 922286D89E1F6F86F3876FD0EFFE4002 /* ConstraintMakerRelatable+Extensions.swift in Sources */, - 17F1C63137132337E12752FDF7633A9A /* ConstraintMultiplierTarget.swift in Sources */, - DB1699CD46DB4D42E854405177569B84 /* ConstraintOffsetTarget.swift in Sources */, - D2D54E0E6F07EFBB725682A8D8A213C3 /* ConstraintPriority.swift in Sources */, - 5857BD9A2659F2F93F2F2314C68A05E9 /* ConstraintPriorityTarget.swift in Sources */, - FDF36E20A3B3BF130C9F20C6269900B5 /* ConstraintRelatableTarget.swift in Sources */, - 3C8CE770C755B822C569A4F9D302F342 /* ConstraintRelation.swift in Sources */, - 7CBCCA6CA9877B5B485B3321929131AD /* ConstraintView.swift in Sources */, - CBF07238641A620765EA20CD83EAAF39 /* ConstraintView+Extensions.swift in Sources */, - 59066938787B3F1835305B4B9C935216 /* ConstraintViewDSL.swift in Sources */, - 14FC98FD822FD9609F753AD2D8EAC873 /* Debugging.swift in Sources */, - DF51C9A2429A74A4DFB895937B7C0B85 /* LayoutConstraint.swift in Sources */, - 710A1F70CC5FDB1C54EACF92B4D990D9 /* LayoutConstraintItem.swift in Sources */, - 910E6231340C7EC7B59EEAE300B4C9DE /* SnapKit-dummy.m in Sources */, - B6B040EE86C6F779D5ED7097204F977C /* Typealiases.swift in Sources */, - 8A9FE5BF5D0F11AF4BB5FC428D3405FE /* UILayoutSupport+Extensions.swift in Sources */, + C7B4B692AC1E9B6F6A844F171DE1BEC4 /* DTActivityTitleView.m in Sources */, + 0622935FFD2ADD637FBDC5278F8D5E92 /* DTAnimatedGIF.m in Sources */, + 086B6FE0EFE46CBAA9CA4A74720B6C52 /* DTBase64Coding.m in Sources */, + 02BD5B00D86A7A544629B90103ACB148 /* DTBlockFunctions.m in Sources */, + B189C3640D0AACE5C0B2513E932166F6 /* DTCoreGraphicsUtils.m in Sources */, + 09F91906617C975ABCF9D9C11BDA8C4F /* DTCustomColoredAccessory.m in Sources */, + 2952D6997F5580919F4825DCAA1A4EFA /* DTExtendedFileAttributes.m in Sources */, + 8AD34CC035AC1D89AB68C1327FAE3C62 /* DTFolderMonitor.m in Sources */, + E3726D55A7B60C3DC86EC4D90370426A /* DTFoundation-dummy.m in Sources */, + E8AB2FEE8443436B10DC3BD74A8226FD /* DTFoundationConstants.m in Sources */, + 34BBABDE700AB81718A4752E7D1E0140 /* DTHTMLParser.m in Sources */, + A2F28D0E1EE3C7B2135DF059CC5B8FBA /* DTLog.m in Sources */, + 9144EF4B8243782D693D9C3F18E4D968 /* DTPieProgressIndicator.m in Sources */, + 5D58B68AE7FBF43CF6F7B5AD1285C803 /* DTSmartPagingScrollView.m in Sources */, + 6E90373CEFA7629B5FF48F610799E606 /* DTTiledLayerWithoutFade.m in Sources */, + 9752BDBC8B255FC16E8DC9E10F407147 /* DTVersion.m in Sources */, + 0A64A09E852BBF52677A7BC5CC7691C0 /* NSArray+DTError.m in Sources */, + 18E05C9D1D63A2AD105D6CC0E0C64C57 /* NSData+DTCrypto.m in Sources */, + 5486FFE1398EF5F6BBE4EE0871A21C39 /* NSDictionary+DTError.m in Sources */, + BA174999E3413F5A45786FF54383240D /* NSFileWrapper+DTCopying.m in Sources */, + D7972A2540E20B28E2C9D299AAE8AF46 /* NSMutableArray+DTMoving.m in Sources */, + 2F39C838FD072D7CA4D3978C874DCF86 /* NSString+DTFormatNumbers.m in Sources */, + 7A6320A72DFF2C533B1CA8A927A9D516 /* NSString+DTPaths.m in Sources */, + EABC41A8E3D4525FEEC80C2F6CF0C108 /* NSString+DTURLEncoding.m in Sources */, + F65F1F57FE114E39EDF8BD657EF8565B /* NSString+DTUtilities.m in Sources */, + 7B6DFB4412FF0ACDAD4320AA4EEA8E63 /* NSURL+DTAppLinks.m in Sources */, + FF6E330BB1C384D79EA36415F5415511 /* NSURL+DTComparing.m in Sources */, + D1792FAE89B67B4379A9B4157E22290F /* NSURL+DTUnshorten.m in Sources */, + 94FF947022AF6FE1F04D484EB69A2048 /* UIApplication+DTNetworkActivity.m in Sources */, + 18A69B8D310DB6279273A14E9DB1A1DF /* UIImage+DTFoundation.m in Sources */, + D47F4852A393C8731EA395FE7CB059F4 /* UIScreen+DTFoundation.m in Sources */, + 08E897E7340B3D5708F3520FE146F124 /* UIView+DTFoundation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - CAA75A1C6B0CE8C39109E2DC8439D628 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B711340B48B16DAAC3BF45DFBE54907 /* SSAlertAnimation.swift in Sources */, - F51883B7D8D4858816A049BE80A3082C /* SSAlertAnimationController.swift in Sources */, - 70842C59A29DA75B9D42AF0863043578 /* SSAlertCommonView.swift in Sources */, - C6A421CEC68B444EFC2E496473EDD93D /* SSAlertDefaultAnmation.swift in Sources */, - 3EC890B2CE7B2360729F4EBF3023B68D /* SSAlertPresentAnimation.swift in Sources */, - 90AC69AC4EBE7EE54AF3C57F6A9C1338 /* SSAlertSwift-dummy.m in Sources */, - AFF930A701A1822364C2C86FD8636D74 /* SSAlertView.swift in Sources */, - 5F7D5EB957828E8657530DBB033EB6EA /* SSAlertViewExtention.swift in Sources */, - 56FB160F2030BA8EA8409795DDF90428 /* UIViewFrameExtension.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA9382AFDD8D8CEB6687FE718577C981 /* Sources */ = { + BD23672C3C7E57623DDEEBBDF147F41C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -2477,139 +2483,149 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F8DC34B39FD5C083F90D263320E44F0E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 62AD6F599831925D68B03800823FFE73 /* SSAlertAnimation.swift in Sources */, + E2731FCFCF96868342E633F7962FD9F5 /* SSAlertAnimationController.swift in Sources */, + 213651A172BE115A3EB6597D4EF16EF9 /* SSAlertCommonView.swift in Sources */, + 95596341B01BC4C7E8E25D13DF885DE6 /* SSAlertDefaultAnmation.swift in Sources */, + 512C2FE338700D1FD6DFCFF2D1C96903 /* SSAlertPresentAnimation.swift in Sources */, + AF9AE1A497A51A6C99E09D260EE8939F /* SSAlertSwift-dummy.m in Sources */, + 3CFE245716B8EAC81022BB5543A419B4 /* SSAlertView.swift in Sources */, + 9A35B17A98BF4BA386549F582B9C8118 /* SSAlertViewExtention.swift in Sources */, + DF8D260A10033EBCFE8C5413EFF1535F /* UIViewFrameExtension.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F96FFD5113D092836D4AD41A4F201A88 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FC050EDAFDDEA3B65238F3C4C214D150 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 00ABC7E516DCCCD5F93019180D10975F /* PBXTargetDependency */ = { + 020F0A0B69436E99808F13904976F379 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = ZIPFoundation; - target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; - targetProxy = 3A88EB3BFD0B1573E2C1D4D635B1C0F4 /* PBXContainerItemProxy */; + name = DTCoreText; + target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; + targetProxy = 87730E6F16E8FFBF6898B9EBD0AD14C5 /* PBXContainerItemProxy */; }; - 0DBBB35856C6D1690FE07A57337CDCDF /* PBXTargetDependency */ = { + 0FD34BEAFBBC108E029BD172F1A001AC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SSAlertSwift; + target = 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */; + targetProxy = 57FCFD9D0AF20D20A8404315B4634FEB /* PBXContainerItemProxy */; + }; + 1C87262B71402CF8076F136C711B3B87 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SnapKit; + target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; + targetProxy = B1F14D48BA2B3361AB7CF6CFB4248E92 /* PBXContainerItemProxy */; + }; + 2116DF18700ED27036D60C0892EDD986 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "ZIPFoundation-ZIPFoundation_Privacy"; target = C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */; - targetProxy = 3B5D920B697B5CC498D21895C14A2822 /* PBXContainerItemProxy */; + targetProxy = 54FE0EFC4BD35EB51504F9D17F65C630 /* PBXContainerItemProxy */; }; - 1383EEFEE990132E5DC3E6752707B3A0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ZIPFoundation; - target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; - targetProxy = F23CFA277994E35BABC3ADBD5AF87BC8 /* PBXContainerItemProxy */; - }; - 1C2E282B93D9AF8F3BA02A0882B283DB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SSAlertSwift; - target = 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */; - targetProxy = 95F7ED85ACE5FB85F86AE0577F0DAA2A /* PBXContainerItemProxy */; - }; - 1DE36CCA8EDA5E355423FD755697B40D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "DTCoreText-Resources"; - target = 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */; - targetProxy = E715D8F65E7D7E80C6F0C07416FCE5F1 /* PBXContainerItemProxy */; - }; - 425221FB78517B513A8DA086E9F4EBA9 /* PBXTargetDependency */ = { + 2771AC7F4AA9CF4C86A3D614D77F33CD /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SnapKit; target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = 2C341FDE4508BEEBB3BC7DF6B51D37E3 /* PBXContainerItemProxy */; + targetProxy = F1618E89E8894E616222D6212EEB9BE2 /* PBXContainerItemProxy */; }; - 4331C47887871F4A75A8D2C450D2F02E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SnapKit; - target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = 68CF89A2645BAD91F4A2A60A2B03BC9C /* PBXContainerItemProxy */; - }; - 65B8919CE6A759D6293DEB6F9CF41247 /* PBXTargetDependency */ = { + 2AC1DEEE4B5E32E1FA841E25B3D2FDD4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = RDReaderView; target = AA2E57587AA8EECA63C4BE08EA3CB6D2 /* RDReaderView */; - targetProxy = 21F9491451FF3DCCE2F7ABE74FA1BF71 /* PBXContainerItemProxy */; + targetProxy = 37F6C824B43C269AA070A9970F478E23 /* PBXContainerItemProxy */; }; - 6851A166D92E8FE23B3DD15126C207E7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTCoreText; - target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; - targetProxy = CF573978303F543D918F1C88627EF0FD /* PBXContainerItemProxy */; - }; - 85B6CD064D8FD6BBD877D6E19EB6F8F7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTFoundation; - target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; - targetProxy = 769E3922D6EF90FC105378371AD83AE0 /* PBXContainerItemProxy */; - }; - ABE2047F82C60D4CF6F168BF11D6D45A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SSAlertSwift; - target = 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */; - targetProxy = C4FE1D60CA9E1F9C78E4DE7CCF714CA7 /* PBXContainerItemProxy */; - }; - AD7C7A49E57F6923698611B511B2B28F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTFoundation; - target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; - targetProxy = 4B12DDA215649FC0BD01FDED78F56A1D /* PBXContainerItemProxy */; - }; - D0CEDCF680E61097CCDE7BA3F3A2FFE6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTCoreText; - target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; - targetProxy = 6BE1421CDA00F2733A05769CE52ACDB0 /* PBXContainerItemProxy */; - }; - E2C4FFF39012D9E3D504FB9F916D8FA0 /* PBXTargetDependency */ = { + 3C71D3E681036CA8EEF99BD3B1B33169 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "RDReaderView-RDReaderViewAssets"; target = AE7F393FB7805DE2664AB4111873F907 /* RDReaderView-RDReaderViewAssets */; - targetProxy = 923111445E67BE92A223CBD0DE4D82E7 /* PBXContainerItemProxy */; + targetProxy = E02332EF5B2CCE697593D8FC99DCEBB2 /* PBXContainerItemProxy */; }; - E40E639D5188E207B340EA9ED760ACED /* PBXTargetDependency */ = { + 43C7FA9296E0A69B39E9CEDD513DB5E3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "DTCoreText-Resources"; + target = 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */; + targetProxy = BDB86097405AC17908E1D824C764DF29 /* PBXContainerItemProxy */; + }; + 48FD93EF0BB78DB9428C4189B580A86D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ZIPFoundation; + target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; + targetProxy = AD170DC0B755D9C13E44D4703F93ECAC /* PBXContainerItemProxy */; + }; + 4F9D9C658D922102865227C060F26475 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SSAlertSwift; + target = 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */; + targetProxy = 6FEB3EC13F3780DE28D9E3A7027F5EF4 /* PBXContainerItemProxy */; + }; + 5E87F0E1B9AF330712D0384388AFA603 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTCoreText; + target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; + targetProxy = 5A688446F3834F916B644BF13086903B /* PBXContainerItemProxy */; + }; + 715597FB3F1E0E95F8A3F4B3271288A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTFoundation; + target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; + targetProxy = 2DEC0E6E6DD76FFDDCA8167EC51975D3 /* PBXContainerItemProxy */; + }; + 95AAA3C6A552559016545CAD5B50333C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ZIPFoundation; + target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; + targetProxy = B27CFAAF383D62C8A184778C6B4667E7 /* PBXContainerItemProxy */; + }; + BAEA1865D980379B2B1067919B5DC4F9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTFoundation; + target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; + targetProxy = CAB04B4C082D733C23D698A32EF0BD3C /* PBXContainerItemProxy */; + }; + F2B0F6EE052F080271AEAFFE90B26584 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "SnapKit-SnapKit_Privacy"; target = 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */; - targetProxy = 8495735DE53D4168DC26101C6D19DD8D /* PBXContainerItemProxy */; + targetProxy = 5C2DF152EE7F8EAB792D96A02ED313A6 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 00BBE9F334DD6E2CF39B1BCF305FA780 /* Debug */ = { + 04DEDD89C96E9D39D24C0E818528ACCA /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 18387159515E0523AFB4204B1AF940ED /* SSAlertSwift.debug.xcconfig */; + baseConfigurationReference = F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IBSC_MODULE = ZIPFoundation; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift.modulemap"; - PRODUCT_MODULE_NAME = SSAlertSwift; - PRODUCT_NAME = SSAlertSwift; + PRODUCT_NAME = ZIPFoundation_Privacy; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + WRAPPER_EXTENSION = bundle; }; - name = Debug; + name = Release; }; 0FAC9B086846BEC73DD79CD3B21F22ED /* Release */ = { isa = XCBuildConfiguration; @@ -2651,27 +2667,9 @@ }; name = Release; }; - 19DEC1081411E882012E53266DE19419 /* Release */ = { + 199ABCEB03829A86D129CB2B64059604 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = SnapKit; - INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = SnapKit_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 27A6482E4E33AEFD806FCD8EB3B00267 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */; + baseConfigurationReference = B8FAF5A1A2890703F132819BD138C1A9 /* RDReaderView.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2684,9 +2682,9 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/RDReaderView/RDReaderView-prefix.pch"; GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; + INFOPLIST_FILE = "Target Support Files/RDReaderView/RDReaderView-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -2694,31 +2692,31 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; - PRODUCT_MODULE_NAME = ZIPFoundation; - PRODUCT_NAME = ZIPFoundation; + MODULEMAP_FILE = "Target Support Files/RDReaderView/RDReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDReaderView; + PRODUCT_NAME = RDReaderView; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 5.10; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 374DFEFAFDD444AE16E699655CB41E87 /* Debug */ = { + 3DF0A71B4EF8D878F0159B87589F7B3A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */; + baseConfigurationReference = B8FAF5A1A2890703F132819BD138C1A9 /* RDReaderView.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDReaderView"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = ZIPFoundation; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; + IBSC_MODULE = RDReaderView; + INFOPLIST_FILE = "Target Support Files/RDReaderView/ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = ZIPFoundation_Privacy; + PRODUCT_NAME = RDReaderViewAssets; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2789,27 +2787,49 @@ }; name = Release; }; - 470B3560602421E1DD69EA1E4D9AF19B /* Release */ = { + 53A2283E0892EB077409247A1CCA0CF0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C2840BE6D91479CCBC2E908FBD9DA183 /* DTCoreText.release.xcconfig */; + baseConfigurationReference = F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */; buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = DTCoreText; - INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = Resources; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; + PRODUCT_MODULE_NAME = ZIPFoundation; + PRODUCT_NAME = ZIPFoundation; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; - 552BEC477607B42F87ECF4851B27970F /* Release */ = { + 63E9CCD27034A1EBCB978ECA99F55EB8 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */; + baseConfigurationReference = C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2841,90 +2861,28 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 6146737EC13EB59A94631D69D6BA370F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = BEBB599A31B8BC71D00B843E8EB0971F /* RDReaderView.debug.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/RDReaderView/RDReaderView-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/RDReaderView/RDReaderView-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/RDReaderView/RDReaderView.modulemap"; - PRODUCT_MODULE_NAME = RDReaderView; - PRODUCT_NAME = RDReaderView; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.10; - TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 6CBE5E4DDAC9330128A5498DDD8413D8 /* Release */ = { + 6D650492638AE82D03F063433932545C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DF670EC438F05ACC1F1C7B725DBDAA18 /* DTFoundation.release.xcconfig */; + baseConfigurationReference = 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */; buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IBSC_MODULE = DTCoreText; + INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; - PRODUCT_MODULE_NAME = DTFoundation; - PRODUCT_NAME = DTFoundation; + PRODUCT_NAME = Resources; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + WRAPPER_EXTENSION = bundle; }; - name = Release; + name = Debug; }; 73BBB08AD96AC1A6A095E15ADC5FCEE1 /* Debug */ = { isa = XCBuildConfiguration; @@ -2965,27 +2923,27 @@ }; name = Debug; }; - 7D7A491D22450377454F79AF38F37E48 /* Debug */ = { + 84907734FE753401B60117961CB771E4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */; + baseConfigurationReference = 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = DTCoreText; - INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; + IBSC_MODULE = SnapKit; + INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = Resources; + PRODUCT_NAME = SnapKit_Privacy; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Debug; + name = Release; }; - 84202CFD23DD601FC7576FC764DDFA0D /* Release */ = { + 8F6E6E8D8D3FE8229120F940ACC10E69 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FE2991699D0391172DEADF2F4613E320 /* SSAlertSwift.release.xcconfig */; + baseConfigurationReference = 18387159515E0523AFB4204B1AF940ED /* SSAlertSwift.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -3016,107 +2974,9 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - 92473191D454FAA879C071395CE486B3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6014DA7213E4687224F2BF921E30002C /* DTFoundation.debug.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; - PRODUCT_MODULE_NAME = DTFoundation; - PRODUCT_NAME = DTFoundation; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 97BD02361EB65749FA19884A8A8D7937 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D0AA4E895BB85E9FC893F2FEE774981F /* RDReaderView.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/RDReaderView/RDReaderView-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/RDReaderView/RDReaderView-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/RDReaderView/RDReaderView.modulemap"; - PRODUCT_MODULE_NAME = RDReaderView; - PRODUCT_NAME = RDReaderView; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.10; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 9EE1D8E79EC1A35C141177A1BFAA69F3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = SnapKit; - INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = SnapKit_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; name = Debug; }; A0DC1C2C814704734F83EAB35BB20B21 /* Debug */ = { @@ -3226,6 +3086,46 @@ }; name = Release; }; + A3ADDFBF740E9EF025733DF5A86606A9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DF670EC438F05ACC1F1C7B725DBDAA18 /* DTFoundation.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; + PRODUCT_MODULE_NAME = DTFoundation; + PRODUCT_NAME = DTFoundation; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; A843E21C1B95C92BE904EB3F8115DD30 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */; @@ -3265,9 +3165,9 @@ }; name = Debug; }; - BCCB0643A85B64325B0404A1FEE4A49D /* Release */ = { + ABCA9F44E70D3EE1081789983480BA88 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D0AA4E895BB85E9FC893F2FEE774981F /* RDReaderView.release.xcconfig */; + baseConfigurationReference = C73611E91719890E1DD889DEBBA1DDF2 /* RDReaderView.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDReaderView"; @@ -3283,17 +3183,57 @@ }; name = Release; }; - E352847F1E2DD6BB84C566EBD9A180F7 /* Debug */ = { + AFD738A5A56DD586CDE6EED5E9D055DD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BEBB599A31B8BC71D00B843E8EB0971F /* RDReaderView.debug.xcconfig */; + baseConfigurationReference = C73611E91719890E1DD889DEBBA1DDF2 /* RDReaderView.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/RDReaderView/RDReaderView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/RDReaderView/RDReaderView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/RDReaderView/RDReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDReaderView; + PRODUCT_NAME = RDReaderView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.10; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B30EB3155DF64947C68870EA04BB6BC3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDReaderView"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = RDReaderView; - INFOPLIST_FILE = "Target Support Files/RDReaderView/ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; + IBSC_MODULE = SnapKit; + INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = RDReaderViewAssets; + PRODUCT_NAME = SnapKit_Privacy; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3301,9 +3241,27 @@ }; name = Debug; }; - E9712DE9F1C3720961326B5B32217C15 /* Debug */ = { + CB5CC2DCDF7737CE4E8DB57DE721E159 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */; + baseConfigurationReference = 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IBSC_MODULE = ZIPFoundation; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + PRODUCT_NAME = ZIPFoundation_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + DB6496470B753FBB57ED2D213D8C5E8E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3335,22 +3293,23 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - F565CC9E3570B2986D96AD21E99CDE47 /* Release */ = { + E7EB20FBCA7F7CF4F3AB0D6B4D088BBC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */; + baseConfigurationReference = C2840BE6D91479CCBC2E908FBD9DA183 /* DTCoreText.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = ZIPFoundation; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; + IBSC_MODULE = DTCoreText; + INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = ZIPFoundation_Privacy; + PRODUCT_NAME = Resources; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3358,9 +3317,9 @@ }; name = Release; }; - F5808AEC9721FCD87C6C34E78FE420C8 /* Release */ = { + F1B7FFA17A844069CBE9D0CC155A0DF8 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */; + baseConfigurationReference = 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3392,6 +3351,83 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FA83B89AEE2BB71FF01D300E5297250A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6014DA7213E4687224F2BF921E30002C /* DTFoundation.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; + PRODUCT_MODULE_NAME = DTFoundation; + PRODUCT_NAME = DTFoundation; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FAFF47CBF775C9FB76C9E18B0DC93D60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FE2991699D0391172DEADF2F4613E320 /* SSAlertSwift.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift.modulemap"; + PRODUCT_MODULE_NAME = SSAlertSwift; + PRODUCT_NAME = SSAlertSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -3410,6 +3446,42 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 1CA7C9D5DFD7044C7A36338BE2AC73C5 /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3DF0A71B4EF8D878F0159B87589F7B3A /* Debug */, + ABCA9F44E70D3EE1081789983480BA88 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DE4C138F942A2A0F6A14D11F475D90E /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D650492638AE82D03F063433932545C /* Debug */, + E7EB20FBCA7F7CF4F3AB0D6B4D088BBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 30520D73A57B5DC231BF4D593A3E1FC0 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F1B7FFA17A844069CBE9D0CC155A0DF8 /* Debug */, + 53A2283E0892EB077409247A1CCA0CF0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 470D80E3313FE7E739AE9D34641F2DB4 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB5CC2DCDF7737CE4E8DB57DE721E159 /* Debug */, + 04DEDD89C96E9D39D24C0E818528ACCA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3419,65 +3491,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4FCF0AB7FD0EE29DDF61FB0406216C6A /* Build configuration list for PBXNativeTarget "ZIPFoundation" */ = { + 4FF3470542147C289B711C20EF27792C /* Build configuration list for PBXNativeTarget "SSAlertSwift" */ = { isa = XCConfigurationList; buildConfigurations = ( - 27A6482E4E33AEFD806FCD8EB3B00267 /* Debug */, - F5808AEC9721FCD87C6C34E78FE420C8 /* Release */, + 8F6E6E8D8D3FE8229120F940ACC10E69 /* Debug */, + FAFF47CBF775C9FB76C9E18B0DC93D60 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 85398FFFE9D1D55653F32CBCF3C6D9EA /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */ = { + 5BD9E11EEAC07E694B8A86BF10ECDE00 /* Build configuration list for PBXNativeTarget "DTFoundation" */ = { isa = XCConfigurationList; buildConfigurations = ( - E352847F1E2DD6BB84C566EBD9A180F7 /* Debug */, - BCCB0643A85B64325B0404A1FEE4A49D /* Release */, + FA83B89AEE2BB71FF01D300E5297250A /* Debug */, + A3ADDFBF740E9EF025733DF5A86606A9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B753DAE9D62F1C3970033983902D5DA9 /* Build configuration list for PBXNativeTarget "SnapKit" */ = { + 71C725761AC2E4DC24695B87CC437F3F /* Build configuration list for PBXNativeTarget "SnapKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - E9712DE9F1C3720961326B5B32217C15 /* Debug */, - 552BEC477607B42F87ECF4851B27970F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B854881981700E80EC9A3C5D38C9C2B2 /* Build configuration list for PBXNativeTarget "SSAlertSwift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00BBE9F334DD6E2CF39B1BCF305FA780 /* Debug */, - 84202CFD23DD601FC7576FC764DDFA0D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BE593AFEA35446DBF1FCE7A2B316369D /* Build configuration list for PBXNativeTarget "RDReaderView" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6146737EC13EB59A94631D69D6BA370F /* Debug */, - 97BD02361EB65749FA19884A8A8D7937 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C0CF038C60823EB4C6318C9BCA487473 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7D7A491D22450377454F79AF38F37E48 /* Debug */, - 470B3560602421E1DD69EA1E4D9AF19B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C5194BAF57874F6FA713A09DD4FEDA8F /* Build configuration list for PBXNativeTarget "DTFoundation" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 92473191D454FAA879C071395CE486B3 /* Debug */, - 6CBE5E4DDAC9330128A5498DDD8413D8 /* Release */, + 63E9CCD27034A1EBCB978ECA99F55EB8 /* Debug */, + DB6496470B753FBB57ED2D213D8C5E8E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -3491,20 +3527,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E3DCB66E157E16D180F49EF0D7945A6B /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = { + DC8655349C54538232C4CB81B137860C /* Build configuration list for PBXNativeTarget "RDReaderView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9EE1D8E79EC1A35C141177A1BFAA69F3 /* Debug */, - 19DEC1081411E882012E53266DE19419 /* Release */, + 199ABCEB03829A86D129CB2B64059604 /* Debug */, + AFD738A5A56DD586CDE6EED5E9D055DD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - EB464E7C400BBAF32186D983363BE1DB /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */ = { + F05CB5E657DCFC1458E4475B7909467D /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = { isa = XCConfigurationList; buildConfigurations = ( - 374DFEFAFDD444AE16E699655CB41E87 /* Debug */, - F565CC9E3570B2986D96AD21E99CDE47 /* Release */, + B30EB3155DF64947C68870EA04BB6BC3 /* Debug */, + 84907734FE753401B60117961CB771E4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ReadViewDemo/Pods/Pods.xcodeproj/xcuserdata/shen.xcuserdatad/xcschemes/xcschememanagement.plist b/ReadViewDemo/Pods/Pods.xcodeproj/xcuserdata/shen.xcuserdatad/xcschemes/xcschememanagement.plist index 31f7503..4e445b7 100644 --- a/ReadViewDemo/Pods/Pods.xcodeproj/xcuserdata/shen.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ReadViewDemo/Pods/Pods.xcodeproj/xcuserdata/shen.xcuserdatad/xcschemes/xcschememanagement.plist @@ -8,56 +8,78 @@ isShown + orderHint + 1 DTCoreText.xcscheme isShown + orderHint + 0 DTFoundation.xcscheme isShown + orderHint + 2 Pods-ReadViewDemo.xcscheme isShown + orderHint + 3 RDReaderView-RDReaderViewAssets.xcscheme isShown + orderHint + 5 RDReaderView.xcscheme isShown + orderHint + 4 SSAlertSwift.xcscheme isShown + orderHint + 8 SnapKit-SnapKit_Privacy.xcscheme isShown + orderHint + 7 SnapKit.xcscheme isShown + orderHint + 6 ZIPFoundation-ZIPFoundation_Privacy.xcscheme isShown + orderHint + 10 ZIPFoundation.xcscheme isShown + orderHint + 9 SuppressBuildableAutocreation diff --git a/ReadViewDemo/ReadViewDemo.xcworkspace/xcuserdata/shen.xcuserdatad/UserInterfaceState.xcuserstate b/ReadViewDemo/ReadViewDemo.xcworkspace/xcuserdata/shen.xcuserdatad/UserInterfaceState.xcuserstate index 017734e8718f552dc1ce048f0515b9e1e24223a0..447cab9d023acaf462ba5f2b92fd512248908147 100644 GIT binary patch literal 73809 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 t$8Pp(RowG>m-k1^@#9AiMwo diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBAssetRepository.swift b/Sources/RDReaderView/EPUBCore/RDEPUBAssetRepository.swift index 848c02b..812e75d 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBAssetRepository.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBAssetRepository.swift @@ -7,6 +7,14 @@ import Foundation /// EPUB 内置资源枚举,定义桥接脚本和固定版式模板的文件名及扩展名 enum RDEPUBAsset: String { + /// Rangy core 等价桥接脚本,负责提供 Web range/selection 基础能力 + case rangyCoreScript = "rangy-core" + /// Rangy serializer 等价桥接脚本,负责 DOM range 序列化/反序列化 + case rangySerializerScript = "rangy-serializer" + /// WXRead 对齐的动态 CSS 注入脚本 + case cssInjectorScript = "cssInjector" + /// WXRead 对齐的 WeReadApi JS-Native 桥接脚本 + case weReadAPIScript = "WeReadApi" /// JS 桥接脚本(epub-bridge.js),注入到 WebView 中实现原生-JS 通信 case bridgeScript = "epub-bridge" /// 固定版式 HTML 模板(epub-fixed-layout.html),用于渲染 pre-paginated 类型的 EPUB @@ -23,7 +31,7 @@ enum RDEPUBAsset: String { /// 对应的文件扩展名 var fileExtension: String { switch self { - case .bridgeScript: + case .rangyCoreScript, .rangySerializerScript, .cssInjectorScript, .weReadAPIScript, .bridgeScript: return "js" case .fixedLayoutTemplate: return "html" diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift b/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift index 27f71c2..09b4a20 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift @@ -31,17 +31,23 @@ enum RDEPUBJavaScriptBridge { /// 获取注入到 WebView 的桥接用户脚本(在 document end 注入) /// 将消息类型占位符替换为实际值,使 JS 端能通过 window.webkit.messageHandlers 发送消息 static var userScript: String { - RDEPUBAssetRepository.string( - for: .bridgeScript, - replacements: [ - "PROGRESSION_CHANGED_MESSAGE": RDEPUBJavaScriptBridgeMessage.progressionChanged.rawValue, - "SELECTION_CHANGED_MESSAGE": RDEPUBJavaScriptBridgeMessage.selectionChanged.rawValue, - "INTERNAL_LINK_MESSAGE": RDEPUBJavaScriptBridgeMessage.internalLink.rawValue, - "EXTERNAL_LINK_MESSAGE": RDEPUBJavaScriptBridgeMessage.externalLink.rawValue, - "JAVASCRIPT_ERROR_MESSAGE": RDEPUBJavaScriptBridgeMessage.javaScriptError.rawValue, - "FIXED_LAYOUT_READY_MESSAGE": RDEPUBJavaScriptBridgeMessage.fixedLayoutReady.rawValue - ] - ) + [ + RDEPUBAssetRepository.string(for: .rangyCoreScript), + RDEPUBAssetRepository.string(for: .rangySerializerScript), + RDEPUBAssetRepository.string(for: .cssInjectorScript), + RDEPUBAssetRepository.string(for: .weReadAPIScript), + RDEPUBAssetRepository.string( + for: .bridgeScript, + replacements: [ + "PROGRESSION_CHANGED_MESSAGE": RDEPUBJavaScriptBridgeMessage.progressionChanged.rawValue, + "SELECTION_CHANGED_MESSAGE": RDEPUBJavaScriptBridgeMessage.selectionChanged.rawValue, + "INTERNAL_LINK_MESSAGE": RDEPUBJavaScriptBridgeMessage.internalLink.rawValue, + "EXTERNAL_LINK_MESSAGE": RDEPUBJavaScriptBridgeMessage.externalLink.rawValue, + "JAVASCRIPT_ERROR_MESSAGE": RDEPUBJavaScriptBridgeMessage.javaScriptError.rawValue, + "FIXED_LAYOUT_READY_MESSAGE": RDEPUBJavaScriptBridgeMessage.fixedLayoutReady.rawValue + ] + ) + ].joined(separator: "\n\n") } /// 生成重排模式下的分页渲染脚本 @@ -55,23 +61,42 @@ enum RDEPUBJavaScriptBridge { return """ (function() { - if (!window.RDReaderBridge) { return false; } - window.RDReaderBridge.applyPagination(`\(style)`); - window.RDReaderBridge.setPageMetrics(\(request.totalPagesInChapter), \(pageStride)); - window.RDReaderBridge.clearHighlights(); - window.RDReaderBridge.setHighlights(\(jsonString(from: highlightsPayload(request.highlights), fallback: "[]"))); + if (!window.WeReadApi) { return false; } + window.WeReadApi.applySharedTheme({ + backgroundColor: \(javaScriptStringLiteral(request.presentation.themeBackgroundColor)), + textColor: \(javaScriptStringLiteral(request.presentation.themeTextColor)), + includeFrames: false + }); + window.WeReadApi.applyPagination(`\(style)`); + window.WeReadApi.setPageMetrics(\(request.totalPagesInChapter), \(pageStride)); + window.WeReadApi.clearHighlights(); + window.WeReadApi.setHighlights(\(jsonString(from: highlightsPayload(request.highlights), fallback: "[]"))); if (\(jsonString(from: targetLocationPayload(request.targetLocation), fallback: "null")) !== null) { - window.RDReaderBridge.scrollToLocation(\(jsonString(from: targetLocationPayload(request.targetLocation), fallback: "null")), \(request.pageIndex)); + window.WeReadApi.scrollToLocation(\(jsonString(from: targetLocationPayload(request.targetLocation), fallback: "null")), \(request.pageIndex)); } else { - window.RDReaderBridge.scrollToPage(\(request.pageIndex)); + window.WeReadApi.scrollToPage(\(request.pageIndex)); } - window.RDReaderBridge.reportProgression(); + window.WeReadApi.reportProgression(); return true; })(); \(searchScript) """ } + static func applyFixedPresentationScript(for request: RDEPUBFixedRenderRequest) -> String { + """ + (function() { + if (!window.WeReadApi) { return false; } + window.WeReadApi.applySharedTheme({ + backgroundColor: \(javaScriptStringLiteral(request.backgroundColorCSS)), + textColor: null, + includeFrames: true + }); + return true; + })(); + """ + } + /// 生成搜索高亮脚本 /// 在当前文档和所有 iframe 中查找关键词并用 span 标记高亮, /// 活跃匹配项使用特殊样式并自动滚动到视图中央 @@ -81,8 +106,8 @@ enum RDEPUBJavaScriptBridge { let payload = jsonString(from: searchPayload(presentation), fallback: "null") return """ (function() { - if (!window.RDReaderBridge) { return false; } - window.RDReaderBridge.setSearchPresentation(\(payload)); + if (!window.WeReadApi) { return false; } + window.WeReadApi.setSearchPresentation(\(payload)); return true; })(); """ @@ -91,8 +116,8 @@ enum RDEPUBJavaScriptBridge { static func resolveDecorationsScript() -> String { """ (function() { - if (!window.RDReaderBridge) { return { highlights: [], search: [] }; } - return window.RDReaderBridge.resolveDecorations(); + if (!window.WeReadApi) { return { highlights: [], search: [] }; } + return window.WeReadApi.resolveDecorations(); })(); """ } @@ -152,4 +177,11 @@ enum RDEPUBJavaScriptBridge { } return string } + + private static func javaScriptStringLiteral(_ value: String?) -> String { + guard let value else { return "null" } + return jsonString(from: [value], fallback: "[null]") + .replacingOccurrences(of: "[", with: "") + .replacingOccurrences(of: "]", with: "") + } } diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBPreferences.swift b/Sources/RDReaderView/EPUBCore/RDEPUBPreferences.swift index aee5d7b..b9b5b72 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBPreferences.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBPreferences.swift @@ -25,12 +25,18 @@ public struct RDEPUBPreferences: Equatable { public var fixedLayoutFit: RDEPUBFixedLayoutFit /// 固定版式双页展开模式(never/always/automatic) public var fixedLayoutSpreadMode: RDEPUBFixedLayoutSpreadMode + /// 多栏排版栏数 + public var numberOfColumns: Int + /// 多栏排版栏间距 + public var columnGap: CGFloat public init( fontSize: CGFloat, lineHeightMultiple: CGFloat, reflowableContentInsets: UIEdgeInsets, fixedContentInset: UIEdgeInsets, + numberOfColumns: Int = 1, + columnGap: CGFloat = 20, themeBackgroundColor: String? = nil, themeTextColor: String? = nil, fixedBackgroundColor: String? = nil, @@ -41,6 +47,8 @@ public struct RDEPUBPreferences: Equatable { self.lineHeightMultiple = lineHeightMultiple self.reflowableContentInsets = reflowableContentInsets self.fixedContentInset = fixedContentInset + self.numberOfColumns = max(1, numberOfColumns) + self.columnGap = max(0, columnGap) self.themeBackgroundColor = themeBackgroundColor self.themeTextColor = themeTextColor self.fixedBackgroundColor = fixedBackgroundColor @@ -55,6 +63,8 @@ public struct RDEPUBPreferences: Equatable { contentInsets: reflowableContentInsets, fontSize: fontSize, lineHeightMultiple: lineHeightMultiple, + numberOfColumns: numberOfColumns, + columnGap: columnGap, themeBackgroundColor: themeBackgroundColor, themeTextColor: themeTextColor ) @@ -99,4 +109,4 @@ public struct RDEPUBPreferences: Equatable { ) ) } -} \ No newline at end of file +} diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift b/Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift index 96acf86..fa6a943 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBReadingModels.swift @@ -179,6 +179,13 @@ public enum RDEPUBHighlightStyle: String, Codable { case underline } +/// 统一标注类型,对标 WXRead 的 WRBookmark 语义分层。 +public enum RDEPUBAnnotationKind: String, Codable, Equatable { + case bookmark + case highlight + case underline +} + /// 标注菜单操作类型,用于用户长按选中文本后的操作选项 public enum RDEPUBAnnotationMenuAction: Equatable { case copy @@ -396,6 +403,10 @@ public struct RDEPUBHighlight: Codable, Equatable { try container.encodeIfPresent(note, forKey: .note) try container.encode(createdAt, forKey: .createdAt) } + + public var annotation: RDEPUBAnnotation { + RDEPUBAnnotation(highlight: self) + } } /// 书签模型,记录用户标记的阅读位置 @@ -433,6 +444,108 @@ public struct RDEPUBBookmark: Codable, Equatable { public var hasNote: Bool { note?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false } + + public var annotation: RDEPUBAnnotation { + RDEPUBAnnotation(bookmark: self) + } +} + +/// 统一标注模型,对标 WXRead 的 WRBookmark。 +public struct RDEPUBAnnotation: Codable, Equatable { + public var id: String + public var bookIdentifier: String? + public var kind: RDEPUBAnnotationKind + public var location: RDEPUBLocation + public var text: String? + public var rangeInfo: String? + public var color: String? + public var chapterTitle: String? + public var note: String? + public var createdAt: Date + + public init( + id: String = UUID().uuidString, + bookIdentifier: String? = nil, + kind: RDEPUBAnnotationKind, + location: RDEPUBLocation, + text: String? = nil, + rangeInfo: String? = nil, + color: String? = nil, + chapterTitle: String? = nil, + note: String? = nil, + createdAt: Date = Date() + ) { + self.id = id + self.bookIdentifier = bookIdentifier + self.kind = kind + self.location = location + self.text = text?.nilIfEmpty + self.rangeInfo = rangeInfo?.nilIfEmpty + self.color = color?.nilIfEmpty + self.chapterTitle = chapterTitle?.nilIfEmpty + self.note = note?.nilIfEmpty + self.createdAt = createdAt + } + + public init(highlight: RDEPUBHighlight) { + self.init( + id: highlight.id, + bookIdentifier: highlight.bookIdentifier, + kind: highlight.style == .underline ? .underline : .highlight, + location: highlight.location, + text: highlight.text, + rangeInfo: highlight.rangeInfo, + color: highlight.color, + chapterTitle: nil, + note: highlight.note, + createdAt: highlight.createdAt + ) + } + + public init(bookmark: RDEPUBBookmark) { + self.init( + id: bookmark.id, + bookIdentifier: bookmark.bookIdentifier, + kind: .bookmark, + location: bookmark.location, + text: nil, + rangeInfo: nil, + color: nil, + chapterTitle: bookmark.chapterTitle, + note: bookmark.note, + createdAt: bookmark.createdAt + ) + } + + public var bookmark: RDEPUBBookmark? { + guard kind == .bookmark else { return nil } + return RDEPUBBookmark( + id: id, + bookIdentifier: bookIdentifier, + location: location, + chapterTitle: chapterTitle, + note: note, + createdAt: createdAt + ) + } + + public var highlight: RDEPUBHighlight? { + guard kind == .highlight || kind == .underline, + let text else { + return nil + } + return RDEPUBHighlight( + id: id, + bookIdentifier: bookIdentifier, + location: location, + text: text, + rangeInfo: rangeInfo, + style: kind == .underline ? .underline : .highlight, + color: color ?? "#F8E16C", + note: note, + createdAt: createdAt + ) + } } /// 章节信息模型,描述单个章节的元数据 diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBRenderRequest.swift b/Sources/RDReaderView/EPUBCore/RDEPUBRenderRequest.swift index c778cb1..ac29f70 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBRenderRequest.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBRenderRequest.swift @@ -41,6 +41,10 @@ public struct RDEPUBPresentationStyle: Equatable { public var fontSize: CGFloat /// 行距倍数(1.0 为默认行距) public var lineHeightMultiple: CGFloat + /// 栏数,对标 WXRead 的多栏分页配置 + public var numberOfColumns: Int + /// 栏间距,对标 WXRead 的 columnGap + public var columnGap: CGFloat /// 主题背景色(CSS 颜色值,如 "#FFFFFF") public var themeBackgroundColor: String? /// 主题文字色(CSS 颜色值,如 "#000000") @@ -51,6 +55,8 @@ public struct RDEPUBPresentationStyle: Equatable { contentInsets: UIEdgeInsets, fontSize: CGFloat, lineHeightMultiple: CGFloat, + numberOfColumns: Int = 1, + columnGap: CGFloat = 20, themeBackgroundColor: String? = nil, themeTextColor: String? = nil ) { @@ -58,6 +64,8 @@ public struct RDEPUBPresentationStyle: Equatable { self.contentInsets = contentInsets self.fontSize = fontSize self.lineHeightMultiple = lineHeightMultiple + self.numberOfColumns = max(1, numberOfColumns) + self.columnGap = max(0, columnGap) self.themeBackgroundColor = themeBackgroundColor self.themeTextColor = themeTextColor } @@ -170,4 +178,4 @@ public enum RDEPUBRenderRequest: Equatable { return request.spread.primaryResource.href } } -} \ No newline at end of file +} diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBStyleSheetBuilder.swift b/Sources/RDReaderView/EPUBCore/RDEPUBStyleSheetBuilder.swift index b1c8490..efc2d07 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBStyleSheetBuilder.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBStyleSheetBuilder.swift @@ -28,6 +28,7 @@ public enum RDEPUBStyleSheetBuilder { let values = cssValues(for: presentation) let backgroundCSS = presentation.themeBackgroundColor.map { "background: \($0) !important;" } ?? "" let textCSS = presentation.themeTextColor.map { "color: \($0) !important;" } ?? "" + let columnCountCSS = values.numberOfColumns > 1 ? "-webkit-column-count: \(values.numberOfColumns) !important; column-count: \(values.numberOfColumns) !important;" : "" return """ html { @@ -70,6 +71,7 @@ public enum RDEPUBStyleSheetBuilder { line-height: \(values.lineHeight) !important; -webkit-column-width: \(values.contentWidth)px !important; column-width: \(values.contentWidth)px !important; + \(columnCountCSS) -webkit-column-gap: \(values.columnGap)px !important; column-gap: \(values.columnGap)px !important; -webkit-column-fill: auto !important; @@ -109,6 +111,7 @@ public enum RDEPUBStyleSheetBuilder { let values = cssValues(for: presentation) let backgroundCSS = presentation.themeBackgroundColor.map { "background: \($0) !important;" } ?? "" let textCSS = presentation.themeTextColor.map { "color: \($0) !important;" } ?? "" + let columnCountCSS = values.numberOfColumns > 1 ? "-webkit-column-count: \(values.numberOfColumns) !important; column-count: \(values.numberOfColumns) !important;" : "" return """ html { @@ -132,6 +135,7 @@ public enum RDEPUBStyleSheetBuilder { line-height: \(values.lineHeight) !important; -webkit-column-width: \(values.contentWidth)px !important; column-width: \(values.contentWidth)px !important; + \(columnCountCSS) -webkit-column-gap: \(values.columnGap)px !important; column-gap: \(values.columnGap)px !important; -webkit-column-fill: auto !important; @@ -187,6 +191,7 @@ public enum RDEPUBStyleSheetBuilder { viewportHeight: String, contentWidth: String, columnGap: String, + numberOfColumns: Int, paddingTop: String, paddingRight: String, paddingBottom: String, @@ -197,14 +202,18 @@ public enum RDEPUBStyleSheetBuilder { let viewportWidth = max(1, presentation.viewportSize.width) let viewportHeight = max(1, presentation.viewportSize.height) let contentInsets = presentation.contentInsets - let contentWidth = max(1, viewportWidth - contentInsets.left - contentInsets.right) - let columnGap = max(0, contentInsets.left + contentInsets.right) + let numberOfColumns = max(1, presentation.numberOfColumns) + let availableWidth = max(1, viewportWidth - contentInsets.left - contentInsets.right) + let totalGap = CGFloat(numberOfColumns - 1) * max(0, presentation.columnGap) + let contentWidth = max(1, (availableWidth - totalGap) / CGFloat(numberOfColumns)) + let columnGap = max(0, presentation.columnGap) return ( viewportWidth: String(format: "%.3f", viewportWidth), viewportHeight: String(format: "%.3f", viewportHeight), contentWidth: String(format: "%.3f", contentWidth), columnGap: String(format: "%.3f", columnGap), + numberOfColumns: numberOfColumns, paddingTop: String(format: "%.3f", contentInsets.top), paddingRight: String(format: "%.3f", contentInsets.right), paddingBottom: String(format: "%.3f", contentInsets.bottom), diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+FixedLayout.swift b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+FixedLayout.swift index 1652849..1847752 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+FixedLayout.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+FixedLayout.swift @@ -91,8 +91,10 @@ extension RDEPUBWebView { func scheduleFixedLayoutReadyFallback() { let workItem = DispatchWorkItem { [weak self] in RDEPUBWebViewDebug.log(self?.debugScope ?? "ReaderWebView", message: "fixed ready fallback fired") - self?.applySearchDecorationsIfNeeded { - self?.rendered() + self?.applyFixedPresentationIfNeeded { + self?.refreshNativeDecorationsIfNeeded { + self?.rendered() + } } } fixedLayoutReadyWorkItem = workItem @@ -104,4 +106,25 @@ extension RDEPUBWebView { fixedLayoutReadyWorkItem?.cancel() fixedLayoutReadyWorkItem = nil } + + func applyFixedPresentationIfNeeded(completion: (() -> Void)? = nil) { + guard let webView, + let currentRenderRequest, + case .fixed(let request) = currentRenderRequest else { + completion?() + return + } + + let script = RDEPUBJavaScriptBridge.applyFixedPresentationScript(for: request) + webView.evaluateJavaScript(script) { [weak self] _, error in + guard let self else { + completion?() + return + } + if let error { + self.delegate?.epubWebView(self, didLogJavaScriptError: error.localizedDescription) + } + self.applySearchDecorationsIfNeeded(completion: completion) + } + } } diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+JavaScriptBridge.swift b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+JavaScriptBridge.swift index 9327ed8..236943e 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+JavaScriptBridge.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+JavaScriptBridge.swift @@ -21,7 +21,8 @@ extension RDEPUBWebView { let progression = (body["progression"] as? NSNumber)?.doubleValue ?? 0 let lastProgression = (body["lastProgression"] as? NSNumber)?.doubleValue let fragment = body["fragment"] as? String - return RDEPUBLocation(href: currentHref, progression: progression, lastProgression: lastProgression, fragment: fragment) + let href = body["href"] as? String ?? currentHref + return RDEPUBLocation(href: href, progression: progression, lastProgression: lastProgression, fragment: fragment) } } @@ -108,11 +109,13 @@ extension RDEPUBWebView: WKScriptMessageHandler { case RDEPUBJavaScriptBridgeMessage.javaScriptError.rawValue: delegate?.epubWebView(self, didLogJavaScriptError: "\(message.body)") case RDEPUBJavaScriptBridgeMessage.fixedLayoutReady.rawValue: - applySearchDecorationsIfNeeded { - self.rendered() + applyFixedPresentationIfNeeded { + self.refreshNativeDecorationsIfNeeded { + self.rendered() + } } default: break } } -} \ No newline at end of file +} diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Reflowable.swift b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Reflowable.swift index bd39f1e..cf625b0 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Reflowable.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Reflowable.swift @@ -128,6 +128,8 @@ extension RDEPUBWebView { String(format: "%.2f", presentation.contentInsets.right), String(format: "%.2f", presentation.fontSize), String(format: "%.2f", presentation.lineHeightMultiple), + String(presentation.numberOfColumns), + String(format: "%.2f", presentation.columnGap), presentation.themeBackgroundColor ?? "", presentation.themeTextColor ?? "", targetSignature, diff --git a/Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js b/Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js new file mode 100644 index 0000000..df154ac --- /dev/null +++ b/Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js @@ -0,0 +1,67 @@ +(function() { + if (window.WeReadApi) { return; } + + function bridge() { + return window.RDReaderBridge || null; + } + + function sharedThemeCSS(theme) { + if (!theme) { return ''; } + var backgroundColor = theme.backgroundColor || 'transparent'; + var textColor = theme.textColor || 'inherit'; + return [ + ':root {', + ' color-scheme: light;', + '}', + 'html, body {', + ' background: ' + backgroundColor + ' !important;', + ' color: ' + textColor + ' !important;', + '}', + 'a {', + ' -webkit-tap-highlight-color: transparent;', + '}' + ].join('\n'); + } + + window.WeReadApi = { + applySharedTheme: function(theme) { + var css = sharedThemeCSS(theme); + if (window.RDInjectedCSS) { + window.RDInjectedCSS.setStyle('ss-reader-theme', css, { + includeFrames: !!(theme && theme.includeFrames) + }); + } + return true; + }, + applyPagination: function(styleText) { + return !!(bridge() && bridge().applyPagination(styleText)); + }, + setPageMetrics: function(pageCount, pageStride) { + return !!(bridge() && bridge().setPageMetrics(pageCount, pageStride)); + }, + scrollToPage: function(pageIndex) { + return !!(bridge() && bridge().scrollToPage(pageIndex)); + }, + scrollToLocation: function(location, fallbackPageIndex) { + return !!(bridge() && bridge().scrollToLocation(location, fallbackPageIndex)); + }, + setHighlights: function(items) { + return !!(bridge() && bridge().setHighlights(items)); + }, + clearHighlights: function() { + return !!(bridge() && bridge().clearHighlights()); + }, + setSearchPresentation: function(payload) { + return !!(bridge() && bridge().setSearchPresentation(payload)); + }, + resolveDecorations: function() { + return bridge() ? bridge().resolveDecorations() : { highlights: [], search: [] }; + }, + reportProgression: function(fragment) { + return !!(bridge() && bridge().reportProgression(fragment)); + }, + selectionPayload: function() { + return bridge() ? bridge().selectionPayload() : null; + } + }; +})(); diff --git a/Sources/RDReaderView/EPUBCore/Resources/cssInjector.js b/Sources/RDReaderView/EPUBCore/Resources/cssInjector.js new file mode 100644 index 0000000..9517c26 --- /dev/null +++ b/Sources/RDReaderView/EPUBCore/Resources/cssInjector.js @@ -0,0 +1,45 @@ +(function() { + if (window.RDInjectedCSS) { return; } + + function applyStyle(doc, identifier, cssText) { + if (!doc || !doc.head) { return; } + var style = doc.getElementById(identifier); + if (!style) { + style = doc.createElement('style'); + style.id = identifier; + doc.head.appendChild(style); + } + style.textContent = cssText || ''; + } + + function walkDocuments(rootDoc, includeFrames, visitor) { + if (!rootDoc) { return; } + visitor(rootDoc); + if (!includeFrames || !rootDoc.querySelectorAll) { return; } + Array.prototype.forEach.call(rootDoc.querySelectorAll('iframe'), function(frame) { + try { + if (!frame.contentDocument) { return; } + walkDocuments(frame.contentDocument, includeFrames, visitor); + } catch (error) { + } + }); + } + + window.RDInjectedCSS = { + setStyle: function(identifier, cssText, options) { + var includeFrames = !!(options && options.includeFrames); + walkDocuments(document, includeFrames, function(doc) { + applyStyle(doc, identifier, cssText); + }); + }, + removeStyle: function(identifier, options) { + var includeFrames = !!(options && options.includeFrames); + walkDocuments(document, includeFrames, function(doc) { + var style = doc.getElementById(identifier); + if (style && style.parentNode) { + style.parentNode.removeChild(style); + } + }); + } + }; +})(); diff --git a/Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js b/Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js index cc2b106..52219bc 100644 --- a/Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js +++ b/Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js @@ -7,48 +7,17 @@ } catch (error) { } }); - function nodePath(node) { - var path = []; - var current = node; - while (current && current !== document) { - var parent = current.parentNode; - if (!parent) { break; } - var index = Array.prototype.indexOf.call(parent.childNodes, current); - path.unshift(index); - current = parent; - } - return path; - } - function nodeFromPath(path) { - var current = document; - for (var i = 0; i < path.length; i += 1) { - if (!current || !current.childNodes || current.childNodes.length <= path[i]) { return null; } - current = current.childNodes[path[i]]; - } - return current; - } function serializeRange(range) { - return JSON.stringify({ - kind: 'dom-range', - startPath: nodePath(range.startContainer), - startOffset: range.startOffset, - endPath: nodePath(range.endContainer), - endOffset: range.endOffset - }); + if (window.rangy && typeof window.rangy.serializeRange === 'function') { + return window.rangy.serializeRange(range, range && range.startContainer && range.startContainer.ownerDocument); + } + return null; } function rangeFromInfo(rangeInfo) { - try { - var payload = typeof rangeInfo === 'string' ? JSON.parse(rangeInfo) : rangeInfo; - var startNode = nodeFromPath(payload.startPath || []); - var endNode = nodeFromPath(payload.endPath || []); - if (!startNode || !endNode) { return null; } - var range = document.createRange(); - range.setStart(startNode, payload.startOffset || 0); - range.setEnd(endNode, payload.endOffset || 0); - return range; - } catch (error) { - return null; + if (window.rangy && typeof window.rangy.deserializeRange === 'function') { + return window.rangy.deserializeRange(rangeInfo, document); } + return null; } var visiblePageIndex = 0; var configuredPageCount = 1; @@ -153,6 +122,22 @@ var absoluteLeft = Math.max(0, rect.left + currentPageOffset()); return Math.max(0, Math.floor(absoluteLeft / effectivePageStride())); } + function fragmentTarget(fragment) { + if (!fragment) { return null; } + var contexts = documentContexts(document, 0, 0); + for (var index = 0; index < contexts.length; index += 1) { + var context = contexts[index]; + var target = context.doc.getElementById(fragment) + || context.doc.querySelector('[name="' + fragment.replace(/"/g, '\\"') + '"]'); + if (target) { + return { + context: context, + target: target + }; + } + } + return null; + } var storedHighlights = []; var storedSearchPresentation = null; function normalizeHref(rawHref) { @@ -228,6 +213,36 @@ }); return items; } + var hookedDocuments = new WeakSet(); + var hookedFrames = new WeakSet(); + function selectionForDocument(doc) { + if (!doc) { return null; } + try { + var view = doc.defaultView || window; + return view.getSelection ? view.getSelection() : null; + } catch (error) { + return null; + } + } + function currentSelectionContext() { + var contexts = documentContexts(document, 0, 0); + for (var index = 0; index < contexts.length; index += 1) { + var context = contexts[index]; + var selection = selectionForDocument(context.doc); + if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { + continue; + } + var text = selection.toString ? selection.toString() : ''; + if (!text || !text.trim()) { + continue; + } + return { + context: context, + selection: selection + }; + } + return null; + } function rectPayloadForRange(range, offsetX, offsetY) { if (!range || range.collapsed) { return []; } var rects = []; @@ -344,17 +359,18 @@ }; } function selectionPayload() { - var selection = window.getSelection(); - if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { + var payloadContext = currentSelectionContext(); + if (!payloadContext) { return null; } - var range = selection.getRangeAt(0); - var text = selection.toString(); + var range = payloadContext.selection.getRangeAt(0); + var text = payloadContext.selection.toString(); if (!text || !text.trim()) { return null; } var pageCount = totalPageCount(); var progression = pageCount <= 1 ? 0 : visiblePageIndex / Math.max(pageCount - 1, 1); var lastProgression = progression; return { + href: payloadContext.context.href || null, text: text, rangeInfo: serializeRange(range), progression: progression, @@ -362,13 +378,54 @@ }; } var selectionTimer = null; - document.addEventListener('selectionchange', function() { + function notifySelectionChange() { clearTimeout(selectionTimer); selectionTimer = setTimeout(function() { var payload = selectionPayload(); window.webkit.messageHandlers.{{SELECTION_CHANGED_MESSAGE}}.postMessage(payload); }, 120); - }); + } + function handleDocumentClick(event) { + var anchor = event.target.closest ? event.target.closest('a[href]') : null; + if (!anchor) { return; } + var href = anchor.getAttribute('href'); + if (!href) { return; } + if (/^(https?:|mailto:|tel:)/i.test(href)) { + event.preventDefault(); + window.webkit.messageHandlers.{{EXTERNAL_LINK_MESSAGE}}.postMessage({ url: href }); + return; + } + event.preventDefault(); + window.webkit.messageHandlers.{{INTERNAL_LINK_MESSAGE}}.postMessage({ href: href }); + } + function installDocumentHooks(doc) { + if (!doc || hookedDocuments.has(doc)) { return; } + hookedDocuments.add(doc); + doc.addEventListener('selectionchange', notifySelectionChange); + doc.addEventListener('click', handleDocumentClick, true); + } + function installFrameHooks(rootDoc) { + if (!rootDoc || !rootDoc.querySelectorAll) { return; } + Array.prototype.forEach.call(rootDoc.querySelectorAll('iframe'), function(frame) { + if (hookedFrames.has(frame)) { return; } + hookedFrames.add(frame); + var hookFrameDocument = function() { + try { + if (!frame.contentDocument) { return; } + installDocumentHooks(frame.contentDocument); + installFrameHooks(frame.contentDocument); + } catch (error) { + } + }; + frame.addEventListener('load', function() { + hookFrameDocument(); + scheduleRelayout(); + }, { passive: true }); + hookFrameDocument(); + }); + } + installDocumentHooks(document); + installFrameHooks(document); window.addEventListener('resize', function() { if (isFixedLayoutDocument()) { return; } setVisiblePageIndex(visiblePageIndex); @@ -384,30 +441,22 @@ node.addEventListener('error', scheduleRelayout, { passive: true }); }); } - document.addEventListener('click', function(event) { - var anchor = event.target.closest ? event.target.closest('a[href]') : null; - if (!anchor) { return; } - var href = anchor.getAttribute('href'); - if (!href) { return; } - if (/^(https?:|mailto:|tel:)/i.test(href)) { - event.preventDefault(); - window.webkit.messageHandlers.{{EXTERNAL_LINK_MESSAGE}}.postMessage({ url: href }); - return; - } - event.preventDefault(); - window.webkit.messageHandlers.{{INTERNAL_LINK_MESSAGE}}.postMessage({ href: href }); - }, true); window.RDReaderBridge = { applyPagination: function(styleText) { if (isFixedLayoutDocument()) { return; } - var style = document.getElementById('ss-reader-pagination'); - if (!style) { - style = document.createElement('style'); - style.id = 'ss-reader-pagination'; - document.head.appendChild(style); + if (window.RDInjectedCSS) { + window.RDInjectedCSS.setStyle('ss-reader-pagination', styleText, { includeFrames: false }); + } else { + var style = document.getElementById('ss-reader-pagination'); + if (!style) { + style = document.createElement('style'); + style.id = 'ss-reader-pagination'; + document.head.appendChild(style); + } + style.textContent = styleText; } - style.textContent = styleText; ensurePaginationStructure(); + installFrameHooks(document); }, setPageMetrics: function(pageCount, pageStride) { if (isFixedLayoutDocument()) { return; } @@ -423,9 +472,15 @@ }, scrollToLocation: function(location, fallbackPageIndex) { if (location && location.fragment) { - var target = document.getElementById(location.fragment) || document.querySelector('[name="' + location.fragment.replace(/"/g, '\\"') + '"]'); - if (target) { - setVisiblePageIndex(pageIndexForElement(target)); + var resolvedTarget = fragmentTarget(location.fragment); + if (resolvedTarget) { + if (isFixedLayoutDocument()) { + reportProgression(location.fragment); + return; + } + var rect = resolvedTarget.target.getBoundingClientRect(); + var absoluteLeft = Math.max(0, rect.left + resolvedTarget.context.offsetX + currentPageOffset()); + setVisiblePageIndex(Math.max(0, Math.floor(absoluteLeft / effectivePageStride()))); reportProgression(location.fragment); return; } diff --git a/Sources/RDReaderView/EPUBCore/Resources/rangy-core.js b/Sources/RDReaderView/EPUBCore/Resources/rangy-core.js new file mode 100644 index 0000000..d1f4a9f --- /dev/null +++ b/Sources/RDReaderView/EPUBCore/Resources/rangy-core.js @@ -0,0 +1,13 @@ +(function() { + if (window.rangy) { return; } + + window.rangy = { + initialized: true, + init: function() { + return window.rangy; + }, + createRange: function(doc) { + return (doc || document).createRange(); + } + }; +})(); diff --git a/Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js b/Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js new file mode 100644 index 0000000..ff74015 --- /dev/null +++ b/Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js @@ -0,0 +1,93 @@ +(function() { + if (!window.rangy) { + window.rangy = {}; + } + if (window.rangy.serializeRange && window.rangy.deserializeRange) { + return; + } + + function normalizeHref(rawHref) { + if (!rawHref) { return ''; } + var value = String(rawHref); + value = value.replace(/^.*?:\/\/[^/]+\//, ''); + value = value.split('#')[0]; + value = value.replace(/^\/+/, ''); + try { + value = decodeURIComponent(value); + } catch (error) { + } + return value; + } + + function nodePath(node) { + var path = []; + var current = node; + while (current && current !== current.ownerDocument) { + var parent = current.parentNode; + if (!parent) { break; } + var index = Array.prototype.indexOf.call(parent.childNodes, current); + path.unshift(index); + current = parent; + } + return path; + } + + function nodeFromPath(doc, path) { + var current = doc; + for (var index = 0; index < path.length; index += 1) { + if (!current || !current.childNodes || current.childNodes.length <= path[index]) { + return null; + } + current = current.childNodes[path[index]]; + } + return current; + } + + function documentContexts(rootDoc) { + var items = []; + if (!rootDoc) { return items; } + items.push(rootDoc); + var frames = rootDoc.querySelectorAll ? rootDoc.querySelectorAll('iframe') : []; + Array.prototype.forEach.call(frames, function(frame) { + try { + if (!frame.contentDocument) { return; } + documentContexts(frame.contentDocument).forEach(function(item) { + items.push(item); + }); + } catch (error) { + } + }); + return items; + } + + window.rangy.serializeRange = function(range, doc) { + var ownerDocument = doc || (range && range.startContainer && range.startContainer.ownerDocument) || document; + return JSON.stringify({ + kind: 'dom-range', + documentHref: normalizeHref(ownerDocument.location && ownerDocument.location.href), + startPath: nodePath(range.startContainer), + startOffset: range.startOffset, + endPath: nodePath(range.endContainer), + endOffset: range.endOffset + }); + }; + + window.rangy.deserializeRange = function(rangeInfo, rootDoc) { + try { + var payload = typeof rangeInfo === 'string' ? JSON.parse(rangeInfo) : rangeInfo; + var documentHref = normalizeHref(payload.documentHref); + var resolvedDocument = (documentContexts(rootDoc || document).find(function(candidate) { + return normalizeHref(candidate.location && candidate.location.href) === documentHref; + })) || (rootDoc || document); + var startNode = nodeFromPath(resolvedDocument, payload.startPath || []); + var endNode = nodeFromPath(resolvedDocument, payload.endPath || []); + if (!startNode || !endNode) { return null; } + var range = resolvedDocument.createRange(); + range.setStart(startNode, payload.startOffset || 0); + range.setEnd(endNode, payload.endOffset || 0); + return range; + } catch (error) { + return null; + } + }; +})(); diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBChapterData.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBChapterData.swift index 46a1f03..6b4a336 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBChapterData.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBChapterData.swift @@ -30,8 +30,19 @@ public final class RDEPUBChapterData { public var attributedContent: NSAttributedString { chapter.attributedContent } /// 分页后的页面列表 public var pages: [RDEPUBTextPage] { chapter.pages } + /// 章节总页数 + public var pageCount: Int { chapter.pages.count } /// fragment ID → 字符偏移量的映射表(用于锚点定位) public var fragmentOffsets: [String: Int] { chapter.fragmentOffsets } + /// 章节信息快照(供阅读会话/目录面板复用) + public var chapterInfo: EPUBChapterInfo { + EPUBChapterInfo(spineIndex: spineIndex, title: title, pageCount: pageCount) + } + /// 章节覆盖的绝对页码范围(闭区间) + public var absolutePageRange: ClosedRange? { + guard let firstPage = pages.first, let lastPage = pages.last else { return nil } + return firstPage.absolutePageIndex...lastPage.absolutePageIndex + } // MARK: - 页面查询 @@ -52,20 +63,36 @@ public final class RDEPUBChapterData { chapter.pages.first { $0.absolutePageIndex == absolutePageIndex } } + /// 按章节内页码查找页面(从 1 开始) + public func page(atPageNumber pageNumber: Int) -> RDEPUBTextPage? { + guard pageNumber > 0, pages.indices.contains(pageNumber - 1) else { return nil } + return pages[pageNumber - 1] + } + // MARK: - 锚点与位置映射 - /// 将绝对字符索引转换为语义锚点(fileIndex/row/column 三元组) + /// 将章节内字符索引转换为语义锚点(fileIndex/row/column 三元组) public func anchor(forAbsoluteIndex index: Int) -> RDEPUBTextAnchor { indexTable.anchor(forAbsoluteIndex: index, in: chapter) } - /// 将绝对字符范围转换为起止锚点对 + /// 将全书字符索引转换为语义锚点。 + public func anchor(forGlobalIndex index: Int) -> RDEPUBTextAnchor? { + indexTable.anchor(forGlobalIndex: index) + } + + /// 将章节内字符范围转换为起止锚点对 public func rangeAnchor(for absoluteRange: NSRange) -> RDEPUBTextRangeAnchor { let start = anchor(forAbsoluteIndex: absoluteRange.location) let end = anchor(forAbsoluteIndex: absoluteRange.location + absoluteRange.length) return RDEPUBTextRangeAnchor(start: start, end: end) } + /// 将锚点范围转换为全书字符范围。 + public func globalRange(for rangeAnchor: RDEPUBTextRangeAnchor) -> NSRange { + indexTable.globalRange(for: rangeAnchor) + } + /// 从绝对字符范围构建选区对象(用于复制/高亮分享) /// - Parameters: /// - absoluteRange: 选区在全书中的字符范围 @@ -102,9 +129,21 @@ public final class RDEPUBChapterData { location(for: page.contentRange, bookIdentifier: bookIdentifier) } + /// 根据持久化位置定位所属页面。 + public func page(for location: RDEPUBLocation) -> RDEPUBTextPage? { + guard let range = absoluteRange(for: location) else { return nil } + return page(containing: range.location) + } + + /// 根据搜索结果定位所属页面。 + public func page(for searchMatch: RDEPUBSearchMatch) -> RDEPUBTextPage? { + guard let range = absoluteRange(for: searchMatch) else { return nil } + return page(containing: range.location) + } + // MARK: - 位置反向解析(Location → 绝对偏移量) - /// 将持久化位置还原为章节内的绝对字符范围。 + /// 将持久化位置还原为章节内的字符范围。 /// /// 解析优先级: /// 1. rangeAnchor(锚点定位,最精确) @@ -112,7 +151,7 @@ public final class RDEPUBChapterData { /// 3. navigationProgression(进度百分比回退) public func absoluteRange(for location: RDEPUBLocation) -> NSRange? { if let rangeAnchor = location.rangeAnchor { - return indexTable.absoluteRange(for: rangeAnchor) + return indexTable.chapterRange(for: rangeAnchor) } if let fragment = location.fragment, @@ -128,7 +167,7 @@ public final class RDEPUBChapterData { /// 从高亮的持久化位置还原绝对字符范围 public func absoluteRange(for highlight: RDEPUBHighlight) -> NSRange? { if let rangeAnchor = highlight.location.rangeAnchor { - return indexTable.absoluteRange(for: rangeAnchor) + return indexTable.chapterRange(for: rangeAnchor) } return RDEPUBTextOffsetRangeInfo.decode(from: highlight.rangeInfo)?.nsRange } @@ -136,7 +175,7 @@ public final class RDEPUBChapterData { /// 从搜索结果还原绝对字符范围 public func absoluteRange(for searchMatch: RDEPUBSearchMatch) -> NSRange? { if let rangeAnchor = searchMatch.rangeAnchor { - return indexTable.absoluteRange(for: rangeAnchor) + return indexTable.chapterRange(for: rangeAnchor) } if let location = searchMatch.rangeLocation { return NSRange(location: location, length: searchMatch.rangeLength) @@ -144,6 +183,42 @@ public final class RDEPUBChapterData { return nil } + /// 将持久化位置还原为全书字符范围。 + public func globalRange(for location: RDEPUBLocation) -> NSRange? { + if let rangeAnchor = location.rangeAnchor { + return indexTable.globalRange(for: rangeAnchor) + } + guard let chapterRange = absoluteRange(for: location), + let chapterStart = indexTable.chapterStartOffset(forFileIndex: spineIndex) else { + return nil + } + return NSRange(location: chapterStart + chapterRange.location, length: chapterRange.length) + } + + /// 从高亮的持久化位置还原全书字符范围。 + public func globalRange(for highlight: RDEPUBHighlight) -> NSRange? { + if let rangeAnchor = highlight.location.rangeAnchor { + return indexTable.globalRange(for: rangeAnchor) + } + guard let chapterRange = absoluteRange(for: highlight), + let chapterStart = indexTable.chapterStartOffset(forFileIndex: spineIndex) else { + return nil + } + return NSRange(location: chapterStart + chapterRange.location, length: chapterRange.length) + } + + /// 从搜索结果还原全书字符范围。 + public func globalRange(for searchMatch: RDEPUBSearchMatch) -> NSRange? { + if let rangeAnchor = searchMatch.rangeAnchor { + return indexTable.globalRange(for: rangeAnchor) + } + guard let chapterRange = absoluteRange(for: searchMatch), + let chapterStart = indexTable.chapterStartOffset(forFileIndex: spineIndex) else { + return nil + } + return NSRange(location: chapterStart + chapterRange.location, length: chapterRange.length) + } + // MARK: - 高亮/搜索结果与页面的交叉查询 /// 获取指定页面上出现的所有高亮 @@ -163,7 +238,6 @@ public final class RDEPUBChapterData { /// 获取指定页面上出现的所有搜索匹配结果 public func searchMatches(on page: RDEPUBTextPage, from matches: [RDEPUBSearchMatch]) -> [RDEPUBSearchMatch] { - let pageRange = absoluteOffsetRange(for: page) return matches.filter { match in guard match.href == chapter.href else { return false } if let range = absoluteRange(for: match) { @@ -173,12 +247,54 @@ public final class RDEPUBChapterData { } } + /// `searchMatches(on:from:)` 的别名;保持和文档/WXRead 语义一致。 + public func searchResults(on page: RDEPUBTextPage, from matches: [RDEPUBSearchMatch]) -> [RDEPUBSearchMatch] { + searchMatches(on: page, from: matches) + } + /// 根据持久化位置获取对应页码(从 1 开始),用于阅读进度跳转 public func pageNumber(for location: RDEPUBLocation) -> Int? { - if let range = absoluteRange(for: location) { - return pageNumber(containing: range.location).map { $0 + 1 } + guard let page = page(for: location) else { return nil } + return page.absolutePageIndex + 1 + } + + /// 根据搜索结果获取对应页码(从 1 开始)。 + public func pageNumber(for searchMatch: RDEPUBSearchMatch) -> Int? { + guard let page = page(for: searchMatch) else { return nil } + return page.absolutePageIndex + 1 + } + + // MARK: - 目录与章节语义 + + /// 判断某个 TOC 条目是否属于当前章节。 + public func contains( + tableOfContentsItem item: EPUBTableOfContentsItem, + normalizer: (String) -> String? + ) -> Bool { + guard let chapterHref = normalizer(href), + let itemHref = normalizer(item.href.components(separatedBy: "#").first ?? item.href) else { + return false } - return nil + return chapterHref == itemHref + } + + /// 过滤出当前章节命中的目录条目。 + public func tableOfContentsItems( + from items: [EPUBTableOfContentsItem], + normalizer: (String) -> String? + ) -> [EPUBTableOfContentsItem] { + items.flatMap { item -> [EPUBTableOfContentsItem] in + let descendants = tableOfContentsItems(from: item.children, normalizer: normalizer) + return contains(tableOfContentsItem: item, normalizer: normalizer) ? [item] + descendants : descendants + } + } + + /// 当前章节最合适的目录条目(通常取命中的首个最近条目)。 + public func primaryTableOfContentsItem( + from items: [EPUBTableOfContentsItem], + normalizer: (String) -> String? + ) -> EPUBTableOfContentsItem? { + tableOfContentsItems(from: items, normalizer: normalizer).first } // MARK: - 私有工具方法 @@ -190,12 +306,8 @@ public final class RDEPUBChapterData { return lowerBound.. Int { - indexTable.absoluteIndex( - fileIndex: anchor.fileIndex, - row: anchor.row, - column: anchor.column - ) ?? anchor.chapterOffset + indexTable.chapterOffset(for: anchor) } } diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift index 117ce95..2d9ad0e 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextBookBuilder.swift @@ -76,6 +76,10 @@ public struct RDEPUBTextBook { public var pages: [RDEPUBTextPage] /// 全局索引表:fileIndex/row/column → 绝对字符偏移量 public let indexTable: RDEPUBTextIndexTable + /// 对标 WXRead 的位置转换器(文件位置 <-> 全书字符位置 <-> 页码) + public var positionConverter: RDEPUBTextPositionConverter { + RDEPUBTextPositionConverter(book: self) + } public init(chapters: [RDEPUBTextChapter], pages: [RDEPUBTextPage]) { self.chapters = chapters @@ -93,12 +97,47 @@ public struct RDEPUBTextBook { return RDEPUBChapterData(chapter: chapter, indexTable: indexTable) } + /// 按 spine 索引获取章节的数据访问层。 + public func chapterData(forSpineIndex spineIndex: Int) -> RDEPUBChapterData? { + guard let chapter = chapters.first(where: { $0.spineIndex == spineIndex }) else { return nil } + return RDEPUBChapterData(chapter: chapter, indexTable: indexTable) + } + /// 按章节序号获取章节的数据访问层 public func chapterData(atChapterIndex index: Int) -> RDEPUBChapterData? { guard chapters.indices.contains(index) else { return nil } return RDEPUBChapterData(chapter: chapters[index], indexTable: indexTable) } + /// 按绝对页码(从 1 开始)获取章节的数据访问层。 + public func chapterData(forPageNumber pageNumber: Int) -> RDEPUBChapterData? { + guard let page = page(at: pageNumber) else { return nil } + return chapterData(forSpineIndex: page.spineIndex) + } + + /// 根据持久化位置解析所属章节的数据访问层。 + public func chapterData( + for location: RDEPUBLocation, + resolver: RDEPUBResourceResolver, + bookIdentifier: String? + ) -> RDEPUBChapterData? { + guard let normalizedLocation = resolver.normalizedLocation(location, bookIdentifier: bookIdentifier) else { + return nil + } + return chapterData(for: normalizedLocation.href) + } + + /// 全书章节信息快照;对标 WXRead 由章节模型直接提供章节元数据。 + public var chapterInfos: [EPUBChapterInfo] { + chapters.map { chapter in + EPUBChapterInfo( + spineIndex: chapter.spineIndex, + title: chapter.title, + pageCount: chapter.pages.count + ) + } + } + /// 按页码(从 1 开始)获取对应页面 public func page(at pageNumber: Int) -> RDEPUBTextPage? { guard pageNumber > 0, pages.indices.contains(pageNumber - 1) else { @@ -115,51 +154,30 @@ public struct RDEPUBTextBook { /// 3. navigationProgression 进度百分比回退 public func pageNumber(for location: RDEPUBLocation, resolver: RDEPUBResourceResolver, bookIdentifier: String?) -> Int? { guard let normalizedLocation = resolver.normalizedLocation(location, bookIdentifier: bookIdentifier), - let chapter = chapters.first(where: { $0.href == normalizedLocation.href }) else { + let chapterData = chapterData(for: normalizedLocation.href) else { return nil } if let anchor = normalizedLocation.rangeAnchor?.start, - let page = indexTable.pageNumber(for: anchor, in: self) { - return page + 1 + let page = positionConverter.pageNumber(for: anchor) { + return page } - let targetOffset: Int - if let fragment = normalizedLocation.fragment, let fragmentOffset = chapter.fragmentOffsets[fragment] { - targetOffset = fragmentOffset - } else { - let lastOffset = max(chapter.attributedContent.length - 1, 0) - targetOffset = min(lastOffset, max(0, Int(round(Double(lastOffset) * normalizedLocation.navigationProgression)))) + if let anchor = indexTable.anchor(for: normalizedLocation), + let page = positionConverter.pageNumber(for: anchor) { + return page } - if let page = chapter.pages.first(where: { targetOffset >= $0.pageStartOffset && targetOffset <= $0.pageEndOffset }) { - return page.absolutePageIndex + 1 - } - - return chapter.pages.last.map { $0.absolutePageIndex + 1 } + return chapterData.pageNumber(for: normalizedLocation) } /// 根据页码生成持久化位置(RDEPUBLocation),包含起止锚点 public func location(forPageNumber pageNumber: Int, bookIdentifier: String?) -> RDEPUBLocation? { - guard let page = page(at: pageNumber), - let chapter = chapters.first(where: { $0.chapterIndex == page.chapterIndex }) else { + guard let chapterData = chapterData(forPageNumber: pageNumber), + let page = page(at: pageNumber) else { return nil } - - let totalLength = max(chapter.attributedContent.length - 1, 1) - - let startAnchor = indexTable.anchor(forAbsoluteIndex: page.pageStartOffset, in: chapter) - let endAnchor = indexTable.anchor(forAbsoluteIndex: page.pageEndOffset, in: chapter) - let rangeAnchor = RDEPUBTextRangeAnchor(start: startAnchor, end: endAnchor) - - return RDEPUBLocation( - bookIdentifier: bookIdentifier, - href: page.href, - progression: Double(page.pageStartOffset) / Double(totalLength), - lastProgression: Double(page.pageEndOffset) / Double(totalLength), - fragment: nil, - rangeAnchor: rangeAnchor - ) + return chapterData.location(forPage: page, bookIdentifier: bookIdentifier) } } diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextIndexTable.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextIndexTable.swift index 624db91..4a32cc5 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextIndexTable.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextIndexTable.swift @@ -44,6 +44,15 @@ public struct RDEPUBTextIndexTable { /// spine 文件索引 → 行列索引数组的映射 public let fileRowColumnMap: [Int: [RDEPUBRowColumnIndex]] + /// 全书总字符数(章节长度累加) + public var totalCharacterCount: Int { + guard let lastIndex = chapterStartOffsets.indices.last, + chapterLengths.indices.contains(lastIndex) else { + return 0 + } + return chapterStartOffsets[lastIndex] + chapterLengths[lastIndex] + } + /// 从文本章节列表构建索引表 public init(chapters: [RDEPUBTextChapter]) { var offsets: [Int] = [] @@ -118,11 +127,29 @@ public struct RDEPUBTextIndexTable { ) } + /// 根据全书字符偏移量构建文本锚点。 + public func anchor(forGlobalIndex index: Int) -> RDEPUBTextAnchor? { + guard let fileIndex = fileIndex(forCharacterPosition: index), + let href = href(for: fileIndex) else { + return nil + } + + let chapterOffset = localOffsetInFile(at: fileIndex, forGlobalPosition: index) ?? 0 + let fragmentID = nearestFragmentID(beforeOrAt: chapterOffset, inHref: href) + return RDEPUBTextAnchor( + fileIndex: fileIndex, + row: row(forAbsoluteIndex: chapterOffset, inFileIndex: fileIndex), + column: column(forAbsoluteIndex: chapterOffset, inFileIndex: fileIndex), + chapterOffset: chapterOffset, + fragmentID: fragmentID + ) + } + /// 根据锚点查找对应的绝对页码 public func pageNumber(for anchor: RDEPUBTextAnchor, in book: RDEPUBTextBook) -> Int? { guard let chapter = book.chapters.first(where: { $0.spineIndex == anchor.fileIndex }) else { return nil } let basePageIndex = chapter.pages.first?.absolutePageIndex ?? 0 - let resolvedOffset = absoluteIndex(for: anchor) + let resolvedOffset = chapterOffset(for: anchor) return chapter.pages.firstIndex { page in NSLocationInRange(resolvedOffset, page.contentRange) }.map { $0 + basePageIndex } @@ -138,31 +165,77 @@ public struct RDEPUBTextIndexTable { hrefToChapterIndex[href] } - /// 将锚点转换为全书绝对字符索引 - public func absoluteIndex(for anchor: RDEPUBTextAnchor) -> Int { - absoluteIndex( + /// 通过文件索引获取章节起始的全书字符偏移量。 + public func chapterStartOffset(forFileIndex fileIndex: Int) -> Int? { + guard let href = href(for: fileIndex), + let chapterIndex = hrefToChapterIndex[href], + chapterStartOffsets.indices.contains(chapterIndex) else { + return nil + } + return chapterStartOffsets[chapterIndex] + } + + /// 通过文件索引获取章节长度。 + public func chapterLength(forFileIndex fileIndex: Int) -> Int? { + guard let href = href(for: fileIndex), + let chapterIndex = hrefToChapterIndex[href], + chapterLengths.indices.contains(chapterIndex) else { + return nil + } + return chapterLengths[chapterIndex] + } + + /// 将锚点转换为章节内字符偏移量。 + public func chapterOffset(for anchor: RDEPUBTextAnchor) -> Int { + chapterOffset( fileIndex: anchor.fileIndex, row: anchor.row, column: anchor.column ) ?? anchor.chapterOffset } - /// 将范围锚点转换为全书绝对 NSRange - public func absoluteRange(for rangeAnchor: RDEPUBTextRangeAnchor) -> NSRange { - let start = absoluteIndex(for: rangeAnchor.start) - let end = max(start, absoluteIndex(for: rangeAnchor.end)) + /// 将锚点转换为全书绝对字符索引。 + public func globalIndex(for anchor: RDEPUBTextAnchor) -> Int { + let chapterOffset = chapterOffset(for: anchor) + let baseOffset = chapterStartOffset(forFileIndex: anchor.fileIndex) ?? 0 + let chapterLength = max(chapterLength(forFileIndex: anchor.fileIndex) ?? 0, 0) + let lastOffset = max(chapterLength - 1, 0) + return baseOffset + min(max(chapterOffset, 0), lastOffset) + } + + /// 兼容旧调用:返回全书绝对字符索引。 + public func absoluteIndex(for anchor: RDEPUBTextAnchor) -> Int { + globalIndex(for: anchor) + } + + /// 将范围锚点转换为章节内 NSRange。 + public func chapterRange(for rangeAnchor: RDEPUBTextRangeAnchor) -> NSRange { + let start = chapterOffset(for: rangeAnchor.start) + let end = max(start, chapterOffset(for: rangeAnchor.end)) return NSRange(location: start, length: max(end - start, 0)) } + /// 将范围锚点转换为全书绝对 NSRange。 + public func globalRange(for rangeAnchor: RDEPUBTextRangeAnchor) -> NSRange { + let start = globalIndex(for: rangeAnchor.start) + let end = max(start, globalIndex(for: rangeAnchor.end)) + return NSRange(location: start, length: max(end - start, 0)) + } + + /// 兼容旧调用:返回全书绝对范围。 + public func absoluteRange(for rangeAnchor: RDEPUBTextRangeAnchor) -> NSRange { + globalRange(for: rangeAnchor) + } + /// 将单个锚点转换为阅读位置(计算 progression) public func location( for anchor: RDEPUBTextAnchor, in chapter: RDEPUBTextChapter, bookIdentifier: String? ) -> RDEPUBLocation { - let absoluteOffset = absoluteIndex(for: anchor) + let chapterOffset = self.chapterOffset(for: anchor) let totalLength = max(chapter.attributedContent.length - 1, 1) - let progression = Double(min(max(absoluteOffset, 0), totalLength)) / Double(totalLength) + let progression = Double(min(max(chapterOffset, 0), totalLength)) / Double(totalLength) return RDEPUBLocation( bookIdentifier: bookIdentifier, href: chapter.href, @@ -179,8 +252,8 @@ public struct RDEPUBTextIndexTable { in chapter: RDEPUBTextChapter, bookIdentifier: String? ) -> RDEPUBLocation { - let start = absoluteIndex(for: rangeAnchor.start) - let end = max(start, absoluteIndex(for: rangeAnchor.end)) + let start = chapterOffset(for: rangeAnchor.start) + let end = max(start, chapterOffset(for: rangeAnchor.end)) let totalLength = max(chapter.attributedContent.length - 1, 1) let clampedStart = min(max(start, 0), totalLength) let clampedEnd = min(max(end, clampedStart), totalLength) @@ -213,8 +286,8 @@ public struct RDEPUBTextIndexTable { return max(index - lastRow.startOffset, 0) } - /// 根据文件索引、行号和列号计算全书绝对索引 - public func absoluteIndex(fileIndex: Int, row: Int, column: Int) -> Int? { + /// 根据文件索引、行号和列号计算章节内偏移量。 + public func chapterOffset(fileIndex: Int, row: Int, column: Int) -> Int? { guard let rows = fileRowColumnMap[fileIndex], !rows.isEmpty else { return nil } let normalizedRow = min(max(row, 0), rows.count - 1) let rowEntry = rows[normalizedRow] @@ -222,6 +295,46 @@ public struct RDEPUBTextIndexTable { return rowEntry.startOffset + min(max(column, 0), maxColumn) } + /// 根据文件索引、行号和列号计算全书绝对索引。 + public func absoluteIndex(fileIndex: Int, row: Int, column: Int) -> Int? { + guard let chapterOffset = chapterOffset(fileIndex: fileIndex, row: row, column: column), + let baseOffset = chapterStartOffset(forFileIndex: fileIndex) else { + return nil + } + return baseOffset + chapterOffset + } + + /// 全书字符偏移量 → 文件索引。 + public func fileIndex(forCharacterPosition index: Int) -> Int? { + guard totalCharacterCount > 0 else { return nil } + let normalized = min(max(index, 0), max(totalCharacterCount - 1, 0)) + for (href, chapterIndex) in hrefToChapterIndex { + guard chapterStartOffsets.indices.contains(chapterIndex), + chapterLengths.indices.contains(chapterIndex), + let fileIndex = hrefToFileIndex[href] else { + continue + } + + let start = chapterStartOffsets[chapterIndex] + let length = chapterLengths[chapterIndex] + let endExclusive = start + max(length, 1) + if normalized >= start && normalized < endExclusive { + return fileIndex + } + } + return fileIndexToHref.keys.sorted().last + } + + /// 全书字符偏移量 → 指定文件内的章节偏移量。 + public func localOffsetInFile(at fileIndex: Int, forGlobalPosition index: Int) -> Int? { + guard let start = chapterStartOffset(forFileIndex: fileIndex), + let chapterLength = chapterLength(forFileIndex: fileIndex) else { + return nil + } + let normalized = min(max(index, start), start + max(chapterLength - 1, 0)) + return normalized - start + } + /// 将偏移量限制在章节范围内 private func clampedOffset(_ index: Int, in chapter: RDEPUBTextChapter) -> Int { let lastOffset = max(chapter.attributedContent.length - 1, 0) @@ -243,6 +356,21 @@ public struct RDEPUBTextIndexTable { return bestID } + /// 查找给定 href 中距离偏移量最近(且在其之前)的 fragment ID。 + private func nearestFragmentID(beforeOrAt offset: Int, inHref href: String) -> String? { + guard let fragmentOffsets = fragmentOffsetsByHref[href] else { + return nil + } + + var bestID: String? + var bestOffset = -1 + for (id, fragmentOffset) in fragmentOffsets where fragmentOffset <= offset && fragmentOffset > bestOffset { + bestOffset = fragmentOffset + bestID = id + } + return bestID + } + /// 从文本字符串构建行列索引数组(按行分割,记录每行的起止偏移) private static func makeRowColumnIndices(for text: String) -> [RDEPUBRowColumnIndex] { let nsText = text as NSString diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextPositionConverter.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextPositionConverter.swift new file mode 100644 index 0000000..02e8c97 --- /dev/null +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextPositionConverter.swift @@ -0,0 +1,75 @@ +import Foundation + +/// 对标 WXRead `WREpubPositionConverter` 的全书位置转换器。 +/// +/// 负责在四套坐标之间做双向转换: +/// - `(fileIndex, row, column)` 文件级语义锚点 +/// - 章节内字符偏移 +/// - 全书字符偏移 +/// - 页码 / `RDEPUBLocation` +public struct RDEPUBTextPositionConverter { + public let book: RDEPUBTextBook + + public init(book: RDEPUBTextBook) { + self.book = book + } + + public var totalCharacterCount: Int { + book.indexTable.totalCharacterCount + } + + public func globalIndex(for anchor: RDEPUBTextAnchor) -> Int { + book.indexTable.globalIndex(for: anchor) + } + + public func globalRange(for rangeAnchor: RDEPUBTextRangeAnchor) -> NSRange { + book.indexTable.globalRange(for: rangeAnchor) + } + + public func fileIndex(forCharacterPosition index: Int) -> Int? { + book.indexTable.fileIndex(forCharacterPosition: index) + } + + public func localOffsetInFile(at fileIndex: Int, forGlobalPosition index: Int) -> Int? { + book.indexTable.localOffsetInFile(at: fileIndex, forGlobalPosition: index) + } + + public func anchor(forCharacterPosition index: Int) -> RDEPUBTextAnchor? { + book.indexTable.anchor(forGlobalIndex: index) + } + + public func anchor(for location: RDEPUBLocation) -> RDEPUBTextAnchor? { + book.indexTable.anchor(for: location) + } + + public func pageNumber(for anchor: RDEPUBTextAnchor) -> Int? { + book.indexTable.pageNumber(for: anchor, in: book).map { $0 + 1 } + } + + public func pageNumber(forCharacterPosition index: Int) -> Int? { + guard let anchor = anchor(forCharacterPosition: index) else { + return nil + } + return pageNumber(for: anchor) + } + + public func location( + for anchor: RDEPUBTextAnchor, + bookIdentifier: String? + ) -> RDEPUBLocation? { + guard let chapter = book.chapters.first(where: { $0.spineIndex == anchor.fileIndex }) else { + return nil + } + return book.indexTable.location(for: anchor, in: chapter, bookIdentifier: bookIdentifier) + } + + public func location( + for rangeAnchor: RDEPUBTextRangeAnchor, + bookIdentifier: String? + ) -> RDEPUBLocation? { + guard let chapter = book.chapters.first(where: { $0.spineIndex == rangeAnchor.start.fileIndex }) else { + return nil + } + return book.indexTable.location(for: rangeAnchor, in: chapter, bookIdentifier: bookIdentifier) + } +} diff --git a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift index 7785c9f..84e9af7 100644 --- a/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift +++ b/Sources/RDReaderView/EPUBTextRendering/RDEPUBTextRendererSupport.swift @@ -1,4 +1,5 @@ import UIKit +import CoreText #if canImport(DTCoreText) import DTCoreText @@ -27,6 +28,8 @@ enum RDEPUBTextRendererSupport { private static var didLogFootnoteAttachment = false /// 封面附件日志已输出标记(避免重复日志) private static var didLogCoverAttachment = false + /// 已注册字体资源,避免重复调用 CTFontManager。 + private static var registeredFontPaths = Set() // MARK: - Fragment 标记注入/提取 @@ -209,6 +212,11 @@ enum RDEPUBTextRendererSupport { contentLanguageCode: contentLanguageCode, sourceHTML: rawHTML ) + registerEmbeddedFonts( + in: stylesheetHrefReplacements.inlinedCSS + "\n" + inlineStyleCSS(in: normalizedHTML), + chapterHref: href, + resourceResolver: resourceResolver + ) let htmlWithBase = injectBaseHref(into: stylesheetHrefReplacements.html, baseURL: baseURL) let htmlWithDefaultLayers = injectStyleTag( into: htmlWithBase, @@ -327,6 +335,58 @@ enum RDEPUBTextRendererSupport { return RDEPUBAssetRepository.string(for: asset) } + private static func inlineStyleCSS(in html: String) -> String { + guard let regex = try? NSRegularExpression(pattern: #"]*>([\s\S]*?)"#, options: [.caseInsensitive]) else { + return "" + } + let nsHTML = html as NSString + return regex.matches(in: html, range: NSRange(location: 0, length: nsHTML.length)) + .compactMap { match in + guard match.numberOfRanges > 1 else { return nil } + return nsHTML.substring(with: match.range(at: 1)) + } + .joined(separator: "\n") + } + + private static func registerEmbeddedFonts( + in css: String, + chapterHref: String, + resourceResolver: RDEPUBResourceResolver? + ) { + guard let resourceResolver, + let faceRegex = try? NSRegularExpression(pattern: #"@font-face\s*\{([\s\S]*?)\}"#, options: [.caseInsensitive]), + let urlRegex = try? NSRegularExpression(pattern: #"url\(([^)]+)\)"#, options: [.caseInsensitive]) else { + return + } + + let nsCSS = css as NSString + for faceMatch in faceRegex.matches(in: css, range: NSRange(location: 0, length: nsCSS.length)) { + guard faceMatch.numberOfRanges > 1 else { continue } + let block = nsCSS.substring(with: faceMatch.range(at: 1)) + let nsBlock = block as NSString + for urlMatch in urlRegex.matches(in: block, range: NSRange(location: 0, length: nsBlock.length)) { + guard urlMatch.numberOfRanges > 1 else { continue } + let rawReference = nsBlock.substring(with: urlMatch.range(at: 1)) + .trimmingCharacters(in: CharacterSet(charactersIn: "\"' \n\r\t")) + guard !rawReference.isEmpty, + !rawReference.hasPrefix("data:"), + !rawReference.hasPrefix("http://"), + !rawReference.hasPrefix("https://"), + let fileURL = resourceResolver.fileURL(forReference: rawReference, relativeToHref: chapterHref) else { + continue + } + registerFontIfNeeded(at: fileURL) + } + } + } + + private static func registerFontIfNeeded(at fileURL: URL) { + let standardizedPath = fileURL.standardizedFileURL.path + guard !registeredFontPaths.contains(standardizedPath) else { return } + CTFontManagerRegisterFontsForURL(fileURL as CFURL, .process, nil) + registeredFontPaths.insert(standardizedPath) + } + private static func normalizeAttachmentHTMLMarkers(in html: String) -> String { var normalized = html diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift b/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift index 73051c5..27ec33d 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBPageLayoutSnapshot.swift @@ -64,6 +64,15 @@ struct RDEPUBPageLayoutSnapshot { let layoutFrame: DTCoreTextLayoutFrame #endif + var contentBounds: CGRect { + let rects = lines.map(\.frame) + attachments.map(\.frame) + guard var bounds = rects.first else { return .zero } + for rect in rects.dropFirst() { + bounds = bounds.union(rect) + } + return bounds + } + func line(containing absoluteIndex: Int) -> RDEPUBPageLine? { lines.first { NSLocationInRange(absoluteIndex, $0.stringRange) } } @@ -80,12 +89,44 @@ struct RDEPUBPageLayoutSnapshot { attachments.first { $0.frame.insetBy(dx: -hitSlop, dy: -hitSlop).contains(point) } } + func line(at point: CGPoint, hitSlop: CGFloat = 4) -> RDEPUBPageLine? { + lines.first { line in + let lineRect = CGRect( + x: line.frame.minX, + y: line.baselineOrigin.y - line.ascent, + width: max(line.frame.width, 1), + height: line.ascent + line.descent + line.leading + ) + return lineRect.insetBy(dx: -hitSlop, dy: -hitSlop).contains(point) + } + } + + func run(at point: CGPoint, hitSlop: CGFloat = 4) -> RDEPUBPageRun? { + runs.first { $0.frame.insetBy(dx: -hitSlop, dy: -hitSlop).contains(point) } + } + func rects(containing point: CGPoint, in decorations: [RDEPUBTextOverlayDecoration]) -> [RDEPUBTextOverlayDecoration] { decorations.filter { decoration in decoration.rects.contains { $0.insetBy(dx: -4, dy: -4).contains(point) } } } + func absoluteRange(at point: CGPoint, in decorations: [RDEPUBTextOverlayDecoration]) -> NSRange? { + if let attachment = attachment(at: point) { + return attachment.stringRange + } + if let run = run(at: point) { + return run.stringRange + } + let hitDecorations = rects(containing: point, in: decorations) + if let mostSpecific = hitDecorations.min(by: { lhs, rhs in + lhs.absoluteRange.length < rhs.absoluteRange.length + }) { + return mostSpecific.absoluteRange + } + return line(at: point)?.stringRange + } + #if canImport(DTCoreText) static func build( from layoutFrame: DTCoreTextLayoutFrame, diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift index 9933875..152206f 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderConfiguration.swift @@ -21,6 +21,10 @@ public struct RDEPUBReaderConfiguration: Equatable { public var fontSize: CGFloat /// 行距倍数,默认 1.6(即行距为字号的 1.6 倍) public var lineHeightMultiple: CGFloat + /// 栏数,默认单栏 + public var numberOfColumns: Int + /// 栏间距,默认 20pt + public var columnGap: CGFloat /// 翻页显示模式:.pageCurl(仿真翻页)或 .scroll(滚动阅读) public var displayType: RDReaderView.DisplayType /// 横屏时是否启用双页显示,默认开启 @@ -73,6 +77,8 @@ public struct RDEPUBReaderConfiguration: Equatable { public init( fontSize: CGFloat = 15, lineHeightMultiple: CGFloat = 1.6, + numberOfColumns: Int = 1, + columnGap: CGFloat = 20, displayType: RDReaderView.DisplayType = .pageCurl, landscapeDualPageEnabled: Bool = true, showsTableOfContents: Bool = true, @@ -87,6 +93,8 @@ public struct RDEPUBReaderConfiguration: Equatable { ) { self.fontSize = fontSize self.lineHeightMultiple = lineHeightMultiple + self.numberOfColumns = max(1, numberOfColumns) + self.columnGap = max(0, columnGap) self.displayType = displayType self.landscapeDualPageEnabled = landscapeDualPageEnabled self.showsTableOfContents = showsTableOfContents @@ -115,6 +123,8 @@ extension RDEPUBReaderConfiguration { lineHeightMultiple: lineHeightMultiple, reflowableContentInsets: reflowableContentInsets, fixedContentInset: fixedContentInset, + numberOfColumns: numberOfColumns, + columnGap: columnGap, themeBackgroundColor: theme.themeBackgroundColorCSS, themeTextColor: theme.themeTextColorCSS, fixedBackgroundColor: theme.themeBackgroundColorCSS, @@ -122,4 +132,4 @@ extension RDEPUBReaderConfiguration { fixedLayoutSpreadMode: fixedLayoutSpreadMode ) } -} \ No newline at end of file +} diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift index 9d52d81..520ddb3 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift @@ -106,6 +106,12 @@ public final class RDEPUBReaderController: UIViewController { activeBookmarks } + /// 统一标注语义视图,对标 WXRead 的 WRBookmark 主模型。 + public var annotations: [RDEPUBAnnotation] { + let merged = activeHighlights.map(\.annotation) + activeBookmarks.map(\.annotation) + return merged.sorted { $0.createdAt < $1.createdAt } + } + /// 原始目录树结构 public var tableOfContents: [EPUBTableOfContentsItem] { publication?.tableOfContents ?? [] @@ -164,6 +170,7 @@ public final class RDEPUBReaderController: UIViewController { private var searchState: RDEPUBSearchState? private var lastAppliedViewportSignature: RDEPUBViewportSignature? private var pendingViewportChangeReason: RDEPUBViewportChangeReason? + private var pendingPresentationRestoreLocation: RDEPUBLocation? private var isWaitingForViewportTransitionCompletion = false /// 标记是否通过外部 TextBook 初始化(跳过 EPUB 解析流程) private var isExternalTextBook = false @@ -289,6 +296,7 @@ public final class RDEPUBReaderController: UIViewController { super.viewWillTransition(to: size, with: coordinator) guard didStartInitialLoad else { return } + pendingPresentationRestoreLocation = currentVisibleLocation() ?? persistenceLocation() isWaitingForViewportTransitionCompletion = true coordinator.animate(alongsideTransition: nil) { [weak self] _ in @@ -315,6 +323,7 @@ public final class RDEPUBReaderController: UIViewController { searchState = nil lastAppliedViewportSignature = currentViewportSignature() pendingViewportChangeReason = nil + pendingPresentationRestoreLocation = nil isWaitingForViewportTransitionCompletion = false updateCurrentSelection(nil) readerView.reloadData() @@ -587,17 +596,23 @@ public final class RDEPUBReaderController: UIViewController { } private func applyReaderViewConfiguration() { - let displayTypeDidChange = readerView.currentDisplayType != configuration.displayType - let preservedLocation = displayTypeDidChange ? currentVisibleLocation() : nil + let resolvedDirection = resolvedPageDirection() + let presentationDidChange = readerView.currentDisplayType != configuration.displayType + || readerView.landscapeDualPageEnabled != configuration.landscapeDualPageEnabled + || readerView.pageDirection != resolvedDirection + let preservedLocation = presentationDidChange + ? (pendingPresentationRestoreLocation ?? currentVisibleLocation() ?? persistenceLocation()) + : nil view.backgroundColor = configuration.theme.contentBackgroundColor readerView.landscapeDualPageEnabled = configuration.landscapeDualPageEnabled - readerView.pageDirection = resolvedPageDirection() + readerView.pageDirection = resolvedDirection updateReaderChrome() - if displayTypeDidChange { + if presentationDidChange { readerView.switchReaderDisplayType(configuration.displayType) if let preservedLocation { _ = restoreReadingLocation(preservedLocation) } + pendingPresentationRestoreLocation = nil } } @@ -789,7 +804,8 @@ public final class RDEPUBReaderController: UIViewController { private func repaginatePreservingCurrentLocation() { guard publication != nil else { return } - let restoreLocation = currentVisibleLocation() ?? persistenceLocation() + let restoreLocation = pendingPresentationRestoreLocation ?? currentVisibleLocation() ?? persistenceLocation() + pendingPresentationRestoreLocation = nil paginatePublication(restoreLocation: restoreLocation) } @@ -1042,6 +1058,9 @@ public final class RDEPUBReaderController: UIViewController { settingsController.onLineHeightChange = { [weak self] lineHeightMultiple in self?.updateConfiguration { $0.lineHeightMultiple = lineHeightMultiple } } + settingsController.onColumnCountChange = { [weak self] numberOfColumns in + self?.updateConfiguration { $0.numberOfColumns = numberOfColumns } + } settingsController.onDisplayTypeChange = { [weak self] displayType in self?.updateConfiguration { $0.displayType = displayType } } @@ -1097,6 +1116,8 @@ public final class RDEPUBReaderController: UIViewController { ) -> Bool { oldConfiguration.fontSize != newConfiguration.fontSize || oldConfiguration.lineHeightMultiple != newConfiguration.lineHeightMultiple || + oldConfiguration.numberOfColumns != newConfiguration.numberOfColumns || + oldConfiguration.columnGap != newConfiguration.columnGap || oldConfiguration.reflowableContentInsets != newConfiguration.reflowableContentInsets || oldConfiguration.fixedContentInset != newConfiguration.fixedContentInset || oldConfiguration.fixedLayoutFit != newConfiguration.fixedLayoutFit || @@ -1160,6 +1181,24 @@ public final class RDEPUBReaderController: UIViewController { return nil } + if let textBook, + let chapterData = textBook.chapterData( + for: currentLocation, + resolver: publication.resourceResolver, + bookIdentifier: currentBookIdentifier + ), + let tocItem = chapterData.primaryTableOfContentsItem( + from: publication.tableOfContents, + normalizer: { publication.resourceResolver.normalizedHref($0) } + ) { + return items.last { $0.href == tocItem.href } ?? items.last { + guard let normalizedItemHref = publication.resourceResolver.normalizedHref($0.href.components(separatedBy: "#").first ?? $0.href) else { + return false + } + return normalizedItemHref == normalizedCurrentHref + } + } + return items.last { item in guard let normalizedItemHref = publication.resourceResolver.normalizedHref(item.href.components(separatedBy: "#").first ?? item.href) else { return false @@ -1175,12 +1214,18 @@ public final class RDEPUBReaderController: UIViewController { items.flatMap { item in let location = RDEPUBLocation(bookIdentifier: currentBookIdentifier, href: item.href, progression: 0) let pageNumber: Int? - if let textBook, let publication { - pageNumber = textBook.pageNumber( - for: location, - resolver: publication.resourceResolver, + if let textBook, let publication, + let chapterData = textBook.chapterData(for: location, resolver: publication.resourceResolver, bookIdentifier: currentBookIdentifier) { + let normalizedLocation = publication.resourceResolver.normalizedLocation( + location, bookIdentifier: currentBookIdentifier - ) + ) ?? location + pageNumber = chapterData.pageNumber(for: normalizedLocation) + ?? textBook.pageNumber( + for: location, + resolver: publication.resourceResolver, + bookIdentifier: currentBookIdentifier + ) } else if let readingSession { pageNumber = readingSession.pageIndex(for: location, bookIdentifier: currentBookIdentifier).map { $0 + 1 } } else { @@ -1242,8 +1287,8 @@ public final class RDEPUBReaderController: UIViewController { frameWidth: derivedFrameSize.width, frameHeight: derivedFrameSize.height, edgeInsets: .zero, - numberOfColumns: 1, - columnGap: 20, + numberOfColumns: configuration.numberOfColumns, + columnGap: configuration.columnGap, avoidOrphans: true, avoidWidows: true, avoidPageBreakInsideEnabled: true, @@ -1646,22 +1691,12 @@ extension RDEPUBReaderController { private func pageNumber(for searchMatch: RDEPUBSearchMatch) -> Int? { if let chapterData = textChapterData(forNormalizedHref: searchMatch.href) { - let location = RDEPUBLocation( - bookIdentifier: currentBookIdentifier, - href: chapterData.href, - progression: searchMatch.progression, - lastProgression: searchMatch.progression, - fragment: nil, - rangeAnchor: searchMatch.rangeAnchor - ) - if let pageNumber = chapterData.pageNumber(for: location) { + if let pageNumber = chapterData.pageNumber(for: searchMatch) { return pageNumber } if let rangeLocation = searchMatch.rangeLocation, - let page = chapterData.pages.first(where: { - rangeLocation >= $0.pageStartOffset && rangeLocation <= $0.pageEndOffset - }) { + let page = chapterData.page(containing: rangeLocation) { return page.absolutePageIndex + 1 } } @@ -1822,6 +1857,7 @@ extension RDEPUBReaderController: RDReaderDataSource, RDReaderDelegate { public func readerViewOrientationWillChange(readerView: RDReaderView, isLandscape: Bool) { _ = isLandscape + pendingPresentationRestoreLocation = currentVisibleLocation() ?? persistenceLocation() } } @@ -1958,7 +1994,7 @@ extension RDEPUBReaderController: RDEPUBTextContentViewDelegate { return nil } - let location = textBook.chapterData(for: page.href)?.location(forPage: page, bookIdentifier: currentBookIdentifier) + let location = textBook.chapterData(forPageNumber: pageNumber)?.location(forPage: page, bookIdentifier: currentBookIdentifier) ?? textBook.location(forPageNumber: pageNumber, bookIdentifier: currentBookIdentifier) guard let location else { return nil } @@ -1986,13 +2022,7 @@ extension RDEPUBReaderController: RDEPUBTextContentViewDelegate { } private func nativeTextSnapshot(from textBook: RDEPUBTextBook) -> NativeTextSnapshot { - let chapters = textBook.chapters.map { - EPUBChapterInfo( - spineIndex: $0.spineIndex, - title: $0.title, - pageCount: $0.pages.count - ) - } + let chapters = textBook.chapterInfos let pages = textBook.pages.map { EPUBPage( spineIndex: $0.spineIndex, diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettings.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettings.swift index 4ba204c..5056582 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettings.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettings.swift @@ -112,6 +112,8 @@ public struct RDEPUBReaderSettings: Codable, Equatable { public var fontSize: CGFloat? /// 用户选择的行距倍数,nil 表示使用默认值 public var lineHeightMultiple: CGFloat? + /// 用户选择的栏数,nil 表示使用默认值 + public var numberOfColumns: Int? /// 用户选择的翻页模式,nil 表示使用默认值 public var displayMode: RDEPUBReaderDisplayMode? /// 用户选择的主题预设,nil 表示使用默认值 @@ -122,12 +124,14 @@ public struct RDEPUBReaderSettings: Codable, Equatable { brightness: CGFloat? = nil, fontSize: CGFloat? = nil, lineHeightMultiple: CGFloat? = nil, + numberOfColumns: Int? = nil, displayMode: RDEPUBReaderDisplayMode? = nil, themePreset: RDEPUBReaderThemePreset? = nil ) { self.brightness = brightness self.fontSize = fontSize self.lineHeightMultiple = lineHeightMultiple + self.numberOfColumns = numberOfColumns self.displayMode = displayMode self.themePreset = themePreset } @@ -145,6 +149,9 @@ public struct RDEPUBReaderSettings: Codable, Equatable { if let lineHeightMultiple { resolvedConfiguration.lineHeightMultiple = lineHeightMultiple } + if let numberOfColumns { + resolvedConfiguration.numberOfColumns = max(1, numberOfColumns) + } if let displayMode { resolvedConfiguration.displayType = displayMode.displayType } @@ -169,8 +176,9 @@ public struct RDEPUBReaderSettings: Codable, Equatable { brightness: max(0, min(1, brightness)), fontSize: configuration.fontSize, lineHeightMultiple: configuration.lineHeightMultiple, + numberOfColumns: configuration.numberOfColumns, displayMode: RDEPUBReaderDisplayMode(displayType: configuration.displayType), themePreset: RDEPUBReaderThemePreset(theme: configuration.theme) ) } -} \ No newline at end of file +} diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettingsViewController.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettingsViewController.swift index 95ad62c..a01cf84 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettingsViewController.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettingsViewController.swift @@ -14,6 +14,8 @@ final class RDEPUBReaderSettingsViewController: UIViewController { var onFontSizeChange: ((CGFloat) -> Void)? /// 行距倍数变化回调 var onLineHeightChange: ((CGFloat) -> Void)? + /// 栏数变化回调 + var onColumnCountChange: ((Int) -> Void)? /// 翻页模式变化回调 var onDisplayTypeChange: ((RDReaderView.DisplayType) -> Void)? /// 主题变化回调 @@ -65,6 +67,7 @@ final class RDEPUBReaderSettingsViewController: UIViewController { private let decreaseFontButton = UIButton(type: .system) private let increaseFontButton = UIButton(type: .system) private let lineHeightControl = UISegmentedControl(items: ["紧凑", "标准", "宽松"]) + private let columnCountControl = UISegmentedControl(items: ["单栏", "双栏"]) private let displayTypeControl = UISegmentedControl(items: ["仿真", "横滑", "竖滑"]) private let themeStackView: UIStackView = { let stackView = UIStackView() @@ -136,6 +139,7 @@ final class RDEPUBReaderSettingsViewController: UIViewController { increaseFontButton.addTarget(self, action: #selector(increaseFontAction), for: .touchUpInside) lineHeightControl.addTarget(self, action: #selector(lineHeightChanged(_:)), for: .valueChanged) + columnCountControl.addTarget(self, action: #selector(columnCountChanged(_:)), for: .valueChanged) displayTypeControl.addTarget(self, action: #selector(displayTypeChanged(_:)), for: .valueChanged) ThemePreset.allCases.forEach { preset in @@ -156,6 +160,7 @@ final class RDEPUBReaderSettingsViewController: UIViewController { contentStack.addArrangedSubview(makeSection(title: "亮度", content: brightnessSlider)) contentStack.addArrangedSubview(makeSection(title: "字号", content: makeFontSizeRow())) contentStack.addArrangedSubview(makeSection(title: "行距", content: lineHeightControl)) + contentStack.addArrangedSubview(makeSection(title: "分栏", content: columnCountControl)) contentStack.addArrangedSubview(makeSection(title: "翻页方式", content: displayTypeControl)) contentStack.addArrangedSubview(makeSection(title: "主题", content: themeStackView)) } @@ -203,6 +208,7 @@ final class RDEPUBReaderSettingsViewController: UIViewController { let lineHeightIndex = lineHeightValues.enumerated().min { abs($0.element - currentConfiguration.lineHeightMultiple) < abs($1.element - currentConfiguration.lineHeightMultiple) }?.offset ?? 1 lineHeightControl.selectedSegmentIndex = lineHeightIndex + columnCountControl.selectedSegmentIndex = currentConfiguration.numberOfColumns > 1 ? 1 : 0 switch currentConfiguration.displayType { case .pageCurl: @@ -233,7 +239,7 @@ final class RDEPUBReaderSettingsViewController: UIViewController { button.backgroundColor = theme.toolBackgroundColor } - [lineHeightControl, displayTypeControl].forEach { control in + [lineHeightControl, columnCountControl, displayTypeControl].forEach { control in control.backgroundColor = theme.toolBackgroundColor if #available(iOS 13.0, *) { control.selectedSegmentTintColor = theme.toolControlTextColor.withAlphaComponent(0.14) @@ -289,6 +295,12 @@ final class RDEPUBReaderSettingsViewController: UIViewController { onLineHeightChange?(value) } + @objc private func columnCountChanged(_ control: UISegmentedControl) { + let numberOfColumns = control.selectedSegmentIndex == 1 ? 2 : 1 + currentConfiguration.numberOfColumns = numberOfColumns + onColumnCountChange?(numberOfColumns) + } + @objc private func displayTypeChanged(_ control: UISegmentedControl) { let displayType: RDReaderView.DisplayType switch control.selectedSegmentIndex { @@ -309,4 +321,4 @@ final class RDEPUBReaderSettingsViewController: UIViewController { applyTheme(preset.theme) onThemeChange?(preset.theme) } -} \ No newline at end of file +} diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBSelectionOverlayView.swift b/Sources/RDReaderView/EPUBUI/RDEPUBSelectionOverlayView.swift index 9dc1b22..b8ab531 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBSelectionOverlayView.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBSelectionOverlayView.swift @@ -102,17 +102,8 @@ final class RDEPUBSelectionOverlayView: UIView { } if let snapshot, - let attachment = snapshot.attachment(at: point) { - return attachment.stringRange - } - - if let snapshot { - let hitDecorations = snapshot.rects(containing: point, in: resolvedDecorations) - if let mostSpecific = hitDecorations.min(by: { lhs, rhs in - lhs.absoluteRange.length < rhs.absoluteRange.length - }) { - return mostSpecific.absoluteRange - } + let absoluteRange = snapshot.absoluteRange(at: point, in: resolvedDecorations) { + return absoluteRange } for decoration in resolvedDecorations { diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift b/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift index efd6f88..37829b8 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBTextContentView.swift @@ -383,13 +383,14 @@ final class RDEPUBTextContentView: UIView { return } - let totalLength = max(page.content.length - 1, 1) - let relativeLocation = range.location - page.pageStartOffset + let chapterLength = max(page.chapterContent.length - 1, 1) + let chapterStart = max(range.location, 0) + let chapterEnd = max(chapterStart + range.length - 1, chapterStart) let selection = RDEPUBSelection( location: RDEPUBLocation( href: page.href, - progression: Double(max(relativeLocation, 0)) / Double(totalLength), - lastProgression: Double(max(relativeLocation + range.length - 1, 0)) / Double(totalLength), + progression: Double(chapterStart) / Double(chapterLength), + lastProgression: Double(chapterEnd) / Double(chapterLength), fragment: nil ), text: selectedText, @@ -698,12 +699,12 @@ extension RDEPUBTextContentView: UITextViewDelegate { let globalStart = page.pageStartOffset + selectedRange.location let globalEnd = globalStart + selectedRange.length - let totalLength = max(page.content.length - 1, 1) + let totalLength = max(page.chapterContent.length - 1, 1) let selection = RDEPUBSelection( location: RDEPUBLocation( href: page.href, - progression: Double(selectedRange.location) / Double(totalLength), - lastProgression: Double(max(selectedRange.location + selectedRange.length - 1, 0)) / Double(totalLength), + progression: Double(globalStart) / Double(totalLength), + lastProgression: Double(max(globalEnd - 1, globalStart)) / Double(totalLength), fragment: nil ), text: selectedText, diff --git a/Sources/RDReaderView/ReaderView/RDReaderView.swift b/Sources/RDReaderView/ReaderView/RDReaderView.swift index 0453bc0..2ec1b0a 100644 --- a/Sources/RDReaderView/ReaderView/RDReaderView.swift +++ b/Sources/RDReaderView/ReaderView/RDReaderView.swift @@ -287,6 +287,13 @@ public class RDReaderView: UIView { } } + /// 将页码钳制到当前书籍的合法范围内 + private func clampedPageNumber(_ pageNum: Int) -> Int? { + let totalPages = dataSource?.pageCountOfReaderView(readerView: self) ?? 0 + guard totalPages > 0 else { return nil } + return min(max(pageNum, 0), totalPages - 1) + } + /// 上一次检测到的横竖屏状态,用于在 layoutSubviews 中检测方向变化 private var previousIsLandscape: Bool? @@ -339,6 +346,14 @@ public class RDReaderView: UIView { let boundsSize: CGSize } + /// 当 pageCurl 正在转场时,后续跳转请求会先排队,待当前动画稳定后再执行。 + private struct PageTransitionRequest: Equatable { + let pageNum: Int + let animated: Bool + } + + private var pendingTransitionRequest: PageTransitionRequest? + override init(frame: CGRect) { super.init(frame: frame) } @@ -465,12 +480,41 @@ public class RDReaderView: UIView { guard currentPage >= 0 else { return } DispatchQueue.main.async { [weak self] in guard let self else { return } + self.isTransitioning = false + self.pendingTransitionRequest = nil + self.willPreviousTransitionToViewController = nil + self.willNextTransitionToViewController = nil + self.willTransitionToViewController = nil self.invalidatePageCaches() self.rebuildPageViewController() self.transitionToPage(pageNum: self.currentPage, animated: false) } } + /// pageCurl 动画过程中如果收到新的跳转请求,则排队等待当前动画结束。 + private func shouldQueuePageTransition(_ request: PageTransitionRequest) -> Bool { + guard currentDisplayType == .pageCurl, isTransitioning else { return false } + pendingTransitionRequest = request + return true + } + + /// 收尾 pageCurl 转场,并尝试执行排队中的后续跳转。 + private func finishPageCurlTransition(repairFaultIfNeeded: Bool = true) { + isTransitioning = false + willPreviousTransitionToViewController = nil + willNextTransitionToViewController = nil + willTransitionToViewController = nil + + if repairFaultIfNeeded, detectPageViewControllerFault(pageViewController) { + patchPageViewControllerFault() + return + } + + guard let pendingTransitionRequest else { return } + self.pendingTransitionRequest = nil + transitionToPage(pageNum: pendingTransitionRequest.pageNum, animated: pendingTransitionRequest.animated) + } + // MARK: - Preload / Forecast /// 确保预加载宿主视图已添加到视图层级 @@ -706,6 +750,10 @@ public class RDReaderView: UIView { if didAddToParent { pageViewController.didMove(toParent: parentViewController) } + + if currentDisplayType == .pageCurl, !isTransitioning, pendingTransitionRequest != nil { + finishPageCurlTransition(repairFaultIfNeeded: false) + } } /// 从父控制器和视图层级中移除 pageViewController @@ -900,45 +948,65 @@ public class RDReaderView: UIView { /// - pageNum: 目标页码(item 索引) /// - animated: 是否动画过渡 public func transitionToPage(pageNum: Int, animated: Bool = false) { + guard let safePageNum = clampedPageNumber(pageNum) else { return } switch currentDisplayType { case .pageCurl: + let request = PageTransitionRequest(pageNum: safePageNum, animated: animated) + if shouldQueuePageTransition(request) { + return + } + let isDualPage = landscapeDualPageEnabled && isLandscape // RTL 时动画方向需要反转 let direction: UIPageViewController.NavigationDirection if pageDirection == .rightToLeft { - direction = pageNum > currentPage ? .reverse : .forward + direction = safePageNum > currentPage ? .reverse : .forward } else { - direction = pageNum > currentPage ? .forward : .reverse + direction = safePageNum > currentPage ? .forward : .reverse } + predictedPageDirection = currentPage >= 0 ? safePageNum >= currentPage : nil + attachPageViewControllerIfNeeded() if isDualPage { - let pair = dualPagePair(for: pageNum) + let pair = dualPagePair(for: safePageNum) let leftContent = pageViewForDisplay(pageNum: pair.left) let leftVC = RDReaderPageChildViewController(contentView: leftContent, pageNum: pair.left) + isTransitioning = animated if let rightPage = pair.right { let rightContent = pageViewForDisplay(pageNum: rightPage) let rightVC = RDReaderPageChildViewController(contentView: rightContent, pageNum: rightPage) - pageViewController.setViewControllers([leftVC, rightVC], direction: animated ? direction : .forward, animated: animated, completion: nil) + pageViewController.setViewControllers([leftVC, rightVC], direction: animated ? direction : .forward, animated: animated) { [weak self] _ in + guard let self else { return } + self.finishPageCurlTransition() + } } else { // 封面页独占或奇数最后一页:右侧放空白页 let blankNum = isFullScreenPage(pair.left) ? RDReaderView.blankPageNum : RDReaderView.blankEndPageNum let emptyVC = RDReaderPageChildViewController(contentView: UIView(), pageNum: blankNum) - pageViewController.setViewControllers([leftVC, emptyVC], direction: animated ? direction : .forward, animated: animated, completion: nil) + pageViewController.setViewControllers([leftVC, emptyVC], direction: animated ? direction : .forward, animated: animated) { [weak self] _ in + guard let self else { return } + self.finishPageCurlTransition() + } } currentPage = pair.left primePageCache(around: pair.left, preferredForward: predictedPageDirection) } else { - let contentView = pageViewForDisplay(pageNum: pageNum) - let vc = RDReaderPageChildViewController(contentView: contentView, pageNum: pageNum) - pageViewController.setViewControllers([vc], direction: animated ? direction : .forward, animated: animated, completion: nil) - currentPage = pageNum - primePageCache(around: pageNum, preferredForward: predictedPageDirection) + let contentView = pageViewForDisplay(pageNum: safePageNum) + let vc = RDReaderPageChildViewController(contentView: contentView, pageNum: safePageNum) + isTransitioning = animated + pageViewController.setViewControllers([vc], direction: animated ? direction : .forward, animated: animated) { [weak self] _ in + guard let self else { return } + self.finishPageCurlTransition() + } + currentPage = safePageNum + primePageCache(around: safePageNum, preferredForward: predictedPageDirection) } default: collectionView.reloadData() collectionView.layoutIfNeeded() - collectionView.setContentOffset(layout.currentContentOffset(count: pageNum), animated: animated) - currentPage = pageNum - primePageCache(around: pageNum, preferredForward: predictedPageDirection) + predictedPageDirection = currentPage >= 0 ? safePageNum >= currentPage : nil + collectionView.setContentOffset(layout.currentContentOffset(count: safePageNum), animated: animated) + currentPage = safePageNum + primePageCache(around: safePageNum, preferredForward: predictedPageDirection) } } @@ -1091,15 +1159,13 @@ extension RDReaderView: UIPageViewControllerDataSource, UIPageViewControllerDele } predictedPageDirection = nil - - if detectPageViewControllerFault(pageViewController) { - patchPageViewControllerFault() - } + finishPageCurlTransition() } /// UIPageViewController 代理:即将开始转场动画 /// 记录预测的翻页方向,用于优化预加载策略 public func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { + isTransitioning = true willTransitionToViewController = pendingViewControllers.first if let target = pendingViewControllers.first as? RDReaderPageChildViewController, target.pageNum != RDReaderView.blankPageNum, @@ -1151,6 +1217,9 @@ extension RDReaderView: UICollectionViewDataSource, RDReaderFlowLayoutDelegate, /// 布局代理回调:当前可见页码变化时通知 public func pageNum(flowLayout: RDReaderFlowLayout, pageIndex: Int) { + if currentPage >= 0, currentPage != pageIndex { + predictedPageDirection = pageIndex >= currentPage + } currentPage = pageIndex primePageCache(around: pageIndex, preferredForward: predictedPageDirection) }