36 lines
1.3 KiB
Swift
36 lines
1.3 KiB
Swift
import Foundation
|
|
|
|
struct RDEPUBResolvedPage {
|
|
let page: RDEPUBTextPage
|
|
let chapter: RDEPUBRuntimeChapter
|
|
let chapterIndex: Int
|
|
}
|
|
|
|
final class RDEPUBPageResolver {
|
|
private unowned let context: RDEPUBReaderContext
|
|
private let store: RDEPUBChapterRuntimeStore
|
|
|
|
init(context: RDEPUBReaderContext, store: RDEPUBChapterRuntimeStore) {
|
|
self.context = context
|
|
self.store = store
|
|
}
|
|
|
|
func resolvePage(absolutePageIndex: Int) -> RDEPUBResolvedPage? {
|
|
guard let bookPageMap = context.bookPageMap,
|
|
let spineIndex = bookPageMap.spineIndex(forAbsolutePage: absolutePageIndex),
|
|
let localPageIndex = bookPageMap.localPageIndex(forAbsolutePage: absolutePageIndex),
|
|
let chapter = store.chapterData(for: spineIndex),
|
|
chapter.pages.indices.contains(localPageIndex),
|
|
let chapterIndex = bookPageMap.chapterIndex(forSpineIndex: spineIndex) else {
|
|
return nil
|
|
}
|
|
|
|
var page = chapter.pages[localPageIndex]
|
|
page.absolutePageIndex = absolutePageIndex
|
|
page.chapterIndex = chapterIndex
|
|
page.pageIndexInChapter = localPageIndex
|
|
page.totalPagesInChapter = chapter.pages.count
|
|
return RDEPUBResolvedPage(page: page, chapter: chapter, chapterIndex: chapterIndex)
|
|
}
|
|
}
|