開發node桌面級應用工具:apk轉化epub

隨着蘋果ibooks對國內的開放,最近接了個麻煩的需求:css

把現有的APK轉化支持蘋果ibooks電子書的epub格式html

  • apk,基本都知道就是安卓的應用程序
  • epub,是ibooks支持的電子書格式 (xhtml組成的靜態多頁面)

這apk與epub兩個徹底不是一個世界的東西,怎麼能關聯並轉化?node

由於我司產出的APK應用是經過phonegap打包的SPA應用,這也是一套黑科技,經過ppt批量生成應用,本質上仍是web那一套,因此給epub轉化提供契機git

經過H5寫應用已經流行幾年了,這裏也很少說了,如流行的phonegap國產appcan、APICloud和HBuilder之類的打包工具太多了,本質上基本差不都,若是沒有接觸的能夠看看github

這是一個APKweb

image

APK解壓後的文件結構ajax

image

其中assets就是web目錄,其中還包含應用的sqlite數據庫算法

image

很明顯只有一個index的單面結構,現用就是須要把index單頁面,分解成多個獨立的靜態頁面,而且要符合xhtml語法規範sql

常規來講,這只是一個靜態分析,應該簡單。shell

可是這裏我沒有采用靜態分析,緣由很少說,跟項目的複雜度有關係,詳情能夠參考個人項目分享 Hybrid App應用製做與跨平臺解決方案

 

我採用的是動態編譯,簡單來講,讓瀏覽器本身解析

經過加載一個後臺的Chromium來解析頁面,而後直接提取出Chromium渲染後的最終HTML結構

若是隻是這樣解析,提取的只可能當前執行的頁面部分,不多是所有的頁面結構

所以,依照靜態編譯的思路須要符合幾點要求

  1. 單頁面的入口index.html,可以根據傳遞參數自動加載不一樣的頁面
  2. 數據庫xxtebook.db可以經過算法分解到每個獨立的頁面中,作成json的數據格式

考慮到最終是桌面級應用工具,我這裏採用了node語言編寫

固然用node的緣由也是由於有神器node-webkit,能夠把node打包成exe執行文件

 

具體的思路流程:

讀取apk文件 =》更名rar =》解壓後讀取web目錄

=》讀出sqlite數據

=》根據數據建立基本頁面 n*.xhtml多個

=》給生成的全部xhtml頁面寫入區分頁面標記(由於apk中的web資源代碼是共享的js/css/圖片等等)

=》將全部ajax處理的資源轉化成js格式(如 svg 讀出數據寫入js文件,靜態訪問直接加載這個腳本)

=》分解每一個頁面的數據sqlite數據,並寫入到對應的xhtml中(數據庫的數據須要分解成json寫入對應的頁面中)

=》啓動web服務器

=》啓動webkit,並加載每個xhtml頁面作分解,等待頁面渲染拿到每一個頁面最終的靜態結構

=》合併epub的標準文件結構,生成對應的規範

=》打包輸出最終的epub文件

 

對比下單頁面結構與多個xhtml靜態文件

 

單頁面SPA結構,經過JS生成DOM

經過JS動態渲染HTML結構,頁面總入口都是同一個

image1

 

靜態xhtml,DOM與數據靜態化

image2

 

把一個index分解成多個xhtml頁面,每一個頁面的js、css等資源代碼都是共享的,因此須要在每個頁面寫入不一樣的數據,用來區分頁面

架設一個web服務端,經過http加載這些xhtml頁面,經過瀏覽器解析就能獲得最終獨立xhtml的結構

因爲執行代碼作了接口處理,只要xhtml中傳遞不一樣的頁碼,代碼就自動執行不一樣的頁面,這樣就能達到,不一樣的頁面都有不一樣的解析結果

因爲是node全自動操做,因此web與頁面的解析都必須經過自動化工具處理,這裏我用的是browser-syncphantomjs

經過phantomjs 解析後就能拿到瀏覽器渲染後的HTML結構了

 

遇到的問題:

解壓丟失文件:node確實沒有一個解壓插件好使,最終用shell執行腳本命令,經過調用winrar軟件處理

node-webkit不支持64位的sqlite3讀取:這是由於nodejs和node-webkit的ABI不一樣,處理的辦法就是從新編譯64位的sqlite3,我估計很難成功,後來找了一款神器 sql.js直接數據庫分解

phantomjs能夠經過execFile調用,可是執行路徑,是以node調用命名爲根路徑計算的

phantomjs加載頁面,須要監聽onResourceReceived事件,以後再獲取數據,頁面的徹底渲染沒法把控的,有請求,有JS繪製等等,必須有一個延時的等待

經過browser-sync作服務器,phantomjs獲取的html的結構中會有__bs_script__這個注入節點,須要刪除

經過browser-sync作服務器,background加載的url都會加上整個http跟地址,因此在最終數據中須要處理

 

打包運行的效果

GQGA$7U`@N@X(R}20Z}DSKW

UI有點醜。。。

若是有這方面需求,或者有啥疑問的,能夠留言。。。。

相關文章
相關標籤/搜索