1.目标是创建两个工程,一个j2se的桌面软件,用于编辑和预览epub等格式的电子书,预览的窗口可以设置分辨率来模拟不同的设备,把编辑的结果实时的显示出来。另一个是Android的应用,用于阅读,管理书籍,主要功能还是阅读。目标是两个平台使用同一套解析与排版代码,争取达到在桌面预览的效果就是在设备看到的效果
 
2.第一步:由于手头的FBReaderJ 1.8.2 代码是Android版本的,考虑到移植的难易程度,决定先从Android平台开始移植,由于FBReaderJ的代码模块化程度很高,期望移植完FBReaderJ的一部分模块后,对桌面程序的移植能起一个指导作用.
首先决定从与界面关联度最少的模块部分开始:那就是数据模型部分,切入点是Book类,这是所有FBReaderJ支持的书籍类型的总抽象,期望抽取出Book相关的数据类型,那么可以顺理成章的使用它解析各种文件格式,并且可以容易的移植到PC平台。
 
2.1 .首先创建自己的工程NewReader,创建基础的包com.yueang.newreader,这个相当于FBReaderJ的org.geometerplus.fbreader。我决定移植过来的代码包结构也按照FBReaderJ的代码结构进行组织,这样最省事易懂。首先从Book类入手,新建com.yueang.newreader.book包,拷贝Book.java到包中,在Eclipse中借助代码的自动检查功能可以看到缺失了那些代码,红红的一片,场面非常状况,不要慌张!一步一步来
 
2.2. 我们依次导入了文件系统相关的ZLFile系列类,XML解析相关的ZLXMLParser系列类(这个类非常重要,因为它不仅用在资源的解析中,更在书籍解析中大显身手),书籍信息相关的Author等类,内部模型表示的ZLTextModel,ZLTextParagraph以及与排版相关的ZLTextElement系列类,在这个过程中也导入了一些关联度很小的支持类,大部分分布在core.util和core.options包下
 
目前的结果如下
├─com
│  └─yueang
│      ├─log
│      │      MyLog.java
│      │      MyUtils.java
│      │     
│      ├─newreader
│      │  │  MainActivity.java
│      │  │  Paths.java
│      │  │ 
│      │  ├─book
│      │  │      Author.java
│      │  │      Book.java
│      │  │      BookDatabase.java
│      │  │      Bookmark.java
│      │  │      FileInfo.java
│      │  │      FileInfoSet.java
│      │  │      Series.java
│      │  │      SeriesInfo.java
│      │  │      Tag.java
│      │  │      UID.java
│      │  │     
│      │  ├─bookmodel
│      │  │      BookReadingException.java
│      │  │     
│      │  └─sort
│      │          TitledEntity.java
│      │         
│      └─zlibrary
│          ├─core
│          │  ├─config
│          │  │      ZLConfig.java
│          │  │     
│          │  ├─filesystem
│          │  │  │  ZLArchiveEntryFile.java
│          │  │  │  ZLFile.java
│          │  │  │  ZLPhysicalFile.java
│          │  │  │  ZLResourceFile.java
│          │  │  │  ZLZipEntryFile.java
│          │  │  │ 
│          │  │  └─tar
│          │  │          ZLTarEntryFile.java
│          │  │          ZLTarHeader.java
│          │  │          ZLTarInputStream.java
│          │  │         
│          │  ├─image
│          │  │      ZLImage.java
│          │  │      ZLImageData.java
│          │  │      ZLImageManager.java
│          │  │      ZLLoadableImage.java
│          │  │      ZLSingleImage.java
│          │  │     
│          │  ├─language
│          │  │      Language.java
│          │  │     
│          │  ├─library
│          │  │      ZLibrary.java
│          │  │     
│          │  ├─options
│          │  │      ZLOption.java
│          │  │      ZLStringOption.java
│          │  │     
│          │  ├─resources
│          │  │      ZLMissingResource.java
│          │  │      ZLResource.java
│          │  │      ZLTreeResource.java
│          │  │     
│          │  ├─tree
│          │  │      ZLTree.java
│          │  │     
│          │  ├─util
│          │  │      MimeType.java
│          │  │      MiscUtil.java
│          │  │      ZLArrayUtils.java
│          │  │      ZLBoolean3.java
│          │  │      ZLColor.java
│          │  │     
│          │  └─xml
│          │          ZLDTDParser.java
│          │          ZLMutableString.java
│          │          ZLStringMap.java
│          │          ZLXMLParser.java
│          │          ZLXMLProcessor.java
│          │          ZLXMLReader.java
│          │          ZLXMLReaderAdapter.java
│          │         
│          └─text
│              ├─model
│              │      ZLImageEntry.java
│              │      ZLTextMark.java
│              │      ZLTextMetrics.java
│              │      ZLTextModel.java
│              │      ZLTextParagraph.java
│              │      ZLTextStyleEntry.java
│              │     
│              └─view
│                      ZLPaintContext.java
│                      ZLTextControlElement.java
│                      ZLTextElement.java
│                      ZLTextFixedHSpaceElement.java
│                      ZLTextFixedPosition.java
│                      ZLTextHyperlink.java
│                      ZLTextHyperlinkControlElement.java
│                      ZLTextImageElement.java
│                      ZLTextParagraphCursor.java
│                      ZLTextParagraphCursorCache.java
│                      ZLTextPosition.java
│                      ZLTextStyleElement.java
│                      ZLTextWord.java
│                      ZLTextWordCursor.java
│                     
└─org
    ├─amse
    │  └─ys
    │      └─zip
    │              Decompressor.java
    │              DeflatingDecompressor.java
    │              LocalFileHeader.java
    │              MyBufferedInputStream.java
    │              NoCompressionDecompressor.java
    │              ZipException.java
    │              ZipFile.java
    │              ZipInputStream.java
    │             
    └─vimgadgets
        └─linebreak
                LineBreaker.java
 
