随着苹果ibooks对国内的开放,最近接了个麻烦的需求:css
把现有的APK转化支持苹果ibooks电子书的epub格式html
这apk与epub两个彻底不是一个世界的东西,怎么能关联并转化?node
由于我司产出的APK应用是经过phonegap打包的SPA应用,这也是一套黑科技,经过ppt批量生成应用,本质上仍是web那一套,因此给epub转化提供契机git
经过H5写应用已经流行几年了,这里也很少说了,如流行的phonegap国产appcan、APICloud和HBuilder之类的打包工具太多了,本质上基本差不都,若是没有接触的能够看看github
这是一个APKweb
APK解压后的文件结构ajax
其中assets就是web目录,其中还包含应用的sqlite数据库算法
很明显只有一个index的单面结构,现用就是须要把index单页面,分解成多个独立的静态页面,而且要符合xhtml语法规范sql
常规来讲,这只是一个静态分析,应该简单。shell
可是这里我没有采用静态分析,缘由很少说,跟项目的复杂度有关系,详情能够参考个人项目分享 Hybrid App应用制做与跨平台解决方案
我采用的是动态编译,简单来讲,让浏览器本身解析
经过加载一个后台的Chromium来解析页面,而后直接提取出Chromium渲染后的最终HTML结构
若是只是这样解析,提取的只可能当前执行的页面部分,不多是所有的页面结构
所以,依照静态编译的思路须要符合几点要求
考虑到最终是桌面级应用工具,我这里采用了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结构,页面总入口都是同一个
静态xhtml,DOM与数据静态化
把一个index分解成多个xhtml页面,每一个页面的js、css等资源代码都是共享的,因此须要在每个页面写入不一样的数据,用来区分页面
架设一个web服务端,经过http加载这些xhtml页面,经过浏览器解析就能获得最终独立xhtml的结构
因为执行代码作了接口处理,只要xhtml中传递不一样的页码,代码就自动执行不一样的页面,这样就能达到,不一样的页面都有不一样的解析结果
因为是node全自动操做,因此web与页面的解析都必须经过自动化工具处理,这里我用的是browser-sync与phantomjs
经过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跟地址,因此在最终数据中须要处理
打包运行的效果
UI有点丑。。。
若是有这方面需求,或者有啥疑问的,能够留言。。。。