- 新增 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>
98 lines
3.9 KiB
Swift
98 lines
3.9 KiB
Swift
|
||
import UIKit
|
||
|
||
public protocol RDEPUBReaderDisplayEnvironment: AnyObject {
|
||
|
||
var currentBrightness: CGFloat { get set }
|
||
|
||
var fallbackViewportSize: CGSize { get }
|
||
}
|
||
|
||
public final class RDEPUBUIScreenEnvironment: RDEPUBReaderDisplayEnvironment {
|
||
public init() {}
|
||
|
||
public var currentBrightness: CGFloat {
|
||
get { CGFloat(UIScreen.main.brightness) }
|
||
set { UIScreen.main.brightness = newValue }
|
||
}
|
||
|
||
public var fallbackViewportSize: CGSize {
|
||
UIScreen.main.bounds.size
|
||
}
|
||
}
|
||
|
||
public struct RDEPUBReaderDependencies {
|
||
|
||
public var environment: any RDEPUBReaderDisplayEnvironment
|
||
|
||
public var makeParser: () -> RDEPUBParser
|
||
|
||
public var makePaginator: () -> RDEPUBPaginator
|
||
|
||
public var makeTextBookBuilder: (RDEPUBTextRenderer, RDEPUBTextBookCache?, RDEPUBTextLayoutConfig) -> RDEPUBTextBookBuilder
|
||
|
||
public var makePlainTextBookBuilder: (RDEPUBTextRenderer, RDEPUBTextLayoutConfig) -> RDPlainTextBookBuilder
|
||
|
||
public var makeTextRenderer: (RDEPUBTextRenderingEngine) -> RDEPUBTextRenderer
|
||
|
||
/// 自定义顶部工具栏工厂;nil 时使用内置 `RDEPUBReaderTopToolView`
|
||
public var makeTopToolView: (() -> RDEPUBReaderTopToolViewProviding)?
|
||
|
||
/// 自定义底部工具栏工厂;nil 时使用内置 `RDEPUBReaderBottomToolView`
|
||
public var makeBottomToolView: (() -> RDEPUBReaderBottomToolViewProviding)?
|
||
|
||
public init(
|
||
environment: any RDEPUBReaderDisplayEnvironment,
|
||
makeParser: @escaping () -> RDEPUBParser,
|
||
makePaginator: @escaping () -> RDEPUBPaginator,
|
||
makeTextBookBuilder: @escaping (RDEPUBTextRenderer, RDEPUBTextBookCache?, RDEPUBTextLayoutConfig) -> RDEPUBTextBookBuilder,
|
||
makePlainTextBookBuilder: @escaping (RDEPUBTextRenderer, RDEPUBTextLayoutConfig) -> RDPlainTextBookBuilder,
|
||
makeTextRenderer: @escaping (RDEPUBTextRenderingEngine) -> RDEPUBTextRenderer,
|
||
makeTopToolView: (() -> RDEPUBReaderTopToolViewProviding)? = nil,
|
||
makeBottomToolView: (() -> RDEPUBReaderBottomToolViewProviding)? = nil
|
||
) {
|
||
self.environment = environment
|
||
self.makeParser = makeParser
|
||
self.makePaginator = makePaginator
|
||
self.makeTextBookBuilder = makeTextBookBuilder
|
||
self.makePlainTextBookBuilder = makePlainTextBookBuilder
|
||
self.makeTextRenderer = makeTextRenderer
|
||
self.makeTopToolView = makeTopToolView
|
||
self.makeBottomToolView = makeBottomToolView
|
||
}
|
||
|
||
/// 构建带加密资源 provider 的默认依赖:
|
||
/// 宿主实现 `RDEPUBResourceDataProvider` 后经此注入,即可打开单文件加密的 EPUB。
|
||
/// - Parameter resourceDataProvider: 解密数据提供者;传 nil 等价于 `.live`
|
||
public static func live(resourceDataProvider: RDEPUBResourceDataProvider?) -> RDEPUBReaderDependencies {
|
||
var dependencies = RDEPUBReaderDependencies.live
|
||
guard let resourceDataProvider else { return dependencies }
|
||
dependencies.makeParser = {
|
||
let parser = RDEPUBParser()
|
||
parser.resourceDataProvider = resourceDataProvider
|
||
return parser
|
||
}
|
||
return dependencies
|
||
}
|
||
|
||
public static var live: RDEPUBReaderDependencies {
|
||
RDEPUBReaderDependencies(
|
||
environment: RDEPUBUIScreenEnvironment(),
|
||
makeParser: { RDEPUBParser() },
|
||
makePaginator: { RDEPUBPaginator() },
|
||
makeTextBookBuilder: { renderer, cache, layoutConfig in
|
||
RDEPUBTextBookBuilder(renderer: renderer, cache: cache, layoutConfig: layoutConfig)
|
||
},
|
||
makePlainTextBookBuilder: { renderer, layoutConfig in
|
||
RDPlainTextBookBuilder(renderer: renderer, layoutConfig: layoutConfig)
|
||
},
|
||
makeTextRenderer: { engine in
|
||
switch engine {
|
||
case .dtCoreText:
|
||
return RDEPUBDTCoreTextRenderer()
|
||
}
|
||
}
|
||
)
|
||
}
|
||
}
|