1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 17:59:33 +02:00

git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@88 6a642e6f-84f6-412e-ac94-c4a38d5a04b0

This commit is contained in:
tushkanchik 2007-11-03 04:54:00 +00:00
parent f5a08b25d7
commit 53f74aa016
5 changed files with 107 additions and 3 deletions

View file

@ -3,6 +3,8 @@ package org.fbreader.bookmodel;
import java.util.HashMap;
import java.util.Map;
import org.zlibrary.text.model.ZLTextModel;
import org.zlibrary.text.model.ZLTextParagraph;
import org.zlibrary.text.model.ZLTextPlainModel;
import org.zlibrary.text.model.impl.ZLModelFactory;
@ -10,6 +12,18 @@ public class BookModel {
private ZLTextPlainModel myBookModel = (new ZLModelFactory()).createPlainModel();
private Map<String, ZLTextPlainModel> myFootnotes =
new HashMap<String, ZLTextPlainModel>();
private Map<String, Label> myInternalHyperlinks =
new HashMap<String, Label>();
private class Label {
final int paragraphNumber;
final ZLTextModel model;
Label(ZLTextModel model, int paragraph) {
paragraphNumber = paragraph;
this.model = model;
}
}
public ZLTextPlainModel getBookModel() {
return myBookModel;
@ -25,4 +39,17 @@ public class BookModel {
public Map<String, ZLTextPlainModel> getFootnotes() {
return myFootnotes;
}
public void addHyperlinkLabel(String label, ZLTextModel model,
int paragraphNumber) {
myInternalHyperlinks.put(label, new Label(model, paragraphNumber));
}
//tmp
public ZLTextParagraph getParagraphByLink(String link) {
if (myInternalHyperlinks.containsKey(link)) {
return myInternalHyperlinks.get(link).model.getParagraph(myInternalHyperlinks.get(link).paragraphNumber);
}
return null;
}
}

View file

@ -113,4 +113,24 @@ public class BookReader {
}
}
}
public void addHyperlinkControl(Byte kind, String label) {
if (myTextParagraphExists) {
flushTextBufferToParagraph();
myCurrentTextModel.addHyperlinkControl(kind, label);
}
myHyperlinkKind = kind;
myHyperlinkReference = label;
}
public void addHyperlinkLabel(String label) {
if (myCurrentTextModel != null) {
int paragraphNumber = myCurrentTextModel.getParagraphsNumber();
if (myTextParagraphExists) {
--paragraphNumber;
}
myBookModel.addHyperlinkLabel(label, myCurrentTextModel, paragraphNumber);
}
}
}

View file

@ -17,6 +17,8 @@ class FB2Handler extends DefaultHandler {
private int mySectionDepth = 0;
private boolean mySectionStarted = false;
private byte myHyperlinkType;
private FB2Tag getTag(String s) {
if (s.contains("-")) {
s = s.replace('-', '_');
@ -24,6 +26,15 @@ class FB2Handler extends DefaultHandler {
return FB2Tag.valueOf(s.toUpperCase());
}
private String reference(Attributes attributes) {
int length = attributes.getLength();
for (int i = 0; i < length; i++) {
if (attributes.getQName(i).endsWith(":href")) {
return attributes.getValue(i);
}
}
return "";
}
public FB2Handler(BookModel model) {
myBookReader = new BookReader(model);
@ -103,6 +114,10 @@ class FB2Handler extends DefaultHandler {
myBookReader.unsetCurrentTextModel();
break;
case A:
myBookReader.addControl(myHyperlinkType, false);
break;
default:
break;
}
@ -116,7 +131,7 @@ class FB2Handler extends DefaultHandler {
if (!myReadMainText) {
myBookReader.setFootnoteTextModel(id);
}
// myModelReader.addHyperlinkLabel(id);
myBookReader.addHyperlinkLabel(id);
}
FB2Tag tag;
try {
@ -207,6 +222,22 @@ class FB2Handler extends DefaultHandler {
}
break;
case A:
String ref = reference(attributes);
if (ref != "") {
if (ref.charAt(0) == '#') {
myHyperlinkType = (byte) FB2Tag.FOOTNOTE.ordinal();
ref = ref.substring(1);
} else {
myHyperlinkType = (byte) FB2Tag.A.ordinal();
}
myBookReader.addHyperlinkControl(myHyperlinkType, ref);
} else {
myHyperlinkType = (byte) FB2Tag.FOOTNOTE.ordinal();
myBookReader.addControl(myHyperlinkType, true);
}
break;
default:
break;
}

View file

@ -22,5 +22,6 @@ public enum FB2Tag {
CODE,
STRIKETHROUGH,
TITLE,
BODY;
BODY,
FOOTNOTE;
}

View file

@ -1,9 +1,11 @@
package org.test.fbreader.formats.fb2;
import org.fbreader.bookmodel.BookModel;
import org.fbreader.formats.fb2.FB2Reader;
import org.fbreader.formats.fb2.FB2Tag;
import org.zlibrary.text.model.ZLTextModel;
import org.zlibrary.text.model.ZLTextParagraph;
import org.zlibrary.text.model.entry.ZLTextEntry;
import junit.framework.TestCase;
@ -189,4 +191,27 @@ public class TestFB2Reader extends TestCase {
assertEquals(model.dump(), "[PARAGRAPH]\n[CONTROL " +
FB2Tag.SECTION.ordinal() + "][TEXT]Title[/TEXT][/PARAGRAPH]\n");
}
public void testFootnote() {
FB2Reader reader = new FB2Reader("FB2ReaderTests/footnote.fb2");
ZLTextModel model = reader.read().getBookModel();
int footnote = FB2Tag.FOOTNOTE.ordinal();
assertEquals(model.dump(), "[PARAGRAPH]\n[CONTROL " + footnote +
"][TEXT][1][/TEXT][/CONTROL " + footnote + "][/PARAGRAPH]\n");
}
public void testFootnote1() {
FB2Reader reader = new FB2Reader("FB2ReaderTests/footnote1.fb2");
BookModel model = reader.read();
assertEquals("footnote",
((ZLTextEntry)model.getParagraphByLink("note1").getEntries().get(0)).getData());
}
public void testExternalHyperlink() {
FB2Reader reader = new FB2Reader("FB2ReaderTests/ext_hyperlink.fb2");
ZLTextModel model = reader.read().getBookModel();
int hyperlink = FB2Tag.A.ordinal();
assertEquals(model.dump(), "[PARAGRAPH]\n[CONTROL " + hyperlink +
"][TEXT][1][/TEXT][/CONTROL " + hyperlink + "][/PARAGRAPH]\n");
}
}