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 017734e..447cab9 100644 Binary files a/ReadViewDemo/ReadViewDemo.xcworkspace/xcuserdata/shen.xcuserdatad/UserInterfaceState.xcuserstate and b/ReadViewDemo/ReadViewDemo.xcworkspace/xcuserdata/shen.xcuserdatad/UserInterfaceState.xcuserstate differ 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) }