这还只是半成品,我们留下了Plugin相关的类还没有导入,这个留在最后,目前在导入Bookmark.java的时候遇到了真正的挑战,那就是:
 
     public void findEnd(ZLTextView view) {
if (myEnd != null) {
return;
}
ZLTextWordCursor cursor = view.getStartCursor();
if (cursor.isNull()) {
cursor = view.getEndCursor();
}
if (cursor.isNull()) {
return;
}
cursor = new ZLTextWordCursor(cursor);
cursor.moveTo(this); ZLTextWord word = null;
mainLoop:
for (int count = myLength; count > 0; cursor.nextWord()) {
while (cursor.isEndOfParagraph()) {
if (!cursor.nextParagraph()) {
break mainLoop;
}
}
final ZLTextElement element = cursor.getElement();
if (element instanceof ZLTextWord) {
if (word != null) {
--count;
}
word = (ZLTextWord)element;
System.err.println(new String(word.Data, word.Offset, word.Length));
count -= word.Length;
}
}
if (word != null) {
myEnd = new ZLTextFixedPosition(
cursor.getParagraphIndex(),
cursor.getElementIndex(),
word.Length
);
}
}

我们遇到了ZLTextView,从这个类开始我们的代码将要进入另外一个部分,那就是与排版相关的代码,那么如果我们打算隔离开这些代码暂时完成解析相关的代码,该如何做呢?我们下一篇再继续,敬请期待

