作者在制作《Ruby on Rails Tutorial》中文版电子书的过程中积累了一些经验,记录如下。
这本书用了 5 个多月的时间才翻译完,其中大概三分之一的时间都用在编写生成电子书所需的工具上了。期间上了两个月晚班,有很多空闲时间,所以我在网上到处搜索可用的工具,用来生成电子书。我的要求很简单:
就这三个简单的要求,我还是没能找到称心的工具。首先被我否定的是 Sphinx 和Pandoc。这两个工具用的人比较多,功能也比较完善,但 Sphinx 只支持 reStructuredText 格式,而且是用 Python 开发的,我不太熟悉这种编程语言,而且我觉得这个工具太复杂。而 Pandoc 很强大,似乎用起来也不复杂,但是还是被否了,原因很简单,Haskell?这是哪个星球的语言?
否了这两个之后,我又接着寻找,这一次集中经历寻找使用 Ruby 开发的工具,结果找到两个,似乎用的人比较多:kitabu 和 bookshop。kitabu 还不错,基本的要求都能满足我的要求,但是看了代码后我才发现自动生成目录大代码对中文完全无用,而且这个 gem 功能又太简单了。bookshop 完全就不支持 Markdown。
又是一阵搜索,最后找到了 easybook,完全能满足我的要求,只有一点,是用 PHP 开发的。本来我想 PHP 就 PHP,反正代码也能看懂,想定制的话也可以,但是当我使用了十几分钟后就决定放弃了,PHP 毕竟还不能胜任 CLI。
找了很多工具,相互比较,也觉得累了,干脆就直接把生成电子书的任务交给 Leanpub吧。动了这个念头之后,我花了点时间熟悉了 Leanpub 的工作流程,也看了生成的文件,但觉得可定制的内容太少了,我是个外观控,如果不能自己定制生成的文件格式,我宁愿不用。所以最后我还是放弃使用 Leanpub。但是,Leanpub 对电子书做的一些处理被我借鉴了,具体内容参见下面的说明。
我决定不在继续找了,所以就总结了一下这几个工具各自的优缺点。最终我决定以 easybook 为蓝本,参照其他几个工具可取的部分,自己编写一个程序,名字嘛就叫做 bookstrap。
其实 bookstrap 只是个 wrapper,使用 Ruby 编写,是个命令行工具,先把 Markdown 转换成 HTML,然后生成 PDF、Epub 和 Mobi 格式电子书。详情如下。
更新(2013-6-3):bookstrap 更名为 burr,并开源:https://github.com/AndorChen/burr
文本肯定要用 Markdown,这是我最熟悉的文本书写语言。决定使用 Markdown 之后就要考虑使用那个工具将其生成 HTML 了,可选的工具太多了,我第一个想到的是redcarpet,我之前使用 Jekyll 开发的网站用的就是这个 gem,而且它还对基本的 Markdown 语法做了一些扩展。不过用起来还是觉得句法太少了,而且这个 gem 是用 C 语言编写的,很难扩展,所以我放弃了。
接下来又找到了 multimarkdown,这是 Markdown 基本语法的一个扩展集,增加了很多实用的句法。但是似乎还是无法满足我的要求,而且相应的转换程序 peg-multimarkdown也是用 C 语言开发的,不易扩展。
最后,我想到了 Leanpub。Leanpub 使用的是 kramdown,所以我决定试一下。kramdown 是使用 Ruby 开发的,很容易扩展语法,试用了一段时间之后,我决定就使用它了。我还开发了 Leanpub 对 kramdown 语法的扩展,这样 Markdown 转换工具就有了。
PDF 制作工具我第一个想到的就是 LATEX,但是它有自己的一套书写语言,而且学习曲线太高。LATEX 其实更适合学术文章,也适合组织或公司使用,个人折腾起来代价太大了。
随后又看了几个生成 PDF 的工具,都不符合我的要求。最后还是选择了 kitabu 等使用的工具:PrinceXML。PrinceXML 是闭源软件,Java 开发,但是可以免费试用,生成的 PDF 首页会加上一个 LOGO。PrinceXML 真正吸引我的是 HTML+CSS 的组合,学过前端开发的人看到这个组合太亲切了。
决定使用 PrinceXML 后,我以 boom 的样式为基础,编写了所需的样式表,加之上一步生成的 HTML,就可以生成一个很漂亮的 PDF 了。
ePub 格式的生成我没有选择 GUI 程序,或者其他命令行工具,而是选择了 Eeepub 这个 gem,因为使用 EeePub 我可以自由控制很多东西。
在生成 ePub 格式时我产生了错觉,仿佛又进入 IE、Chrome、Firefox、Safari 这些浏览器兼容问题的深渊。市面上 ePub 阅读器太多了,而它们对规范的支持很有限,甚或各自有不同的实现方式及扩展,你就要考虑如何最大限度的兼容这些阅读器。其实这里我们可以采用的措施和前端开发一样:优雅降级。对主流阅读器(多看,iBooks)一定要保证所有功能都正确表现,而在其他阅读器中,只要内容能正常显示即可。
生成 ePub 文件后,一定要使用 EpubCheck 检查文件是否有错误。如果有错误一定要按照提示修正,否则可能有些阅读器无法正常显示,或者会导致下一步无法生成 Mobi 格式。
Mobi 格式其实和 ePub 差不多,只是 Kindle 还没提供对 ePub 格式的原生支持,所以必须要为 Kindle 用户考虑,生成 Mobi 格式。生成 Mobi 文件的工具是由 Amazon 开发的kindlegen。这是一个命令行工具,可以直接使用上一步生成的 ePub 文件作为输入。在转换过程中,可能有很多错误提示,一定要及时修正这些错误,否则可能导致 Mobi 文件无法打开。
生成 Mobi 文件后,还可以在 Kindle Previewer 中预览,看一下在各种 Kindle设备中的表现如何。