- Refactor chapter runtime: replace window coordinator/snapshot with warmup orchestrator - Update EPUB core: parser, reading session, JS bridge, navigator layout - Update reader controller: data source, location resolution, persistence - Update chapter runtime: data cache, loader, runtime store, disk cache, warmup orchestrator - Remove deprecated navigation state machine and pagination state - Update text rendering: book cache, HTML normalizer - Update UI: text content view, dark image adjuster, text selection controller - Update settings and reader configuration - Add CODE_REVIEW.md and AUDIT_FINAL.md documentation - Update pod dependencies (remove SSAlertSwift, SnapKit) - Update podspec and pod configuration files Co-Authored-By: Claude <noreply@anthropic.com>
74 lines
2.7 KiB
Swift
74 lines
2.7 KiB
Swift
import UIKit
|
|
|
|
final class RDEPUBReaderEnvironment {
|
|
|
|
weak var controller: RDEPUBReaderController?
|
|
|
|
weak var readerView: RDReaderView?
|
|
|
|
var displayEnvironment: any RDEPUBReaderDisplayEnvironment
|
|
|
|
init(
|
|
controller: RDEPUBReaderController,
|
|
readerView: RDReaderView,
|
|
displayEnvironment: any RDEPUBReaderDisplayEnvironment
|
|
) {
|
|
self.controller = controller
|
|
self.readerView = readerView
|
|
self.displayEnvironment = displayEnvironment
|
|
}
|
|
|
|
func currentLayoutContext(configuration: RDEPUBReaderConfiguration) -> RDEPUBNavigatorLayoutContext {
|
|
let containerSize = readerView?.bounds.size ?? .zero
|
|
let viewSize = controller?.view.bounds.size ?? containerSize
|
|
let resolvedSize = containerSize == .zero ? viewSize : containerSize
|
|
return RDEPUBNavigatorLayoutContext(
|
|
containerSize: resolvedSize,
|
|
pagesPerScreen: readerView?.pagesPerScreen ?? 1,
|
|
safeAreaInsets: controller?.view.safeAreaInsets ?? .zero,
|
|
userInterfaceIdiom: controller?.traitCollection.userInterfaceIdiom ?? .phone,
|
|
reflowableContentInsets: configuration.reflowableContentInsets
|
|
)
|
|
}
|
|
|
|
func currentTextRenderStyle(configuration: RDEPUBReaderConfiguration) -> RDEPUBTextRenderStyle {
|
|
let font = configuration.fontChoice.font(ofSize: configuration.fontSize)
|
|
let lineSpacing = max(font.lineHeight * (configuration.lineHeightMultiple - 1), 4)
|
|
return RDEPUBTextRenderStyle(
|
|
font: font,
|
|
lineSpacing: lineSpacing,
|
|
textColor: configuration.theme.contentTextColor,
|
|
backgroundColor: configuration.theme.contentBackgroundColor
|
|
)
|
|
}
|
|
|
|
func currentTextLayoutConfig(
|
|
configuration: RDEPUBReaderConfiguration,
|
|
pageSize: CGSize
|
|
) -> RDEPUBTextLayoutConfig {
|
|
let layoutContext = currentLayoutContext(configuration: configuration)
|
|
return RDEPUBTextLayoutConfig(
|
|
frameWidth: max(pageSize.width, 1),
|
|
frameHeight: max(pageSize.height, 1),
|
|
edgeInsets: layoutContext.safeReflowableContentInsets,
|
|
numberOfColumns: configuration.numberOfColumns,
|
|
columnGap: configuration.columnGap,
|
|
avoidOrphans: false,
|
|
avoidWidows: false,
|
|
avoidPageBreakInsideEnabled: true,
|
|
hyphenation: true,
|
|
imageMaxHeightRatio: 0.85,
|
|
fallbackViewportSize: displayEnvironment.fallbackViewportSize
|
|
)
|
|
}
|
|
|
|
var currentBrightness: CGFloat {
|
|
get { displayEnvironment.currentBrightness }
|
|
set { displayEnvironment.currentBrightness = newValue }
|
|
}
|
|
|
|
var fallbackViewportSize: CGSize {
|
|
displayEnvironment.fallbackViewportSize
|
|
}
|
|
}
|