参考原文:EPUB弹出窗口式脚注
网上搜到一些国学典籍的EPUB版,虽有古人的注解,但正文和注解混排在一起,当我只想迅速读正文的时候比较碍眼。于是研究了一下 EPUB3 中有关脚注(footnote)的规格定义,写了一个 Python 脚本把所有混在正文中的脚注全部改写成了弹出窗口样式,在 iBooks 里测试通过,略记一笔。
什么是EPUB弹出窗口式脚注
弹出式脚注是 EPUB3 推出的,简单的说就是正文中加一个链接锚点,对应一个脚注模块,点击链接的时候,脚注内容会直接以弹出窗口的形式显示出来。这样就省去了页面跳转这个步骤,更加方便阅读。
一图胜千言,下图是脚本处理后的《三国志》(这个还是混排版的)在 iPad 版 iBooks 下的效果。(原本是像日文电子书那样的竖排EPUB,我把 CSS 里和竖排相关的定义注释掉了)
如何实现EPUB弹出窗口式脚注
要实现这种效果,有三个注意点。
1.正文中的链接锚点。
<p> 太祖武皇帝,沛國譙人也,姓曹,諱操,字孟德,漢相國參之後。 <a epub:type="noteref" href="#fn1"> <sup>1</sup> </a> 桓帝世,曹騰為中常侍大長秋,封費亭侯。 ...... </p>
2.脚注aside模块
<aside epub:type="footnote" id="fn1">〔曹瞞傳曰:太祖一名吉利,小字阿瞞。王沈魏書曰:其先出於黃帝。當高陽世,陸終之子曰安,是為曹姓。周武王克殷,存先世之後,封曹俠於邾。春秋之世,與於盟會,逮至戰國,為楚所滅。子孫分流,或家於沛。漢高祖之起,曹參以功封平陽侯,世襲爵士,絶而復紹,至今適嗣國於容城。〕 </aside>
在 iBooks 下,如果 epub:type
属性的值为 footnote
,这个 aside
会默认隐藏。只有对应的链接被点击时,其内容才会在弹出窗口中显示。
3.epub 命名空间(namespace)。
上面两处都有一个共同的属性名,epub:type
。一般 EPUB 文档都没有定义 epub 这个命名空间,所以满足以上两点之后直接打开会提示 epub 命名空间没有定义。EPUB 定义 namespace 有两种方式,一种是在 CSS 里定义,一种是在内容页的HTML标签里定义。我测试过,iBooks 无法识别 CSS 里定义的 namespace,所以我采用了另外一种方式。
<html xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:epub="http://www.idpf.org/2007/ops">
用Python脚本处理EPUB的HTML文档
了解了这些基本概念之后,再来看要处理的对象。原EPUB文档中注解夹杂在正文中,以span
标签标记,所以 Python 脚本的基本流程就比较清楚了,这里使用 BeautifulSoup 来解析并更改 HTML 文档树。
- 循环读入所有 EPUB 内容文档并解析
- 给
html
标签加上 epub 命名空间定义 - 获取
p
标签下的 所有span
标签 - 遍历获取的
span
标签,取出文本,并以此创建aside
模块 - 清除
span
标签的内容,更改为链接锚点
原 EPUB 中的 HTML 文档节选 :
<p>太祖武皇帝,沛國譙人也,姓曹,諱操,字孟德,漢相國參之後。 <span class="zhushi"> 〔曹瞞傳曰:太祖一名吉利,小字阿瞞。王沈魏書曰:其先出於黃帝。當高陽世,陸終之子曰安,是為曹姓。周武王克殷,存先世之後,封曹俠於邾。春秋之世,與於盟會,逮至戰國,為楚所滅。子孫分流,或家於沛。漢高祖之起,曹參以功封平陽侯,世襲爵士,絶而復紹,至今適嗣國於容城。〕 </span> 桓帝世,曹騰為中常侍大長秋,封費亭侯。 ...... </p>
时间: 2024-09-29 08:51:25