1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 19:42:17 +02:00

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

This commit is contained in:
tushkanchik 2008-04-14 23:14:05 +00:00
parent 34d0f3aa85
commit 753bed8fcd
13 changed files with 492 additions and 41 deletions

View file

@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8"?>
<known-encodings>
<group name="West European">
<encoding region="Western" name="ISO-8859-1">
<code number="28591"/>
</encoding>
<encoding region="Western" name="ISO-8859-15">
<code number="28605"/>
</encoding>
<encoding region="Western" name="IBM850">
<code number="850"/>
</encoding>
<encoding region="Western" name="MacRoman">
<code number="10000"/>
<alias name="Macintosh"/>
</encoding>
<encoding region="Western" name="US-ASCII">
<code number="20127"/>
</encoding>
<encoding region="Western" name="windows-1252">
<code number="1252"/>
</encoding>
<encoding region="Celtic" name="ISO-8859-14">
<code number="28604"/>
</encoding>
<encoding region="Greek" name="ISO-8859-7">
</encoding>
<code number="28597"/>
<encoding region="Greek" name="MacGreek">
<code number="10006"/>
</encoding>
<encoding region="Greek" name="windows-1253">
<code number="1253"/>
</encoding>
<encoding region="Icelandic" name="MacIcelandic">
<code number="10079"/>
</encoding>
<encoding region="Nordic" name="ISO-8859-10">
<code number="28600"/>
</encoding>
<encoding region="South European" name="ISO-8859-3">
<code number="28593"/>
</encoding>
</group>
<group name="East European">
<encoding region="Baltic" name="ISO-8859-4">
<code number="28594"/>
</encoding>
<encoding region="Baltic" name="ISO-8859-13">
<code number="28603"/>
</encoding>
<encoding region="Baltic" name="windows-1257">
<code number="1257"/>
</encoding>
<encoding region="Central European" name="IBM852">
<code number="852"/>
</encoding>
<encoding region="Central European" name="ISO-8859-2">
<code number="28592"/>
</encoding>
<encoding region="Central European" name="MacCE">
<code number="10029"/>
</encoding>
<encoding region="Central European" name="windows-1250">
<code number="1250"/>
</encoding>
<encoding region="Croatian" name="MacCroatian">
<code number="10082"/>
</encoding>
<encoding region="Cyrillic" name="IBM855">
<code number="855"/>
</encoding>
<encoding region="Cyrillic" name="ISO-8859-5">
<code number="28595"/>
</encoding>
<encoding region="Cyrillic" name="ISO-IR-111">
</encoding>
<encoding region="Cyrillic" name="KOI8-R">
<code number="20866"/>
</encoding>
<encoding region="Cyrillic" name="MacCyrillic">
<code number="10007"/>
</encoding>
<encoding region="Cyrillic" name="windows-1251">
<code number="1251"/>
</encoding>
<encoding region="Cyrillic/Russian" name="IBM866">
<code number="866"/>
</encoding>
<encoding region="Cyrillic/Ukrainian" name="KOI8-U">
<code number="21866"/>
</encoding>
<encoding region="Cyrillic/Ukrainian" name="MacUkrainian">
<code number="10017"/>
</encoding>
<encoding region="Romanian" name="ISO-8859-16">
<code number="28606"/>
</encoding>
<encoding region="Romanian" name="MacRomanian">
<code number="10010"/>
</encoding>
</group>
<group name="East Asia">
<encoding region="Chinese Simplified" name="GB2312">
<code number="936"/>
</encoding>
<encoding region="Chinese Simplified" name="GB18030">
<code number="54936"/>
</encoding>
<encoding region="Chinese Simplified" name="GBK">
</encoding>
<encoding region="Chinese Simplified" name="HZ">
</encoding>
<encoding region="Chinese Simplified" name="ISO-2022-CN">
</encoding>
<encoding region="Chinese Traditional" name="Big5">
<code number="950"/>
</encoding>
<encoding region="Chinese Traditional" name="Big5-HKSCS">
</encoding>
<encoding region="Chinese Traditional" name="EUC-TW">
</encoding>
<encoding region="Japanese" name="EUC-JP">
<code number="51932"/>
</encoding>
<encoding region="Japanese" name="ISO-2022-JP">
<code number="50222"/>
</encoding>
<encoding region="Japanese" name="Shift_JIS">
<code number="932"/>
</encoding>
<encoding region="Korean" name="EUC-KR">
<code number="51949"/>
</encoding>
<encoding region="Korean" name="ISO-2022-KR">
<code number="50225"/>
</encoding>
<encoding region="Korean" name="JOHAB">
<code number="1361"/>
</encoding>
<encoding region="Korean" name="UHC">
</encoding>
</group>
<group name="SW &amp; SE Asia">
<encoding region="Armenian" name="ARMSCII-8">
</encoding>
<encoding region="Georgian" name="GEOSTD8">
</encoding>
<encoding region="Thai" name="IBM874">
<code number="874"/>
</encoding>
<encoding region="Thai" name="ISO-8859-11">
<code number="28601"/>
</encoding>
<encoding region="Thai" name="TIS-620">
</encoding>
<encoding region="Turkish" name="IBM857">
<code number="857"/>
</encoding>
<encoding region="Turkish" name="ISO-8859-9">
<code number="28599"/>
</encoding>
<encoding region="Turkish" name="MacTurkish">
<code number="10081"/>
</encoding>
<encoding region="Turkish" name="windows-1254">
<code number="1254"/>
</encoding>
<encoding region="Vietnamese" name="TCVN">
</encoding>
<encoding region="Vietnamese" name="VISCII">
</encoding>
<encoding region="Vietnamese" name="VPS">
</encoding>
<encoding region="Vietnamese" name="windows-1258">
<code number="1258"/>
</encoding>
<encoding region="Hindi" name="MacDevanagari">
</encoding>
<encoding region="Hindi" name="ISCII Devanagari">
<code number="57002"/>
</encoding>
<encoding region="Gujarati" name="MacGujarati">
</encoding>
<encoding region="Gujarati" name="ISCII Gujarati">
<code number="57010"/>
</encoding>
<encoding region="Gurmukhi" name="MacGurmukhi">
</encoding>
</group>
<group name="Middle Eastern">
<encoding region="Arabic" name="ISO-8859-6">
<code number="28596"/>
</encoding>
<encoding region="Arabic" name="IBM864">
<code number="864"/>
</encoding>
<encoding region="Arabic" name="windows-1256">
<code number="1256"/>
</encoding>
<encoding region="Arabic" name="MacArabic">
<code number="10004"/>
</encoding>
<encoding region="Farsi" name="MacFarsi">
</encoding>
<encoding region="Hebrew" name="IBM862">
<code number="862"/>
</encoding>
<encoding region="Hebrew" name="ISO-8859-8">
<code number="28598"/>
</encoding>
<encoding region="Hebrew" name="ISO-8859-8-I">
<code number="38598"/>
</encoding>
<encoding region="Hebrew" name="MacHebrew">
<code number="10005"/>
</encoding>
<encoding region="Hebrew" name="windows-1255">
<code number="1255"/>
</encoding>
</group>
<group name="Unicode">
<encoding region="Unicode" name="UTF-8">
</encoding>
<encoding region="Unicode" name="UTF-7">
</encoding>
<encoding region="Unicode" name="UTF-16">
</encoding>
</group>
</known-encodings>