FBReader移植日记 第一天的更多相关文章

  1. FBReader移植日记 第二天

    昨天我们的移植工作进行了一大半,还留下两个重要的部分没有完成:1.没有移植的 ZLTextView,2.FormatPlugin相关的类. 第一个问题我们放在后面解决,下面先解决格式插件的问题. 我们 ...

  2. FFmpeg在Android上的移植之第一步

    http://blog.sina.com.cn/s/blog_69a04cf40100x1fr.html 从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmpeg开发的. ...

  3. “数学口袋精灵”App的第三个Sprint计划----开发日记(第一天12.7~第十天12.16)

    “数学口袋精灵”第三个Sprint计划----第一天 项目进度: 基本完成一个小游戏,游戏具有:随机产生算式,判断对错功能.通过轻快的背景音乐,音效,给玩家提供一个良好的氛围.  任务分配: 冯美欣: ...

  4. Egret入门学习日记 --- 第一篇 (引擎的选择)

    第一篇 (引擎的选择) 我人比较笨,得慢慢学,我就一点一点来好了. 首先,我个人喜欢游戏.网页开发相对游戏开发来说,网页开发实在太枯燥了,没劲.所以打算转游戏开发了. 游戏开发要选择游戏引擎,我去看了 ...

  5. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

  6. 傲娇Android二三事之操蛋的开发日记(第一回)

    武宗元年 十一月初四 霾 今日魔都,依旧仙雾环绕,仿佛蓬莱落凡尘.望着470这个鲜红的AQI修仙指数,贫道不禁吟道,“正是修仙好光景,雾霾时节又逢君”.但在这个只修bug,不修仙的时代,路上的行人都步 ...

  7. 【Alpha】咸鱼冲刺日记第一天-黄紫仪

    总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 emmmmm,事实上它还没有正式开始.所以依旧没有[突然觉得明天任务真重] 三,项目进展 emmmmm,我错了咸鱼了两天才突然反应过来 ...

  8. ASP.NET MVC5 高级编程-学习日记-第一章 入门

    1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. 1.1.1 MVC模式 ...

  9. Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)

    这节我们来学习Cocos2d-x的最后一节.怎样处理重力感应事件.移植到Android后加入再按一次返回键退出游戏等.我这里用的Android.IOS不会也没设备呃 效果图不好弄,由于是要移植到真机上 ...

随机推荐

  1. ASCII 码表对照

    ASCII码表 ASCII码大致可以分作三部分组成.第一部分是:ASCII非打印控制字符第二部分是:ASCII打印字符:第三部分是:扩展ASCII打印字符 第一部分:ASCII非打印控制字符表 ASC ...

  2. js EasyUI前台 全选的实现

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWcAAAEQCAIAAADj/SKjAAAgAElEQVR4nO1dz48ry1W+/5N3swaFEP ...

  3. Android 点击事件,4种回调。

    1.  继承监听接口. 2.  xml方式 : 设置 android:onClick 3. 内部类 4. 匿名类 ------------------------------------------- ...

  4. SQL SERVER while循环

    在SQL数据库中,可以通过WHILE实现循环,下面就将为您介绍SQL循环执行while控制,希望对您提升WHILE的使用水平能够有些帮助. WHILE Boolean_expression    { ...

  5. 2014年10月30日-----SQL的基础知识

    数据库的概念 结构化查询语言:structured query language 简称:SQL 数据库管理系统:database management system 简称:DBMS 数据库管理员:da ...

  6. JS 同源策略

    对于任何基于WEB的应用,最重要的就是安全性.JS中有各种安全检查以防止恶意脚本攻击你的机器,其中一些特定的安全手段在各种浏览器中都有采用.如:Mozilla有个完全独特的完全模型,涉及到了签署脚本和 ...

  7. 【BZOJ3527】【FFT】力

    [问题描述]给出n个数qi,给出Fj的定义如下:令Ei=Fi/qi.试求Ei.[输入格式]输入文件force.in包含一个整数n,接下来n行每行输入一个数,第i行表示qi.[输出格式]输出文件forc ...

  8. 关于Zen Coding:css,html缩写

    zen coding 是一个俄罗斯人写的编辑器(支持大部分现下流行的编辑器)插件,其安装也是非常简单,只要安装插件,然后在项目中拷贝js文件就可以.像Webstorm6.0.2中已经包含这样的插件.什 ...

  9. 浏览器阻止window.open的解决方案

    先分析一下浏览器为什么会阻止window.open吧:用户主动去触发事件的浏览器不会阻止,什么是用户主动触发的呢?就是当用户去点击的一瞬间就弹出这种浏览器是不会阻止的,如果是通过setTimeout定 ...

  10. PYTHON开发--面向对象基础入门

    面向对象 一:面向对象初级 1.思考:首先在python中,以前我们以前用到的几乎都是函数式编程,但是有时候函数式编程其中代码重复利用率太高,我们往往会把这些重复代码写进一个函数日后去调用,所以呢,今 ...