一直在看 Epub 类型的图书, 很好奇一个 Epub 解析器是如果工作的。 碰巧看到了 Epub.js, 体验了一下还可以。 就尝试分析一下它的实现。本文会先介绍下 EPUB 格式,再来分析 Epubjs 的实现. 我前端经验仅限于了解常见标签含义,可能会有各种错误恳请斧正。
EPub是一个自由的开放标准,属于一种可以“自动重新排版”的内容;也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示。EPub档案内部使用了XHTML或DTBook(一种由DAISY Consortium提出的XML标准)来展现文字、并以zip压缩格式来包裹档案内容。EPub格式中包含了数位版权管理(DRM)相关功能可供选用
以上来自维基百科: https://zh.wikipedia.org/wiki/EPUB
本文参考的规范为: Epub 3.2该规范发布于 2019-05-08, 定义了 EPUB 图书格式和 EPUB 图书的浏览器应实现的功能. Epub格式由以下规范组成:
如下图: EPUB图书的内容是由一个或多个Rendition组成,每个Rendition都由所谓的EPUB Package 表示。 EPUB Package包含呈现内容所需的所有资源。其中的关键文件是Package Document,它包括阅读系统用于向用户呈现EPUB图书的所有元数据(例如标题和作者等)。它还提供了一个完整的资源清单,并包括一个 SPINE
(用来表是文档出现的顺序)。 EPUB Package还包括另一个称为EPUB Navigation Document的文件。本文档提供了导航功能,例如目录,允许用户快速轻松地导航内容。 EPUB 图书的资源捆绑在一个基于 ZIP 的文件中,文件扩展名为.epub. 作为符合 ZIP 格式的文件,EPUB 出版物可以被许多软件程序解压缩,从而简化了它们的使用。
application/epub+zip
内容如下: 其中rootfile指定了package file
Package 文件, 定义了书籍的 meta 信息, 资源列表和阅读顺序(Spine) 内容如下:
Calvin用来演示 EPUBJS 的书Calvin Wangurn:uuid:5F1E4C07-2A52-48BC-BBA5-E98564559794zh-CN 2021-11-14T08:32:29Z ß
<--!CoverPage-->Cover Page