import Foundation struct RDEPUBChapterOffsetMap { let fragmentOffsets: [String: Int] let pageStartOffsets: [Int] let pageEndOffsets: [Int] let cfiMap: RDEPUBCFIMap? let chapterText: String? func chapterOffset(forFragmentID fragmentID: String) -> Int? { return fragmentOffsets[fragmentID] } func chapterOffset(forCFI rawCFI: String?) -> Int? { guard let cfi = RDEPUBCFICompatibility.parseLossy(rawCFI) else { return nil } let resolved = RDEPUBCFIResolver.resolve(cfi) let lastOffset = max((pageEndOffsets.max() ?? 0), 0) return RDEPUBCFIRecoveryEngine.recover( cfi: cfi, cfiMap: cfiMap, chapterText: chapterText, fragmentOffsets: fragmentOffsets, fallbackOffset: resolved.chapterOffset, lastOffset: lastOffset )?.chapterOffset } func pageIndex(forChapterOffset offset: Int) -> Int? { for i in 0..= pageStartOffsets[i] && offset <= pageEndOffsets[i] { return i } } return nil } }