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() } } ) } }