View file

@ -0,0 +1,37 @@
package org.geometerplus.fbreader.encoding;
public class DummyEncodingConverterProvider extends ZLEncodingConverterProvider {
public ZLEncodingConverter createConverter() {
return new DummyEncodingConverter();
}
public ZLEncodingConverter createConverter(String encoding) {
return createConverter();
}
public boolean providesConverter(String encoding) {
final String lowerCasedEncoding = encoding.toLowerCase();
return ("utf-8".equals(lowerCasedEncoding)) || ("us-ascii".equals(lowerCasedEncoding));
}
private static class DummyEncodingConverter extends ZLEncodingConverter {
private DummyEncodingConverter() {}
public boolean fillTable(int[] map) {
for (int i = 0; i < 255; ++i) {
map[i] = i;
}
return true;
}
public void reset() {}
//size=end-start
public String convert(char [] src, int start, int end) {
return new String(src, start, end - start);
}
}
}

View file

@ -0,0 +1,15 @@
package org.geometerplus.fbreader.encoding;
public class MyEncodingConverterProvider extends ZLEncodingConverterProvider {
public ZLEncodingConverter createConverter(String encoding) {
// TODO Auto-generated method stub
return null;
}
public boolean providesConverter(String encoding) {
// TODO Auto-generated method stub
return false;
}
}

