FBReader移植日記 第一天

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的時候遇到了真正的挑戰,那就是:
 
 1     public void findEnd(ZLTextView view) {
 2         if (myEnd != null) {
 3             return;
 4         }
 5         ZLTextWordCursor cursor = view.getStartCursor();
 6         if (cursor.isNull()) {
 7             cursor = view.getEndCursor();
 8         }
 9         if (cursor.isNull()) {
10             return;
11         }
12         cursor = new ZLTextWordCursor(cursor);
13         cursor.moveTo(this);
14 
15         ZLTextWord word = null;
16 mainLoop:
17         for (int count = myLength; count > 0; cursor.nextWord()) {
18             while (cursor.isEndOfParagraph()) {
19                 if (!cursor.nextParagraph()) {
20                     break mainLoop;
21                 }
22             }
23             final ZLTextElement element = cursor.getElement();
24             if (element instanceof ZLTextWord) {
25                 if (word != null) {
26                     --count;
27                 }
28                 word = (ZLTextWord)element;
29                 System.err.println(new String(word.Data, word.Offset, word.Length));
30                 count -= word.Length;
31             }
32         }
33         if (word != null) {
34             myEnd = new ZLTextFixedPosition(
35                 cursor.getParagraphIndex(),
36                 cursor.getElementIndex(),
37                 word.Length
38             );
39         }
40     }

咱們遇到了ZLTextView,從這個類開始咱們的代碼將要進入另一個部分,那就是與排版相關的代碼,那麼若是咱們打算隔離開這些代碼暫時完成解析相關的代碼,該如何作呢?咱們下一篇再繼續,敬請期待java

相關文章
相關標籤/搜索