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