- 新增 RDEPUBResourceDataProvider 解密钩子协议 + 访问登记表,收敛章节 HTML/ 图片/内联 CSS/脚注/封面/图片查看器/正文取图等读取点,scheme handler 对加密书 禁用流式分支;新增 RDEPUBDecryptingImageAttachment 解密 DTCoreText 图片附件; RDEPUBReaderDependencies.live(resourceDataProvider:) 便捷注入。明文书零影响。 - 试读墙:configuration.trialPolicy + delegate epubReaderTrialWallView/ DidReachTrialWall,UI 由宿主提供(RDEPUBReaderController+Trial)。 - 工具栏定制:RDEPUBReaderTop/BottomToolViewProtocol 协议 + dependencies 工厂注入, 内置栏已 conform,configureTopToolView 改协议类型。 - 朝向锁定:RDEPUBMetadata.orientation(OPF rendition:orientation 主, iBooks display-options 兜底)+ RDEPUBReaderController+Orientation 重写支持朝向、 打开后主动转向。 注:RDEPUBReaderController+LocationResolution / PaginationCoordinator 为本次改动前 即存在的工作区修改,一并纳入。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
61 lines
2.0 KiB
Swift
61 lines
2.0 KiB
Swift
import UIKit
|
||
|
||
final class RDEPUBImageViewerCoordinator {
|
||
|
||
private weak var presentingController: UIViewController?
|
||
private let theme: RDEPUBReaderTheme
|
||
|
||
init(presentingController: UIViewController, theme: RDEPUBReaderTheme) {
|
||
self.presentingController = presentingController
|
||
self.theme = theme
|
||
}
|
||
|
||
// MARK: - From Native Text Path (UIImage already resolved)
|
||
|
||
func presentImage(_ image: UIImage, sourceRect: CGRect? = nil, altText: String? = nil) {
|
||
let config = RDEPUBImageViewController.Configuration(
|
||
image: image,
|
||
sourceRect: sourceRect,
|
||
altText: altText,
|
||
theme: theme
|
||
)
|
||
let viewerVC = RDEPUBImageViewController(configuration: config)
|
||
presentingController?.present(viewerVC, animated: true)
|
||
}
|
||
|
||
// MARK: - From WebView Path (need to resolve from src URL)
|
||
|
||
func presentImageFromWebView(
|
||
src: String,
|
||
baseHref: String?,
|
||
resourceResolver: RDEPUBResourceResolver
|
||
) {
|
||
guard let image = loadImage(src: src, baseHref: baseHref, resourceResolver: resourceResolver) else {
|
||
return
|
||
}
|
||
presentImage(image)
|
||
}
|
||
|
||
// MARK: - Private
|
||
|
||
private func loadImage(
|
||
src: String,
|
||
baseHref: String?,
|
||
resourceResolver: RDEPUBResourceResolver
|
||
) -> UIImage? {
|
||
let pathPart = src.components(separatedBy: "#").first ?? src
|
||
guard !pathPart.isEmpty else { return nil }
|
||
|
||
let fileURL: URL?
|
||
if let baseHref {
|
||
fileURL = resourceResolver.fileURL(forReference: pathPart, relativeToHref: baseHref)
|
||
} else {
|
||
let normalized = resourceResolver.normalizedHref(pathPart)
|
||
fileURL = normalized.flatMap { resourceResolver.fileURL(forRelativePath: $0) }
|
||
}
|
||
|
||
// 经统一资源入口读取:加密图片由 provider 解密,明文图片直读磁盘
|
||
guard let fileURL, let data = resourceResolver.resourceData(at: fileURL) else { return nil }
|
||
return UIImage(data: data)
|
||
}
|
||
} |