第三章的结尾,咱们说到从FBReaderApp类的openBookInternal方法,就要开始对epub文件的处理流程了。 javascript
在对这个流程进行详细的分析以前,咱们有必要先用一个章节详细介绍一下epub文件的内部组成。 css
首先,epub文件一种压缩文件,是压缩格式是与zip压缩文件是同样的。换一句话说,epub文件是能够用支持zip格式的解压缩文件解压的(有些软件不能识别epub后缀名,须要手动把.epub的后缀名改为.zip)。 html
把epub文件解压以后,打开文件夹,咱们能够看到有以下的文件与文件夹,咱们一个一个来看一下。 java
这个文件文件夹的名字翻译成中文就是“元信息”。文件夹里面只有一个container.xml文件 app
文件的内容以下: 测试
这段内容的做用就是标明了.opf文件的位置。这个.opf文件是一个很重要的文件,它记录了epub文件内部各个文件的具体信息,咱们会在介绍OPS文件夹的时候详细介绍这个文件。 ui
程序必须正确解析.opf文件的内容后才能正常运行,可是.opf这个文件的文件名自己倒是能够自定义的,也就是说,不一样的epub文件里面可能包含不一样名字、位于不一样行位置的.opf文件。那么,如何确保程序可以正确找到并解析.opf文件呢,就是经过container.xml这个文件来指定.opf文件。正是基于这个缘由,epub文件的标准里规定“EPUB 根目录下必须包含 META-INF 目录,并且其中必需要有一个文件 container.xml”(引用自http://blog.sina.com.cn/s/blog_6441e0640100gmhv.html)。 spa
你们能够试一下,若是你把解压后的epub文件里的container.xml文件更名后再从新压缩成epub文件,程序就会报错。 .net
OPS文件夹主要包含三种重要的文件.opf文件、ncx文件、.xhtml文件。同时,还可能会有css文件和图片文件。下面详细介绍下这些文件。 翻译
opf表明“Open Packaging Format”,意译成中文差很少应该是“EPUB文件包格式”。咱们说过epub文件是个zip压缩文件,opf文件的做用能够被理解为描述了EPUB文件解压后,内部各个文件和文件夹的名字、位置等信息。
.opf文件主要包含三个主要的节点metadata、manifest、spine,这个三个节点分别描述了不一样信息。
其中,metadata节点定义了epub的做者、书名、语言等元信息。这些元信息大部分都在dc的命名空间下。dc表明Dublin Core,意指国际组织“Dublin Core Metadata Initiative”定义的标准。
manifest节点的做用是描述epub文件内部对应不一样章节对应的文件的位置。manifest节点在这里的做用有点像以前提到的container.xml文件:container定义了.opf文件的位置,而manifest节点中的item子节点的href属性则定义了含有对应每一个章节的文件的位置。
spine节点的做用是定义读者在顺序阅读时,每一个章节出现的前后次序。linear这个节点的做用是这样的:“ EPUB 规范的阅读系统将首先打开 spine 中没有设置为 linear=no 中的第一项”。因此,“建议将封面定义为 linear=no”。(引用自http://blog.sina.com.cn/s/blog_6441e0640100gmi8.html)
咱们能够看到,咱们的测试epub文件彷佛并无严格按照epub规范将封面的linear属性设置为“no”。正由于如此,第一次打开测试文件的时候,默认的第一页是封面而不是正文。
ncx表明“Navigation Center eXtended”,意思大体就是导航文件,这个文件与目录有直接的关系。
.ncx文件中最主要的节点是navMap。navMap节点是由许多navPoint节点组成的。而navPoint节点则是由navLabel、content两个子节点组成。
navPoint节点中,playOrder属性定义当前项在目录中显示的次序。
navLabel子节点中的text节点定义了每一个目录的名字。
content子节点的src属性定义了对应每一个章节的文件的具体位置。
看到这里,可能会有有人以为.opf文件与.ncx文件有一点重复:.opf文件的item节点中的href属性描述了各个章节文件的位置与顺序,.ncx文件中的conten节点中的src属性也描述了各个章节文件的位置与顺序。其实他们仍是有区别的,区别就在于,.opf文件定义的是读者在顺序阅读时会用到的章节文件与它们的顺序,.ncx文件则定义的是目录中会用到的章节文件与它们的顺序。若是存在某些附件性质的内容被但愿在目录中出现,但却不但愿在读者顺序阅读的时候出现时,那么就能够经过对.opf文件和.ncx文件进行不一样的设置来达到这个目的。固然,大部分的时候,.opf与.ncx这两个文件的内容基本是重合的。
.xhtm文件就是存储每一个章节具体内容。按照epub的规范,存储具体内容的文件应该是xhtml为后缀名(参照http://zh.wikipedia.org/wiki/EPUB),可是彷佛并非每一个epub里面都用xhtml做为存储具体内容的文件的后缀名。好比,咱们的测试文件就使用了html做为后缀名,我还看到过htm做为后缀名的。但其实无论用什么做为后缀名都不会有问题,由于在.opf和.ncx文件已经准肯定义文件的位置和后缀名。同时,无论epub文件使用了什么后缀名,FBReader程序都是使用XHTMLReader类来处理这些文件。
样式文件的做用是定义一些文本信息显示的格式。并非每个epub文件内部都会附有样式文件,没有样式文件的状况下,就会使用程序默认的样式文件。
在FBReader程序1.0的版本里面并无专门读取epub文件内部样式文件的类。1.0的版本直接使用了/asstes/default/style.xml做为默认的样式文件。不论是epub文件是否附有自带的样式文件文件,1.0的版本都使用的是这一套样式文件的格式。2.0的版本增长了读取自定义样式文件文件的功能。你们能够在1.0版本和2.0版本下分别打开Quiet这本书(这个文件只做为测试用,请支持正版,多看中译版购买地址),就能够明显看到样式文件格式的不一样。
1.0版本中的css解析类:ZLTextStyleCollection类
2.0的版本中的样式文件解析类:
1.0版本显示效果:
2.0版本显示效果(标题与小字部分都使用epub文件内置的样式文件)
图片文件通常集中存储在一个文件夹里面。最多见的图片的文件就是封面图片。封面图片的位置会在.opf文件标明。
这个文件的内容很简单,只有一行:application/epub+zip。其实这行内容就是代表了epub文件的mimetype属性。搞过网页的朋友应该挺熟悉这个mimetype属性的,html文件的mimetype属性就是text/html,样式文件文件的mimetype属性是text/样式文件,js文件的mimtype属性则是application/javascript。
根据epub的标准,epub根目录下必须包含mimetype文件,文件名与内容都不能变。不过,我仔细看了下FBReader代码,并无发现专门针对这个文件的部分。我有试着把这个miemtype文件删掉而后再从新压缩成epub文件。FBReader程序仍是能正常打开这个文件。总而言之,按照标准,mimetype文件必须有,并且文件名与内容都不能变。不过,实际操做起来,没有mimetype文件,FBReader同样能正常打开epub文件。
若是你们想更深刻得了解epub文件的组成,能够参考下这个博客的相关内容。
http://blog.sina.com.cn/s/blog_6441e0640100gmfe.html
http://blog.sina.com.cn/s/blog_6441e0640100gmhv.html
http://blog.sina.com.cn/s/blog_6441e0640100gmi8.html
http://blog.sina.com.cn/s/blog_6441e0640100gmj9.html