Merge branch 'master' into wallpapers
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geometerplus.zlibrary.ui.android" android:versionCode="9903" android:versionName="0.99.3" android:installLocation="auto">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geometerplus.zlibrary.ui.android" android:versionCode="9904" android:versionName="0.99.4" android:installLocation="auto">
|
||||
<uses-sdk android:minSdkVersion="4" />
|
||||
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
|
13
ChangeLog
|
@ -1,6 +1,15 @@
|
|||
===== 0.99.4 (Jan ??, 2011) =====
|
||||
* A list of dictionaries is supported (ColorDict, Fora)
|
||||
===== 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
|
||||
* 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
|
||||
|
|
2
VERSION
|
@ -1 +1 @@
|
|||
0.99.3
|
||||
0.99.4
|
||||
|
|
20
assets/data/help/MiniHelp.nl.fb2
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Dutch MiniHelp, by Frank Fesevur 07-Jan-2011 -->
|
||||
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>Over FBReaderJ</book-title> <lang>nl</lang></title-info></description>
|
||||
<body>
|
||||
<title><p>Over FBReaderJ &FBReaderVersion;</p></title>
|
||||
<p>FBReaderJ is een e-book reader voor het <a l:href="http://www.android.com/">Android platform</a>. Het is een kloon van <a l:href="http://www.fbreader.org/">FBReader book reader</a> en is in Java geschreven door dezelfde makers. FBReaderJ ondersteunt verschillende e-bookformaten: <code>oeb</code>, <code>epub</code>, <code>fb2</code>. In toekomstige versies zal deze lijst uitgebreid worden zodat dezelfde formats als in de originele FBReader worden ondersteund. Rechtstreeks lezen van <code>zip</code>, <code>tar</code> en <code>gzip</code> archieven is ondersteund.</p>
|
||||
<p>Je kunt de configuratie van FBReaderJ aanpassen naar je eigen smaak. Kleuren, lettertypes, toetsgebruik en vele andere eigenschappen kunnen worden aangepast in de <code>Instellingen</code>.</p>
|
||||
<p>FBReaderJ is vrijgegeven onder de voorwaarden van de <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
|
||||
<empty-line/>
|
||||
<subtitle><p>Hoe te beginnen</p></subtitle>
|
||||
<p>Er zijn twee manieren om een boek toe te voegen aan de FBReaderJ bibliotheek.</p>
|
||||
<p>De eerste is het boek te kopieren naar de map <code>/sdcard/Books</code> (of een submap daaronder). Dan zal FBReader dit boek automatisch toevoegen.</p>
|
||||
<p>De tweede methode is door te klikken op een link naar een boek (bijv. op een link naar een bestand met de extensie <code>.epub</code>, <code>.oeb</code>, <code>.fb2</code> of <code>.fb2.zip</code>) 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.</p>
|
||||
<empty-line/>
|
||||
<subtitle><p>Gerelateerde sites</p></subtitle>
|
||||
<p>Meer informatie over FBReader en FBReaderJ kan je vinden op de <a l:href="http://www.fbreader.org">FBReader site</a>.</p>
|
||||
<p>Als je een automatisch bericht wilt over het verschijnen van nieuwe versies, kun je je aanmelden bij het <a l:href="http://freshmeat.net/projects/fbreaderj">FBReaderJ project bij freshmeat</a>.</p>
|
||||
<p>Als je vragen of suggesties hebt kun je de <a l:href="http://groups.google.com/group/fbreader">FBReader group van googlegroups</a> gebruiken.</p>
|
||||
</body>
|
||||
</FictionBook>
|
|
@ -459,13 +459,13 @@
|
|||
<node name="summaryOn" value="Double tap to run navigation dialog/menu"/>
|
||||
<node name="summaryOff" value="Ignore double taps"/>
|
||||
</node>
|
||||
<node name="volumeKeys" value="Volume keys scrolling">
|
||||
<node name="summaryOn" value="Use volume keys to scroll"/>
|
||||
<node name="volumeKeys" value="Turn page with volume keys">
|
||||
<node name="summaryOn" value="Use volume keys to turn the pages"/>
|
||||
<node name="summaryOff" value="Keep volume keys for sound"/>
|
||||
</node>
|
||||
<node name="invertVolumeKeys" value="Invert volume keys scrolling">
|
||||
<node name="summaryOn" value="Up (down) key scrolls a page down (up)"/>
|
||||
<node name="summaryOff" value="Up (down) key scrolls a page up (down)"/>
|
||||
<node name="invertVolumeKeys" value="Invert volume keys direction">
|
||||
<node name="summaryOn" value="Louder (lower) key turns to previous (next) page"/>
|
||||
<node name="summaryOff" value="Lower (louder) key turns to next (previous) page"/>
|
||||
</node>
|
||||
<node name="animation" value="Animation">
|
||||
<node name="none" value="Scroll with no animation"/>
|
||||
|
|
602
assets/resources/application/nl.xml
Normal file
|
@ -0,0 +1,602 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Dutch FBReader resources, by Frank Fesevur 12-Jan-2011 -->
|
||||
<resources>
|
||||
<node name="library">
|
||||
<node name="unknownAuthor" value="Onbekende auteur"/>
|
||||
<node name="booksWithNoTags" value="Boeken zonder trefwoorden"/>
|
||||
<node name="demo" value="voorbeeld"/>
|
||||
</node>
|
||||
<node name="libraryView">
|
||||
<node name="byAuthor" value="Auteurs">
|
||||
<node name="summary" value="Boeken gesorteerd op auteur"/>
|
||||
</node>
|
||||
<node name="byTag" value="Trefwoorden">
|
||||
<node name="summary" value="Boeken gesorteerd op trefwoord"/>
|
||||
</node>
|
||||
<node name="recent" value="Recent">
|
||||
<node name="summary" value="Recent geopende boeken"/>
|
||||
</node>
|
||||
<node name="favorites" value="Favorieten">
|
||||
<node name="summary" value="Mijn geselecteerde boeken"/>
|
||||
</node>
|
||||
<node name="searchResults" value="Gevonden">
|
||||
<node name="summary" value="Zoekresultaten voor: %s"/>
|
||||
</node>
|
||||
<node name="fileTree" value="Bestanden">
|
||||
<node name="summary" value="Bekijk bestandssysteem"/>
|
||||
</node>
|
||||
<node name="fileTreeRoot" value="Apparaat">
|
||||
<node name="summary" value="Volledige bestandssysteem van het apparaat"/>
|
||||
</node>
|
||||
<node name="fileTreeCard" value="Geheugenkaart">
|
||||
<node name="summary" value="Geheugenkaart geplaatst in het apparaat"/>
|
||||
</node>
|
||||
<node name="fileTreeLibrary" value="FBReader bibliotheek">
|
||||
<node name="summary" value="FBReader boeken map"/>
|
||||
</node>
|
||||
<node name="menu">
|
||||
<node name="localSearch" value="Lokaal zoeken"/>
|
||||
</node>
|
||||
<node name="openBook" value="Boek openen"/>
|
||||
<node name="showBookInfo" value="Boekinformatie"/>
|
||||
<node name="deleteBook" value="Boek verwijderen"/>
|
||||
<node name="addToFavorites" value="Toevoegen aan favorieten"/>
|
||||
<node name="removeFromFavorites" value="Verwijderen van favorieten"/>
|
||||
</node>
|
||||
<node name="networkView">
|
||||
<node name="openCatalog" value="Open catalogus"/>
|
||||
<node name="showResults" value="Toon resulten"/>
|
||||
<node name="showBooks" value="Toon boeken"/>
|
||||
<node name="download" value="Download"/>
|
||||
<node name="read" value="Lees lokale kopie"/>
|
||||
<node name="delete" value="Verwijder lokale kopie"/>
|
||||
<node name="readDemo" value="Lees voorbeeld"/>
|
||||
<node name="deleteDemo" value="Verwijder voorbeeld"/>
|
||||
<node name="downloadDemo" value="Download voorbeeld"/>
|
||||
<node name="buy" value="Koop (%s)"/>
|
||||
<node name="openInBrowser" value="Openen in de browser" />
|
||||
<node name="stopLoading" value="Stop loading" toBeTranslated="true" />
|
||||
<node name="stopSearching" value="Stop searching" toBeTranslated="true" />
|
||||
<node name="signIn" value="Sign in" toBeTranslated="true"/>
|
||||
<node name="signOut" value="Sign out (%s)" toBeTranslated="true"/>
|
||||
<node name="refillAccount" value="Top up account (currently: %s)" toBeTranslated="true"/>
|
||||
<node name="refillTitle" value="Top up account" toBeTranslated="true"/>
|
||||
<node name="refillViaSms" value="Text messages" toBeTranslated="true"/>
|
||||
<node name="refillViaBrowser" value="Open pagina in de browser" />
|
||||
<node name="refillSummary" value="Currently: %s" toBeTranslated="true"/>
|
||||
<node name="alreadyDownloading" value="Boek wordt gedownload" />
|
||||
<node name="alreadyDownloadingDemo" value="Voorbeeld wordt gedownload" />
|
||||
<node name="stoppingCatalogLoading" value="Stopping loading" toBeTranslated="true" />
|
||||
<node name="stoppingNetworkSearch" value="Stopping search" toBeTranslated="true" />
|
||||
<node name="search" value="Zoeken" />
|
||||
<node name="searchSummary" value="Zoeken naar boeken in catalogi" />
|
||||
<node name="searchResults" value="Zoekresulten voor: %s" />
|
||||
<node name="editCustomCatalog" value="Catalogus bewerken"/>
|
||||
<node name="removeCustomCatalog" value="Verwijder catalogus"/>
|
||||
<node name="addCustomCatalog" value="Catalogus toevoegen"/>
|
||||
<node name="addCustomCatalogSummary" value="Voeg handmatig eigen OPDS-catalogus toe"/>
|
||||
<node name="confirmQuestions">
|
||||
<node name="read" value="Wil je de lokale kopie lezen?"/>
|
||||
<node name="download" value="Wil je dit boek downloaden?"/>
|
||||
<node name="readDemo" value="Wil je het voorbeeld lezen?"/>
|
||||
<node name="downloadDemo" value="Wil je het voorbeeld downloaden"/>
|
||||
<node name="buy" value="Wil je dit boek kopen? (%s)" />
|
||||
<node name="openInBrowser" value="Wil je deze catalous openen in de browser?" />
|
||||
</node>
|
||||
<node name="downloadingCatalogs" value="Downloading catalogs" toBeTranslated="true"/> <!-- used as notification title -->
|
||||
<node name="searchingNetwork" value="Searching for books in network" toBeTranslated="true"/> <!-- used as notification title -->
|
||||
<node name="menu">
|
||||
<node name="networkSearch" value="Zoeken op het netwerk"/>
|
||||
<node name="reload" value="Vernieuwen"/>
|
||||
<node name="signIn" value="Sign in" toBeTranslated="true"/>
|
||||
<node name="signUp" value="Sign up" toBeTranslated="true"/>
|
||||
<node name="signOut" value="Sign out (%s)" toBeTranslated="true"/>
|
||||
<node name="refillAccount" value="Top up account" toBeTranslated="true"/>
|
||||
<node name="addCustomCatalog" value="Catalogus toevoegen"/>
|
||||
<node name="refreshCatalogsList" value="Catalogi vernieuwen"/>
|
||||
<node name="languages" value="Taalfilter"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="networkBookView">
|
||||
<node name="bookInfo" value="Boekinformatie" />
|
||||
<node name="description" value="Beschrijving" />
|
||||
<node name="noDescription" value="Geen beschrijving beschikbaar" />
|
||||
<node name="title" value="Titel:" />
|
||||
<node name="authors" value="Auteurs:" />
|
||||
<node name="series" value="Serie:" />
|
||||
<node name="indexInSeries" value="Nummer in serie:" />
|
||||
<node name="tags" value="Trefwoorden:" />
|
||||
</node>
|
||||
<node name="bookInfo">
|
||||
<node name="bookInfo" value="Boekinformatie" />
|
||||
<node name="fileInfo" value="Bestandsinformatie" />
|
||||
<node name="annotation" value="Annotatie" />
|
||||
<node name="title" value="Titel:" />
|
||||
<node name="authors" value="Auteurs:" />
|
||||
<node name="series" value="Serie:" />
|
||||
<node name="indexInSeries" value="Nummer in serie:" />
|
||||
<node name="tags" value="Trefwoorden:" />
|
||||
<node name="language" value="Taal:"/>
|
||||
<node name="name" value="Naam:" />
|
||||
<node name="type" value="Type:" />
|
||||
<node name="size" value="Grootte:" />
|
||||
<node name="time" value="Laatst gewijzigd:" />
|
||||
<node name="sizeInBytes" value="%s byte(s)" />
|
||||
<node name="sizeInKiloBytes" value="%s kB" />
|
||||
<node name="menu">
|
||||
<node name="edit" value="Bewerken" />
|
||||
</node>
|
||||
</node>
|
||||
<node name="bookDownloader">
|
||||
<node name="tickerSuccess" value="Boek is gedownload" />
|
||||
<node name="tickerError" value="Fout bij downloaden boek" />
|
||||
<node name="contentSuccess" value="Klaar met downloaden" />
|
||||
<node name="contentError" value="Download mislukt" />
|
||||
<node name="downloadingStarted" value="Downloaden van boek is begonnen" />
|
||||
<node name="alreadyDownloading" value="Boek wordt al gedownload" />
|
||||
</node>
|
||||
<node name="tocView">
|
||||
<node name="expandTree" value="Hoofdstukken tonen"/>
|
||||
<node name="collapseTree" value="Hoofdstukken verbergen"/>
|
||||
<node name="readText" value="Lees tekst"/>
|
||||
</node>
|
||||
<node name="bookmarksView">
|
||||
<node name="thisBook" value="Dit boek"/>
|
||||
<node name="allBooks" value="Alle boeken"/>
|
||||
<node name="searchResults" value="Gevonden"/>
|
||||
<node name="new" value="Nieuwe bladwijzer"/>
|
||||
<node name="open" value="Openen"/>
|
||||
<node name="edit" value="Bladwijzer bewerken"/>
|
||||
<node name="delete" value="Bladwijzer verwijderen"/>
|
||||
<node name="menu">
|
||||
<node name="search" value="Zoeken"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="menu">
|
||||
<node name="preferences" value="Instellingen"/>
|
||||
<node name="bookInfo" value="Boekinformatie"/>
|
||||
<node name="library" value="Bibliotheek"/>
|
||||
<node name="toc" value="Inhoud"/>
|
||||
<node name="day" value="Dag"/>
|
||||
<node name="night" value="Nacht"/>
|
||||
<node name="networkLibrary" value="Netwerk bibliotheek"/>
|
||||
<node name="navigate" value="Navigeer">
|
||||
<node name="toc" value="Inhoudsopgave"/>
|
||||
<node name="gotoHome" value="Begin van document"/>
|
||||
<node name="gotoPageNumber" value="Ga naar pagina..."/>
|
||||
<node name="gotoSectionStart" value="Ga naar het begin van de sectie" />
|
||||
<node name="gotoSectionEnd" value="Ga naar het einde van de sectie" />
|
||||
<node name="nextTOCSection" value="Ga naar het volgende hoofdstuk" />
|
||||
<node name="previousTOCSection" value="Ga naar het vorige hoofdstuk" />
|
||||
<node name="undo" value="Terug"/>
|
||||
<node name="redo" value="Verder"/>
|
||||
</node>
|
||||
<node name="selection" value="Selectie">
|
||||
<node name="copyToClipboard" value="Kopieer naar klembord"/>
|
||||
<node name="openInDictionary" value="Openen in woordenboek"/>
|
||||
<node name="clearSelection" value="Wissen"/>
|
||||
</node>
|
||||
<node name="search" value="Zoeken"/>
|
||||
<node name="rotate" value="Scherm draaien"/>
|
||||
<node name="increaseFont" value="Inzoomen" />
|
||||
<node name="decreaseFont" value="Uitzoomen" />
|
||||
<node name="toggleFullscreen" value="Volledig scherm"/>
|
||||
<node name="bookmarks" value="Bladwijzers"/>
|
||||
</node>
|
||||
<node name="dialog">
|
||||
<node name="button">
|
||||
<node name="install" value="Installeren" />
|
||||
<node name="update" value="Bijwerken" />
|
||||
<node name="skip" value="Overslaan" />
|
||||
<node name="buy" value="Kopen" />
|
||||
<node name="buyAndDownload" value="Kopen en downloaden" />
|
||||
<node name="continue" value="Doorgaan" />
|
||||
<node name="editUrl" value="URL bewerken" />
|
||||
<node name="tryAgain" value="Probeer opnieuw" />
|
||||
<node name="openBook" value="Lezen" />
|
||||
<node name="editInfo" value="Bewerken" />
|
||||
<node name="reloadInfo" value="Vernieuwen" />
|
||||
<node name="refillAccount" value="Top up" toBeTranslated="true" />
|
||||
</node>
|
||||
<node name="plugin">
|
||||
<node name="installTitle" value="Plug-in installeren"/>
|
||||
<node name="updateTitle" value="Plug-in bijwerken"/>
|
||||
<node name="dontAskAgain" value="Vraag niet opnieuw"/>
|
||||
</node>
|
||||
<node name="installDictionary">
|
||||
<node name="title" value="Installeer woordenboek"/>
|
||||
<node name="message" value="Wil je %s installeren?"/>
|
||||
</node>
|
||||
<node name="BookInfo">
|
||||
<node name="fileName" value="Bestandsnaam"/>
|
||||
<node name="title" value="Titel"/>
|
||||
<node name="language" value="Taal"/>
|
||||
<node name="encoding" value="Codering"/>
|
||||
</node>
|
||||
<node name="Preferences">
|
||||
<node name="directories" value="Mappen">
|
||||
<node name="summary" value="Waar zijn de bestanden opgeslagen"/>
|
||||
<node name="books" value="Map met boeken"/>
|
||||
<node name="fonts" value="Map met lettertypes"/>
|
||||
</node>
|
||||
<node name="appearance" value="Weergave">
|
||||
<node name="summary" value="Draaien, statusbalk"/>
|
||||
<node name="autoOrientation" value="Automatisch draaien">
|
||||
<node name="summaryOn" value="Het scherm zal draaien als het apparaat gedraaid wordt"/>
|
||||
<node name="summaryOff" value="Het scherm zal niet draaien als het apparaat gedraaid wordt"/>
|
||||
</node>
|
||||
<node name="showStatusBar" value="Toon statusbalk">
|
||||
<node name="summaryOn" value="Toon statusbalk tijdens lezen"/>
|
||||
<node name="summaryOff" value="Verberg statusbalk tijdens lezen"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="text" value="Tekst">
|
||||
<node name="summary" value="Lettertype, Afbreken, etc."/>
|
||||
<node name="font" value="Lettertype">
|
||||
<node name="unchanged" value="<ongewijzigd>"/>
|
||||
</node>
|
||||
<node name="fontSize" value="Lettergrootte"/>
|
||||
<node name="fontSizeDifference" value="Lettergrootte verschil"/>
|
||||
<node name="fontStyle" value="Letterstijl">
|
||||
<node name="regular" value="Normaal"/>
|
||||
<node name="bold" value="Vet"/>
|
||||
<node name="italic" value="Cursief"/>
|
||||
<node name="boldItalic" value="Vet Cursief"/>
|
||||
</node>
|
||||
<node name="bold" value="Vet">
|
||||
<node name="on" value="vet"/>
|
||||
<node name="off" value="normaal"/>
|
||||
<node name="unchanged" value="<ongewijzigd>"/>
|
||||
</node>
|
||||
<node name="italic" value="Cursief">
|
||||
<node name="on" value="cursief"/>
|
||||
<node name="off" value="normaal"/>
|
||||
<node name="unchanged" value="<ongewijzigd>"/>
|
||||
</node>
|
||||
<node name="lineSpacing" value="Regelafstand">
|
||||
<node name="unchanged" value="<ongewijzigd>"/>
|
||||
</node>
|
||||
<node name="alignment" value="Uitlijning">
|
||||
<node name="left" value="Links"/>
|
||||
<node name="right" value="Rechts"/>
|
||||
<node name="center" value="Gecentreerd"/>
|
||||
<node name="justify" value="Uitvullen"/>
|
||||
<node name="unchanged" value="<ongewijzigd>"/>
|
||||
</node>
|
||||
<node name="autoHyphenations" value="Automatisch afbreken">
|
||||
<node name="summaryOn" value="Woorden automatisch afbreken"/>
|
||||
<node name="summaryOff" value="Woorden niet automatisch afbreken"/>
|
||||
</node>
|
||||
<node name="allowHyphenations" value="Afbreken">
|
||||
<node name="on" value="woorden afbreken"/>
|
||||
<node name="off" value="woorden niet afbreken"/>
|
||||
<node name="unchanged" value="<ongewijzigd>" />
|
||||
</node>
|
||||
<node name="firstLineIndent" value="Eerste regel inspringen" />
|
||||
<node name="spaceBefore" value="Ruimte voor"/>
|
||||
<node name="spaceAfter" value="Ruimte achter"/>
|
||||
<node name="leftIndent" value="Links inspringen"/>
|
||||
<node name="rightIndent" value="Rechts inspringen"/>
|
||||
<node name="more" value="Meer stijlen">
|
||||
<node name="summary" value="Aangepaste instellingen voor titels, paragrafen, etc."/>
|
||||
<node name="Regular Paragraph" value="Normale paragraaf">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Title" value="Titel">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Section Title" value="Section Title" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Poem Title" value="Poem Title" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Subtitle" value="Subtitel">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Annotation" value="Annotatie">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Epigraph" value="Epigraph" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Stanza" value="Stanza" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Verse" value="Verse" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Preformatted text" value="Preformatted text" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Image" value="Afbeelding">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Cite" value="Cite" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Author" value="Auteur">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Date" value="Datum">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Internal Hyperlink" value="Interne hyperlink">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Footnote" value="Voetnote">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Emphasis" value="Emphasis" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Strong" value="Strong" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Subscript" value="Subscript">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Superscript" value="Superscript">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Code" value="Code">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="StrikeThrough" value="Doorhalen">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Italic" value="Cursief">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Bold" value="Vet">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Definition" value="Definitie">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Definition Description" value="Definition Description" toBeTranslated="true">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Header 1" value="Koptekst 1">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Header 2" value="Koptekst 2">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Header 3" value="Koptekst 3">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Header 4" value="Koptekst 4">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Header 5" value="Koptekst 5">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="Header 6" value="Koptekst 6">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
<node name="External Hyperlink" value="Externe hyperlink">
|
||||
<node name="summary" value=""/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node name="colors" value="Kleuren">
|
||||
<node name="summary" value="Kleurinstellingen"/>
|
||||
<node name="background" value="Achtergrond"/>
|
||||
<node name="selectionBackground" value="Selectie achtergrond"/>
|
||||
<node name="text" value="Normale tekst"/>
|
||||
<node name="hyperlink" value="Hyperlink tekst"/>
|
||||
<node name="highlighting" value="Achtergrond zoekresultaten"/>
|
||||
<node name="footer" value="Voettekst" />
|
||||
</node>
|
||||
<node name="margins" value="Marges">
|
||||
<node name="summary" value="Tekst marges"/>
|
||||
<node name="left" value="Linkermarge"/>
|
||||
<node name="right" value="Rechtermarge"/>
|
||||
<node name="top" value="Bovenmarge"/>
|
||||
<node name="bottom" value="Ondermarge"/>
|
||||
</node>
|
||||
<node name="scrollBar" value="Scrollbar" toBeTranslated="true">
|
||||
<node name="summary" value="Scrollbar & footer settings" toBeTranslated="true"/>
|
||||
<node name="scrollbarType" value="Scrollbar type" toBeTranslated="true">
|
||||
<node name="hide" value="Hide" toBeTranslated="true"/>
|
||||
<node name="show" value="Vertical slider" toBeTranslated="true"/>
|
||||
<node name="showAsProgress" value="Vertical progress bar" toBeTranslated="true"/>
|
||||
<node name="showAsFooter" value="Horizontal footer" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="footerHeight" value="Footer height" toBeTranslated="true" />
|
||||
<node name="footerColor" value="Footer color" toBeTranslated="true" />
|
||||
<node name="tocMarks" value="Show TOC marks" toBeTranslated="true">
|
||||
<node name="summaryOn" value="Show TOC marks in the footer bar" toBeTranslated="true"/>
|
||||
<node name="summaryOff" value="Don't show TOC marks in the footer bar" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="footerLongTap" value="Footer long tap" toBeTranslated="true">
|
||||
<node name="longTapRevert" value="Revert position" toBeTranslated="true"/>
|
||||
<node name="longTapNavigate" value="Go to position" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="showProgress" value="Toon paginanummer">
|
||||
<node name="summaryOn" value="Show page number in footer" toBeTranslated="true"/>
|
||||
<node name="summaryOff" value="Don't show page number in footer" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="showBattery" value="Toon batterijniveau">
|
||||
<node name="summaryOn" value="Show battery level in footer" toBeTranslated="true"/>
|
||||
<node name="summaryOff" value="Don't show battery level in footer" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="showClock" value="Toon klok">
|
||||
<node name="summaryOn" value="Show clock in footer" toBeTranslated="true"/>
|
||||
<node name="summaryOff" value="Don't show clock in footer" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="isSensitive" value="Navigation by tap on footer" toBeTranslated="true">
|
||||
<node name="summaryOn" value="Navigation is enabled" toBeTranslated="true"/>
|
||||
<node name="summaryOff" value="Navigation is disabled" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="font" value="Lettertype"/>
|
||||
</node>
|
||||
<node name="display" value="Scherm">
|
||||
<node name="summary" value="Helderheid, Voorkom uitschakelen scherm"/>
|
||||
<node name="allowScreenBrightnessAdjustment" value="Helderheid scherm aanpassen">
|
||||
<node name="summaryOn" value="Door vinger op/neer te slepen over linkerkant scherm"/>
|
||||
<node name="summaryOff" value="Uitgeschakeld"/>
|
||||
</node>
|
||||
<node name="dontTurnScreenOff" value="Voorkom uitschakelen scherm">
|
||||
<node name="0" value="Altijd"/>
|
||||
<node name="25" value="Zolang batterijniveau hoger is dan 25 procent"/>
|
||||
<node name="50" value="Zolang batterijniveau hoger is dan 50 procent"/>
|
||||
<node name="100" value="Nooit"/>
|
||||
</node>
|
||||
<node name="dontTurnScreenOffDuringCharging" value="Voorkom uitschakelen scherm tijdens opladen">
|
||||
<node name="summaryOn" value="Voorkom uitschakelen scherm tijdens het opladen"/>
|
||||
<node name="summaryOff" value="Schakel scherm uit, zelfs tijdens het opladen"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="scrolling" value="Omslaan">
|
||||
<node name="summary" value="Hoe sla je de bladzijdes om"/>
|
||||
<node name="fingerScrolling" value="Touch screen scrolling" toBeTranslated="true">
|
||||
<node name="byTap" value="Scroll pages by finger tap" toBeTranslated="true"/>
|
||||
<node name="byFlick" value="Scroll pages by finger flick" toBeTranslated="true"/>
|
||||
<node name="byTapAndFlick" value="Scroll pages by finger tap or flick" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="enableDoubleTapDetection" value="Dubbel-tik detectie">
|
||||
<node name="summaryOn" value="Dubbel-tik om navigatiescherm te openen"/>
|
||||
<node name="summaryOff" value="Dubbel-tikken negeren"/>
|
||||
</node>
|
||||
<node name="volumeKeys" value="Omslaan met volumeknoppen">
|
||||
<node name="summaryOn" value="Gebruik volumeknoppen om om te slaan"/>
|
||||
<node name="summaryOff" value="Gebruik volumeknoppen voor geluid"/>
|
||||
</node>
|
||||
<node name="invertVolumeKeys" value="Richting volumeknoppen">
|
||||
<node name="summaryOn" value="Harder (zachter) toets naar vorige (volgende) pagina"/>
|
||||
<node name="summaryOff" value="Harder (zachter) toets naar volgende (vorige) pagina"/>
|
||||
</node>
|
||||
<node name="animation" value="Animatie">
|
||||
<node name="none" value="Omslaan zonder animatie"/>
|
||||
<node name="slide" value="Slide-animatie"/>
|
||||
<node name="shift" value="Shift-animatie"/>
|
||||
</node>
|
||||
<node name="horizontal" value="Horizontaal omslaan">
|
||||
<node name="summaryOn" value="Pagina's horizontaal omslaan"/>
|
||||
<node name="summaryOff" value="Pagina's verticaal omslaan"/>
|
||||
</node>
|
||||
</node>
|
||||
<node name="dictionary" value="Woordenboek">
|
||||
<node name="summary" value="Woordenboek instellingen"/>
|
||||
<node name="dictionary" value="Woordenboek"/>
|
||||
<node name="tappingAction" value="Long tapping action" toBeTranslated="true">
|
||||
<node name="doNothing" value="Long tapping does nothing" toBeTranslated="true"/>
|
||||
<node name="selectWord" value="Long tapping selects the word" toBeTranslated="true"/>
|
||||
<node name="openDictionary" value="Long tapping selects the word, release opens dictionary" toBeTranslated="true"/>
|
||||
</node>
|
||||
<node name="navigateOverAllWords" value="Navigate over all words" toBeTranslated="true">
|
||||
<node name="summaryOn" value="Key navigation visits all words" toBeTranslated="true"/>
|
||||
<node name="summaryOff" value="Key navigation visits hyperlinks only" toBeTranslated="true"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node name="OptionsDialog">
|
||||
<node name="tab">
|
||||
<node name="Language" value="Taal">
|
||||
<node name="autoDetect" value="Taal en codering automatisch detecteren" />
|
||||
<node name="defaultLanguage" value="Standaard taal"/>
|
||||
<node name="defaultEncodingSet" value="Standaard coderingsset"/>
|
||||
<node name="defaultEncoding" value="Standaard codering" />
|
||||
</node>
|
||||
<node name="Selection" value="Selectie">
|
||||
<node name="enableSelection" value="Enable Text Selection" toBeTranslated="true"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node name="deleteBookBox">
|
||||
<node name="message" value="Het verwijderen van dit boek kan niet ongedaan worden gemaakt. Weet u het zeker?"/>
|
||||
</node>
|
||||
<node name="redownloadFileBox">
|
||||
<node name="message" value="Bestand bestaat al. Opnieuw downloaden?"/>
|
||||
</node>
|
||||
<node name="waitMessage">
|
||||
<node name="downloadingFile" value="Boek %s wordt gedownload" />
|
||||
<node name="search" value="Bezig met zoeken. Een ogenblik..." />
|
||||
<node name="loadingBook" value="Boek wordt geopend. Een ogenblik..." />
|
||||
<node name="loadingBookList" value="Bibliotheek wordt geladen. Een ogenblik..." />
|
||||
<node name="creatingBooksDatabase" value="Boekendatabase wordt gemaakt. Een ogenblik..." />
|
||||
<node name="updatingBooksDatabase" value="Boekendatabase wordt bijgewerkt. Een ogenblik..." />
|
||||
<node name="loadingNetworkLibrary" value="Bibliotheek wordt geladen. Een ogenblik..." />
|
||||
<node name="authentication" value="Authenticatie. Een ogenblik..." />
|
||||
<node name="signOut" value="Afmelden. Een ogenblik..." />
|
||||
<node name="purchaseBook" value="Boek wordt gekocht. Een ogenblik..." />
|
||||
<node name="loadingCatalogInfo" value="Catalogusinformati wordt geladen. Een ogenblik..." />
|
||||
<node name="updatingCatalogsList" value="Cataloguslijst wordt bijgewerkt. Een ogenblik..."/>
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="internalError" value="Interne serverfout" />
|
||||
<node name="purchaseNotEnoughMoney" value="Niet genoeg geld" />
|
||||
<node name="purchaseMissingBook" value="Missing book" toBeTranslated="true" />
|
||||
<node name="purchaseAlreadyPurchased" value="Reeds aangeschaft" />
|
||||
<node name="bookNotPurchased" value="Boek was niet aangeschaft" />
|
||||
<node name="downloadLimitExceeded" value="Downloadlimiet bereikt" />
|
||||
<node name="noUserEmail" value="Er is geen gebruik bekend met het opgegeven e-mailadres" />
|
||||
<node name="unsupportedOperation" value="Bewerking wordt niet ondersteund" />
|
||||
<node name="notAnOPDS" value="Dit is geen OPDS-catalogus" />
|
||||
<node name="noRequiredInformation" value="Required information is not specified in the catalog" toBeTranslated="true" />
|
||||
<node name="cacheDirectoryError" value="Maken van de cache-directory is mislukt" />
|
||||
</node>
|
||||
<node name="emptyCatalogBox">
|
||||
<node name="title" value="Informatie" />
|
||||
<node name="message" value="Catalogus is leeg" />
|
||||
</node>
|
||||
<node name="emptySearchResults">
|
||||
<node name="title" value="Zoekresultaten" />
|
||||
<node name="message" value="Er zijn geen geschikte boeken gevonden" />
|
||||
</node>
|
||||
<node name="AuthenticationDialog">
|
||||
<node name="title" value="Authenticatie" />
|
||||
<node name="login" value="Gebruikersnaam" />
|
||||
<node name="password" value="Wachtwoord" />
|
||||
<node name="skipIP" value="Don't bound to ip-address" toBeTranslated="true" />
|
||||
<node name="loginIsEmpty" value="Gebruikersnaam kan niet leeg zijn" />
|
||||
<node name="register" value="Registeren" />
|
||||
</node>
|
||||
<node name="CustomCatalogDialog">
|
||||
<node name="title" value="Andere catalogus" />
|
||||
<node name="catalogTitle" value="Titel" />
|
||||
<node name="catalogUrl" value="URL" />
|
||||
<node name="catalogSummary" value="Beschrijving" />
|
||||
<node name="catalogTitleExample" value="Bijv.: Project Gutenberg catalogus" />
|
||||
<node name="catalogUrlExample" value="Bijv.: http://m.gutenberg.org/" />
|
||||
<node name="catalogSummaryExample" value="Bijv.: Public domain boeken" />
|
||||
<node name="titleIsEmpty" value="Titel kan niet leeg zijn" />
|
||||
<node name="urlIsEmpty" value="URL kan niet leeg zijn" />
|
||||
<node name="invalidUrl" value="Ongeldige URL" />
|
||||
<node name="titleAlreadyExists" value="Deze titel wordt al gebruikt" />
|
||||
<node name="siteAlreadyExists" value="Deze site wordt al gebruikt" />
|
||||
</node>
|
||||
<node name="languageFilterDialog">
|
||||
<node name="title" value="Taalfilter" />
|
||||
</node>
|
||||
<node name="purchaseConfirmBox">
|
||||
<node name="title" value="Koop boek" />
|
||||
<node name="message" value="Weet je zeker dat je het boek “%s” wilt kopen?" />
|
||||
</node>
|
||||
<node name="alreadyPurchasedBox">
|
||||
<node name="title" value="Koop boek" />
|
||||
<node name="message" value="Boek is al aangescahft" />
|
||||
</node>
|
||||
</node>
|
||||
<node name="errorMessage">
|
||||
<node name="cannotRunAndroidMarket" value="Geen toegang tot de Android Market. Installeer %s handmatig"/>
|
||||
<node name="textNotFound" value="Er is geen passende tekst in het boek"/>
|
||||
<node name="bookNotFound" value="Er zijn geen passende boeken in de bibliotheek"/>
|
||||
<node name="bookmarkNotFound" value="Er zijn geen passende bladwijzers gevonden" />
|
||||
<node name="cannotOpenBook" value="Kan het boek nu niet openen"/>
|
||||
<node name="dictionaryIsNotInstalled" value="Woordenboek is niet geïnstalleerd"/>
|
||||
<node name="permissionDenied" value="Toegang geweigerd"/>
|
||||
<node name="noFavorites" value="Je lijst met favorieten is leeg"/>
|
||||
</node>
|
||||
<node name="external">
|
||||
<node name="browser" value="Browser"/>
|
||||
<node name="defaultBrowser" value="Standaardbrowser"/>
|
||||
</node>
|
||||
<node name="mobipocketPlugin">
|
||||
<node name="unknown" value="Onbekende fout"/>
|
||||
<node name="unsupportedCompressionMethod" value="Compressiemethode niet ondersteund"/>
|
||||
<node name="encriptedFile" value="DRM-beschermd bestand"/>
|
||||
</node>
|
||||
</resources>
|
|
@ -449,7 +449,7 @@
|
|||
</node>
|
||||
</node>
|
||||
<node name="scrolling" value="Перелистывание страниц">
|
||||
<node name="summary" value="Как листать стрницы"/>
|
||||
<node name="summary" value="Как листать страницы"/>
|
||||
<node name="fingerScrolling" value="Листание пальцем по экрану">
|
||||
<node name="byTap" value="Листать нажатием на экран"/>
|
||||
<node name="byFlick" value="Листать протягиванием страницы"/>
|
||||
|
|
93
assets/resources/zlibrary/nl.xml
Normal file
|
@ -0,0 +1,93 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Dutch zlibrary resources, by Frank Fesevur 07-Jan-2011 -->
|
||||
<resources>
|
||||
<node name="dialog">
|
||||
<node name="button">
|
||||
<node name="ok" value="OK" />
|
||||
<node name="cancel" value="Annuleren" />
|
||||
<node name="yes" value="Ja" />
|
||||
<node name="no" value="Nee" />
|
||||
<node name="apply" value="Toepassen" />
|
||||
</node>
|
||||
<node name="networkError">
|
||||
<node name="title" value="Netwerkfout" />
|
||||
<node name="unknownErrorMessage" value="Onbekende fout" />
|
||||
<node name="operationTimedOutMessage" value="Time-out bij bewerking" />
|
||||
<node name="somethingWrongMessage" value="Er gaat iets mis bij %s" />
|
||||
<node name="couldntCreateDirectoryMessage" value="Kan geen map %s niet maken" />
|
||||
<node name="couldntCreateFileMessage" value="Kan bestand %s niet maken" />
|
||||
<node name="couldntConnectToNetworkMessage" value="Kan geen verbinding met het netwerk maken" />
|
||||
<node name="couldntConnectMessage" value="Kan geen verbinding met host %s maken" />
|
||||
<node name="couldntResolveHostMessage" value="Hostnaam %s niet gevonden" />
|
||||
<node name="authenticationFailed" value="Authenticatie mislukt" />
|
||||
<node name="unsupportedProtocol" value="Protocol niet ondersteund" />
|
||||
<node name="invalidURL" value="Ongeldige URL" />
|
||||
<node name="hostCantBeReached" value="Host %s is onbereikbaar" />
|
||||
<node name="connectionRefused" value="Verbinding was geweigerd door %s" />
|
||||
<node name="sslError" value="SSL subsysteem fout" />
|
||||
<node name="sslConnectErrorMessage" value="SSL/TLS handshake probleem opgetreden: %s" />
|
||||
<node name="sslBadKey" value="Fout SSL certificaat van: %s" />
|
||||
<node name="sslPeerUnverified" value="Identiteit van %s niet geverifieerd" />
|
||||
<node name="sslProtocolError" value="Fout bij gebruikt van het SSL protocol" />
|
||||
<node name="sslBadCertificateFileMessage" value="Kan het SSL CA certificaat bestand niet lezen: %s" />
|
||||
<node name="sslCertificateExpired" value="SSL certificaat is verlopen: %s" />
|
||||
<node name="sslCertificateNotYetValid" value="SSL certificaat is nog niet geldig: %s" />
|
||||
</node>
|
||||
</node>
|
||||
<node name="color">
|
||||
<node name="red" value="Rood" />
|
||||
<node name="green" value="Groen" />
|
||||
<node name="blue" value="Blauw" />
|
||||
<node name="black" value="Zwart" />
|
||||
<node name="white" value="Wit" />
|
||||
<node name="maroon" value="Bordeauxrood" />
|
||||
<node name="olive" value="Olijfgroen" />
|
||||
<node name="navy" value="Donkerblauw" />
|
||||
<node name="purple" value="Paars" />
|
||||
<node name="teal" value="Blauwgroen" />
|
||||
<node name="silver" value="Zilver" />
|
||||
<node name="gray" value="Grijs" />
|
||||
<node name="lime" value="Felgroen" />
|
||||
<node name="yellow" value="Geel" />
|
||||
<node name="magenta" value="Magenta" />
|
||||
<node name="cyan" value="Cyaan" />
|
||||
<node name="custom..." value="Aangepast..." />
|
||||
</node>
|
||||
<node name="language">
|
||||
<node name="ar" value="Arabisch" />
|
||||
<node name="cs" value="Tsjechisch" />
|
||||
<node name="de" value="Duits" />
|
||||
<node name="de-traditional" value="Duits (traditionele spelling)" />
|
||||
<node name="el" value="Grieks" />
|
||||
<node name="en" value="Engels" />
|
||||
<node name="eo" value="Esperanto" />
|
||||
<node name="es" value="Spaans" />
|
||||
<node name="fi" value="Fins" />
|
||||
<node name="fr" value="Frans" />
|
||||
<node name="he" value="Hebreeuws" />
|
||||
<node name="hu" value="Hongaars" />
|
||||
<node name="id" value="Indonesisch" />
|
||||
<node name="it" value="Italiaans" />
|
||||
<node name="lt" value="Litouws" />
|
||||
<node name="nl" value="Nederlands" />
|
||||
<node name="no" value="Noors" />
|
||||
<node name="pt" value="Portugees" />
|
||||
<node name="pl" value="Pools" />
|
||||
<node name="ru" value="Russisch" />
|
||||
<node name="sv" value="Zweeds" />
|
||||
<node name="tr" value="Turks" />
|
||||
<node name="uk" value="Oekraïens" />
|
||||
<node name="vi" value="Vietnamees" />
|
||||
<node name="zh" value="Chinees" />
|
||||
<node name="other" value="Anders" />
|
||||
<node name="multi" value="Meertalig" />
|
||||
</node>
|
||||
<node name="boolean3">
|
||||
<node name="on" value="aan" />
|
||||
<node name="off" value="uit" />
|
||||
<node name="unchanged" value="ongewijzigd" />
|
||||
</node>
|
||||
<node name="keyOptionView">
|
||||
<node name="actionFor" value="Actie voor toets" />
|
||||
</node>
|
||||
</resources>
|
BIN
icons/menu/ic_menu_add.png
Normal file
After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
icons/menu/ic_menu_day.png
Executable file → Normal file
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 681 B |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
res/drawable-hdpi/ic_menu_add.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
res/drawable-hdpi/ic_menu_bookmarks.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
res/drawable-hdpi/ic_menu_day.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
res/drawable-hdpi/ic_menu_languages.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
res/drawable-hdpi/ic_menu_library.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
res/drawable-hdpi/ic_menu_networklibrary.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
res/drawable-hdpi/ic_menu_night.png
Normal file
After Width: | Height: | Size: 3 KiB |
BIN
res/drawable-hdpi/ic_menu_refresh.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
res/drawable-hdpi/ic_menu_search.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
res/drawable-hdpi/ic_menu_toc.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
|
@ -21,12 +21,9 @@ package org.geometerplus.android.fbreader;
|
|||
|
||||
import java.util.*;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.SearchManager;
|
||||
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;
|
||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||
|
@ -35,51 +32,133 @@ import org.geometerplus.android.util.UIUtil;
|
|||
import org.geometerplus.android.util.PackageUtil;
|
||||
|
||||
public abstract class DictionaryUtil {
|
||||
private static LinkedList<PackageInfo> ourDictionaryInfos = new LinkedList<PackageInfo>();
|
||||
// Map: dictionary info -> hide if package is not installed
|
||||
private static LinkedHashMap<PackageInfo,Boolean> ourDictionaryInfos =
|
||||
new LinkedHashMap<PackageInfo,Boolean>();
|
||||
private static ZLStringOption ourDictionaryOption;
|
||||
|
||||
public static List<PackageInfo> dictionaryInfos() {
|
||||
private static Map<PackageInfo,Boolean> infos() {
|
||||
if (ourDictionaryInfos.isEmpty()) {
|
||||
ourDictionaryInfos.add(new PackageInfo(
|
||||
"com.socialnmobile.colordict",
|
||||
"com.socialnmobile.colordict.activity.Main",
|
||||
"ColorDict"
|
||||
));
|
||||
ourDictionaryInfos.add(new PackageInfo(
|
||||
"com.ngc.fora",
|
||||
"com.ngc.fora.ForaDictionary",
|
||||
"Fora Dictionary"
|
||||
));
|
||||
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<PackageInfo> dictionaryInfos(Context context) {
|
||||
final LinkedList<PackageInfo> list = new LinkedList<PackageInfo>();
|
||||
for (Map.Entry<PackageInfo,Boolean> 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<PackageInfo,Boolean> 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", "Class", dictionaryInfos().get(0).ClassName);
|
||||
ourDictionaryOption = new ZLStringOption("Dictionary", "Id", firstInfo().Id);
|
||||
}
|
||||
return ourDictionaryOption;
|
||||
}
|
||||
|
||||
private static PackageInfo getCurrentDictionaryInfo() {
|
||||
final String className = dictionaryOption().getValue();
|
||||
for (PackageInfo info : dictionaryInfos()) {
|
||||
if (info.ClassName.equals(className)) {
|
||||
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();
|
||||
return new Intent(Intent.ACTION_SEARCH)
|
||||
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
|
||||
))
|
||||
.putExtra(SearchManager.QUERY, text);
|
||||
.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 intent.setData(Uri.parse(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) {
|
||||
|
|
|
@ -20,13 +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;
|
||||
|
||||
PackageInfo(String packageName, String className, String title) {
|
||||
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;
|
||||
|
||||
IntentAction = intentAction;
|
||||
IntentDataPattern = intentDataPattern;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -344,6 +344,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
|
|||
protected List<Author> 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<Author> list = new ArrayList<Author>();
|
||||
|
@ -435,6 +436,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
|
|||
protected List<Tag> 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<Tag> list = new ArrayList<Tag>();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -210,8 +210,8 @@ public class NetworkLibraryActivity extends NetworkBaseActivity {
|
|||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
super.onCreateOptionsMenu(menu);
|
||||
addMenuItem(menu, MENU_SEARCH, "networkSearch", R.drawable.ic_menu_networksearch);
|
||||
addMenuItem(menu, MENU_ADD_CATALOG, "addCustomCatalog", android.R.drawable.ic_menu_add);
|
||||
addMenuItem(menu, MENU_SEARCH, "networkSearch", R.drawable.ic_menu_search);
|
||||
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;
|
||||
|
|
|
@ -36,13 +36,13 @@ class DictionaryPreference extends ZLStringListPreference {
|
|||
super(context, resource, resourceKey);
|
||||
|
||||
myOption = DictionaryUtil.dictionaryOption();
|
||||
final List<PackageInfo> infos = DictionaryUtil.dictionaryInfos();
|
||||
final List<PackageInfo> infos = DictionaryUtil.dictionaryInfos(context);
|
||||
|
||||
final String[] values = new String[infos.size()];
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -62,23 +62,11 @@ class FB2CoverImage extends ZLImageProxy {
|
|||
return myImage;
|
||||
}
|
||||
|
||||
private String myXLinkPrefix;
|
||||
|
||||
@Override
|
||||
public boolean processNamespaces() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void namespaceMapChangedHandler(HashMap<String,String> namespaceMap) {
|
||||
myXLinkPrefix = null;
|
||||
for (Map.Entry<String,String> 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);
|
||||
}
|
||||
|
|
|
@ -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,104 +279,102 @@ 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;
|
||||
|
||||
|
@ -387,16 +388,6 @@ public final class FB2Reader extends BookReader implements ZLXMLReader {
|
|||
return true;
|
||||
}
|
||||
|
||||
public void namespaceMapChangedHandler(HashMap<String,String> namespaceMap) {
|
||||
myHrefAttribute = null;
|
||||
for (Map.Entry<String,String> entry : namespaceMap.entrySet()) {
|
||||
if ("http://www.w3.org/1999/xlink".equals(entry.getValue())) {
|
||||
myHrefAttribute = (entry.getKey() + ":href").intern();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addExternalEntities(HashMap<String,char[]> entityMap) {
|
||||
entityMap.put("FBReaderVersion", ZLibrary.Instance().getVersionName().toCharArray());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -50,11 +50,13 @@ class OEBAnnotationReader extends ZLXMLReaderAdapter implements XMLNamespaces {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean processNamespaces() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void namespaceMapChangedHandler(HashMap<String,String> namespaceMap) {
|
||||
@Override
|
||||
public void namespaceMapChangedHandler(Map<String,String> namespaceMap) {
|
||||
myDescriptionTag = null;
|
||||
for (Map.Entry<String,String> 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;
|
||||
|
|
|
@ -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<String,String> namespaceMap) {
|
||||
@Override
|
||||
public void namespaceMapChangedHandler(Map<String,String> namespaceMap) {
|
||||
myOPFSchemePrefix = null;
|
||||
for (Map.Entry<String,String> entry : namespaceMap.entrySet()) {
|
||||
if (OpenPackagingFormat.equals(entry.getValue())) {
|
||||
|
@ -257,6 +261,7 @@ class OEBBookReader extends ZLXMLReaderAdapter implements XMLNamespaces {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dontCacheAttributeValues() {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<String,String> namespaceMap) {
|
||||
@Override
|
||||
public void namespaceMapChangedHandler(Map<String,String> 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)) {
|
||||
|
|
|
@ -23,6 +23,8 @@ 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.*;
|
||||
import org.geometerplus.fbreader.formats.util.MiscUtil;
|
||||
|
@ -82,8 +84,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());
|
||||
|
@ -133,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();
|
||||
|
@ -155,6 +159,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 +173,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 +182,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 +232,18 @@ cycle:
|
|||
return ourExternalDTDs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> externalDTDs() {
|
||||
return xhtmlDTDs();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dontCacheAttributeValues() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean processNamespaces() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void namespaceMapChangedHandler(HashMap<String,String> namespaceMap) {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -229,7 +229,7 @@ class OPDSLinkXMLReader extends OPDSXMLReader implements OPDSConstants, MimeType
|
|||
private String myFBReaderNamespaceId;
|
||||
|
||||
@Override
|
||||
public void namespaceMapChangedHandler(HashMap<String, String> namespaceMap) {
|
||||
public void namespaceMapChangedHandler(Map<String, String> namespaceMap) {
|
||||
super.namespaceMapChangedHandler(namespaceMap);
|
||||
|
||||
myFBReaderNamespaceId = null;
|
||||
|
|
|
@ -74,7 +74,7 @@ class OPDSXMLReader extends ZLXMLReaderAdapter {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void namespaceMapChangedHandler(HashMap<String,String> namespaceMap) {
|
||||
public void namespaceMapChangedHandler(Map<String,String> namespaceMap) {
|
||||
myDublinCoreNamespaceId = null;
|
||||
myAtomNamespaceId = null;
|
||||
myOpenSearchNamespaceId = null;
|
||||
|
|
|
@ -57,7 +57,7 @@ class OpenSearchXMLReader extends ZLXMLReaderAdapter {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void namespaceMapChangedHandler(HashMap<String, String> namespaces) {
|
||||
public void namespaceMapChangedHandler(Map<String, String> namespaces) {
|
||||
myOpenSearchNamespaceId = null;
|
||||
|
||||
for (Map.Entry<String,String> entry : namespaces.entrySet()) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -151,10 +151,12 @@ public class ZLTTFInfoDetector {
|
|||
if (nameInfo == null || nameInfo.Offset < myPosition || nameInfo.Length <= 0) {
|
||||
return null;
|
||||
}
|
||||
if (nameInfo.Length > 10240) {
|
||||
throw new IOException("Name table size is too large: " + nameInfo.Length);
|
||||
byte[] buffer;
|
||||
try {
|
||||
buffer = readTable(nameInfo);
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
final byte[] buffer = readTable(nameInfo);
|
||||
if (getInt16(buffer, 0) != 0) {
|
||||
throw new IOException("Name table format is invalid");
|
||||
}
|
||||
|
|
|
@ -72,6 +72,10 @@ public final class ZLStringMap {
|
|||
return myKeys[index];
|
||||
}
|
||||
|
||||
String getValue(int index) {
|
||||
return myValues[index];
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
mySize = 0;
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ public interface ZLXMLReader {
|
|||
public void characterDataHandlerFinal(char[] ch, int start, int length);
|
||||
|
||||
boolean processNamespaces();
|
||||
void namespaceMapChangedHandler(HashMap<String,String> namespaces);
|
||||
void namespaceMapChangedHandler(Map<String,String> namespaces);
|
||||
|
||||
void addExternalEntities(HashMap<String,char[]> entityMap);
|
||||
List<String> externalDTDs();
|
||||
|
|
|
@ -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<String,String> myNamespaceMap = Collections.emptyMap();
|
||||
|
||||
public boolean read(ZLFile file) {
|
||||
return ZLXMLProcessor.read(this, file);
|
||||
}
|
||||
|
||||
|
@ -62,7 +64,53 @@ public class ZLXMLReaderAdapter implements ZLXMLReader {
|
|||
return false;
|
||||
}
|
||||
|
||||
public void namespaceMapChangedHandler(HashMap<String,String> namespaces) {
|
||||
public void namespaceMapChangedHandler(Map<String,String> namespaces) {
|
||||
myNamespaceMap = namespaces != null ? namespaces : Collections.<String,String>emptyMap();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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<String,char[]> entityMap) {
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -100,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";
|
||||
}
|
||||
|
@ -109,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<String> 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<String> familySet = new TreeSet(getFontMap(forceReload).keySet());
|
||||
familySet.add("Droid Sans");
|
||||
familySet.add("Droid Serif");
|
||||
familySet.add("Droid Mono");
|
||||
families.addAll(familySet);
|
||||
}
|
||||
}
|
||||
|
|