import Foundation public final class RDEPUBPublication { public let parser: RDEPUBParser public let resourceResolver: RDEPUBResourceResolver public init(parser: RDEPUBParser) { self.parser = parser self.resourceResolver = RDEPUBResourceResolver(parser: parser) } public var metadata: RDEPUBMetadata { parser.metadata } public var manifest: [String: RDEPUBManifestItem] { parser.manifest } public var spine: [RDEPUBSpineItem] { parser.spine } public var tableOfContents: [EPUBTableOfContentsItem] { parser.tableOfContents } public var layout: RDEPUBLayout { metadata.layout } public var readingProfile: RDEPUBReadingProfile { parser.readingProfile() } public var readingProgression: RDEPUBReadingProgression { metadata.readingProgression } public var bookIdentifier: String? { metadata.identifier } public func fixedLayoutSpreadEnabled(for preferences: RDEPUBPreferences, viewportSize: CGSize) -> Bool { guard layout == .fixed else { return false } guard metadata.spread?.lowercased() != "none" else { return false } switch preferences.fixedLayoutSpreadMode { case .never: return false case .always: return spine.count > 1 case .automatic: return viewportSize.width > viewportSize.height } } public func makeFixedSpreads(preferences: RDEPUBPreferences, viewportSize: CGSize) -> [EPUBFixedSpread] { EPUBFixedSpread.makeSpreads( spine: spine, spreadEnabled: fixedLayoutSpreadEnabled(for: preferences, viewportSize: viewportSize) ) } }