- 实现EPUB阅读器搜索功能及选中注释功能 - 优化CFI模块,修复代码审查发现的11个问题 - 实现大书远距目录跳转与后台补全优化方案 - 优化设置面板与章节运行时联动 - 重构及大量改进优化
52 lines
1.6 KiB
Swift
52 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
public struct RDEPUBCFIResolverResult: Equatable {
|
|
|
|
public var href: String?
|
|
|
|
public var fileIndex: Int?
|
|
|
|
public var chapterOffset: Int?
|
|
|
|
public var fragmentID: String?
|
|
|
|
public init(href: String? = nil, fileIndex: Int? = nil, chapterOffset: Int? = nil, fragmentID: String? = nil) {
|
|
self.href = href
|
|
self.fileIndex = fileIndex
|
|
self.chapterOffset = chapterOffset
|
|
self.fragmentID = fragmentID
|
|
}
|
|
}
|
|
|
|
public enum RDEPUBCFIResolver {
|
|
|
|
public static func resolve(_ cfi: RDEPUBCFI) -> RDEPUBCFIResolverResult {
|
|
|
|
// EPUB CFI spec: package path structure is /6/2[spine]/2n[manifest-id]
|
|
// Manifest step is always the 3rd step (index 2) if present, or the last step with an id assertion.
|
|
let manifestStep: RDEPUBCFIStep?
|
|
if cfi.packagePath.steps.count >= 3 {
|
|
manifestStep = cfi.packagePath.steps[2]
|
|
} else {
|
|
manifestStep = cfi.packagePath.steps.last(where: { $0.idAssertion?.rd_cfiNilIfEmpty != nil })
|
|
}
|
|
let href = manifestStep?.idAssertion
|
|
|
|
// Spine step is the 2nd step (index 1) in the package path
|
|
let fileIndex: Int?
|
|
if cfi.packagePath.steps.count >= 2 {
|
|
fileIndex = max((cfi.packagePath.steps[1].index / 2) - 1, 0)
|
|
} else {
|
|
fileIndex = nil
|
|
}
|
|
|
|
let fragmentID = cfi.contentPath.steps.last(where: { $0.idAssertion?.rd_cfiNilIfEmpty != nil })?.idAssertion
|
|
return RDEPUBCFIResolverResult(
|
|
href: href,
|
|
fileIndex: fileIndex,
|
|
chapterOffset: cfi.characterOffset,
|
|
fragmentID: fragmentID
|
|
)
|
|
}
|
|
}
|