mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-03 09:49:19 +02:00
git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@88 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
parent
f5a08b25d7
commit
53f74aa016
5 changed files with 107 additions and 3 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import org.xml.sax.SAXException;
|
|||
import org.xml.sax.helpers.DefaultHandler;
|
||||
import org.zlibrary.text.model.ZLTextParagraph;
|
||||
|
||||
class FB2Handler extends DefaultHandler {
|
||||
class FB2Handler extends DefaultHandler {
|
||||
private BookReader myBookReader;
|
||||
|
||||
private boolean myInsidePoem = false;
|
||||
|
@ -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);
|
||||
|
@ -102,6 +113,10 @@ class FB2Handler extends DefaultHandler {
|
|||
myReadMainText = false;
|
||||
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 {
|
||||
|
@ -206,6 +221,22 @@ class FB2Handler extends DefaultHandler {
|
|||
myReadMainText = true;
|
||||
}
|
||||
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;
|
||||
|
|
|
@ -22,5 +22,6 @@ public enum FB2Tag {
|
|||
CODE,
|
||||
STRIKETHROUGH,
|
||||
TITLE,
|
||||
BODY;
|
||||
BODY,
|
||||
FOOTNOTE;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue