為電子書閱讀器而開發的瀏覽器 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 檔案中,當成一個新的章節。
677 行的 getRawHtml()
利用注入 javasript 取得 raw html。拿到手的 raw html 還不行直接拿來用,因為它裡頭有些字元已經被轉換過了,需要加入
implementation 'org.apache.commons:commons-text:1.7'
然後呼叫 StringEscapeUtils.unscapeJava()
,還原成可用的字串。
getBookName()
和 getChapterName()
都會跳出 AlertDialog
讓使用者輸入字串。因為不想再用 callback 的方式,所以把它們都包成 suspendCoroutine
,讓程式好讀一點。
以 getChapterName()
為例,在代入恰當的參數到 TextInputDialog
後,就可以得到想要的章節名稱。
而 TextInputDialog
只是很單純地實作了 show()
,在使用者有任何互動後,把字串傳出。
目前只能把純文字的資料存進 epub 檔案裡。在下一回會介紹如何把網頁中的圖片也存到 epub 檔案中,讓產生的 epub 更有價值。
v8.6.0 https://github.com/plateaukao/browser/releases/tag/v8.6.0