View file

@ -21,17 +21,29 @@ package org.geometerplus.fbreader.encoding;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import org.geometerplus.zlibrary.core.util.*;
import org.geometerplus.zlibrary.core.config.ZLConfigManager;
import org.geometerplus.zlibrary.core.library.ZLibrary;
import org.geometerplus.zlibrary.core.options.ZLBooleanOption;
import org.geometerplus.zlibrary.core.options.ZLOption;
import org.geometerplus.zlibrary.core.xml.ZLStringMap;
import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter;
public class ZLEncodingCollection {
private static ZLEncodingCollection ourInstance;
private static ZLBooleanOption ourUseWindows1252HackOption;
private static ZLBooleanOption ourUseWindows1252HackOption;
private final ArrayList/*<ZLEncodingSet>*/ mySets = new ArrayList();
private final HashMap/*<String,ZLEncodingConverterInfo>*/ myInfosByName = new HashMap();
private final ArrayList/*<ZLEncodingConverterProvider>*/ myProviders = new ArrayList();
private ZLEncodingCollection() {
registerProvider(new DummyEncodingConverterProvider());
// registerProvider(new MyEncodingConverterProvider());
}
public static ZLEncodingCollection instance() {
if (ourInstance == null) {
ourInstance = new ZLEncodingCollection();
@ -39,7 +51,7 @@ public class ZLEncodingCollection {
return ourInstance;
}
public static String encodingDescriptionPath() {
return ZLibrary.JAR_DATA_PREFIX + "zlibrary" + File.separator + "encodings";
return ZLibrary.JAR_DATA_PREFIX + "data/encodings/Encodings.xml";
}
public static ZLBooleanOption useWindows1252HackOption() {
@ -74,28 +86,101 @@ public class ZLEncodingCollection {
}
public ZLEncodingConverter defaultConverter() {
return null;//DummyEncodingConverterProvider().createConverter();
return new DummyEncodingConverterProvider().createConverter();
}
public void registerProvider(ZLEncodingConverterProvider provider) {
myProviders.add(provider);
}
private void addInfo(ZLEncodingConverterInfo info) {
}
// private void addInfo(ZLEncodingConverterInfo info) {}
ArrayList/*<ZLEncodingConverterProvider>*/ providers() {
return myProviders;
}
private final ArrayList/*<ZLEncodingSet>*/ mySets = new ArrayList();
private final HashMap/*<String,ZLEncodingConverterInfo>*/ myInfosByName = new HashMap();
private final ArrayList/*<ZLEncodingConverterProvider>*/ myProviders = new ArrayList();
//private ZLEncodingCollection();
private void init() {
if (mySets.isEmpty()) {
String prefix = encodingDescriptionPath() + File.separator;
//new ZLEncodingCollectionReader(this).readDocument(prefix + "Encodings.xml");
// String prefix = encodingDescriptionPath() + File.separator;
// System.out.println("trying to read " + prefix + "Encodings.xml");
new ZLEncodingCollectionReader(this).read(encodingDescriptionPath());
}
}
private static class ZLEncodingCollectionReader extends ZLXMLReaderAdapter {
private final ZLEncodingCollection myCollection;
private ZLEncodingSet myCurrentSet;
private ZLEncodingConverterInfo myCurrentInfo;
private final ArrayList/*<String>*/ myNames = new ArrayList();
private static final String GROUP = "group";
private static final String ENCODING = "encoding";
private static final String NAME = "name";
private static final String REGION = "region";
private static final String ALIAS = "alias";
private static final String CODE = "code";
private static final String NUMBER = "number";
public ZLEncodingCollectionReader(ZLEncodingCollection collection) {
myCollection = collection;
}
public boolean dontCacheAttributeValues() {
return true;
}
public boolean endElementHandler(String tag) {
if (myCurrentInfo != null && (ENCODING.equals(tag))) {
if (myCurrentInfo.canCreateConverter()) {
myCurrentSet.addInfo(myCurrentInfo);
final int size = myNames.size();
for (int i = 0; i < size; i++) {
myCollection.myInfosByName.put(((String) myNames.get(i)).toLowerCase(), myCurrentInfo);
}
}
myCurrentInfo = null;
myNames.clear();
} else if (myCurrentSet != null && (GROUP.equals(tag))) {
if (!myCurrentSet.infos().isEmpty()) {
myCollection.mySets.add(myCurrentSet);
}
myCurrentSet = null;
}
return false;
}
public boolean startElementHandler(String tag, ZLStringMap attributes) {
System.out.println("reading");
if (GROUP.equals(tag)) {
final String name = attributes.getValue(NAME);
if (name != null) {
myCurrentSet = new ZLEncodingSet(name);
}
} else if (myCurrentSet != null) {
if (ENCODING.equals(tag)) {
final String name = attributes.getValue(NAME);
final String region = attributes.getValue(REGION);
if ((name != null) && (region != null)) {
final String sName = name;
myCurrentInfo = new ZLEncodingConverterInfo(sName, region);
myNames.add(sName);
}
} else if (myCurrentInfo != null) {
String name = null;
if (CODE.equals(tag)) {
name = attributes.getValue(NUMBER);
} else if (ALIAS.equals(tag)) {
name = attributes.getValue(NAME);
}
if (name != null) {
final String sName = name;
myCurrentInfo.addAlias(sName);
myNames.add(sName);
}
}
}
return false;
}
}
}

View file

@ -23,9 +23,8 @@ public abstract class ZLEncodingConverter {
protected ZLEncodingConverter() {}
//abstract public void convert(String dst, const char *srcStart, const char *srcEnd);
public void convert(String dst, String src) {
abstract public String convert(char [] src, int start, int end);
//convert(dst, src.toCharArray(), src.data() + src.length());
}
public abstract void reset();
public abstract boolean fillTable(int[] map);

View file

@ -23,6 +23,10 @@ import java.util.ArrayList;
import java.util.Iterator;
public class ZLEncodingConverterInfo {
private String myName = "";
private String myVisibleName = "";
private ArrayList/*<String>*/ myAliases = new ArrayList();
public ZLEncodingConverterInfo(String name, String region) {
myName = name;
myVisibleName = region + " (" + name + ")";
@ -60,20 +64,16 @@ public class ZLEncodingConverterInfo {
public boolean canCreateConverter() {
ZLEncodingCollection collection = ZLEncodingCollection.instance();
ArrayList<ZLEncodingConverterProvider> providers = collection.providers();
for (Iterator it = providers.iterator(); it.hasNext();) {
for (Iterator it = providers.iterator(); it.hasNext();) {
final ZLEncodingConverterProvider privider = (ZLEncodingConverterProvider)it.next();
for (Iterator jt = myAliases.iterator(); jt.hasNext(); ) {
if (((ZLEncodingConverterProvider)it.next()).providesConverter((String)jt.next())) {
if (privider.providesConverter((String)jt.next())) {
return true;
}
}
}
return false;
}
private String myName = "";
private String myVisibleName = "";
private ArrayList<String> myAliases = new ArrayList();
//private ZLEncodingConverterInfo(const ZLEncodingConverterInfo&);
//private ZLEncodingConverterInfo &operator=(const ZLEncodingConverterInfo&);
}

View file

@ -20,8 +20,8 @@
package org.geometerplus.fbreader.encoding;
public abstract class ZLEncodingConverterProvider {
protected ZLEncodingConverterProvider() {}
protected ZLEncodingConverterProvider() {}
public abstract boolean providesConverter(String encoding);
public abstract ZLEncodingConverter createConverter(String encoding);

View file

@ -22,6 +22,9 @@ package org.geometerplus.fbreader.encoding;
import java.util.ArrayList;
public class ZLEncodingSet {
private String myName = "";
private ArrayList/*<ZLEncodingConverterInfo>*/ myInfos = new ArrayList();
public ZLEncodingSet(String name) {
}
@ -36,7 +39,4 @@ public class ZLEncodingSet {
public ArrayList/*<ZLEncodingConverterInfo>*/ infos() {
return myInfos;
}
private String myName = "";
private ArrayList/*<ZLEncodingConverterInfo>*/ myInfos = new ArrayList();
}

View file

@ -50,12 +50,16 @@ public class EncodingEntry extends ZLComboOptionEntry {
return;
}
final ArrayList/*<ZLEncodingSet>*/ sets = ZLEncodingCollection.instance().sets();
final ArrayList/*<ZLEncodingSet>*/ sets = ZLEncodingCollection.instance().sets();
System.out.println("sets size = " + sets.size());
for (int i = 0; i < sets.size(); i++) {
ZLEncodingSet es = (ZLEncodingSet) sets.get(i);
final ArrayList/*<ZLEncodingConverterInfo>*/ infos = es.infos();
final ArrayList/*<ZLEncodingConverterInfo>*/ infos = es.infos();
// System.out.println(es.name());
mySetNames.add(es.name());
ArrayList/*<String>*/ names = (ArrayList) myValues.get(es.name());
ArrayList/*<String>*/ names = new ArrayList();
for (int j = 0; j < infos.size(); j++) {
ZLEncodingConverterInfo eci = (ZLEncodingConverterInfo) infos.get(j);
if (eci.name().equals(value)) {
@ -64,10 +68,11 @@ public class EncodingEntry extends ZLComboOptionEntry {
}
names.add(eci.visibleName());
myValueByName.put(eci.visibleName(), eci.name());
}
}
myValues.put(es.name(), names);
}
if (myInitialSetName.length() == 0) {
//TODO:
if (myInitialSetName.length() == 0 && !mySetNames.isEmpty()) {
myInitialSetName = (String) mySetNames.get(0);
}
}

View file

@ -18,7 +18,21 @@
*/
package org.geometerplus.fbreader.formats;
import org.geometerplus.fbreader.encoding.ZLEncodingCollection;
import org.geometerplus.fbreader.encoding.ZLEncodingConverter;
import org.geometerplus.fbreader.encoding.ZLEncodingConverterInfo;
public class EncodedTextReader {
public class EncodedTextReader {
private ZLEncodingConverter myConverter;
//?static
public EncodedTextReader(final String encoding) {
ZLEncodingCollection collection = ZLEncodingCollection.instance();
ZLEncodingConverterInfo info = collection.info(encoding);
myConverter = (info != null) ? info.createConverter() : collection.defaultConverter();
}
public ZLEncodingConverter getConverter() {
return myConverter;
}
}

View file

@ -25,7 +25,7 @@ import java.util.ArrayList;
public class PdbHeader {
static public String DocName;
static public short Flags;
static public int Flags;
static public String Id;
static public int[] Offsets;
@ -35,7 +35,7 @@ public class PdbHeader {
return false;
}
DocName = new String(buffer);
Flags = PdbUtil.readShort(stream);
Flags = PdbUtil.readUnsignedShort(stream);
stream.skip(26);
@ -46,7 +46,7 @@ public class PdbHeader {
stream.skip(8);
short numRecords = PdbUtil.readShort(stream);
int numRecords = PdbUtil.readUnsignedShort(stream);
if (numRecords <= 0) {
return false;
}

View file

@ -0,0 +1,67 @@
package org.geometerplus.fbreader.formats.pdb;
import java.io.IOException;
import java.io.InputStream;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
public class PdbInputStream extends InputStream {
private final InputStream myBase;
private long myOffset = 0;
private final long mySize;
public PdbInputStream(ZLFile file) throws IOException {
mySize = file.size();
myBase = file.getInputStream();
}
public int read() throws IOException {
int result = myBase.read();
if (result != -1) {
myOffset ++;
}
return result;
}
public int available() throws IOException {
return super.available();
}
public void close() throws IOException {
myOffset = 0;
super.close();
}
public synchronized void mark(int readlimit) {
super.mark(readlimit);
}
public boolean markSupported() {
return super.markSupported();
}
public int read(byte[] b, int off, int len) throws IOException {
return super.read(b, off, len);
}
public int read(byte[] b) throws IOException {
return super.read(b);
}
public synchronized void reset() throws IOException {
// myOffset = 0;
super.reset();
}
public long skip(long n) throws IOException {
return super.skip(n);
}
public long offset() {
return myOffset;
}
public long sizeOfOpened() {
return mySize - myOffset;
}
}

View file

@ -16,7 +16,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.zlibrary.core.language;
import java.util.ArrayList;