电子书阅读器上的浏览器 [Day15] 网页汇出成 epub 档案 (I)

为电子书阅读器而开发的浏览器 APP,在绕了一大圈之後,终於又绕回了电子书本身。原本的实作就已经可以将网页输出成 pdf 档案。不过,如果希望产生的档案可以更有弹性地调整字型大小,或是在不同的设备上阅读,转成 epub 格式会是更好的选择。但目前市面上的行动浏览器都没有这样子的设计,顶多提供输出成 pdf,或 mhtml 等格式。

引入函式库

为了在 browser 中加入这功能,当务之急是先找到一个可以在 Android 设备上新增、开启和编辑 epub 的函式库。找来找去,似乎选择也不多,只有 Epublib 是个比较完整的方案。

https://github.com/psiegman/epublib

Epublib 是个纯 Java 的函式库,不过也支援在 Android 系统中使用。虽然它已经很久没有什麽更新了,但看起来功能应该还算符合我的需求。它并没有把它的函式库放在常用的 public repository 中;文件中是建议直接下载 jar 档案,塞在 Android app 中。不过这和发布到 F-Droid 的规则有抵触,所以我去 mavenCentral 找到了其他人帮忙上传的版本。比最新版差了些 commit,但并不影响我需要的功能。

https://search.maven.org/artifact/com.positiondev.epublib/epublib-core

实作

目前我在实作上,会先跳出系统的 document picker ,让使用者建立一个新档名,或是选择一个已经存在的 epub 档案,再把目前网页的 innerHtml 内容取出,利用 Epublib 注入到 epub 档案中,当成一个新的章节。

https://ithelp.ithome.com.tw/upload/images/20210913/20140260n12VJb6PJl.png

677 行的 getRawHtml() 利用注入 javasript 取得 raw html。拿到手的 raw html 还不行直接拿来用,因为它里头有些字元已经被转换过了,需要加入

implementation 'org.apache.commons:commons-text:1.7'

https://ithelp.ithome.com.tw/upload/images/20210913/20140260AjcoVrfx8C.png

然後呼叫 StringEscapeUtils.unscapeJava() ,还原成可用的字串。

电子书名及章节名称

getBookName()getChapterName() 都会跳出 AlertDialog 让使用者输入字串。因为不想再用 callback 的方式,所以把它们都包成 suspendCoroutine,让程序好读一点。

getChapterName() 为例,在代入恰当的参数到 TextInputDialog 後,就可以得到想要的章节名称。

https://ithelp.ithome.com.tw/upload/images/20210913/20140260M3ki9U7Esb.png

TextInputDialog 只是很单纯地实作了 show(),在使用者有任何互动後,把字串传出。

https://ithelp.ithome.com.tw/upload/images/20210913/20140260tsSOmPNzaC.png

待改进的地方

目前只能把纯文字的资料存进 epub 档案里。在下一回会介绍如何把网页中的图片也存到 epub 档案中,让产生的 epub 更有价值。

参考原始码连结

v8.6.0 https://github.com/plateaukao/browser/releases/tag/v8.6.0


<<:  [Day14]C# 鸡础观念- 不同层次的阵列~二维阵列

>>:  DAY 3 『 RGB调色盘 - 每个物件的功能 』Part2

用 cv 2 、tkinter 实现选择路径打开照片并显示照片、照片直方图 histogram

实现思维: 一、用 tkinker file ask 方法配合按钮,执行按钮就开始选择路径照片, 并...

D-20. 预设更改DBMS 、bundle指令 、Gemfile && Reverse String II && III

开始Rails new前新手可以先做的。 Rails是允许客制生成框架内容的,下方即为指令,会出现很...

学习笔记:一起进入 PixiJS 的世界 (二)

开始绘图吧! 有了基础场景後,就可以开始画图了,首先使用new建构出PIXI.Graphics()图...

#18 No-code 之旅 — 读取资料库来实作部落格 ft. Notion SDK

嗨大家~ 像昨天文章里提的,这专案会采用 Notion 来当 CMS (包含资料库),意思是部落格文...

【Day 29】心法与招式并用 x AWS SDK x Python

tags: 铁人赛 SDK AWS Python 前言 杨过先背起全真教心法之後,才去练古墓派招式。...