From 1206925a616c7e7d52791af412d48240cb4dad24 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 03:02:41 +0000 Subject: [PATCH 01/27] multiple names for the same namespace problem has been fixed --- .../fbreader/formats/fb2/FB2CoverImage.java | 17 +- .../fbreader/formats/fb2/FB2Reader.java | 229 +++++++++--------- .../zlibrary/core/xml/ZLStringMap.java | 4 + .../zlibrary/core/xml/ZLXMLReaderAdapter.java | 23 +- 4 files changed, 137 insertions(+), 136 deletions(-) diff --git a/src/org/geometerplus/fbreader/formats/fb2/FB2CoverImage.java b/src/org/geometerplus/fbreader/formats/fb2/FB2CoverImage.java index a300c9d5f..50bae340f 100644 --- a/src/org/geometerplus/fbreader/formats/fb2/FB2CoverImage.java +++ b/src/org/geometerplus/fbreader/formats/fb2/FB2CoverImage.java @@ -62,23 +62,11 @@ class FB2CoverImage extends ZLImageProxy { return myImage; } - private String myXLinkPrefix; - @Override public boolean processNamespaces() { return true; } - public void namespaceMapChangedHandler(HashMap namespaceMap) { - myXLinkPrefix = null; - for (Map.Entry entry : namespaceMap.entrySet()) { - if (XMLNamespaces.XLink.equals(entry.getValue())) { - myXLinkPrefix = entry.getKey() + ":"; - break; - } - } - } - @Override public boolean startElementHandler(String tagName, ZLStringMap attributes) { switch (FB2Tag.getTagByName(tagName)) { @@ -87,10 +75,7 @@ class FB2CoverImage extends ZLImageProxy { break; case FB2Tag.IMAGE: if (myReadCoverPage) { - if (myXLinkPrefix == null) { - break; - } - final String href = attributes.getValue((myXLinkPrefix + "href").intern()); + final String href = getAttributeValue(attributes, XMLNamespaces.XLink, "href"); if (href != null && href.length() > 1 && href.charAt(0) == '#') { myImageReference = href.substring(1); } diff --git a/src/org/geometerplus/fbreader/formats/fb2/FB2Reader.java b/src/org/geometerplus/fbreader/formats/fb2/FB2Reader.java index 01e3c16fd..7eae258f5 100644 --- a/src/org/geometerplus/fbreader/formats/fb2/FB2Reader.java +++ b/src/org/geometerplus/fbreader/formats/fb2/FB2Reader.java @@ -22,12 +22,16 @@ package org.geometerplus.fbreader.formats.fb2; import java.util.*; import org.geometerplus.zlibrary.core.library.ZLibrary; -import org.geometerplus.fbreader.bookmodel.*; +import org.geometerplus.zlibrary.core.constants.XMLNamespaces; import org.geometerplus.zlibrary.core.xml.*; import org.geometerplus.zlibrary.core.util.*; import org.geometerplus.zlibrary.text.model.ZLTextParagraph; -public final class FB2Reader extends BookReader implements ZLXMLReader { +import org.geometerplus.fbreader.bookmodel.*; + +public final class FB2Reader extends ZLXMLReaderAdapter { + private final BookReader myBookReader; + private boolean myInsidePoem = false; private boolean myInsideTitle = false; private int myBodyCounter = 0; @@ -43,18 +47,17 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { private int myParagraphsBeforeBodyNumber = Integer.MAX_VALUE; private final char[] SPACE = { ' ' }; - private String myHrefAttribute; private byte[] myTagStack = new byte[10]; private int myTagStackSize = 0; public FB2Reader(BookModel model) { - super(model); + myBookReader = new BookReader(model); } boolean readBook() { Base64EncodedImage.resetCounter(); - return ZLXMLProcessor.read(this, Model.Book.File); + return ZLXMLProcessor.read(this, myBookReader.Model.Book.File); } public void startDocumentHandler() { @@ -75,7 +78,7 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { if (image != null) { image.addData(ch, start, length); } else { - addData(ch, start, length, false); + myBookReader.addData(ch, start, length, false); } } @@ -87,7 +90,7 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { if (image != null) { image.addData(ch, start, length); } else { - addData(ch, start, length, true); + myBookReader.addData(ch, start, length, true); } } @@ -95,38 +98,38 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { final byte tag = myTagStack[--myTagStackSize]; switch (tag) { case FB2Tag.P: - endParagraph(); + myBookReader.endParagraph(); break; case FB2Tag.SUB: - addControl(FBTextKind.SUB, false); + myBookReader.addControl(FBTextKind.SUB, false); break; case FB2Tag.SUP: - addControl(FBTextKind.SUP, false); + myBookReader.addControl(FBTextKind.SUP, false); break; case FB2Tag.CODE: - addControl(FBTextKind.CODE, false); + myBookReader.addControl(FBTextKind.CODE, false); break; case FB2Tag.EMPHASIS: - addControl(FBTextKind.EMPHASIS, false); + myBookReader.addControl(FBTextKind.EMPHASIS, false); break; case FB2Tag.STRONG: - addControl(FBTextKind.STRONG, false); + myBookReader.addControl(FBTextKind.STRONG, false); break; case FB2Tag.STRIKETHROUGH: - addControl(FBTextKind.STRIKETHROUGH, false); + myBookReader.addControl(FBTextKind.STRIKETHROUGH, false); break; case FB2Tag.V: case FB2Tag.SUBTITLE: case FB2Tag.TEXT_AUTHOR: case FB2Tag.DATE: - popKind(); - endParagraph(); + myBookReader.popKind(); + myBookReader.endParagraph(); break; case FB2Tag.CITE: case FB2Tag.EPIGRAPH: - popKind(); + myBookReader.popKind(); break; case FB2Tag.POEM: @@ -134,52 +137,52 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { break; case FB2Tag.STANZA: - beginParagraph(ZLTextParagraph.Kind.AFTER_SKIP_PARAGRAPH); - endParagraph(); - beginParagraph(ZLTextParagraph.Kind.EMPTY_LINE_PARAGRAPH); - endParagraph(); - popKind(); + myBookReader.beginParagraph(ZLTextParagraph.Kind.AFTER_SKIP_PARAGRAPH); + myBookReader.endParagraph(); + myBookReader.beginParagraph(ZLTextParagraph.Kind.EMPTY_LINE_PARAGRAPH); + myBookReader.endParagraph(); + myBookReader.popKind(); break; case FB2Tag.SECTION: if (myReadMainText) { - endContentsParagraph(); + myBookReader.endContentsParagraph(); --mySectionDepth; mySectionStarted = false; } else { - unsetCurrentTextModel(); + myBookReader.unsetCurrentTextModel(); } break; case FB2Tag.ANNOTATION: - popKind(); + myBookReader.popKind(); if (myBodyCounter == 0) { - insertEndOfSectionParagraph(); - unsetCurrentTextModel(); + myBookReader.insertEndOfSectionParagraph(); + myBookReader.unsetCurrentTextModel(); } break; case FB2Tag.TITLE: - popKind(); - exitTitle(); + myBookReader.popKind(); + myBookReader.exitTitle(); myInsideTitle = false; break; case FB2Tag.BODY: - popKind(); + myBookReader.popKind(); myReadMainText = false; - unsetCurrentTextModel(); + myBookReader.unsetCurrentTextModel(); break; case FB2Tag.A: - addControl(myHyperlinkType, false); + myBookReader.addControl(myHyperlinkType, false); break; case FB2Tag.COVERPAGE: if (myBodyCounter == 0) { myInsideCoverpage = false; - insertEndOfSectionParagraph(); - unsetCurrentTextModel(); + myBookReader.insertEndOfSectionParagraph(); + myBookReader.unsetCurrentTextModel(); } break; @@ -200,9 +203,9 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { String id = attributes.getValue("id"); if (id != null) { if (!myReadMainText) { - setFootnoteTextModel(id); + myBookReader.setFootnoteTextModel(id); } - addHyperlinkLabel(id); + myBookReader.addHyperlinkLabel(id); } final byte tag = FB2Tag.getTagByName(tagName); byte[] tagStack = myTagStack; @@ -216,59 +219,59 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { if (mySectionStarted) { mySectionStarted = false; } else if (myInsideTitle) { - addContentsData(SPACE); + myBookReader.addContentsData(SPACE); } - beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); + myBookReader.beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); break; case FB2Tag.SUB: - addControl(FBTextKind.SUB, true); + myBookReader.addControl(FBTextKind.SUB, true); break; case FB2Tag.SUP: - addControl(FBTextKind.SUP, true); + myBookReader.addControl(FBTextKind.SUP, true); break; case FB2Tag.CODE: - addControl(FBTextKind.CODE, true); + myBookReader.addControl(FBTextKind.CODE, true); break; case FB2Tag.EMPHASIS: - addControl(FBTextKind.EMPHASIS, true); + myBookReader.addControl(FBTextKind.EMPHASIS, true); break; case FB2Tag.STRONG: - addControl(FBTextKind.STRONG, true); + myBookReader.addControl(FBTextKind.STRONG, true); break; case FB2Tag.STRIKETHROUGH: - addControl(FBTextKind.STRIKETHROUGH, true); + myBookReader.addControl(FBTextKind.STRIKETHROUGH, true); break; case FB2Tag.V: - pushKind(FBTextKind.VERSE); - beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); + myBookReader.pushKind(FBTextKind.VERSE); + myBookReader.beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); break; case FB2Tag.TEXT_AUTHOR: - pushKind(FBTextKind.AUTHOR); - beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); + myBookReader.pushKind(FBTextKind.AUTHOR); + myBookReader.beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); break; case FB2Tag.SUBTITLE: - pushKind(FBTextKind.SUBTITLE); - beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); + myBookReader.pushKind(FBTextKind.SUBTITLE); + myBookReader.beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); break; case FB2Tag.DATE: - pushKind(FBTextKind.DATE); - beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); + myBookReader.pushKind(FBTextKind.DATE); + myBookReader.beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); break; case FB2Tag.EMPTY_LINE: - beginParagraph(ZLTextParagraph.Kind.EMPTY_LINE_PARAGRAPH); - endParagraph(); + myBookReader.beginParagraph(ZLTextParagraph.Kind.EMPTY_LINE_PARAGRAPH); + myBookReader.endParagraph(); break; case FB2Tag.CITE: - pushKind(FBTextKind.CITE); + myBookReader.pushKind(FBTextKind.CITE); break; case FB2Tag.EPIGRAPH: - pushKind(FBTextKind.EPIGRAPH); + myBookReader.pushKind(FBTextKind.EPIGRAPH); break; case FB2Tag.POEM: @@ -276,107 +279,105 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { break; case FB2Tag.STANZA: - pushKind(FBTextKind.STANZA); - beginParagraph(ZLTextParagraph.Kind.BEFORE_SKIP_PARAGRAPH); - endParagraph(); + myBookReader.pushKind(FBTextKind.STANZA); + myBookReader.beginParagraph(ZLTextParagraph.Kind.BEFORE_SKIP_PARAGRAPH); + myBookReader.endParagraph(); break; case FB2Tag.SECTION: if (myReadMainText) { - insertEndOfSectionParagraph(); + myBookReader.insertEndOfSectionParagraph(); ++mySectionDepth; - beginContentsParagraph(); + myBookReader.beginContentsParagraph(); mySectionStarted = true; } break; case FB2Tag.ANNOTATION: if (myBodyCounter == 0) { - setMainTextModel(); + myBookReader.setMainTextModel(); } - pushKind(FBTextKind.ANNOTATION); + myBookReader.pushKind(FBTextKind.ANNOTATION); break; case FB2Tag.TITLE: if (myInsidePoem) { - pushKind(FBTextKind.POEM_TITLE); + myBookReader.pushKind(FBTextKind.POEM_TITLE); } else if (mySectionDepth == 0) { - insertEndOfSectionParagraph(); - pushKind(FBTextKind.TITLE); + myBookReader.insertEndOfSectionParagraph(); + myBookReader.pushKind(FBTextKind.TITLE); } else { - pushKind(FBTextKind.SECTION_TITLE); + myBookReader.pushKind(FBTextKind.SECTION_TITLE); myInsideTitle = true; - enterTitle(); + myBookReader.enterTitle(); } break; case FB2Tag.BODY: ++myBodyCounter; - myParagraphsBeforeBodyNumber = Model.BookTextModel.getParagraphsNumber(); + myParagraphsBeforeBodyNumber = myBookReader.Model.BookTextModel.getParagraphsNumber(); if ((myBodyCounter == 1) || (attributes.getValue("name") == null)) { - setMainTextModel(); + myBookReader.setMainTextModel(); myReadMainText = true; } - pushKind(FBTextKind.REGULAR); + myBookReader.pushKind(FBTextKind.REGULAR); break; case FB2Tag.A: - if (myHrefAttribute != null) { - String ref = attributes.getValue(myHrefAttribute); - String type = attributes.getValue("type"); - if ((ref != null) && (ref.length() != 0)) { - if (ref.charAt(0) == '#') { - myHyperlinkType = "note".equals(type) ? FBTextKind.FOOTNOTE : FBTextKind.INTERNAL_HYPERLINK; - ref = ref.substring(1); - } else { - myHyperlinkType = FBTextKind.EXTERNAL_HYPERLINK; - } - addHyperlinkControl(myHyperlinkType, ref); + { + String ref = getAttributeValue(attributes, XMLNamespaces.XLink, "href"); + if ((ref != null) && (ref.length() != 0)) { + final String type = attributes.getValue("type"); + if (ref.charAt(0) == '#') { + myHyperlinkType = "note".equals(type) ? FBTextKind.FOOTNOTE : FBTextKind.INTERNAL_HYPERLINK; + ref = ref.substring(1); } else { - myHyperlinkType = FBTextKind.FOOTNOTE; - addControl(myHyperlinkType, true); + myHyperlinkType = FBTextKind.EXTERNAL_HYPERLINK; } + myBookReader.addHyperlinkControl(myHyperlinkType, ref); + } else { + myHyperlinkType = FBTextKind.FOOTNOTE; + myBookReader.addControl(myHyperlinkType, true); } break; - + } case FB2Tag.COVERPAGE: if (myBodyCounter == 0) { myInsideCoverpage = true; - setMainTextModel(); + myBookReader.setMainTextModel(); } break; - + case FB2Tag.IMAGE: - if (myHrefAttribute != null) { - String imgRef = attributes.getValue(myHrefAttribute); - if ((imgRef != null) && (imgRef.length() != 0) && (imgRef.charAt(0) == '#')) { - String vOffset = attributes.getValue("voffset"); - short offset = 0; - try { - offset = Short.parseShort(vOffset); - } catch (NumberFormatException e) { - } - imgRef = imgRef.substring(1); - if (!imgRef.equals(myCoverImageReference) || - myParagraphsBeforeBodyNumber != Model.BookTextModel.getParagraphsNumber()) { - addImageReference(imgRef, offset); - } - if (myInsideCoverpage) { - myCoverImageReference = imgRef; - } + { + String imgRef = getAttributeValue(attributes, XMLNamespaces.XLink, "href"); + if ((imgRef != null) && (imgRef.length() != 0) && (imgRef.charAt(0) == '#')) { + String vOffset = attributes.getValue("voffset"); + short offset = 0; + try { + offset = Short.parseShort(vOffset); + } catch (NumberFormatException e) { + } + imgRef = imgRef.substring(1); + if (!imgRef.equals(myCoverImageReference) || + myParagraphsBeforeBodyNumber != myBookReader.Model.BookTextModel.getParagraphsNumber()) { + myBookReader.addImageReference(imgRef, offset); + } + if (myInsideCoverpage) { + myCoverImageReference = imgRef; } } break; - + } case FB2Tag.BINARY: - String contentType = attributes.getValue("content-type"); - String imgId = attributes.getValue("id"); + final String contentType = attributes.getValue("content-type"); + final String imgId = attributes.getValue("id"); if ((contentType != null) && (id != null)) { myCurrentImage = new Base64EncodedImage(contentType); - addImage(imgId, myCurrentImage); + myBookReader.addImage(imgId, myCurrentImage); } break; - + default: break; } @@ -387,16 +388,6 @@ public final class FB2Reader extends BookReader implements ZLXMLReader { return true; } - public void namespaceMapChangedHandler(HashMap namespaceMap) { - myHrefAttribute = null; - for (Map.Entry entry : namespaceMap.entrySet()) { - if ("http://www.w3.org/1999/xlink".equals(entry.getValue())) { - myHrefAttribute = (entry.getKey() + ":href").intern(); - break; - } - } - } - public void addExternalEntities(HashMap entityMap) { entityMap.put("FBReaderVersion", ZLibrary.Instance().getVersionName().toCharArray()); } diff --git a/src/org/geometerplus/zlibrary/core/xml/ZLStringMap.java b/src/org/geometerplus/zlibrary/core/xml/ZLStringMap.java index 9414ff1c1..2c85b078d 100644 --- a/src/org/geometerplus/zlibrary/core/xml/ZLStringMap.java +++ b/src/org/geometerplus/zlibrary/core/xml/ZLStringMap.java @@ -72,6 +72,10 @@ public final class ZLStringMap { return myKeys[index]; } + String getValue(int index) { + return myValues[index]; + } + public void clear() { mySize = 0; } diff --git a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java index f20cbb84e..d043b9b54 100644 --- a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java +++ b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java @@ -25,7 +25,9 @@ import java.io.InputStream; import org.geometerplus.zlibrary.core.filesystem.ZLFile; public class ZLXMLReaderAdapter implements ZLXMLReader { - public boolean read(ZLFile file) { + private Map myNamespaceMap = Collections.emptyMap(); + + public boolean read(ZLFile file) { return ZLXMLProcessor.read(this, file); } @@ -63,6 +65,25 @@ public class ZLXMLReaderAdapter implements ZLXMLReader { } public void namespaceMapChangedHandler(HashMap namespaces) { + myNamespaceMap = namespaces != null ? namespaces : Collections.emptyMap(); + } + + protected String getAttributeValue(ZLStringMap attributes, String namespace, String name) { + final int size = attributes.getSize(); + if (size == 0) { + return null; + } + final String postfix = ":" + name; + for (int i = size - 1; i >= 0; --i) { + final String key = attributes.getKey(i); + if (key.endsWith(postfix)) { + final String nsKey = key.substring(0, key.length() - postfix.length()); + if (namespace.equals(myNamespaceMap.get(nsKey))) { + return attributes.getValue(i); + } + } + } + return null; } public void addExternalEntities(HashMap entityMap) { From 140d5829d5b632172c634b28a74098ad60b68ebf Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 03:21:31 +0000 Subject: [PATCH 02/27] HashMap -> Map --- .../formats/oeb/OEBAnnotationReader.java | 7 +++++- .../fbreader/formats/oeb/OEBBookReader.java | 7 +++++- .../formats/oeb/OEBMetaInfoReader.java | 7 +++++- .../fbreader/formats/xhtml/XHTMLReader.java | 9 ++++--- .../network/opds/OPDSLinkXMLReader.java | 2 +- .../fbreader/network/opds/OPDSXMLReader.java | 2 +- .../network/opds/OpenSearchXMLReader.java | 2 +- .../zlibrary/core/xml/ZLXMLReader.java | 2 +- .../zlibrary/core/xml/ZLXMLReaderAdapter.java | 25 ++++++++++++++++++- 9 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java index 801620397..a3ceb3fa6 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBAnnotationReader.java @@ -50,11 +50,13 @@ class OEBAnnotationReader extends ZLXMLReaderAdapter implements XMLNamespaces { return null; } + @Override public boolean processNamespaces() { return true; } - public void namespaceMapChangedHandler(HashMap namespaceMap) { + @Override + public void namespaceMapChangedHandler(Map namespaceMap) { myDescriptionTag = null; for (Map.Entry entry : namespaceMap.entrySet()) { final String id = entry.getValue(); @@ -64,6 +66,7 @@ class OEBAnnotationReader extends ZLXMLReaderAdapter implements XMLNamespaces { } } + @Override public boolean startElementHandler(String tag, ZLStringMap attributes) { if (tag.equalsIgnoreCase(myDescriptionTag)) { myReadState = READ_DESCRIPTION; @@ -74,12 +77,14 @@ class OEBAnnotationReader extends ZLXMLReaderAdapter implements XMLNamespaces { return false; } + @Override public void characterDataHandler(char[] data, int start, int len) { if (myReadState == READ_DESCRIPTION) { myBuffer.append(new String(data, start, len).trim()); } } + @Override public boolean endElementHandler(String tag) { if (myReadState != READ_DESCRIPTION) { return false; diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java index c95b7a87d..585ef779b 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBBookReader.java @@ -173,6 +173,7 @@ class OEBBookReader extends ZLXMLReaderAdapter implements XMLNamespaces { private int myState; + @Override public boolean startElementHandler(String tag, ZLStringMap xmlattributes) { tag = tag.toLowerCase(); if ((myOPFSchemePrefix != null) && tag.startsWith(myOPFSchemePrefix)) { @@ -231,6 +232,7 @@ class OEBBookReader extends ZLXMLReaderAdapter implements XMLNamespaces { return false; } + @Override public boolean endElementHandler(String tag) { tag = tag.toLowerCase(); if ((myOPFSchemePrefix != null) && tag.startsWith(myOPFSchemePrefix)) { @@ -243,11 +245,13 @@ class OEBBookReader extends ZLXMLReaderAdapter implements XMLNamespaces { return false; } + @Override public boolean processNamespaces() { return true; } - public void namespaceMapChangedHandler(HashMap namespaceMap) { + @Override + public void namespaceMapChangedHandler(Map namespaceMap) { myOPFSchemePrefix = null; for (Map.Entry entry : namespaceMap.entrySet()) { if (OpenPackagingFormat.equals(entry.getValue())) { @@ -257,6 +261,7 @@ class OEBBookReader extends ZLXMLReaderAdapter implements XMLNamespaces { } } + @Override public boolean dontCacheAttributeValues() { return true; } diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java index bfa315aeb..6588e4d99 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBMetaInfoReader.java @@ -85,11 +85,13 @@ class OEBMetaInfoReader extends ZLXMLReaderAdapter implements XMLNamespaces { private final StringBuffer myBuffer = new StringBuffer(); + @Override public boolean processNamespaces() { return true; } - public void namespaceMapChangedHandler(HashMap namespaceMap) { + @Override + public void namespaceMapChangedHandler(Map namespaceMap) { myTitleTag = null; myAuthorTag = null; mySubjectTag = null; @@ -110,6 +112,7 @@ class OEBMetaInfoReader extends ZLXMLReaderAdapter implements XMLNamespaces { } } + @Override public boolean startElementHandler(String tag, ZLStringMap attributes) { tag = tag.toLowerCase().intern(); if (tag == myMetadataTag || tag == myDCMetadataTag || tag == myOpfMetadataTag) { @@ -144,6 +147,7 @@ class OEBMetaInfoReader extends ZLXMLReaderAdapter implements XMLNamespaces { return false; } + @Override public void characterDataHandler(char[] data, int start, int len) { switch (myReadState) { case READ_NONE: @@ -158,6 +162,7 @@ class OEBMetaInfoReader extends ZLXMLReaderAdapter implements XMLNamespaces { } } + @Override public boolean endElementHandler(String tag) { tag = tag.toLowerCase(); if (tag.equals(myMetadataTagRealName)) { diff --git a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java index cc31085ed..8fcc54ec9 100644 --- a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java +++ b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java @@ -155,6 +155,7 @@ public class XHTMLReader extends ZLXMLReaderAdapter { return read(file); } + @Override public boolean startElementHandler(String tag, ZLStringMap attributes) { String id = attributes.getValue("id"); if (id != null) { @@ -168,6 +169,7 @@ public class XHTMLReader extends ZLXMLReaderAdapter { return false; } + @Override public boolean endElementHandler(String tag) { XHTMLTagAction action = (XHTMLTagAction)ourTagActions.get(tag.toLowerCase()); if (action != null) { @@ -176,6 +178,7 @@ public class XHTMLReader extends ZLXMLReaderAdapter { return false; } + @Override public void characterDataHandler(char[] data, int start, int len) { if (myPreformatted) { final char first = data[start]; @@ -225,18 +228,18 @@ cycle: return ourExternalDTDs; } + @Override public List externalDTDs() { return xhtmlDTDs(); } + @Override public boolean dontCacheAttributeValues() { return true; } + @Override public boolean processNamespaces() { return true; } - - public void namespaceMapChangedHandler(HashMap namespaceMap) { - } } diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java index a5d1f1195..d2f6186c5 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSLinkXMLReader.java @@ -229,7 +229,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType private String myFBReaderNamespaceId; @Override - public void namespaceMapChangedHandler(HashMap namespaceMap) { + public void namespaceMapChangedHandler(Map namespaceMap) { super.namespaceMapChangedHandler(namespaceMap); myFBReaderNamespaceId = null; diff --git a/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java index cdc6fbdff..1631f7aef 100644 --- a/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OPDSXMLReader.java @@ -74,7 +74,7 @@ class OPDSXMLReader extends ZLXMLReaderAdapter { } @Override - public void namespaceMapChangedHandler(HashMap namespaceMap) { + public void namespaceMapChangedHandler(Map namespaceMap) { myDublinCoreNamespaceId = null; myAtomNamespaceId = null; myOpenSearchNamespaceId = null; diff --git a/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java b/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java index 39608d84a..fe03b6c76 100644 --- a/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java +++ b/src/org/geometerplus/fbreader/network/opds/OpenSearchXMLReader.java @@ -57,7 +57,7 @@ class OpenSearchXMLReader extends ZLXMLReaderAdapter { } @Override - public void namespaceMapChangedHandler(HashMap namespaces) { + public void namespaceMapChangedHandler(Map namespaces) { myOpenSearchNamespaceId = null; for (Map.Entry entry : namespaces.entrySet()) { diff --git a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReader.java b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReader.java index 0dafa8654..d538af2fd 100644 --- a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReader.java +++ b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReader.java @@ -34,7 +34,7 @@ public interface ZLXMLReader { public void characterDataHandlerFinal(char[] ch, int start, int length); boolean processNamespaces(); - void namespaceMapChangedHandler(HashMap namespaces); + void namespaceMapChangedHandler(Map namespaces); void addExternalEntities(HashMap entityMap); List externalDTDs(); diff --git a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java index d043b9b54..c440ffe5f 100644 --- a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java +++ b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java @@ -64,7 +64,7 @@ public class ZLXMLReaderAdapter implements ZLXMLReader { return false; } - public void namespaceMapChangedHandler(HashMap namespaces) { + public void namespaceMapChangedHandler(Map namespaces) { myNamespaceMap = namespaces != null ? namespaces : Collections.emptyMap(); } @@ -86,6 +86,29 @@ public class ZLXMLReaderAdapter implements ZLXMLReader { return null; } + interface Predicate { + boolean accepts(String namespace); + } + + protected String getAttributeValue(ZLStringMap attributes, Predicate predicate, String name) { + final int size = attributes.getSize(); + if (size == 0) { + return null; + } + final String postfix = ":" + name; + for (int i = size - 1; i >= 0; --i) { + final String key = attributes.getKey(i); + if (key.endsWith(postfix)) { + final String ns = + myNamespaceMap.get(key.substring(0, key.length() - postfix.length())); + if (ns != null && predicate.accepts(ns)) { + return attributes.getValue(i); + } + } + } + return null; + } + public void addExternalEntities(HashMap entityMap) { } From 8006ec5fd0fe43b33d8cd47ec8cc320e273fa818 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 03:27:44 +0000 Subject: [PATCH 03/27] new ChangeLog item --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 64259a592..5dd82091f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ ===== 0.99.4 (Jan ??, 2011) ===== * A list of dictionaries is supported (ColorDict, Fora) * Author of currently opened book is selected in library (same for series and tags) +* FB2 files with multiple XLink namespace prefixes processing has been fixed ===== 0.99.3 (Jan 08, 2011) ===== * All word navigation mode is disabled by default; corresponding option in dictionary preferences works correctly From 009821710bf8e7eb69b2d498686cfeddcaf6f1df Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 05:34:00 +0000 Subject: [PATCH 04/27] code cleanup --- .../android/fbreader/DictionaryUtil.java | 27 +++++++++++++++++++ .../fbreader/ProcessHyperlinkAction.java | 27 ++----------------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/DictionaryUtil.java b/src/org/geometerplus/android/fbreader/DictionaryUtil.java index 6d468450f..26d0f1e6b 100644 --- a/src/org/geometerplus/android/fbreader/DictionaryUtil.java +++ b/src/org/geometerplus/android/fbreader/DictionaryUtil.java @@ -24,6 +24,7 @@ import java.util.*; import android.app.Activity; import android.app.AlertDialog; import android.app.SearchManager; +import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; @@ -50,6 +51,11 @@ public abstract class DictionaryUtil { "com.ngc.fora.ForaDictionary", "Fora Dictionary" )); + ourDictionaryInfos.add(new PackageInfo( + "org.freedictionary", + "org.freedictionary.MainActivity", + "Free Dictionary . org" + )); } return ourDictionaryInfos; } @@ -82,6 +88,27 @@ public abstract class DictionaryUtil { .putExtra(SearchManager.QUERY, text); } + public static void openWordInDictionary(Activity activity, String text) { + if (text == null) { + return; + } + + int start = 0; + int end = text.length(); + for (; start < end && !Character.isLetterOrDigit(text.charAt(start)); ++start); + for (; start < end && !Character.isLetterOrDigit(text.charAt(end - 1)); --end); + if (start == end) { + return; + } + + final Intent intent = DictionaryUtil.getDictionaryIntent(text.substring(start, end)); + try { + activity.startActivity(intent); + } catch(ActivityNotFoundException e){ + DictionaryUtil.installDictionaryIfNotInstalled(activity); + } + } + public static void installDictionaryIfNotInstalled(final Activity activity) { if (PackageUtil.canBeStarted(activity, getDictionaryIntent("test"))) { return; diff --git a/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java b/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java index 92fb814b6..f2c1a378e 100644 --- a/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java +++ b/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java @@ -19,10 +19,9 @@ package org.geometerplus.android.fbreader; -import android.content.ActivityNotFoundException; import android.content.Intent; +import android.content.ActivityNotFoundException; import android.net.Uri; -//import android.widget.Toast; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.network.ZLNetworkException; @@ -67,29 +66,7 @@ class ProcessHyperlinkAction extends FBAction { return; } - final String text = Reader.getTextView().getSelectedText(); - if (text != null) { - int start = 0; - int end = text.length(); - for (; start < end && !Character.isLetterOrDigit(text.charAt(start)); ++start); - for (; start < end && !Character.isLetterOrDigit(text.charAt(end - 1)); --end); - if (start == end) { - return; - } - final Intent intent = DictionaryUtil.getDictionaryIntent(text.substring(start, end)); - try { - myBaseActivity.startActivity(intent); - } catch(ActivityNotFoundException e){ - DictionaryUtil.installDictionaryIfNotInstalled(myBaseActivity); - /* - Toast.makeText( - myBaseActivity, - ZLResource.resource("errorMessage").getResource("dictionaryIsNotInstalled").getValue(), - Toast.LENGTH_LONG - ).show(); - */ - } - } + DictionaryUtil.openWordInDictionary(myBaseActivity, Reader.getTextView().getSelectedText()); } private void openInBrowser(String urlString) { From 4d2ca933bfa6f260dd462abf4b202901f7211d54 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 05:41:50 +0000 Subject: [PATCH 05/27] Free Dictionary code has been removed (no way to send word to Free Dictionary) --- src/org/geometerplus/android/fbreader/DictionaryUtil.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/DictionaryUtil.java b/src/org/geometerplus/android/fbreader/DictionaryUtil.java index 26d0f1e6b..dd9b1e449 100644 --- a/src/org/geometerplus/android/fbreader/DictionaryUtil.java +++ b/src/org/geometerplus/android/fbreader/DictionaryUtil.java @@ -51,11 +51,6 @@ public abstract class DictionaryUtil { "com.ngc.fora.ForaDictionary", "Fora Dictionary" )); - ourDictionaryInfos.add(new PackageInfo( - "org.freedictionary", - "org.freedictionary.MainActivity", - "Free Dictionary . org" - )); } return ourDictionaryInfos; } From e258f5d5b9db788bd427716925b1ba4555dd4331 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 08:41:00 +0000 Subject: [PATCH 06/27] Dutch localization (by Frank Fesevur) --- assets/data/help/MiniHelp.nl.fb2 | 20 + assets/resources/application/nl.xml | 602 ++++++++++++++++++++++++++++ assets/resources/zlibrary/nl.xml | 93 +++++ 3 files changed, 715 insertions(+) create mode 100644 assets/data/help/MiniHelp.nl.fb2 create mode 100644 assets/resources/application/nl.xml create mode 100644 assets/resources/zlibrary/nl.xml diff --git a/assets/data/help/MiniHelp.nl.fb2 b/assets/data/help/MiniHelp.nl.fb2 new file mode 100644 index 000000000..036d89400 --- /dev/null +++ b/assets/data/help/MiniHelp.nl.fb2 @@ -0,0 +1,20 @@ + + +FBReader Over FBReaderJ nl + +<p>Over FBReaderJ &FBReaderVersion;</p> +

FBReaderJ is een e-book reader voor het Android platform. Het is een kloon van FBReader book reader en is in Java geschreven door dezelfde makers. FBReaderJ ondersteunt verschillende e-bookformaten: oeb, epub, fb2. In toekomstige versies zal deze lijst uitgebreid worden zodat dezelfde formats als in de originele FBReader worden ondersteund. Rechtstreeks lezen van zip, tar en gzip archieven is ondersteund.

+

Je kunt de configuratie van FBReaderJ aanpassen naar je eigen smaak. Kleuren, lettertypes, toetsgebruik en vele andere eigenschappen kunnen worden aangepast in de Instellingen.

+

FBReaderJ is vrijgegeven onder de voorwaarden van de GNU GPL.

+ +

Hoe te beginnen

+

Er zijn twee manieren om een boek toe te voegen aan de FBReaderJ bibliotheek.

+

De eerste is het boek te kopieren naar de map /sdcard/Books (of een submap daaronder). Dan zal FBReader dit boek automatisch toevoegen.

+

De tweede methode is door te klikken op een link naar een boek (bijv. op een link naar een bestand met de extensie .epub, .oeb, .fb2 of .fb2.zip) in de standaard Android browser. Het boek zal gedownload worden naar het apparaat geopend worden in FBReaderJ. Als je nogmaals op link klikt, zal het boek niet nog een keer gedownload worden maar zal de lokale kopie geopend worden om te lezen.

+ +

Gerelateerde sites

+

Meer informatie over FBReader en FBReaderJ kan je vinden op de FBReader site.

+

Als je een automatisch bericht wilt over het verschijnen van nieuwe versies, kun je je aanmelden bij het FBReaderJ project bij freshmeat.

+

Als je vragen of suggesties hebt kun je de FBReader group van googlegroups gebruiken.

+ +
diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml new file mode 100644 index 000000000..866a1fcf0 --- /dev/null +++ b/assets/resources/application/nl.xml @@ -0,0 +1,602 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/resources/zlibrary/nl.xml b/assets/resources/zlibrary/nl.xml new file mode 100644 index 000000000..076d5f066 --- /dev/null +++ b/assets/resources/zlibrary/nl.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 68be54033362b29926f7a6c76d7ff00415b1c699 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 14 Jan 2011 08:43:30 +0000 Subject: [PATCH 07/27] Dutch localization --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 5dd82091f..d95ddebdb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * A list of dictionaries is supported (ColorDict, Fora) * Author of currently opened book is selected in library (same for series and tags) * FB2 files with multiple XLink namespace prefixes processing has been fixed +* Dutch localization (by Frank Fesevur) has been added ===== 0.99.3 (Jan 08, 2011) ===== * All word navigation mode is disabled by default; corresponding option in dictionary preferences works correctly From 6607f5139dd191dd673b328aa291165dc99c2534 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 15 Jan 2011 13:22:51 +0000 Subject: [PATCH 08/27] resources texts fixes --- assets/resources/application/en.xml | 10 +++++----- assets/resources/application/ru.xml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 00b1e0d61..34aebe274 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -459,13 +459,13 @@ - - + + - - - + + + diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index 43c27a53c..41447c867 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -449,7 +449,7 @@ - + From dd109d8c3fb91e1eff0937b9ebfea37c0680f0d2 Mon Sep 17 00:00:00 2001 From: Steffen Siebert Date: Thu, 6 Jan 2011 23:10:54 +0100 Subject: [PATCH 09/27] NEW: Support for SlovoEd English German Deluxe dictionary added. --- .../android/fbreader/DictionaryUtil.java | 51 +++++++++++++++---- .../android/fbreader/PackageInfo.java | 6 ++- .../preferences/DictionaryPreference.java | 2 +- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/DictionaryUtil.java b/src/org/geometerplus/android/fbreader/DictionaryUtil.java index dd9b1e449..6a2a95ac5 100644 --- a/src/org/geometerplus/android/fbreader/DictionaryUtil.java +++ b/src/org/geometerplus/android/fbreader/DictionaryUtil.java @@ -28,6 +28,7 @@ import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; +import android.net.Uri; import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.resources.ZLResource; @@ -44,12 +45,30 @@ public abstract class DictionaryUtil { ourDictionaryInfos.add(new PackageInfo( "com.socialnmobile.colordict", "com.socialnmobile.colordict.activity.Main", - "ColorDict" + "ColorDict", + null, + true )); ourDictionaryInfos.add(new PackageInfo( "com.ngc.fora", "com.ngc.fora.ForaDictionary", - "Fora Dictionary" + "Fora Dictionary", + null, + true + )); + ourDictionaryInfos.add(new PackageInfo( + "com.slovoed.noreg.english_german.deluxe", + "com.slovoed.noreg.english_german.deluxe.Start", + "SlovoEd Deluxe German->English", + "/808464950", + false + )); + ourDictionaryInfos.add(new PackageInfo( + "com.slovoed.noreg.english_german.deluxe", + "com.slovoed.noreg.english_german.deluxe.Start", + "SlovoEd Deluxe English->German", + "/808464949", + false )); } return ourDictionaryInfos; @@ -58,15 +77,15 @@ public abstract class DictionaryUtil { public static ZLStringOption dictionaryOption() { if (ourDictionaryOption == null) { ourDictionaryOption = - new ZLStringOption("Dictionary", "Class", dictionaryInfos().get(0).ClassName); + new ZLStringOption("Dictionary", "Title", dictionaryInfos().get(0).Title); } return ourDictionaryOption; } private static PackageInfo getCurrentDictionaryInfo() { - final String className = dictionaryOption().getValue(); + final String title = dictionaryOption().getValue(); for (PackageInfo info : dictionaryInfos()) { - if (info.ClassName.equals(className)) { + if (info.Title.equals(title)) { return info; } } @@ -75,12 +94,22 @@ public abstract class DictionaryUtil { public static Intent getDictionaryIntent(String text) { final PackageInfo dictionaryInfo = getCurrentDictionaryInfo(); - return new Intent(Intent.ACTION_SEARCH) - .setComponent(new ComponentName( - dictionaryInfo.PackageName, - dictionaryInfo.ClassName - )) - .putExtra(SearchManager.QUERY, text); + if (dictionaryInfo.UseSearchIntend) { + return new Intent(Intent.ACTION_SEARCH) + .setComponent(new ComponentName( + dictionaryInfo.PackageName, + dictionaryInfo.ClassName + )) + .putExtra(SearchManager.QUERY, text); + } else { + return new Intent(Intent.ACTION_VIEW) + .setComponent(new ComponentName( + dictionaryInfo.PackageName, + dictionaryInfo.ClassName + )) + .setData(Uri.parse(text + dictionaryInfo.Argument)) + .addFlags(0x14000000); + } } public static void openWordInDictionary(Activity activity, String text) { diff --git a/src/org/geometerplus/android/fbreader/PackageInfo.java b/src/org/geometerplus/android/fbreader/PackageInfo.java index d1cd0fab9..55a44c45c 100644 --- a/src/org/geometerplus/android/fbreader/PackageInfo.java +++ b/src/org/geometerplus/android/fbreader/PackageInfo.java @@ -23,10 +23,14 @@ public class PackageInfo { public final String PackageName; public final String ClassName; public final String Title; + public final String Argument; + public final boolean UseSearchIntend; - PackageInfo(String packageName, String className, String title) { + PackageInfo(String packageName, String className, String title, String argument, boolean useSearchIntend) { PackageName = packageName; ClassName = className; Title = title; + Argument = argument; + UseSearchIntend = useSearchIntend; } } diff --git a/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java b/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java index 369f65f62..1eb2715ed 100644 --- a/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java +++ b/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java @@ -42,7 +42,7 @@ class DictionaryPreference extends ZLStringListPreference { final String[] texts = new String[infos.size()]; int index = 0; for (PackageInfo i : infos) { - values[index] = i.ClassName; + values[index] = i.Title; texts[index] = i.Title; ++index; } From 520736b313e8839252728890221b29281daeb5e1 Mon Sep 17 00:00:00 2001 From: Steffen Siebert Date: Sat, 15 Jan 2011 13:52:41 +0100 Subject: [PATCH 10/27] NEW: Support for Free Dictionary added. --- src/org/geometerplus/android/fbreader/DictionaryUtil.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/org/geometerplus/android/fbreader/DictionaryUtil.java b/src/org/geometerplus/android/fbreader/DictionaryUtil.java index 6a2a95ac5..fa6ae8238 100644 --- a/src/org/geometerplus/android/fbreader/DictionaryUtil.java +++ b/src/org/geometerplus/android/fbreader/DictionaryUtil.java @@ -70,6 +70,13 @@ public abstract class DictionaryUtil { "/808464949", false )); + ourDictionaryInfos.add(new PackageInfo( + "org.freedictionary", + "org.freedictionary.MainActivity", + "Free Dictionary . org", + "", + false + )); } return ourDictionaryInfos; } From 7824ad3482e512cc9800ca1af946c9818cec44df Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 15 Jan 2011 17:54:36 +0000 Subject: [PATCH 11/27] dictionary code refactoring --- .../android/fbreader/DictionaryUtil.java | 153 ++++++++++-------- .../android/fbreader/PackageInfo.java | 14 +- .../preferences/DictionaryPreference.java | 2 +- .../android/util/PackageUtil.java | 5 +- 4 files changed, 100 insertions(+), 74 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/DictionaryUtil.java b/src/org/geometerplus/android/fbreader/DictionaryUtil.java index fa6ae8238..703eee3a5 100644 --- a/src/org/geometerplus/android/fbreader/DictionaryUtil.java +++ b/src/org/geometerplus/android/fbreader/DictionaryUtil.java @@ -21,13 +21,8 @@ package org.geometerplus.android.fbreader; import java.util.*; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.SearchManager; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; -import android.content.DialogInterface; -import android.content.Intent; +import android.app.*; +import android.content.*; import android.net.Uri; import org.geometerplus.zlibrary.core.options.ZLStringOption; @@ -37,85 +32,111 @@ import org.geometerplus.android.util.UIUtil; import org.geometerplus.android.util.PackageUtil; public abstract class DictionaryUtil { - private static LinkedList ourDictionaryInfos = new LinkedList(); + // Map: dictionary info -> hide if package is not installed + private static LinkedHashMap ourDictionaryInfos = + new LinkedHashMap(); private static ZLStringOption ourDictionaryOption; - public static List dictionaryInfos() { + private static Map infos() { if (ourDictionaryInfos.isEmpty()) { - ourDictionaryInfos.add(new PackageInfo( - "com.socialnmobile.colordict", - "com.socialnmobile.colordict.activity.Main", - "ColorDict", - null, - true - )); - ourDictionaryInfos.add(new PackageInfo( - "com.ngc.fora", - "com.ngc.fora.ForaDictionary", - "Fora Dictionary", - null, - true - )); - ourDictionaryInfos.add(new PackageInfo( - "com.slovoed.noreg.english_german.deluxe", - "com.slovoed.noreg.english_german.deluxe.Start", - "SlovoEd Deluxe German->English", - "/808464950", - false - )); - ourDictionaryInfos.add(new PackageInfo( - "com.slovoed.noreg.english_german.deluxe", - "com.slovoed.noreg.english_german.deluxe.Start", - "SlovoEd Deluxe English->German", - "/808464949", - false - )); - ourDictionaryInfos.add(new PackageInfo( - "org.freedictionary", - "org.freedictionary.MainActivity", - "Free Dictionary . org", - "", - false - )); + ourDictionaryInfos.put(new PackageInfo( + "ColorDict", // Id + "com.socialnmobile.colordict", // Package + "com.socialnmobile.colordict.activity.Main", // Class + "ColorDict", // Title + Intent.ACTION_SEARCH, + "%s" + ), false); + ourDictionaryInfos.put(new PackageInfo( + "Fora Dictionary", // Id + "com.ngc.fora", // Package + "com.ngc.fora.ForaDictionary", // Class + "Fora Dictionary", // Title + Intent.ACTION_SEARCH, + "%s" + ), false); + ourDictionaryInfos.put(new PackageInfo( + "Free Dictionary . org", // Id + "org.freedictionary", // Package + "org.freedictionary.MainActivity", // Class + "Free Dictionary . org", // Title + Intent.ACTION_VIEW, + "%s" + ), false); + ourDictionaryInfos.put(new PackageInfo( + "SlovoEd Deluxe German->English", // Id + "com.slovoed.noreg.english_german.deluxe", // Package + "com.slovoed.noreg.english_german.deluxe.Start", // Class + "SlovoEd Deluxe German->English", // Title + Intent.ACTION_VIEW, + "%s/808464950" + ), true); + ourDictionaryInfos.put(new PackageInfo( + "SlovoEd Deluxe English->German", // Id + "com.slovoed.noreg.english_german.deluxe", // Package + "com.slovoed.noreg.english_german.deluxe.Start", // Class + "SlovoEd Deluxe English->German", // Title + Intent.ACTION_VIEW, + "%s/808464949" + ), true); } return ourDictionaryInfos; } + public static List dictionaryInfos(Context context) { + final LinkedList list = new LinkedList(); + for (Map.Entry entry : infos().entrySet()) { + final PackageInfo info = entry.getKey(); + if (!entry.getValue() || + PackageUtil.canBeStarted(context, getDictionaryIntent(info, "test"))) { + list.add(info); + } + } + return list; + } + + private static PackageInfo firstInfo() { + for (Map.Entry entry : infos().entrySet()) { + if (!entry.getValue()) { + return entry.getKey(); + } + } + throw new RuntimeException("There are no available dictionary infos"); + } + public static ZLStringOption dictionaryOption() { if (ourDictionaryOption == null) { - ourDictionaryOption = - new ZLStringOption("Dictionary", "Title", dictionaryInfos().get(0).Title); + ourDictionaryOption = new ZLStringOption("Dictionary", "Id", firstInfo().Id); } return ourDictionaryOption; } private static PackageInfo getCurrentDictionaryInfo() { - final String title = dictionaryOption().getValue(); - for (PackageInfo info : dictionaryInfos()) { - if (info.Title.equals(title)) { + final String id = dictionaryOption().getValue(); + for (PackageInfo info : infos().keySet()) { + if (info.Id.equals(id)) { return info; } } - return dictionaryInfos().get(0); + return firstInfo(); } - public static Intent getDictionaryIntent(String text) { - final PackageInfo dictionaryInfo = getCurrentDictionaryInfo(); - if (dictionaryInfo.UseSearchIntend) { - return new Intent(Intent.ACTION_SEARCH) - .setComponent(new ComponentName( - dictionaryInfo.PackageName, - dictionaryInfo.ClassName - )) - .putExtra(SearchManager.QUERY, text); + private static Intent getDictionaryIntent(String text) { + return getDictionaryIntent(getCurrentDictionaryInfo(), text); + } + + public static Intent getDictionaryIntent(PackageInfo dictionaryInfo, String text) { + final Intent intent = new Intent(dictionaryInfo.IntentAction) + .setComponent(new ComponentName( + dictionaryInfo.PackageName, + dictionaryInfo.ClassName + )) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + text = dictionaryInfo.IntentDataPattern.replace("%s", text); + if (Intent.ACTION_SEARCH.equals(dictionaryInfo.IntentAction)) { + return intent.putExtra(SearchManager.QUERY, text); } else { - return new Intent(Intent.ACTION_VIEW) - .setComponent(new ComponentName( - dictionaryInfo.PackageName, - dictionaryInfo.ClassName - )) - .setData(Uri.parse(text + dictionaryInfo.Argument)) - .addFlags(0x14000000); + return intent.setData(Uri.parse(text)); } } diff --git a/src/org/geometerplus/android/fbreader/PackageInfo.java b/src/org/geometerplus/android/fbreader/PackageInfo.java index 55a44c45c..09dcf973d 100644 --- a/src/org/geometerplus/android/fbreader/PackageInfo.java +++ b/src/org/geometerplus/android/fbreader/PackageInfo.java @@ -20,17 +20,21 @@ package org.geometerplus.android.fbreader; public class PackageInfo { + public final String Id; public final String PackageName; public final String ClassName; public final String Title; - public final String Argument; - public final boolean UseSearchIntend; - PackageInfo(String packageName, String className, String title, String argument, boolean useSearchIntend) { + public final String IntentAction; + public final String IntentDataPattern; + + PackageInfo(String id, String packageName, String className, String title, String intentAction, String intentDataPattern) { + Id = id; PackageName = packageName; ClassName = className; Title = title; - Argument = argument; - UseSearchIntend = useSearchIntend; + + IntentAction = intentAction; + IntentDataPattern = intentDataPattern; } } diff --git a/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java b/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java index 1eb2715ed..c8248090c 100644 --- a/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java +++ b/src/org/geometerplus/android/fbreader/preferences/DictionaryPreference.java @@ -36,7 +36,7 @@ class DictionaryPreference extends ZLStringListPreference { super(context, resource, resourceKey); myOption = DictionaryUtil.dictionaryOption(); - final List infos = DictionaryUtil.dictionaryInfos(); + final List infos = DictionaryUtil.dictionaryInfos(context); final String[] values = new String[infos.size()]; final String[] texts = new String[infos.size()]; diff --git a/src/org/geometerplus/android/util/PackageUtil.java b/src/org/geometerplus/android/util/PackageUtil.java index aad7aea51..dbb3b96eb 100644 --- a/src/org/geometerplus/android/util/PackageUtil.java +++ b/src/org/geometerplus/android/util/PackageUtil.java @@ -23,6 +23,7 @@ import java.util.Map; import android.app.Activity; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ActivityNotFoundException; @@ -64,8 +65,8 @@ public abstract class PackageUtil { ); } - public static boolean canBeStarted(Activity activity, Intent intent) { - return activity.getApplicationContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null; + public static boolean canBeStarted(Context context, Intent intent) { + return context.getApplicationContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null; } public static boolean installFromMarket(Activity activity, String pkg) { From 757d4b65991f06dc8739136e4324c4aff5f3243a Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 15 Jan 2011 18:43:15 +0000 Subject: [PATCH 12/27] updated ChangeLog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index d95ddebdb..e0c5c91fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ ===== 0.99.4 (Jan ??, 2011) ===== -* A list of dictionaries is supported (ColorDict, Fora) +* A list of dictionaries is supported (ColorDict, Fora, FreeDictionary.Org) * Author of currently opened book is selected in library (same for series and tags) * FB2 files with multiple XLink namespace prefixes processing has been fixed * Dutch localization (by Frank Fesevur) has been added From c4b2a8a36ec7d5bb9c1844cca14f75a60094852f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 15 Jan 2011 18:43:58 +0000 Subject: [PATCH 13/27] 2.3 style refresh icon --- icons/menu/ic_menu_refresh.png | Bin 2450 -> 2156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/menu/ic_menu_refresh.png b/icons/menu/ic_menu_refresh.png index 77d70dd4f0534271b71ef4eb87f5a7a917d944fa..c3551becfaacab9acaa6abafd4e0530003af4b33 100644 GIT binary patch delta 2119 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 Date: Sat, 15 Jan 2011 20:58:12 +0000 Subject: [PATCH 14/27] 2.3-style search menu icon --- icons/menu/ic_menu_search.png | Bin 5059 -> 1783 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/menu/ic_menu_search.png b/icons/menu/ic_menu_search.png index 94446db976cfb4a0e317e94981ff9877be4dd0d2..ef949d500227869b4a52fbd371cbfb3a37072651 100644 GIT binary patch delta 1778 zcmZ{kX*k=77Kfu4w-0W^Q2W$ahN?7?QcG(|>}4#qj-@0LX=;xp6WbrHrOMRRq6D3i zs)iUO%2aI)wMT>Crlwj|gi<3zEg?6ZPxpSfAI|eW=e+0loNtGz_eHiy1&{!NKu6L> zG9sKnyExi`K-5BQxTrfB>-1B+h)#c(!*GPv*I`mD0w*Hu?_zBh_<=x@BhGdRZ-3@S zSyb$Oj^ZG&Vl}Zzcb7 z5hJXD=>c{WuSGi9^>-VzVKEk^zC+;tn(4DJZx;o0=)K6dN%YPM%Oe|(1iJNADo;ij zGZD`^5^h=&H>={`7azM*R`nf6hGrhd+Uy48VoizV@;7f+Aa9;EB9cRDKdDO}2F@{O zCE`7M=g+;V-#6CXj>{lEz_SACy8vof06==~Jx!WD#JwkT^g?s?YrD{l4E}CBR_Xdi zB4o6xlb^31q*>@5GPV$WaGis~e7|F`nwJ8{q-G1Qa0~-!4R^L{Zl(I!BL>QDO}QC9 z>X{Q1?QvRt9p7$C!$-_VN(jZa=HzvPk}Epsm1a{YI8|ZXKY89urUVi%H6RH0}D@=;vbLmA(&(hgor3{8M9VL8p6u4}su?9qRxvRhq|Rq;yyY+7vvNpZx7~ z46|z>wSov4Y>imP`5H4 zCiJ6~wVU#)&RS2*E@6jj+YT>J$ec4mBYmrv9d8?k$G?MJQ&V2xRqwJH?t_1ctJX$&5R5$e z@s??6-|Q&fb_^40Ra%A`v^x)|taSKfz8$~CXrImdED?Eq#HGad)Fsk#-ir}HYt&Cj46ev6P2Jp{o9Kx?rj(K`7S=i${LH9I3p?3_~-B}CP z^W7A(@x`z-NxOct=nR4PmVatM*8L4QfJaND&+V;3SZJZ!HeJkLrrD>vVQV{>b}psK zMS&u0KT%fMwAFWe9cK~+2tLj0P_MjXyrb1Gm@)Trt*29S{Si=-K6D7VNM%J#1;(sF zT|#m?{&?H6Sf^HDUs55-qgB^?dZ(CYx3{8f%lV4HsC|xYsgvCO+D~xnL!cQa_!W3y z7?SkEKAUtjL80a6q1*0y$@{m2F-uquLI*8vaaKd-p&9exxcNSL^BL@?O;dY|h2*g^ z4Q})D5jXnG%?yrJKz|^+LyR~3PIF4GB1=K6n87{=o`wfqHIB>reDZl0wJjWs9E5OZ zl#TVGcpxd_&%L>Re@a>cTVCGe?6#e`ifCyqC%0szCVyO|@bhpBqCCeF-(vMhG2C-w zuOiNYX5c&j=dnqlV~1yqYSqW=tGh!hvXKqxPG=Ymf1v_}ps{=G9-SPU$g<0s2PSHh zYALFlx%(`{?%k3j(uRV>wXSZwYU=1^>m<6+>5Te<`5CWD_kAtkdDh^A-av;PgQ&Xv z>XvUR%YLci=mt-M51Y6up)rqFe4ZQW(F}b_J&`u zxL|GpGl9TNEnqMZbz1j-0#Pv-d^qX<1|nc_Un0vziBn%sgySOj6q}LLB@&o|IiW{m9NGtCOmB{Aw#qN1L=TQ>i_@% literal 5059 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 Z1^|1O+t!kG2Oa Date: Fri, 14 Jan 2011 19:55:45 +0100 Subject: [PATCH 15/27] FIXED: Some database cursors weren't closed if the query doesn't return data. --- src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java b/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java index e6dbfda03..5dfffe044 100644 --- a/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java +++ b/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java @@ -344,6 +344,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase { protected List loadAuthors(long bookId) { final Cursor cursor = myDatabase.rawQuery("SELECT Authors.name,Authors.sort_key FROM BookAuthor INNER JOIN Authors ON Authors.author_id = BookAuthor.author_id WHERE BookAuthor.book_id = ?", new String[] { "" + bookId }); if (!cursor.moveToNext()) { + cursor.close(); return null; } final ArrayList list = new ArrayList(); @@ -435,6 +436,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase { protected List loadTags(long bookId) { final Cursor cursor = myDatabase.rawQuery("SELECT Tags.tag_id FROM BookTag INNER JOIN Tags ON Tags.tag_id = BookTag.tag_id WHERE BookTag.book_id = ?", new String[] { "" + bookId }); if (!cursor.moveToNext()) { + cursor.close(); return null; } ArrayList list = new ArrayList(); From 019b505c2f7276f00825d0b9d83fc665ac5cd742 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 16 Jan 2011 15:48:12 +0000 Subject: [PATCH 16/27] SVG images processing has been added to epub cover image reader --- .../formats/oeb/OEBCoverBackgroundReader.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBCoverBackgroundReader.java b/src/org/geometerplus/fbreader/formats/oeb/OEBCoverBackgroundReader.java index ee885a142..725ea4ee9 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBCoverBackgroundReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBCoverBackgroundReader.java @@ -29,21 +29,29 @@ import org.geometerplus.fbreader.formats.util.MiscUtil; class OEBCoverBackgroundReader extends ZLXMLReaderAdapter implements XMLNamespaces, MimeTypes { private class XHTMLImageFinder extends ZLXMLReaderAdapter { - private static final String IMG = "img"; + @Override + public boolean processNamespaces() { + return true; + } @Override public boolean startElementHandler(String tag, ZLStringMap attributes) { - tag = tag.toLowerCase().intern(); - if (tag == IMG) { - final String src = attributes.getValue("src"); - if (src != null) { - myImage = new ZLFileImage( - MIME_IMAGE_AUTO, - ZLFile.createFileByPath(myXHTMLPathPrefix + src) - ); - return true; - } + tag = tag.toLowerCase(); + String href = null; + if ("img".equals(tag)) { + href = attributes.getValue("src"); + } else if ("image".equals(tag)) { + href = getAttributeValue(attributes, XLink, "href"); } + + if (href != null) { + myImage = new ZLFileImage( + MIME_IMAGE_AUTO, + ZLFile.createFileByPath(myXHTMLPathPrefix + href) + ); + return true; + } + return false; } } From 9803ea679b3f8e2c57f0fccaac021f9b835e317b Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 16 Jan 2011 15:54:50 +0000 Subject: [PATCH 17/27] SVG images processing in epubs has been added --- .../geometerplus/fbreader/formats/xhtml/XHTMLReader.java | 6 ++++-- .../fbreader/formats/xhtml/XHTMLTagImageAction.java | 6 ++++-- .../geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java | 6 +++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java index 8fcc54ec9..4bd04c46f 100644 --- a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java +++ b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java @@ -23,6 +23,7 @@ import java.util.*; import org.geometerplus.zlibrary.core.xml.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; +import org.geometerplus.zlibrary.core.constants.XMLNamespaces; import org.geometerplus.fbreader.bookmodel.*; import org.geometerplus.fbreader.formats.util.MiscUtil; @@ -82,8 +83,9 @@ public class XHTMLReader extends ZLXMLReaderAdapter { addAction("a", new XHTMLTagHyperlinkAction()); - addAction("img", new XHTMLTagImageAction("src")); - addAction("object", new XHTMLTagImageAction("data")); + addAction("img", new XHTMLTagImageAction(null, "src")); + addAction("image", new XHTMLTagImageAction(XMLNamespaces.XLink, "href")); + addAction("object", new XHTMLTagImageAction(null, "data")); //addAction("area", new XHTMLTagAction()); //addAction("map", new XHTMLTagAction()); diff --git a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java index 59dc15983..a4edbebe2 100644 --- a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java +++ b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLTagImageAction.java @@ -28,14 +28,16 @@ import org.geometerplus.fbreader.formats.util.MiscUtil; import org.geometerplus.fbreader.bookmodel.BookReader; class XHTMLTagImageAction extends XHTMLTagAction { + private final String myNamespace; private final String myNameAttribute; - XHTMLTagImageAction(String nameAttribute) { + XHTMLTagImageAction(String namespace, String nameAttribute) { + myNamespace = namespace; myNameAttribute = nameAttribute; } protected void doAtStart(XHTMLReader reader, ZLStringMap xmlattributes) { - String fileName = xmlattributes.getValue(myNameAttribute); + String fileName = reader.getAttributeValue(xmlattributes, myNamespace, myNameAttribute); if (fileName != null) { fileName = MiscUtil.decodeHtmlReference(fileName); final ZLFile imageFile = ZLFile.createFileByPath(reader.myPathPrefix + fileName); diff --git a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java index c440ffe5f..3f3d39e7f 100644 --- a/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java +++ b/src/org/geometerplus/zlibrary/core/xml/ZLXMLReaderAdapter.java @@ -68,7 +68,11 @@ public class ZLXMLReaderAdapter implements ZLXMLReader { myNamespaceMap = namespaces != null ? namespaces : Collections.emptyMap(); } - protected String getAttributeValue(ZLStringMap attributes, String namespace, String name) { + public String getAttributeValue(ZLStringMap attributes, String namespace, String name) { + if (namespace == null) { + return attributes.getValue(name); + } + final int size = attributes.getSize(); if (size == 0) { return null; From e62b4c00506b53999df02ca0045b3ccdf68fdb61 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 16 Jan 2011 16:44:07 +0000 Subject: [PATCH 18/27] relative hyperlinks in epub files --- ChangeLog | 4 +++- src/org/geometerplus/fbreader/formats/oeb/NCXReader.java | 6 +++++- .../geometerplus/fbreader/formats/xhtml/XHTMLReader.java | 2 ++ .../zlibrary/core/filesystem/ZLArchiveEntryFile.java | 5 +++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index e0c5c91fd..a10c734bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,10 @@ ===== 0.99.4 (Jan ??, 2011) ===== -* A list of dictionaries is supported (ColorDict, Fora, FreeDictionary.Org) +* A list of dictionaries is supported (ColorDict, Fora, FreeDictionary.Org, SlovoEd German<->English) Code is partially written by Stefen Siebert * Author of currently opened book is selected in library (same for series and tags) * FB2 files with multiple XLink namespace prefixes processing has been fixed * Dutch localization (by Frank Fesevur) has been added +* EPUB SVG images are supported now +* Relative link processing in epub files has been fixed (thanks to Stefen Siebert) ===== 0.99.3 (Jan 08, 2011) ===== * All word navigation mode is disabled by default; corresponding option in dictionary preferences works correctly diff --git a/src/org/geometerplus/fbreader/formats/oeb/NCXReader.java b/src/org/geometerplus/fbreader/formats/oeb/NCXReader.java index c87078c66..00a433653 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/NCXReader.java +++ b/src/org/geometerplus/fbreader/formats/oeb/NCXReader.java @@ -22,6 +22,7 @@ package org.geometerplus.fbreader.formats.oeb; import java.util.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; +import org.geometerplus.zlibrary.core.filesystem.ZLArchiveEntryFile; import org.geometerplus.zlibrary.core.xml.*; import org.geometerplus.fbreader.bookmodel.*; @@ -109,7 +110,10 @@ class NCXReader extends ZLXMLReaderAdapter { } else if (tag == TAG_CONTENT) { final int size = myPointStack.size(); if (size > 0) { - myPointStack.get(size - 1).ContentHRef = myLocalPathPrefix + attributes.getValue("src"); + myPointStack.get(size - 1).ContentHRef = + ZLArchiveEntryFile.normalizeEntryName( + myLocalPathPrefix + attributes.getValue("src") + ); } } break; diff --git a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java index 4bd04c46f..57eea9fc6 100644 --- a/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java +++ b/src/org/geometerplus/fbreader/formats/xhtml/XHTMLReader.java @@ -23,6 +23,7 @@ import java.util.*; import org.geometerplus.zlibrary.core.xml.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; +import org.geometerplus.zlibrary.core.filesystem.ZLArchiveEntryFile; import org.geometerplus.zlibrary.core.constants.XMLNamespaces; import org.geometerplus.fbreader.bookmodel.*; @@ -135,6 +136,7 @@ public class XHTMLReader extends ZLXMLReaderAdapter { public final String getFileAlias(String fileName) { fileName = MiscUtil.decodeHtmlReference(fileName); + fileName = ZLArchiveEntryFile.normalizeEntryName(fileName); Integer num = myFileNumbers.get(fileName); if (num == null) { num = myFileNumbers.size(); diff --git a/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java b/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java index 3e794f26e..ae26c27fd 100644 --- a/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java +++ b/src/org/geometerplus/zlibrary/core/filesystem/ZLArchiveEntryFile.java @@ -24,7 +24,7 @@ import java.util.*; import org.geometerplus.zlibrary.core.filesystem.tar.ZLTarEntryFile; public abstract class ZLArchiveEntryFile extends ZLFile { - private static String normalizeEntryName(String entryName) { + public static String normalizeEntryName(String entryName) { while (entryName.startsWith("./")) { entryName = entryName.substring(2); } @@ -36,12 +36,13 @@ public abstract class ZLArchiveEntryFile extends ZLFile { entryName = entryName.substring(0, index) + entryName.substring(index + 2); } while (true) { - final int index = entryName.lastIndexOf("/../"); + final int index = entryName.indexOf("/../"); if (index <= 0) { break; } final int prevIndex = entryName.lastIndexOf('/', index - 1); if (prevIndex == -1) { + entryName = entryName.substring(index + 4); break; } entryName = entryName.substring(0, prevIndex) + entryName.substring(index + 3); From cac1e83e0b6b515f48e909d930e37ddc3676fc23 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 16 Jan 2011 16:50:59 +0000 Subject: [PATCH 19/27] Standard search icon is used for network search --- icons/menu/ic_menu_networksearch.png | Bin 3524 -> 0 bytes .../fbreader/network/NetworkLibraryActivity.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 icons/menu/ic_menu_networksearch.png diff --git a/icons/menu/ic_menu_networksearch.png b/icons/menu/ic_menu_networksearch.png deleted file mode 100644 index d55d93b6df11c8a973503d846a126d33be802304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3524 zcmV;#4LkCQP)GyMfmiPx_3{et^l^$zmXJ_8=z3+W*mJ>yh{E%Nf`GLQl z2Jl_KB;V3?x%>VWzs~{C3JNe8OwQh=>^R4q_rW|cH+%QO{NHr|<4&t!T9_WDfhpN> zp|!PDmzmf`J>l8ZI_AR@CWqzP!A=a|kN_-o1OV>FMbgy1ToRP>tlfckhaWgM%Cb zx?5CKw155j^`~&1ZrA{9lvPUnwgQl_tVg)r?xdYNcfQ`z(y}-=H`kYym32KdG_?Qf z)vG_9K7INbWcd2mUw^&e&Ye56N=iyTLLfn9Wo4UjPJ2{TR0}GVQ(ax1fa7f&Hf;DX zKR^F6uG(;HSL?(~P<#OeoJ$qi2N~K+Jem{i+ zpfm#x2Jm;2TCMh`rltlXz*kYF8hr1QS+iy(ojrSY{imOP`hHJO&%ai!T6GxbwlG*d zQV^0!V4gN=G+F02bd^Uu3UK-PE_K!(-i9ekUd-Mjss=&9%3;D;aI-Zr;4P2=J%}-c1b4?m!?Q`u$@}N&mS=o3)^z;IQ3p zk2!PZOb$&-e}BKi0q(jw{QO~oQ!3xim6eqR zNJ_@+*|YmstXQ$K>LULzUjL|?vqIRP-s!f_qWHy|0p z(xpp32V)(j0WMm!s2+*fir_ZmK8@p*oD97_h=piik+2zCwrtrA_V6O(zoJdaE}UYq zSQZ>QbZ86ZcZb8F0j(UOP2f- z*QsUB##K~QY{ER*SXfy2Cwx|lW9p;PcgVqm2NwbkkvTaze`B28!>SVos!V{h z{QUXz4}q0BkzpAESb!`Whlhvb(E|!JY9A7QO{G$`B7kN(M^2tRxuUtbIUP=pvOz}Y z09RaGe6*&fX4$1nmwtxNF5=iAgHhm70~m*o4$M;w8XN>H&M}H}FzFzLv(tg;4me+f z|92v*9#{`5Qv^7zy>;srS9!5A3Jskqa$+&uu+eK7GmH*UZy2DJl9ZIx!KShW*XmD6 zNjY=<`t>!K6)BmSncb6NB*}xQ6AYn6`O|>+i}&f501GY%jvB!{6)b~&UXND^7|cCY zacYxPA~l2boQ zZroUR<;s->2;c^jEsq?)m}EdHjp∾QuzmqI0}DD0M6{tHx&y>;_6S@+%eP6~B&- ziBS5P(2AxH%QWKd>Mx;t9{Vq2!Fi`Z_?$7@0a=UWa^>qlq z3b_)=W{`9$O-zr;0G}}E8G=Tn7l~%srx}Suh7!;NVt9DC8Vx&V|AGCRG2j$%lE@S? zq7ByiBBLYAjA_Qtw0dnjqeE5w?fMrxS~}i9^Q)brlf=fv^7W?r=S=mchMe4->of>B zZyOmIiD%9WQ=!pdN}qf8?tQ1Rv2htLMxbrT_<4dL5XcDvW+9+T5)u+ZEM^OdPmCw( zAT^OI<-Y8!?7yT>Pu~X`9b^y_Sz`19{R4|CFIR3uA4K^Be&Vn>h;`IThK7d-7;Nm? zXma!;~s#O*`;_De6aGnX|I9j(L6FCJ+H4^b&y zB}fFGvX#&8BX*nJIf>HK&jL=T)8)kJ0r8t8b37-2`9jd((=ZTQ*wFM$B>;LwhgPc{ zMyA_<^<1VjHH?W|fDoOktq33~NEKw~0vrkW17yfDl*&jz`moiswY@dV?QxG)fERfJ z7PDi?nFC_rAquau!8xS>L>B!B7LQ6WP%Ly$Hk$?G+K?-<#Q20iGa^_ z`}Xcz#{w1}AX8LzwROh!uJ-wygd3|jdd8WUoM?lDC`96VpuMO(u}(&fK4_t#_%lQD z9z&yA%gf7OWP>J@O-SXudGkytxm>5#@zi-*fnaqoxpwv1FRE`=KMRP3GEpe7`_QU{ z0ONW4KHv8TeXyRBOXS4MdxVj5^P4%=HP6LPkxHt~2PTfsoxSls^$TxK3Q za^yK2%YdapCq<#$S$Owbtd=mjOdjxwJ|b7h31ozN_nzJFm6nxmz`3a`aB4}7w;PMM z|8@I&<{|TJL#P2a=Lu+8%$%OtdFJ$)#h~rZWy_WwW5Urj85*7FsRV7@2=IR<7Wt1% zCX?aaci;Ww^y$;lSUi?M3TV*GZJ5Ny%#6&YI#XSm*XiZ_qMw*Y%mi|S$Rx66K;x1^ zs_=Alc4YP5?ak8#>-e~+I3iO)QV3FFwOIq$?79XA24fd4T(|@9Imp<~_P7CzFZ3~R zreN2uT{~J@TGVJV3D&@?t5>f+4!R3`@WBUfA?tmK35lann)!BzT@d{u@pwIB6Wrx= z5wG7n=B!esq;rKJAOeX!_V5dmg+Q9nNk0l$makm7^6!}PwQLqVGyq}i)~yrK9fgt? zn%@Q8V+Qv>gC?_M1w0QWdI!93#d6L={uVy}{PX_?lzeWdJKpJajzNM zk4H5gBpU?Q%y6L{NclIhj&M6mkUt-4cC>-j|Y; z(qo)qH1+rN>jNYp_qe}dN>r1Q0N>Qol+)hYt_A~|=wr!;JqUhS0OLW>iRgrI8^D5d zlWtj9Jf1y#_%Lm14!qq|T3T9+j5`Vn3Occk=?4Y}^d%)FWub=9Ap{++*Xqs1&lXog z>&Q=@I5{&mE>;}1joMHJr4Nawvp|%H1d^L?ZE4Nw>g|#vLAO{X{ErjB_;91Casruo(`P}D9r2Nok$15cMqk_sk1s4?+ zoqFLXFMNp9h{Hp}Mi2#0brHP_FX4$wt>RmnT4rJGlw=q)8c+$_gM#25@kc&^al4ky zgz($9Z_h`Q7lMsuVz7l#0Z5w@nH$@}u23m|xf?!9Pws+UI4QyS3mM(hJW zx7aKaK@W^#It@#Igdhytg*ZoWnc^FF!Wn^UZ!cH>@p~Mmt zjcn`S1kI`+kZVQ|4tBnkE$Z~0F8BPR#fx^J5c0-`##hW1Ge9H~nJ6QoOeCo(sR9DZ znrN|^$`2glzq;IGlEciZGWNJJE-tQyU6&h|=FD77hPc^r3QJDlg}%aP3U|`~o9av@ zsG!8nxrtngrq%|VbF*{5oJbRKPxyD@@t>CX`<3VTk~G2hz^Q?V@>At+nQoijfTj|( zI<0y6(&Z(wiLsTarsYZXz_;}pdys6m+oKzs8`pZAo^13>8AzZU&W}tq54i8qFZCP~ yd Date: Sun, 16 Jan 2011 16:51:27 +0000 Subject: [PATCH 20/27] 0.99.4 --- AndroidManifest.xml | 2 +- VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9fb1d93f5..f6c9e12c2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/VERSION b/VERSION index d17274b03..de9bcdff2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.99.3 +0.99.4 From eebec6fa813ef149e27a9a2208f25db207d0ac24 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 16 Jan 2011 16:53:36 +0000 Subject: [PATCH 21/27] date in ChangeLog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index a10c734bc..90667f074 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -===== 0.99.4 (Jan ??, 2011) ===== +===== 0.99.4 (Jan 16, 2011) ===== * A list of dictionaries is supported (ColorDict, Fora, FreeDictionary.Org, SlovoEd German<->English) Code is partially written by Stefen Siebert * Author of currently opened book is selected in library (same for series and tags) * FB2 files with multiple XLink namespace prefixes processing has been fixed From 68e993f3a733bdb3e50f8df61cc9fa94c1ff103f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Mon, 17 Jan 2011 20:04:40 +0000 Subject: [PATCH 22/27] key navigation in top-level file manager view has been fixed --- src/org/geometerplus/android/fbreader/library/FileManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/geometerplus/android/fbreader/library/FileManager.java b/src/org/geometerplus/android/fbreader/library/FileManager.java index 480422c56..deb74da5e 100644 --- a/src/org/geometerplus/android/fbreader/library/FileManager.java +++ b/src/org/geometerplus/android/fbreader/library/FileManager.java @@ -65,6 +65,7 @@ public final class FileManager extends BaseActivity { addItem(Paths.BooksDirectoryOption().getValue(), "fileTreeLibrary"); addItem("/", "fileTreeRoot"); addItem(Environment.getExternalStorageDirectory().getPath(), "fileTreeCard"); + adapter.notifyDataSetChanged(); } else { setTitle(myPath); startUpdate(); From 913a702af880b2ab49e96a178e47263ad4208b86 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Mon, 17 Jan 2011 20:45:36 +0000 Subject: [PATCH 23/27] hdpi icons; new icons (compatible with android 2.3) --- icons/menu/ic_menu_bookinfo.png | Bin 1694 -> 0 bytes icons/menu/ic_menu_bookmarks.png | Bin 1500 -> 0 bytes icons/menu/ic_menu_day.png | Bin 2520 -> 0 bytes icons/menu/ic_menu_languages.png | Bin 2083 -> 0 bytes icons/menu/ic_menu_library.png | Bin 1296 -> 0 bytes icons/menu/ic_menu_networklibrary.png | Bin 3524 -> 0 bytes icons/menu/ic_menu_night.png | Bin 2461 -> 0 bytes icons/menu/ic_menu_preferences.png | Bin 2144 -> 0 bytes icons/menu/ic_menu_refresh.png | Bin 2156 -> 0 bytes icons/menu/ic_menu_search.png | Bin 1783 -> 0 bytes icons/menu/ic_menu_toc.png | Bin 1584 -> 0 bytes res/drawable-hdpi/ic_menu_add.png | Bin 0 -> 2891 bytes res/drawable-hdpi/ic_menu_bookmarks.png | Bin 0 -> 1684 bytes res/drawable-hdpi/ic_menu_day.png | Bin 0 -> 2793 bytes res/drawable-hdpi/ic_menu_languages.png | Bin 0 -> 4942 bytes res/drawable-hdpi/ic_menu_library.png | Bin 0 -> 1643 bytes res/drawable-hdpi/ic_menu_networklibrary.png | Bin 0 -> 4578 bytes res/drawable-hdpi/ic_menu_night.png | Bin 0 -> 3021 bytes res/drawable-hdpi/ic_menu_refresh.png | Bin 0 -> 2856 bytes res/drawable-hdpi/ic_menu_search.png | Bin 0 -> 2535 bytes res/drawable-hdpi/ic_menu_toc.png | Bin 0 -> 2151 bytes res/drawable-mdpi/ic_menu_add.png | Bin 0 -> 2011 bytes res/drawable-mdpi/ic_menu_bookmarks.png | Bin 0 -> 1118 bytes res/drawable-mdpi/ic_menu_day.png | Bin 0 -> 2318 bytes res/drawable-mdpi/ic_menu_languages.png | Bin 0 -> 3058 bytes res/drawable-mdpi/ic_menu_library.png | Bin 0 -> 681 bytes res/drawable-mdpi/ic_menu_networklibrary.png | Bin 0 -> 2823 bytes res/drawable-mdpi/ic_menu_night.png | Bin 0 -> 1904 bytes res/drawable-mdpi/ic_menu_refresh.png | Bin 0 -> 1886 bytes res/drawable-mdpi/ic_menu_search.png | Bin 0 -> 1707 bytes res/drawable-mdpi/ic_menu_toc.png | Bin 0 -> 1235 bytes .../fbreader/network/NetworkLibraryActivity.java | 2 +- 32 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 icons/menu/ic_menu_bookinfo.png delete mode 100644 icons/menu/ic_menu_bookmarks.png delete mode 100755 icons/menu/ic_menu_day.png delete mode 100644 icons/menu/ic_menu_languages.png delete mode 100644 icons/menu/ic_menu_library.png delete mode 100644 icons/menu/ic_menu_networklibrary.png delete mode 100644 icons/menu/ic_menu_night.png delete mode 100644 icons/menu/ic_menu_preferences.png delete mode 100644 icons/menu/ic_menu_refresh.png delete mode 100644 icons/menu/ic_menu_search.png delete mode 100644 icons/menu/ic_menu_toc.png create mode 100644 res/drawable-hdpi/ic_menu_add.png create mode 100644 res/drawable-hdpi/ic_menu_bookmarks.png create mode 100644 res/drawable-hdpi/ic_menu_day.png create mode 100644 res/drawable-hdpi/ic_menu_languages.png create mode 100644 res/drawable-hdpi/ic_menu_library.png create mode 100644 res/drawable-hdpi/ic_menu_networklibrary.png create mode 100644 res/drawable-hdpi/ic_menu_night.png create mode 100644 res/drawable-hdpi/ic_menu_refresh.png create mode 100644 res/drawable-hdpi/ic_menu_search.png create mode 100644 res/drawable-hdpi/ic_menu_toc.png create mode 100644 res/drawable-mdpi/ic_menu_add.png create mode 100644 res/drawable-mdpi/ic_menu_bookmarks.png create mode 100644 res/drawable-mdpi/ic_menu_day.png create mode 100644 res/drawable-mdpi/ic_menu_languages.png create mode 100644 res/drawable-mdpi/ic_menu_library.png create mode 100644 res/drawable-mdpi/ic_menu_networklibrary.png create mode 100644 res/drawable-mdpi/ic_menu_night.png create mode 100644 res/drawable-mdpi/ic_menu_refresh.png create mode 100644 res/drawable-mdpi/ic_menu_search.png create mode 100644 res/drawable-mdpi/ic_menu_toc.png diff --git a/icons/menu/ic_menu_bookinfo.png b/icons/menu/ic_menu_bookinfo.png deleted file mode 100644 index 65efaa3ba03517f9ddfe7930175b9a523bf4ae4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694 zcmV;P24VS$P)^TiHwOSaq3)_YTVUc72@XYZXSU$`SGs&LQGjKW; z0Qh0gVGHc)PX+)vXoFP_4i0`YIXQWLXJ;pCZEdaaH9}s!EDVK0+|8Re-(}7x41j0R zK7Q@mwXa+**Ll5O&lMCDa19L&Tvu1ucYS?*7yW*}Y5;sbAIE0?X)F)kw`Lv#dbBz7Q23T5e#Bzvv!Pae8=oxDzu` z5e|prjg3Dc(!a7| zjYYB0TB%*0$_D@mF)QK+qd6#I2_vg`uaafSTb!-7126AK3>1OyBjyksR9sQWr@I1 zwB&7+z9Glj`p`uahFG**c&GrN-xXQMLTBdGKgsWHdqG-s&n+%4#vDf#F&AA2{v%_N*OdR*2t8+uH^N9^7nS)& zb8|D-)6>&}I#EV?C>5cogoT7er33@E!@t_`lU6pflMOr4X05lk_tS}qiF(?iQaY)* zhz0l%il)n0G%CFql39=6%P<=rqE6bJudJ*%uUxtE<@)-%gANBE?qWKcmKgwxgrXNz zyc7}-b^Lzq<;#~px^Usb3H-eW@#dVGnyMwKL1~knoh?@4SWc#+4p90CBzqH8qePVt zA3i)YGc$8WIsl-Qp{PrT1MyNMU3FkDI?_mm*H@~z`!$O2$&)8JX~Rwcqyk6ID~T@a z<7dZ=Ndchr@uMJdg@uKpv*ZLh*5BWMv9+~TjI_WWVz=OZUO<3$}k)XN52+00Fz*z6bz63=Iu^=ytmuUa!}J zw9u=4Y)&&!Q&ThC-Q7Kz> z<#O3T7{QodU*b5RW1ElySTS7}78c%u;}+~`9oXBNFdMuI`5*H6e4CKjuJ-o!LEKtn zySjt{NS~K7*fF<}X&VER$7+3QiZK4)V4I=9LF+)1Knh5X@(h%82P)E z2^bw+voWqZ_I!2c{l?cxZ>PKM9=j!yEqL@tRdv59>Gt;aZ|L!b2E++JOJ*RfCWL_# z>+9=}c6N4pqtR%BCJ-RjQe;^!X+^n)!t(jN6p2KH!NI{F78e&kkt8YP^Znb1_zbnn z5rFK%!otJL%gZ8x%D1+*e$~;@@f|hEl?~wF;GkoBd;5Kw{7aSbcwErGGb)vpC51m} zYHA9F!(qV;KsK8V(QP9s>%DY3Es&Cgy1KgG>D`Ycf3ig!yHJ!ql1Qae0$HH+64%DY z#-9klg(!*z7{qh|$TArrUvi~bELI>1P#>dqPzEMg=;`TsdUA5ou(!8&KbcGdebj30 z1+HNaa@jzL1{NwRD*o11OH0f5&CSi<(&IA=#(B@n(`~x5v-8W% z&CPfA_xJCMSB?GU0=Pm!CWoug*jIERNmz8yR-UyJH0gRta>k4BM7}C!mJ+z~Ir^NQ zo=V(Sc4Z%c*0t-EK#2nb178G#LE)N3EG#W8y#;GfQLF%XsfZhTCK$Hjn-X;0X!cPm#-`EKA>?Vd2GqR4}ZEs`&?EpsFvK3P}a3OU}*8pg> z0Y;(?3GDNL0O92C855)-m))GsuY=4 zS63@YXhudxKBDKRBuG~7;dy3e<_YRKbyQs4$c#b>u+aGUxLp=PPH;h%%a4tXy-W9d zBtLWgAJ7TjPft(J@pGl8E(8FS6F6ZZ_*n(H-PfERBIbWV!C-NIejaUpMGnCA037nv z0uJJ!01Gm*;Kanl=bWZiu9VnTU@*e0EI)_mnaR%$L{WKoc#1n0`r{S7u|9pN|uNpBK71-(X+EN?L5i` zAko6QKpe0BK9Ec%h2`btw=$k?+-iC0+sep9A$= diff --git a/icons/menu/ic_menu_day.png b/icons/menu/ic_menu_day.png deleted file mode 100755 index 74d080802527569c50fc624cb36a01238f0aae46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2520 zcmV;}2`Bc6P)%}(yZH`>BLU~y)2B~IEffQK9I>&n!ip6u1f5Q&<+xBvC*rpX zzDBW<_~_B2oSvQ@QCU@px8F(uS}YEjE<1nze9h?S=)q^to)zF){31#S1Ra%16&z7f z|M?h+@X;8i+qZ8Y?C9wD)!^XZ?zXnJb-1RJqkvopsjXIPg2iIl`{2QYDzn-A#P9c; zG#ZUEFE6hX_a`BcOG1}!+@BK#$9ESqkPq|bL5+lOZf-u%-`~IQ;lqc;iHV7i_wV2T zF|PMBbG@|!K~4vDwLnGgrcIl?)6>(b0|Nuaz;|G3YD%?p=gxm~O!yhUj`;Zae#{Gc z0x%lHHM<1UQEcI)J9q9Jc>MTrMORl>QFeB=8o!H0%xLAJLyiIg4pztd_3Q6J;CMhN zv#+l&x4XMr?Q}ZrP~dB37=dF&SyWWimYkgYC$HD5hhYC=L+DsRTGQCt+FA(A?+5ma zHg4RgPD@K0UA1aeOKxuNQ`~pSVI#Q^@rQ25l;)V7qAlzPC(g8R-$D&Pa&ZJ@=k z@KBq_<52?NC198J>FMbY*s_@z>6b2DsstRijg5_&fc@b5P}l=+3>Ov_wpLbF*5VRD z%CmCiO6P_R8wLO|T|z=aJA}UprQ0c{Hr*y zFJHb~Ju@?t0L26dO#Cm<`pCutU?;fUZUG+rrnl${ROs{93Eks3+3oG^6=%<${R3d2 zCE=k&ko!q^sRE)B2zmhwCd}cesj2x0!P|f-7D<`m4_BCQ50UFBa7|aPT=@-US`wb1 zL)=fo0%Bz8;GpkxjqZVp1+Wr%NPqF-#cB?4ouqt-NJFFG0N1ggF+2=>ji@rdsi~kW4bj`ADB?z#oSe+QfB*i^Da-S^8eUs0#r2XBL?M@jXrh)O63?F+ zzUN|BlckctHoL(jLClkIWNo%TD zb5+1?x>~K)LBIgMyI|?T-TMx%f=k|}49QLbIPR)X{Q@C-TN=r*eAOsbiL3k|XAlMzrMrx<{8(-3|o zS!qdIA`l(|PZ7o;d@}?#!YgK6*NRmvU^IwY>kICy{c;rWbHEI3-n{uD$3tjPk;H+_ z%*?OB=^0D$fS4yhzmK>+8it^sGTTX?N3fY;O5A;hfr96`8r6ks5l#uMN5HO zHTvGL6d)>v0#2+!)*WLd0+K{2Z7sc$Dppo8CkpCYB*mQ3N)LSl9%j3!;ZdUXfto)~m!)94f8K)E$2q0LmVQS}*0t)v`Pr^ITg`=6AT zmwy7U4WlvA_4fA0p;_wPzJ2=uL)R_0tWcgjc`{t#(`##MD^Lc1(9+WKOVnic;^N}g zHEY(iLTE~OCNQFgFiwMnCTc{zF90sK{QUd|cRO19T`CP#yCcfjkH*e6elYw!g!wd(o-oBPNWD zc{>#7M)T5)(-#=y1VeaW6*6z3#bVK-N=?Q5XtUYufJdLOCp`a63E8_6RB*xaM_yiD9U7hh^1ue|eVi)D)Pi;?a0^VuY;+3RTB#%1w?Adb{om>u}wilF|H9S0=-O zt)&Sib}|Cp$HGUhsYig?!8msiv|b2(4*}T*_;fNXq-8EyHyXG%Q=dRAhv3X(I4LE0 zhG1kxP=ARw(}|M70WTD-Tept3V_xu@5!)B?z(QlISFiqT>(;IR1Xgu`4?Sd>djx;T z=B^g=wZuT2bw!R>gp@4w+esMWE98g?G&!Ha13o0kh;OTS!37%qJzRsQc%T+(gAZau_Ha1*D74dpEE^BBZ%)P@+>5 z9M+u^VYb+O2p_t3AW{$#!hGov+#5we4v8^R6fJKSBCo3u{ z{tAj5M+xBp*Ecf%`y%~fU9k*r>cvd~BWG`ct-mZU`4r3aR|E02k+hHS3(N4DRq^h> i67LlFKUd&e0R{k1eRNVkXh_Wf0000Tns z#A&I8I+m{d{K~%Xe$M^8mvpzcw>!V`HP`vYuR{e675Kj^FhA{w>({UEhtC2i21UA0 zy9&@)_j*4IT)K2=e+vBM)dQuXpSiqpxoGrXKxhecLzYZi@<{dlHSzm*AvELq1C)V+ ziTM&V6hz9`uU|KlM~)onoH%iU!%z@QG`6cRWs)}D*slVAqH?F*ZubXVW3Iosxw-!8 z)vKkds$!CVf$z`F&6T(hPMx=;4C7>e;hr z$;QUUsIKdac+MeYWCEK25`Jg=^5x6%ty{MSXU?2Cx45{-7#iZ+K)(+#rU%z;-PSQ+ zAM4(ufF=YN0Yt*PckhnhzI}TWFv(%jh;VT9yg=ll2X=7}X+>p(#);TOPYNM=}o&(+q}Rs!Ke%#{?90umAsu8T1Rr`2;jk8m&e zj4_poK&2Fn;f<1fK7an4fLA3?1@g+mfjr=ppj!hmt3G}D6yLdXr-Cv=2oadYAwVHT zI;IfrS8z||0SaEz6MRP$zyrfaj~-RvAA@J5H6zBA^LT3yEE(>}1Pf&M?%gZDeECAF zhM+zzdGzSf5=0mgPJIbSi)Ro%ln2J3+kzUs6N6}k5Jo9pym-MN&*){vP@n6|>-$$g zA7&1R#pB11S3iFIm_yh|LQ?1v1%aRe=BbR2gN{8@Vd7u&6nrE_=&=Yf)rTUhcrLg$ z;{gg}d%x3Ud_=M?`O7M559OH!W$_#R# z3|?6J`t@t(#7OqaM)Nb^lelq-R5`+(5b3C3Razi+skW5ILJEYrbv#EL(}VO9pFvCj zoMUDp4?-;hG_&{b->)1$ew=(lrPuSIwKi!qcADo%mrKMoU5xt$+*gQed4d)$aQ_XI z%F>OMF;4Z(IS9#&RavkrbFI0!N#KEIJ+7_wlU5!8Y(m37m=+&Cd}yG<3?ZxVid?~} z%nR1IVI2D+)>sVBR_H)XpG^f;CL``ya|)Mz!d8`-iyQu7{V{Pa&jeN%%rX*=!fbnM zIpJxHZ6~-9jZsK=%XASa_ef}6iCs@p0}6oxaiHQ=Szxkw5z7o%%RI-99UBr781KN0 zS%)wpq%7D~sbg30i2K?bqAi4WK2(;lpBQkptkigg*#ytEdLhdqEMT=dPzEyj@!N;m z2T+lwP{K&8*t|E^Mld(ZQ3ifDs}{`fQ3pB_u(7JVGElZj%|py6!gAtZV;h#lVV@mn z&LU;J8Nkd&22ls4X3U_T)e}us042WT7%mVVQY`h|rt9hZwz!Ll#NO5X4|5i4O0hes znCo$Uy;sfhz^oXsir54jdl`9xxw|jSSL$<`!iC?vs<<6D-%}N*4>U+68M5Rw2k51+c12Wz_pu5{_*`CeKwC$TWb(l(HFPC)YEr zy{^X2pfol#>;zyYS*Ar5oPBq)P_k7Jh9ld7;rknWmzY;Z2_4Rf`9j;%*n%8_ zXHZ}n_h{lMrd1F#1?CJ|GG~*e7J|Y@QjX)AR>eE1K~7B_t(fdmyeu27$)mX}JV2-W z5SyEUGaP@bTkQvkJ8u2>F;f}c`tIGk^Srx$CI$6ah}7Is$sLSaFv}~f<^w&GM^BAi zlX<{9GyaxF=@H4%E{%f8h`3Zrr2BKU)KL%wF)A%xJFphoP87Jm#d|~5g(i;ZA$6^_ z>I63{sm2vrl?2^xpo0MufnIvpdP_;G%L*x|Qg8*BA963t%{Z;tgm(3K}ZVJbgRZ>$iBUN`t)gt#hdhM#SB7ivyE1B zM(^~jDU@~1BkWxJfXvF~=4K4OOqCIhCb*_-O-zPXbwHM|SQufP8Xo0|f{SBAet{c( zTGRI}7$<@d_r|_!&0&D}$&)9mpo`3Q^rrFFngiSy32{+=-NScPP9V9k{Ri~E7gWXxJ& z^QNd_*T^!7B?9qck)*(cW-VUhiCC~5+VDUgFhM3yjqyCvkvKh(%2LUU{RJ&OWGc1_ zYu2U`82@f3;C@%ALfL*tHo3tO(~fH$=-yS#uTCDT?{zS>%TfA@?dV+mj9c%>{3*3{ zp6ZQ$$WktY>e@dNGkW}^TA N002ovPDHLkV1gs}>6QQh diff --git a/icons/menu/ic_menu_library.png b/icons/menu/ic_menu_library.png deleted file mode 100644 index a8ce6cb5c2a93c11fffc6d03047e9d656465c576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1296 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∾QuzmqI0}DD0M6{tHx&y>;_6S@+%eP6~B&- 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 bQ-A>glS$44bOzd|00000NkvXXu0mjft@5v? diff --git a/icons/menu/ic_menu_preferences.png b/icons/menu/ic_menu_preferences.png deleted file mode 100644 index b8e71412d8abd068d6c02fb237ada60b2919598f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 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 T%mB`e_XvQryI@PR@xS>Ge*o(e diff --git a/icons/menu/ic_menu_search.png b/icons/menu/ic_menu_search.png deleted file mode 100644 index ef949d500227869b4a52fbd371cbfb3a37072651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1783 zcmZ{kX*e6`8iu17)4^#NN-a}k8LHAmN-eD=u_a|mP~9xYpF8r(V_&M zlB$LnB+6864Yfyu;H0KnRfJN*P)o?9{WbIB{CK|mdf)qduJ7M>!wuym|Bc!=002N9 ziLmz&6Y@D;V9Jz7AA89gRl(6e}j;OB@HTT7O<9M8oi6e(3@@ zYk9r^fb<~J9_Ho8UM-G@zROeYqbypFt}&6*;Z0nrn(rlfb1qUWooeu)j8pA9XF~JK z3~BxYJJ@;FZB(Y<_H9;ZE!z#~Bv}PV*!Of8Hsi3CMLzw&p2~?+5HDvXOvs(^*9pwF zQL6)6o)o6(MY2Fn6g3*lIS{Q`k=Dv%-xeIY(v}RI2Ky)PN84`uXXDIBC5qQ>l)|r_ zGA2=jt3GJR?gvb>r=()tyJk+ms@XNs+lWac-6L@PYuf3d{uJ_4uL<(hKK?D0ryr8F zTh)$XrEPA<;#4lL#)F2++ctAG0=4p8gNJ8>_Ac|#*zdOtmvWMz*yK#%MV?UrqxR-T z<@ID=2Uu_M^>LKZgU)H;?Hyi|kJIZ7S?Hj}U?H)<&Vsr^RB^!szR;=<0VXSr_$AJG z>Q<0L1bG$U!9xWFl^)j(lcXQ-7?GjE@>8iV&6i7om#D8Y_8txt=n}5#;bs#OpG<)& zF!&X(plu{zai@&XGNiIOKjHGy_~!!A#qM{?`x!Coo5zNi1CMw99tbT9Qhn#UM+HIyyLKDKs$XFPJ!k>ClsB7Y%6c zD7Ej91N#vdb7d;7iLo>`K+mQ;T z9wlOU7|Qugn?jC8Tg4F#ja*wUs#*VBU3elc=xFS zGUJ!XA3Q9ybh;%1^wO*4md)qw`DauV|0gLIr3EviUHP#yjE^6$Pq{W`m007h?u>Ci za=Bh{_&Xp*qMJo+s^sgJ|2K)|OqA&XE#@>j@^uajte>~Ot{oWp4suCdbyiTZ&1Jdv z{UxbZ72!rScHfM(N=f-@OZkRVs7SlaD#Wk_*?VHK)jRk?;u^VQKE4fcR}&zVz*RhB z>{nVbC3mhIJvaIx4UClqc0BlYjoyXYl73NuEz_*@fdAVHeexPF7Vuix#w) ziF#-1vRRqG;bq+_=5WmM$Fq~xHYMFiqR$*5B`8$OVSyjLPLxMa=tZKYybowoppX5< zt*Oapqq&raj+0knxm^7D$W5%YXBX=05Zi?NFfqoP#^O8F)t% z5OULq+mSJAGt)t%nw$$wk+$zKk4zJKt@|bWXWU(d5-?J!(>qHb4n~C9U`qJOHF$T_ zu5Sb}PAAnnE73$PM~chp*Sl}5;7uba!VfdL^o!3~Zx}VR=Iq^Un~CIXKNy&70Pcs+ z(K%Pg1EQ9}&cRu&f4pv-t5z>{C@hs0Fe+-?y^<_4Tbj^zC7a5WA%`rxB80--st-_` z{RX`7SIRx3;DjG`x#WXU8Y4Fc(|pTQ(XTO-UC411Icn=ja%$7}&Dr-yEOx1DPar?7 znK@X_CJq;C@*5To_>m{CrSYu&djhzv5`w8WTH^|(8A=ibEbeLG1T@gYBqrnI(WmY7 z<}e_<55%8THPMd{0Axr%cV+wjDQ&gx=|#V;mWVJ~MwFn&vyTx<{#%zt8m8?q8G-uT4dqWYzwK4iEu`?{GVHvuwkQ zFQo68s*kBBsjX%2a$wuH3J=JuN>Z2FI|ypYLlWLhh+Q>(rZz> diff --git a/icons/menu/ic_menu_toc.png b/icons/menu/ic_menu_toc.png deleted file mode 100644 index 27197da3be9b68dd1e2a16c29f1dd067798cdf05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1584 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 e^uMI*k8o0%v80000^G_9`rgVaiU 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_menu_languages.png b/res/drawable-hdpi/ic_menu_languages.png new file mode 100644 index 0000000000000000000000000000000000000000..212316cbb7c9b71731fe2a50373fb5f549da8470 GIT binary patch literal 4942 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 M07*qoM6N<$g6&FPu>b%7 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_menu_library.png b/res/drawable-hdpi/ic_menu_library.png new file mode 100644 index 0000000000000000000000000000000000000000..0e4c2e70c121978f6b6087f581c806094234312b GIT binary patch literal 1643 zcmV-x29)`UP)uAbJoD z@CZmW6f|@!f|fU+<0&Yhq~D(?IH+k9B?e%OO$t{R}ezCPF6+w1&^`3=OtdVPJZfA8<_ugQ=Y zMD@SDz190+KCC6|(>DKp%Um@;fILuBVhh#6)Auqsrf_n@69)#uCkuo8`wL+Zw26rc zH$Fb@hKGlvV;>$K-2MH%dwF@uRR#qr*dc3=#w_yBc;grhYHqGJ z2=sS%cencV^i=mk>+9+9(12h;PhWfBr=!5Y?Lqkn!;RA?kEWyjoRsfgE_S!)5(B(;S_(lLG3G9imiXoW#-s|R5lqrDwyCqSCuu`O<% zS~Le3XJ9QChgkt?YpOwc1ug=%#8M$(95At1#>YFc`g7sAn3NN7_v;!J!ysXnX`|s- z98|c9NqLl}PK;G7X5?|u87szTDb3~z5U0}|dn6-`|D_UNY4e(TP+RZCykN{2X`@tj z9=mD42`ZLHr971Ef9}OFIGR9FVjZVW5@TX))gDl;Dux%wxnat1hYO4q!MJ{kL6jGx zY*m(6%*-Il+emdB%Vl1y04EjFG(l*@BLvqa$7?KC%?3)yBXzg2}zd$8LyOg?d zQ8Kl03an7Bq}Ea#X2}~{j-)yJLq)-UY62ZXpbkm_xCQ zVi0D7|2eih9$*WrDA}#po|dxt@T4ub8dAL)s|puMOSPYWdhHX-mbs0^itG5qrCX8M zwNI=-&jpXUUi)YQxeyrY5)l{7FwhvJ*u~+(!h)NeoOG9$mttR`k#wv$Ce?*FyAZ1a zXm36C_V$_tQGHo#km>KmBoH`*i-DDXsX+=FIa`&bS>~FPRc>>XCyFhQii;#Kl{J=W zOC$|CJvB9DUJTfPv$M07Wt^X%*S^D_H-K%qy1J_OS@(eLlE}97pPS@pgAzcgC4dq@ p37`Z}0w@8L07?L*_FwxWzyJYHBFpS`V1WPt002ovPDHLkV1kqm0CxZY literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_menu_networklibrary.png b/res/drawable-hdpi/ic_menu_networklibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..5435ac926b59d2ee09f835fc88020809a739ba17 GIT binary patch literal 4578 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 M07*qoM6N<$f_N~=yZ`_I literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_menu_night.png b/res/drawable-hdpi/ic_menu_night.png new file mode 100644 index 0000000000000000000000000000000000000000..0d143ab663942fff3cde27573f555a5206b16656 GIT binary patch literal 3021 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_add.png b/res/drawable-mdpi/ic_menu_add.png new file mode 100644 index 0000000000000000000000000000000000000000..57a4099bbb199afe92a9fb3feefc4125190c27c6 GIT binary patch literal 2011 zcmZ{lX*|?x8^`}MVa77d#9&4-wk)B)nbBx+tTXnVp>iz4OdNZbN=ieBl&H{R=d{p* zEQ!O2I)(tlHj*!XZ5zh0)J_@pHxqR(@ffmHCGRul zS=WjhC?l%ttFx||RjANZbn6aMT`1a*29i=PmFD!DvxHK+>?397C6=2{^^S+EwEsom z&N%K{>v`rFWingWw^6Y2ZWCI>x#tr!>-DMBN1@&EV)(~NTC=4_zc7x1knJ>z!6k2( zOU|2050~Tz8w}x6Dh6raHS%9|7j;~im^{fXS=HnKkrk0n+tXRj|Ev^bE{0*aXWuF- zxST%$v_%nTOvru~J#BGD;yJFtmmu+(z3+F`#q)Zbu!)Cbu6XHRy0zzazLCwJa^7t>h|hExD~@C9mwwy68AGXo*@Vgsqj7mYT0U zJd&+~1n6{n!CjAhlY8eEKSp$pQTsZD@)et4QUlny*0n{A_B$=Cxhouu{Pc=gApb$L0tUvbm#^razTeRRu zIvtDun5*3{m-?8Ow-d3@0m?Y7Ebon}+8ka-!nvPY?;g*Z*)+VEc9<3r@`;PK(w-j5 z0uf>^*uF`NwBR#UItLhKnwxV_R0e|(yWp_{4!z~QKu!;$YP+7QQysb~bpy*)jS$J! zyFPEfp%-9OoG{#Q6MmF3?sBY%HxQks()S}o9txfIKTR_68te_x%uztX_VY(dn<R5(Vu0D)AX%E_*~O_Kr3CSNpdRYE+w`!mCB8=bM^-AI*wH1VR$4Go{qMH?0Dk+5pWxj};;VFDG66)O%ypMDg} z8W0;keY5c_Q@{SnyzEIP8)s;3eYMvEm>hpg^s*>MTKMd1$DJ%!cyeen>~>+L6nq6w zdwJ%s26(30XxRxlUVrLz^2(_2dgn!UgwqJPm)9?ni64XBOY`6C%)PGwb0{;zr1PH^ zZ>Za5_|xGsMss)ALOfETkCT=SCxR0+Aw&jS7HhjCWKh(x>%Jmq6`AgE*=|JbRO{j# zK)CRf#w;!|oi}bIB{=;Ickx(#0+oOel&fR67iWSVOuYk?NXm|k))Ax~!TV+&RJm=v zW@~#TJbM%!u|ELr-CvWobf!y5)zdZ_)m^~g!?)S$!JO8E#F2}xxq3kc5Kn_WnFFRe z@}5*aL`ho@OsNb%y_!&$xv(cRQj=e4m{_ahF>#tPfesJnX%Bi1C7Giu(*gP9tnCjN zq{7V?a|F+^$MNeXH_1Zato`FQH@u79LScRFTEWfg`UB2@@+$~zHu~-u9+v&IMQbC_ zdrSSnZl41dJyOfKLBvAWpTsS0H8sBQxA-uP&TJ?ITfWgphvVM+E!j{12$|V$JWjD= zmRG)kzxhBINxb(h`SzQ|cXmCt-l%m{`UNEXl8iO(g-+>N+Pn32+9{p=My)PmTBHv- zDBzHu&;CWwr|eXft50ji^mhHrf&{E2RMr$_)^3&HG?^hi>>bS~A4`oJV8JYFZ!8aQ z{1)0CFjSd)xMY{FN#nE1g9iHA^-Q5H7adH#gp@sxJcsNr?q2g)--eS)^*c`hA@1Iv zLqVlnrCT+vKjwI<*S)$3W5mQ^Z9f10L2gi&mSGB1@9#|+&8Q&7sdd}A)44;OmHUcl zFtyeB7H@)jWyUx~sBwYdjH$;^kHj$O zF-&qm6jJ~I59))uprNil(H&196AqC#0gWyZV*UJA1ghep^I3D-^1GUbsa)N-= zuMNll2#sMzk^MtsqX1A(-z_HatUyWrmkN#WXGR0W*!yr5fx-MTZV|_0PSK;7fEhy| eaW-M}K&C5`&WJm~VHydB02`_!<*~V6(tiLM5`eJ) literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_bookmarks.png b/res/drawable-mdpi/ic_menu_bookmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..92c74bc146d0dfad49a412566ab607b878b98b35 GIT binary patch literal 1118 zcmV-k1flzhP)yy-!5 zct7BZ2SHRks33wy5j|+~F5*Rb3HkxgfOkPe6c;>*XT5n5y$FgPT@j7OeVf7l9;6%sDojO@4ZM;=-4ZkN^`C z6H-tFu-ol_9v>eaT1@u!^=UHWa=E0OoE(UckLP0O`T5yPTPCz2F)`6W1ab-qkdcw$ zP!iA0&4sM2EHInROlHo{&tZLi9a2+MAvrmjOMv_PdwMM?DWTduJ3DibM==4?)6*&O zn3(^rl9ZGL4Gj%Gm5h##s;)mgJcNgb2f6`dC%FW8eSM|Zfq?;Oc6L_A^};5EM3G^C z6Y_XGpXQ8@j~nKox3{-U!A(34>VI0lyu5sxv$(jZx;`Z(1?uYR=z880-+vxzgB2u9 zEM!W;Z*OnD$bwGB(je}Gr~qDC!UDX%ztf?7hfrQ#4taTbn#hR*!p6o%Ks;JB1KkHr z1K#JBmKLg8t@w`LMn*=2O^9cWum+TII}o6W?eFhLrUtxla&n@&9&LDccNf;y*21F! z9sxEtH&xfCrKLeZK|y4iP=9|vGrz%9qNk@vibxZxsHlMa{CrL1r>CdT+uIB6?d_3g zLWC)K&eJ0(#gq5)%AF4V-yO6Ct{rV=H`ZJ&q_R)V&FiyySt+!Z0Eqi z!GWd|`{Ti^7Bk$;%uF1ZCd1X$l_NGbmTrWSo}o_M-Q6u~9b$fSX)c6JBIBfvaGOk~ zE|O`kd=CQ&dyG*C^R!O1I5L~$ov#ZEq-5KUS5+-)>nBU)YsSV zEH5ut5x@9bR8-Uz(o}*~a9AuBAm(8wg^&w1GBh;gtGfK5xw-k8T�*bDoeou@+z+ zgpRzhu;8*AXMp}M-7=16MHwY9a`LaG5RC@U-T-472BGvoeuzH#@3)R1&^bkHb7 z>H=op2#4Bf+}hguWiD}Mn4X^I>J15-5Sjuj3W);xis2@NStctA@pj@2GofHaAyE?z zSrppa+cT^$q}zmec0sEme*gdg07*qoM6N<$f{?@svH$=8 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_day.png b/res/drawable-mdpi/ic_menu_day.png new file mode 100644 index 0000000000000000000000000000000000000000..45f2424d5c11afdca116bce32597c58ff94362b4 GIT binary patch literal 2318 zcmV+p3Gw!cP)3AJG(o(>wVcy zY?MkMfvUz3BtQvG&5z*l3SA+^wJiZo7Y8@UAlU{(>Xj0(gJX&#QhpS*Lgium2U2AT znHVbY5BSlvu_cP3C4-ERMh!|B|q)9G4ba_m_EVqXP9 zQBpj72!Ogbchi!*zP`TQEJDcv4Ho<XdEAP``|P>{;x8AMUD+x_DNyvGDg7lF}? zP9~G&RUS?>PUo*)y?RVE7&;twJ1?;X1%+^wEu^GUWv}hrIhZpdgSUSOuYCZcHpSy{ z7K_L3JRW;|X5G4VeU~qHTH^7T8_(P zlPDTqF^GC*wpc>Av~0(Y9fR4}^FJ{$;?{+5`T)Dj$419m)^Aw<@rP$V+!~c5Z=qyX z03a`+0Ku=P`cE-W2_K8cdvNaj;l{@PPe1*0X<^|rZMg2mU@(}q@!v>FAOuz-L5oT^ zZTe$J$LZbCsQiw_VkyZ3fsyg3SV(G0VSy!6NtQ|=j1c>wK#+yQp&_Hm)aLbiuMB)L z@ESPdKijr#`)pCPkhj^pRgTGL5dtN4#4-_=4#p!HnNH9#g)pF`rl_0(LK76%L1kC#X&b<5kDw;cSWl1j3iRoK1nQ$8s^HfFD>Y`FG8On`KGjWPYEv2I26$-ON_aLDwPzc-$s)c51 z9&xk9iiDL+s^N$iMf;>d5F;}U5KA+*q6$6`7!&pS%{ft{`}fx>vDjQLF{%P>^|^EB zh71P7OC;1N-qlbcPiGh^oRF7Ux%KrBW4b83(8DnU-J5)H8&%I-+|)W}GX`W@&`v zh#q6Ytfvs)WIY2Crq?W)nHm(Tj}>?=5(%?NNXP@N!DEXoZDS}QYy9IU{?;E${UtbO4Hwrtt5IpYr>K4kar-(Qa1AxMQ` zgD9>ilH$^tzcw{vCbZDuN6O4uF`B4P&<)c*-nD$iiWRJ=sA$eRA3S)FJ%Eae3gKx9 z1iuf$?Dbqu3tFw5Dw}kmXfvUxU?|b4T1^w+gXuJ@o#8v)L)0RWGLvO+f=GX|HRfMiScw2~GDT6Up;vO~VHc z9C&uY0aRC4AKPDB>qaBf4^Org6yy)#%M&x>@l0Q=$_V0+f`S5;?{W?41fi|6s|xlfS=p>y`!WryB{n8IL7~U6sC#O64F}_O{>e@7un8d$^^g*HAeV-ANViq{L zQG+iCLWZTOA`zpKp=e%MXJ@B`Ykn=6Bu_XR5rP3f^Q$uZcetgdtE($KuK+wAPdmz< z*KSjL*rMVh1_>R4v?wck_0>V@kI882#;Ef;d-j(lvK$*puhcDXY-}9T&Jhp-dh_PZ zwV1KrU}jz(9UWz3V`J23qc@U2LXI?Dym;|n^Rg;|N|BG``vGZws@+b9let_@@_gB@ z^76q)j~+3Njp=_V6axK6@5R%?jJ!WSJ}zisr|Fxjs;a*t?B2w9GsY_rN>-Q4C1Dms zfJ)Bm3_yKuwB^}a%@*@^ghmK2DBH7V&)~?&2&Uf84bq-P24A{#Ng=I7v>S&2e6yxT z(AJH#r5BpXl`B`0(kwk|SOOHxMCjb2Hx09%DfBMJp@cX;>>>kL*rmUCO4<0-y&o<;q zi@Q&{X7<+D(2zAL<>dE)v<^)-V_$D|`djq_2l2t$HEY>(-+PW9fAQ}x_?WgD{jK_q oY_Yc`080Rt0DQ**{8xYh00&HepO3B@v;Y7A07*qoM6N<$g5uU*O#lD@ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_languages.png b/res/drawable-mdpi/ic_menu_languages.png new file mode 100644 index 0000000000000000000000000000000000000000..21d802d85f0f74f6e215dbaa78d1a688ef08ccdc GIT binary patch literal 3058 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 Y0Mz*;tY87yaR2}S07*qoM6N<$f|MngMF0Q* literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_search.png b/res/drawable-mdpi/ic_menu_search.png new file mode 100644 index 0000000000000000000000000000000000000000..c17fc696f54c43e6d91aed98b7ad24186d432b50 GIT binary patch literal 1707 zcmV;c22}ZpP)BNyj)q&zO z@!9(Reuu1*n;T7=cfR0T+&!n=3xTt1(NNN(A( zWs%dTPZt_Rpz0ntcI=oZE03&NwJOxw+UkSH>Hsgdd?oARVoR1R@%xJxFT!u$yvgXN zKO41)f2crTU!V8!*zaU;3Ygxn~JYmJVM7D~rOqtSLA z+5^c~uU>UPM4){VuV24*&z?PFlSj{-IWrm%TPWFF>K6zdS#XdowXZ*Om> zHeJ}jqY~B^&|FtnS9~TDL+ZhU2k!Xs;{{nBpn23`E>lxRN(Mqe6Gtu1(^!zEO*pFs zA#v~CJ(o(Q?#qqRY<>t}6z0cBBG}$=0s{PXKP)A(5V!ppoo;SIeDV6h=c<<$jtX?qy!?7uXPdIXxL4`;? z3z3#+o{rLavA&+Uh7%y(V<|Qpy|_@v;lqbF*Se5Wi6nDbrV0^UN`}b=q5w}08;jd) zK7CHtvdG@Od$E4fHZXINooe2RQ>RYdZ#aRICr^@}WQ>53QQQvi+qZ9UHVf?9wab%& zS&a_?y3`@9o&J<1ZN@O9{7n^=emovU4IUrB18T zE7VJ%YDszJ%9VeJK*bz>y4EGHr|WaRd?RwY%IYD=)2;BgkV$%>bULT;k%57MLOdRC z9~>OK9|(bK*RFYTn-S$QJ_)Rc8xTPNVugxD7+j5xS^&4&x%_0NCQy!)lTk7no1$!$ zvEmIUVC}|@8-oHHBQeAB7G@2+&4ZOK@27JhQo%upcZ!|&9|)kz=dc0@_n~4FfeERY6yT`F#hyHQ;u9#I1OEFEfE@MmY)H)d zVoN026-AO-I3@xi)WD5!73)NqV%W_KTnbQ^E?p{M@hw}n+!pXKN|vsTiWmgf;{D5) zFUJERVC~keTONgv+=Xf@WY>u$fJUxgzdnBV?p=51&K>vY(IZPKHj7}^ilp+(Fi4mZ zGa=Db@2$Yrty}#X7neW@0H6whA3uKVZ+dG74jkAcWzs|_6smNOR8HdR)vNJ93CuK` zIb{ct489dU9Y2#BH4IbTU(^HwKdP-X1-tEiDD>(vU0cB zwr$%6=Uf3Aw;Y=`ZSs}iLX2p}*-}jjZuAtTGDAZ{@j3m212Amp{{H@PSvlf)ULMyf zuRW}@(bunE?>27S$VFLp&J`$E;?SW(on)#CofVb9&58tLY8QVQ0@X;c2RHx$uTUM^ zzJ2?}Ut$kbB0K@`U)aeY6szGA7B zZSoDY&`OJRVi663g^dOTu}d2J*oii|AcANS!QO~pKnwd^5XD9}zTe*ef5=L1Zq{68 zcVhw>725ke13k4Y93xu<)fxRO#z!j`=5sv7Z-gG4-Y{EypBtwuCC6| zG)=6ouAc1d?1-nQCuIS`;jk?QJf*VG!otGz>+5R*0_$F{SMd4V-=uM!!g=ET{aw7h zy}4rH#>Pe(%A>RcOG`@uydcrj)1x;xHw!AjL4hA1ABV9M8LY?K+uP$eH#c(K>GAUN zqV7TvFbUyw4AIcg@U{N&@gXhq{QMljdI(Dyzu!Lqr5slPuB)a%EEWqu_+V#er^vTH z2VICUz%?it!BVQezCP+kQ7q+}mI}bKdTVQ|w6w?L5rx80cspD&!|F5n-eunQq7QS3Po+GGrv>64SY;`90FS_YKJAo~Q(opNK^ssjfH2Qdg4zrVj1rk^u5pwuy}9)<7; ztOXJ9GFF@(mzS4fY;4SfD66_4Rc%n1kg5K!ikBSC@o2(@h9%u=+6WWf0sF z=CawWD@rJ%guJO~Nz?(oqoYGW*e|5u`)QJ;iu&3+B$x&&9;Vgguzs+uQ3$UmSvf{H(%W zI5Rpr`itjP4|Bv_?ucpz`f-@My1G&((XuHJ4u^g4^&m2WggH*cg|WH0`I|6j=W~kd zFgH0lInAz%FlS~WrZ%Qe+)fbam_pt7sFf?IVry$l4d$k%rXH3yP)S%TV{NG xT*4evr}-7TDq-%YN9}jwngTTis(kzrU;tMJ$E{Sz2X6oX002ovPDHLkV1kEuNe%!2 literal 0 HcmV?d00001 diff --git a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java index d3b1b10e7..e4b74009d 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkLibraryActivity.java @@ -211,7 +211,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity { public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); addMenuItem(menu, MENU_SEARCH, "networkSearch", R.drawable.ic_menu_search); - addMenuItem(menu, MENU_ADD_CATALOG, "addCustomCatalog", android.R.drawable.ic_menu_add); + addMenuItem(menu, MENU_ADD_CATALOG, "addCustomCatalog", R.drawable.ic_menu_add); addMenuItem(menu, MENU_REFRESH, "refreshCatalogsList", R.drawable.ic_menu_refresh); addMenuItem(menu, MENU_LANGUAGE_FILTER, "languages", R.drawable.ic_menu_languages); return true; From cca3795bdad85618a8b8ab299d7ed3f7715eac67 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Mon, 17 Jan 2011 20:52:21 +0000 Subject: [PATCH 24/27] icon renaming rollback: for 1.5-compatibility; ChangeLog update --- ChangeLog | 4 ++++ {res/drawable-mdpi => icons/menu}/ic_menu_add.png | Bin .../menu}/ic_menu_bookmarks.png | Bin {res/drawable-mdpi => icons/menu}/ic_menu_day.png | Bin .../menu}/ic_menu_languages.png | Bin .../menu}/ic_menu_library.png | Bin .../menu}/ic_menu_networklibrary.png | Bin {res/drawable-mdpi => icons/menu}/ic_menu_night.png | Bin .../menu}/ic_menu_refresh.png | Bin .../drawable-mdpi => icons/menu}/ic_menu_search.png | Bin {res/drawable-mdpi => icons/menu}/ic_menu_toc.png | Bin 11 files changed, 4 insertions(+) rename {res/drawable-mdpi => icons/menu}/ic_menu_add.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_bookmarks.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_day.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_languages.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_library.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_networklibrary.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_night.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_refresh.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_search.png (100%) rename {res/drawable-mdpi => icons/menu}/ic_menu_toc.png (100%) diff --git a/ChangeLog b/ChangeLog index 90667f074..934182f07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +===== 0.99.5 (Jan ??, 2011) ===== +* High-resolution menu icons have been added +* Menu icons style has been changed to be android 2.3-compliant + ===== 0.99.4 (Jan 16, 2011) ===== * A list of dictionaries is supported (ColorDict, Fora, FreeDictionary.Org, SlovoEd German<->English) Code is partially written by Stefen Siebert * Author of currently opened book is selected in library (same for series and tags) diff --git a/res/drawable-mdpi/ic_menu_add.png b/icons/menu/ic_menu_add.png similarity index 100% rename from res/drawable-mdpi/ic_menu_add.png rename to icons/menu/ic_menu_add.png diff --git a/res/drawable-mdpi/ic_menu_bookmarks.png b/icons/menu/ic_menu_bookmarks.png similarity index 100% rename from res/drawable-mdpi/ic_menu_bookmarks.png rename to icons/menu/ic_menu_bookmarks.png diff --git a/res/drawable-mdpi/ic_menu_day.png b/icons/menu/ic_menu_day.png similarity index 100% rename from res/drawable-mdpi/ic_menu_day.png rename to icons/menu/ic_menu_day.png diff --git a/res/drawable-mdpi/ic_menu_languages.png b/icons/menu/ic_menu_languages.png similarity index 100% rename from res/drawable-mdpi/ic_menu_languages.png rename to icons/menu/ic_menu_languages.png diff --git a/res/drawable-mdpi/ic_menu_library.png b/icons/menu/ic_menu_library.png similarity index 100% rename from res/drawable-mdpi/ic_menu_library.png rename to icons/menu/ic_menu_library.png diff --git a/res/drawable-mdpi/ic_menu_networklibrary.png b/icons/menu/ic_menu_networklibrary.png similarity index 100% rename from res/drawable-mdpi/ic_menu_networklibrary.png rename to icons/menu/ic_menu_networklibrary.png diff --git a/res/drawable-mdpi/ic_menu_night.png b/icons/menu/ic_menu_night.png similarity index 100% rename from res/drawable-mdpi/ic_menu_night.png rename to icons/menu/ic_menu_night.png diff --git a/res/drawable-mdpi/ic_menu_refresh.png b/icons/menu/ic_menu_refresh.png similarity index 100% rename from res/drawable-mdpi/ic_menu_refresh.png rename to icons/menu/ic_menu_refresh.png diff --git a/res/drawable-mdpi/ic_menu_search.png b/icons/menu/ic_menu_search.png similarity index 100% rename from res/drawable-mdpi/ic_menu_search.png rename to icons/menu/ic_menu_search.png diff --git a/res/drawable-mdpi/ic_menu_toc.png b/icons/menu/ic_menu_toc.png similarity index 100% rename from res/drawable-mdpi/ic_menu_toc.png rename to icons/menu/ic_menu_toc.png From f09ae787688cd27e50c8967ab412e923271d2039 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Mon, 17 Jan 2011 23:18:23 +0000 Subject: [PATCH 25/27] TTF files with name section length > 10K are supported (new limit is 64K) --- src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java b/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java index 22a443b93..fdd0423ab 100644 --- a/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java +++ b/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java @@ -151,7 +151,7 @@ public class ZLTTFInfoDetector { if (nameInfo == null || nameInfo.Offset < myPosition || nameInfo.Length <= 0) { return null; } - if (nameInfo.Length > 10240) { + if (nameInfo.Length > 65536) { throw new IOException("Name table size is too large: " + nameInfo.Length); } final byte[] buffer = readTable(nameInfo); From 7859261c99b391a1be7624ebb4db66d4819ee4c0 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 18 Jan 2011 09:33:22 +0000 Subject: [PATCH 26/27] otf support has been added --- ChangeLog | 1 + .../zlibrary/ui/android/view/AndroidFontUtil.java | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 934182f07..079544ff5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ ===== 0.99.5 (Jan ??, 2011) ===== * High-resolution menu icons have been added * Menu icons style has been changed to be android 2.3-compliant +* OTF font files support ===== 0.99.4 (Jan 16, 2011) ===== * A list of dictionaries is supported (ColorDict, Fora, FreeDictionary.Org, SlovoEd German<->English) Code is partially written by Stefen Siebert diff --git a/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java b/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java index 988e5a299..9c5dcb884 100644 --- a/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java +++ b/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java @@ -77,7 +77,11 @@ public final class AndroidFontUtil { final File[] fileList = new File(Paths.FontsDirectoryOption().getValue()).listFiles( new FilenameFilter() { public boolean accept(File dir, String name) { - return name.toLowerCase().endsWith(".ttf") && !name.startsWith("."); + if (name.startsWith(".")) { + return false; + } + final String lcName = name.toLowerCase(); + return lcName.endsWith(".ttf") || lcName.endsWith(".otf"); } } ); From a361269bb72b362f5dd8dcedf9f8b2c828716d53 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 18 Jan 2011 19:47:46 +0000 Subject: [PATCH 27/27] font processing changes: no duplicate font names, user font is preferred, no name section size limit --- .../zlibrary/core/util/ZLTTFInfoDetector.java | 10 ++++++---- .../ui/android/view/AndroidFontUtil.java | 20 +++++++++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java b/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java index fdd0423ab..d905a03f3 100644 --- a/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java +++ b/src/org/geometerplus/zlibrary/core/util/ZLTTFInfoDetector.java @@ -151,10 +151,12 @@ public class ZLTTFInfoDetector { if (nameInfo == null || nameInfo.Offset < myPosition || nameInfo.Length <= 0) { return null; } - if (nameInfo.Length > 65536) { - throw new IOException("Name table size is too large: " + nameInfo.Length); - } - final byte[] buffer = readTable(nameInfo); + byte[] buffer; + try { + buffer = readTable(nameInfo); + } catch (Throwable e) { + return null; + } if (getInt16(buffer, 0) != 0) { throw new IOException("Name table format is invalid"); } diff --git a/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java b/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java index 9c5dcb884..e4244d3b5 100644 --- a/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java +++ b/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java @@ -104,6 +104,11 @@ public final class AndroidFontUtil { } public static String realFontFamilyName(String fontFamily) { + for (String name : getFontMap(false).keySet()) { + if (name.equalsIgnoreCase(fontFamily)) { + return name; + } + } if ("serif".equalsIgnoreCase(fontFamily) || "droid serif".equalsIgnoreCase(fontFamily)) { return "serif"; } @@ -113,19 +118,14 @@ public final class AndroidFontUtil { if ("monospace".equalsIgnoreCase(fontFamily) || "droid mono".equalsIgnoreCase(fontFamily)) { return "monospace"; } - for (String name : getFontMap(false).keySet()) { - if (name.equalsIgnoreCase(fontFamily)) { - return name; - } - } return "sans-serif"; } public static void fillFamiliesList(ArrayList families, boolean forceReload) { - families.add("Droid Sans"); - families.add("Droid Serif"); - families.add("Droid Mono"); - families.addAll(getFontMap(forceReload).keySet()); - Collections.sort(families); + final TreeSet familySet = new TreeSet(getFontMap(forceReload).keySet()); + familySet.add("Droid Sans"); + familySet.add("Droid Serif"); + familySet.add("Droid Mono"); + families.addAll(familySet); } }