Logo

Swift Platforms Contact

📚 一个简单的 Swift 库,用于解析 EPUB 文档

注意: 这个库仍处于早期阶段!我将进行实验并修改 API,直到我对结果感到满意为止。我不建议在大型项目中使用这个库,但非常欢迎您的反馈 🙇

安装

Swift Package Manager

添加到 Package.swift

.package(url: "https://github.com/witekbobrowski/EPUBKit.git", from: "0.4.0")

CocoaPods

将以下内容添加到您的 Podfile

pod 'EPUBKit'

用法

基本用法

只需在您的 swift 文件中导入 EPUBKit。

import EPUBKit

使用您的 EPUB 文档的 URL 初始化文档实例。

guard
    let path = Bundle.main.url(forResource: "steve_jobs", withExtension: "epub"),
    let document = EPUBDocument(url: path)
else { return }

如果文档被正确解析,您就可以访问完整的文档元数据、内容等。

print(document.title)
> Steve Jobs
print(document.author)
> Walter Isaacson

高级用法

假设我们正在为 iOS 开发一个应用程序,并且有一个视图控制器以某种方式处理 epub 文档,例如显示列表。

首先,您可以将这两个属性添加到视图控制器中(不要忘记导入库)。

let parser: EPUBParser
let urls: [URL]

var documents: [EPUBDocument] = []

并通过 init 中的依赖注入将缺少的属性提供给 VC。

init(parser: EPUBParser, urls: [URL]) {
    self.parser = parser
    self.urls = urls
    super.init(nibName: nil, bundle: nil)
}

现在,在视图加载后,我们可以将自己设置为解析器的委托(在用 EPUBParserDelegate 协议扩展视图控制器之后,否则会收到错误)。

parser.delegate = self

然后遍历 url 数组,希望正确解析每个文档并将它们附加到先前定义的数组中。

urls.forEach { url in
    guard let document = try? parser.parse(documentAt: url) else { return }
    documents.append(document)
}

基本上就是这样。现在,例如,您可以将解析后的文档传递到表格视图。

采用这种方法有什么优势?首先,它可以重用解析器对象。使用前面提到的 EPUBDocumentinit(url:) 初始化器,我们避免了每次为每个文档实例化它。现在,我们对解析过程本身也有了更多的了解,我们可以使用标准的 swift 方式使用 do-catch 语句检查错误,或者使用委托和 parser(:,didFailParsingDocumentAt:,with:),如果发生错误,它会传递一个错误。最后,我们可以通过在解析过程完成之前开始加载封面等操作来改善用户体验。

随着库的不断发展和 API 越来越丰富,这个库高级用法的可能性将变得越来越方便。

注意: 文档尚未准备就绪,但您应该会发现自己探索 API 很容易 🙃