From ba4ca95cda6e018db2c17b88178c5c681a8b049f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 15 Apr 2008 01:47:55 +0000 Subject: [PATCH] plucker support (in progress) git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@829 6a642e6f-84f6-412e-ac94-c4a38d5a04b0 --- .../encoding/ZLEncodingCollection.java | 2 - .../geometerplus/fbreader/formats/formats.rar | Bin 77163 -> 0 bytes .../fbreader/formats/pdb/DocDecompressor.java | 100 ++++++++++ .../fbreader/formats/pdb/PdbHeader.java | 11 +- .../fbreader/formats/pdb/PdbInputStream.java | 14 +- .../fbreader/formats/pdb/PdbPlugin.java | 3 +- .../fbreader/formats/pdb/PdbStream.java | 24 ++- .../fbreader/formats/pdb/PdbUtil.java | 33 +--- .../formats/plucker/PluckerBookReader.java | 179 +++++++++++------- .../formats/plucker/PluckerPlugin.java | 19 +- .../formats/plucker/PluckerTextStream.java | 20 +- 11 files changed, 261 insertions(+), 144 deletions(-) delete mode 100644 src/org/geometerplus/fbreader/formats/formats.rar create mode 100644 src/org/geometerplus/fbreader/formats/pdb/DocDecompressor.java diff --git a/src/org/geometerplus/fbreader/encoding/ZLEncodingCollection.java b/src/org/geometerplus/fbreader/encoding/ZLEncodingCollection.java index 9c800dc2e..8153af6f1 100644 --- a/src/org/geometerplus/fbreader/encoding/ZLEncodingCollection.java +++ b/src/org/geometerplus/fbreader/encoding/ZLEncodingCollection.java @@ -149,8 +149,6 @@ public class ZLEncodingCollection { } public boolean startElementHandler(String tag, ZLStringMap attributes) { - System.out.println("reading"); - if (GROUP.equals(tag)) { final String name = attributes.getValue(NAME); if (name != null) { diff --git a/src/org/geometerplus/fbreader/formats/formats.rar b/src/org/geometerplus/fbreader/formats/formats.rar deleted file mode 100644 index 8c5ea3dac65833ce68dbe27be8c7074045c68bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77163 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
  • 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 NwjQyqW^iC<007TkhwA_U diff --git a/src/org/geometerplus/fbreader/formats/pdb/DocDecompressor.java b/src/org/geometerplus/fbreader/formats/pdb/DocDecompressor.java new file mode 100644 index 000000000..52c114825 --- /dev/null +++ b/src/org/geometerplus/fbreader/formats/pdb/DocDecompressor.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2007-2008 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.formats.pdb; + +import java.io.*; + +public abstract class DocDecompressor { + private static final byte[] TOKEN_CODE = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 + }; + + public static int decompress(InputStream stream, byte[] targetBuffer, int compressedSize) throws IOException { + final int maxUncompressedSize = targetBuffer.length; + final byte[] sourceBuffer = new byte[compressedSize]; + + int sourceIndex = 0; + int targetIndex = 0; + + if (stream.read(sourceBuffer, 0, compressedSize) == compressedSize) { + byte token; + int shiftedIndex; + +loop: + while ((sourceIndex < compressedSize) && (targetIndex < maxUncompressedSize)) { + token = sourceBuffer[sourceIndex++]; + switch (TOKEN_CODE[token]) { + case 0: + targetBuffer[targetIndex++] = token; + break; + case 1: + if ((sourceIndex + token > compressedSize) || + (targetIndex + token > maxUncompressedSize)) { + break loop; + } + System.arraycopy(sourceBuffer, sourceIndex, targetBuffer, targetIndex, token); + sourceIndex += token; + targetIndex += token; + break; + case 2: + if (targetIndex + 2 > maxUncompressedSize) { + break loop; + } + targetBuffer[targetIndex++] = ' '; + targetBuffer[targetIndex++] = (byte)(token ^ 0x80); + break; + case 3: + if (sourceIndex + 1 > compressedSize) { + break loop; + } + int N = 256 * token + sourceBuffer[sourceIndex++]; + int copyLength = (N & 7) + 3; + if (targetIndex + copyLength > maxUncompressedSize) { + break loop; + } + shiftedIndex = targetIndex - (N & 0x3fff) / 8; + if (shiftedIndex >= 0) { + for (int i = 0; i < copyLength; i++) { + targetBuffer[targetIndex++] = targetBuffer[shiftedIndex++]; + } + } + break; + } + } + } + + return targetIndex; + } +} diff --git a/src/org/geometerplus/fbreader/formats/pdb/PdbHeader.java b/src/org/geometerplus/fbreader/formats/pdb/PdbHeader.java index 748feda2e..2bac3be1e 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/PdbHeader.java +++ b/src/org/geometerplus/fbreader/formats/pdb/PdbHeader.java @@ -32,29 +32,34 @@ public class PdbHeader { public boolean read(InputStream stream) throws IOException { final byte[] buffer = new byte[32]; if (stream.read(buffer, 0, 32) != 32) { + System.err.println("way 0"); return false; } DocName = new String(buffer); - Flags = PdbUtil.readUnsignedShort(stream); + Flags = PdbUtil.readShort(stream); stream.skip(26); if (stream.read(buffer, 0, 8) != 8) { + System.err.println("way 1"); return false; } Id = new String(buffer, 0, 8); stream.skip(8); - int numRecords = PdbUtil.readUnsignedShort(stream); + int numRecords = PdbUtil.readShort(stream); if (numRecords <= 0) { + System.err.println(numRecords); + System.err.println("way 2"); return false; } Offsets = new int[numRecords]; for (int i = 0; i < numRecords; ++i) { - Offsets[i] = stream.read(); + Offsets[i] = PdbUtil.readInt(stream); if (stream.skip(4) != 4) { + System.err.println("way 3"); return false; } } diff --git a/src/org/geometerplus/fbreader/formats/pdb/PdbInputStream.java b/src/org/geometerplus/fbreader/formats/pdb/PdbInputStream.java index 1cd4a203c..61df20248 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/PdbInputStream.java +++ b/src/org/geometerplus/fbreader/formats/pdb/PdbInputStream.java @@ -7,11 +7,11 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile; public class PdbInputStream extends InputStream { private final InputStream myBase; - private long myOffset = 0; - private final long mySize; + private int myOffset = 0; + private final int mySize; public PdbInputStream(ZLFile file) throws IOException { - mySize = file.size(); + mySize = (int)file.size(); myBase = file.getInputStream(); } @@ -53,15 +53,11 @@ public class PdbInputStream extends InputStream { super.reset(); } - public long skip(long n) throws IOException { - return super.skip(n); - } - - public long offset() { + public int offset() { return myOffset; } - public long sizeOfOpened() { + public int sizeOfOpened() { return mySize - myOffset; } } diff --git a/src/org/geometerplus/fbreader/formats/pdb/PdbPlugin.java b/src/org/geometerplus/fbreader/formats/pdb/PdbPlugin.java index c0642ee65..d1d507631 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/PdbPlugin.java +++ b/src/org/geometerplus/fbreader/formats/pdb/PdbPlugin.java @@ -37,7 +37,6 @@ public abstract class PdbPlugin extends FormatPlugin { } String fileName = file.getPath(); - System.err.println("fileName = " + fileName); int index = fileName.indexOf(':'); ZLFile baseFile = (index == -1) ? file : new ZLFile(fileName.substring(0, index)); boolean upToDate = BookDescriptionUtil.checkInfo(baseFile); @@ -47,7 +46,7 @@ public abstract class PdbPlugin extends FormatPlugin { if ((palmType.length() != 8) || !upToDate) { byte[] id = new byte[8]; try { - InputStream stream = file.getInputStream(); + final InputStream stream = file.getInputStream(); if (stream == null) { return null; } diff --git a/src/org/geometerplus/fbreader/formats/pdb/PdbStream.java b/src/org/geometerplus/fbreader/formats/pdb/PdbStream.java index 5777c4b7f..e735f3434 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/PdbStream.java +++ b/src/org/geometerplus/fbreader/formats/pdb/PdbStream.java @@ -19,21 +19,19 @@ package org.geometerplus.fbreader.formats.pdb; -import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import org.geometerplus.fbreader.formats.pdb.PdbUtil; import org.geometerplus.zlibrary.core.filesystem.ZLFile; public abstract class PdbStream extends InputStream { protected final InputStream myBase; - private int myOffset; - protected final PdbHeader myHeader = new PdbHeader(); - protected byte[] myBuffer; + private int myOffset; + public final PdbHeader myHeader = new PdbHeader(); + protected byte[] myBuffer; - protected short myBufferLength; - protected short myBufferOffset; + protected short myBufferLength; + protected short myBufferOffset; public PdbStream(ZLFile file) { InputStream base; @@ -62,7 +60,7 @@ public abstract class PdbStream extends InputStream { myOffset += realSize; return realSize; } - /*public int read(byte[] buffer,int offset, int maxSize) { + /*public int read(byte[] buffer,int offset, int maxSize) { int realSize = 0; while (realSize < maxSize) { if (!fillBuffer()) { @@ -89,7 +87,7 @@ public abstract class PdbStream extends InputStream { return false; } - myBase.skip((myHeader.Offsets[0])/*, true*/); + myBase.skip(myHeader.Offsets[0] - 78 - 8 * myHeader.Offsets.length); myBufferLength = 0; myBufferOffset = 0; @@ -108,9 +106,9 @@ public abstract class PdbStream extends InputStream { } } - public void skip(int offset) throws IOException { + public void skip(int offset) throws IOException { if (offset > 0) { - read(null,0, offset); + read(null, 0, offset); } else if (offset < 0) { offset += this.offset(); open(); @@ -120,11 +118,11 @@ public abstract class PdbStream extends InputStream { } } - public int offset() { + public int offset() { return myOffset; } - public int sizeOfOpened() { + public int sizeOfOpened() { // TODO: implement return 0; } diff --git a/src/org/geometerplus/fbreader/formats/pdb/PdbUtil.java b/src/org/geometerplus/fbreader/formats/pdb/PdbUtil.java index a13b9ce08..57f77e162 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/PdbUtil.java +++ b/src/org/geometerplus/fbreader/formats/pdb/PdbUtil.java @@ -21,43 +21,28 @@ package org.geometerplus.fbreader.formats.pdb; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; public class PdbUtil { public static short readShort(InputStream stream) { - byte[] tmp = new byte[2]; + final byte[] tmp = new byte[2]; try { stream.read(tmp, 0, 2); } catch (IOException e) { return -1; } - return (short)(tmp[1] + (tmp[0] << 8)); + return (short)((tmp[1] & 0xFF) + ((tmp[0] & 0xFF) << 8)); } - public static long readUnsignedLong(InputStream stream) { - byte []readBuffer = new byte[8]; - try { - stream.read(readBuffer, 0, 8); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return (((long)readBuffer[0] << 56) + - ((long)(readBuffer[1] & 255) << 48) + - ((long)(readBuffer[2] & 255) << 40) + - ((long)(readBuffer[3] & 255) << 32) + - ((long)(readBuffer[4] & 255) << 24) + - ((readBuffer[5] & 255) << 16) + - ((readBuffer[6] & 255) << 8) + - ((readBuffer[7] & 255) << 0)); - - /*byte []tmp = new byte[4]; + public static int readInt(InputStream stream) { + final byte[] tmp = new byte[4]; try { stream.read(tmp, 0, 4); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + return -1; } - return tmp[3] + tmp[2]*256 +tmp[1] * 256^2 +tmp[0] * 256^3;*/ + return (tmp[0] << 24) + + ((tmp[1] & 0xFF) << 16) + + ((tmp[2] & 0xFF) << 8) + + (tmp[3] & 0xFF); } } diff --git a/src/org/geometerplus/fbreader/formats/plucker/PluckerBookReader.java b/src/org/geometerplus/fbreader/formats/plucker/PluckerBookReader.java index 3c0c4b423..97b0f05e0 100644 --- a/src/org/geometerplus/fbreader/formats/plucker/PluckerBookReader.java +++ b/src/org/geometerplus/fbreader/formats/plucker/PluckerBookReader.java @@ -24,8 +24,12 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; import org.geometerplus.fbreader.bookmodel.*; +import org.geometerplus.fbreader.encoding.*; +import org.geometerplus.fbreader.formats.EncodedTextReader; import org.geometerplus.fbreader.formats.pdb.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.image.ZLImage; @@ -33,44 +37,64 @@ import org.geometerplus.zlibrary.text.model.*; import org.geometerplus.zlibrary.text.model.impl.*; public class PluckerBookReader extends BookReader { + private final String myFilePath; + private PdbInputStream myStream; + private int myFont; + private char[] myCharBuffer; + private String myConvertedTextBuffer; + private boolean myParagraphStarted = false; + private boolean myBufferIsEmpty; + private ZLTextForcedControlEntry myForcedEntry; + private final ArrayList/* >*/ myDelayedControls = new ArrayList(); + private final ArrayList/* */myDelayedHyperlinks = new ArrayList(); + private short myCompressionVersion; + private char myBytesToSkip; + + private final ArrayList/* >*/ myReferencedParagraphs = new ArrayList(); + private final HashMap/* >*/ myParagraphMap = new HashMap(); + private ArrayList/**/ myParagraphVector = new ArrayList(); //на всякий случай + private boolean myParagraphStored; + + private final ZLEncodingConverter myConverter; + public PluckerBookReader(String filePath, BookModel model, String encoding){ - super(model); - //, EncodedTextReader = encoding, - myFilePath = filePath; - myFont = FontType.FT_REGULAR; - myCharBuffer = new char[65535]; - myForcedEntry = null; + super(model); + myConverter = new EncodedTextReader(encoding).getConverter(); + myFilePath = filePath; + System.out.println(filePath + " " + encoding); + myFont = FontType.FT_REGULAR; + myCharBuffer = new char[65535]; + myForcedEntry = null; + } public boolean readDocument() throws IOException { - final PdbStream stream = new PluckerTextStream(new ZLFile(myFilePath)); - myStream = stream; - if (!stream.open()) { - return false; - } + System.out.println("reading document"); + myStream = new PdbInputStream(new ZLFile(myFilePath)); PdbHeader header = new PdbHeader(); - if (!header.read(stream)) { - stream.close(); + if (!header.read(myStream)) { + myStream.close(); + System.out.println("reading stream null"); return false; } setMainTextModel(); myFont = FontType.FT_REGULAR; - for (int i = 0; i < header.Offsets.length; ++i) { - int currentOffset = ((PdbStream)myStream).offset(); - int pit = header.Offsets[i]; + for (int index = 0; index < header.Offsets.length; ++index) { + int currentOffset = myStream.offset(); + int pit = header.Offsets[index]; if (currentOffset > pit) { break; } //myStream.seek(pit - currentOffset, false); myStream.skip(pit - currentOffset); - if (((PdbStream)myStream).offset() != pit) { + if (myStream.offset() != pit) { break; } - int recordSize = 25;//((pit != header.Offsets.size() - 1) ? (Integer)it.next() : ((PdbStream)myStream).sizeOfOpened()) - pit; + int recordSize = ((index != header.Offsets.length - 1) ? header.Offsets[index + 1] : myStream.sizeOfOpened()) - pit; readRecord(recordSize); } myStream.close(); @@ -96,59 +120,88 @@ public class PluckerBookReader extends BookReader { } private class FontType { - public static final int FT_REGULAR = 0; - public static final int FT_H1 = 1; - public static final int FT_H2 = 2; - public static final int FT_H3 = 3; - public static final int FT_H4 = 4; - public static final int FT_H5 = 5; - public static final int FT_H6 = 6; - public static final int FT_BOLD = 7; - public static final int FT_TT = 8; - public static final int FT_SMALL = 9; - public static final int FT_SUB = 10; - public static final int FT_SUP = 11; - }; + public static final int FT_REGULAR = 0; + public static final int FT_H1 = 1; + public static final int FT_H2 = 2; + public static final int FT_H3 = 3; + public static final int FT_H4 = 4; + public static final int FT_H5 = 5; + public static final int FT_H6 = 6; + public static final int FT_BOLD = 7; + public static final int FT_TT = 8; + public static final int FT_SMALL = 9; + public static final int FT_SUB = 10; + public static final int FT_SUP = 11; + }; private void readRecord(int recordSize) throws IOException { - short uid = PdbUtil.readShort(myStream); + System.out.println("reading record"); + int uid = PdbUtil.readShort(myStream); if (uid == 1) { myCompressionVersion = PdbUtil.readShort(myStream ); } else { - short paragraphs = PdbUtil.readShort(myStream); + int paragraphs = PdbUtil.readShort(myStream); + System.out.println("par "+paragraphs); - short size = PdbUtil.readShort(myStream); + int size = PdbUtil.readShort(myStream); //TODO ?????? - int type = (int)myStream.read(); + int type = myStream.read(); - int flags = (int)myStream.read(); + int flags = myStream.read(); + System.out.println("type " + type); + System.out.println("Compression " + myCompressionVersion); switch (type) { case 0: // text (TODO: found sample file and test this code) case 1: // compressed text { ArrayList/**/ pars = new ArrayList(); for (int i = 0; i < paragraphs; ++i) { - short pSize = PdbUtil.readShort(myStream); + int pSize = PdbUtil.readShort(myStream); pars.add(pSize); myStream.skip(2); } boolean doProcess = false; - if (type == 0) { - - doProcess = myStream.read(myCharBuffer.toString().getBytes(), 0, (int)size) == size; + if (type == 0) {//? + byte[] buf = new byte[size]; + doProcess = myStream.read(buf, 0, (int)size) == size; + if (doProcess) { + myCharBuffer = new String(buf).toCharArray(); + } } else if (myCompressionVersion == 1) { - //doProcess = - //DocDecompressor().decompress(myStream, myCharBuffer, recordSize - 8 - 4 * paragraphs, size) == size; + byte[] buf = new byte[size]; + doProcess = + DocDecompressor.decompress(myStream, buf, recordSize - 8 - 4 * paragraphs) == size; + if (doProcess) { + myCharBuffer = new String(buf).toCharArray(); + } } else if (myCompressionVersion == 2) { - myStream.skip(2); + // myStream.skip(2); + System.out.println("input size = " + (recordSize - 10 - 4 * paragraphs)); + System.out.println("size = " + size); + byte input [] = new byte[(int) (recordSize - 10 - 4 * paragraphs)]; + final int inputSize = myStream.read(input); + System.out.println("inputsize = " + inputSize); + Inflater decompressor = new Inflater(); + decompressor.setInput(input, 0, inputSize); + byte output [] = new byte[30000]; + try { + doProcess = decompressor.inflate(output) == size; + decompressor.end(); + myCharBuffer = new String(output, 0, size).toCharArray(); + } catch (DataFormatException e) { + // TODO Auto-generated catch block + // e.printStackTrace(); + System.out.println(e.getMessage()); + } //doProcess = //ZLZDecompressor(recordSize - 10 - 4 * paragraphs). //decompress(myStream, myCharBuffer, size) == size; } if (doProcess) { addHyperlinkLabel(fromNumber(uid)); + myParagraphMap.put(uid, new ArrayList()); myParagraphVector = (ArrayList)myParagraphMap.get(uid); processTextRecord(size, pars); if ((flags & 0x1) == 0) { @@ -206,14 +259,14 @@ public class PluckerBookReader extends BookReader { } } - private void processTextRecord(int size, ArrayList pars) { + private void processTextRecord(int size, ArrayList/**/ pars) { int start = 0; int end = 0; for (Iterator it = pars.iterator(); it.hasNext();) { start = end; end = start + (Integer)it.next(); - if (end > myCharBuffer[size]) { + if (end > size) { return; } myParagraphStored = false; @@ -238,8 +291,8 @@ public class PluckerBookReader extends BookReader { functionFlag = true; if (ptr > textStart) { safeBeginParagraph(); - myConvertedTextBuffer = "";//.erase(); - //myConverter.convert(myConvertedTextBuffer, textStart, ptr); + // myConvertedTextBuffer = "";//.erase(); + myConvertedTextBuffer = myConverter.convert(data, textStart, ptr); addData(myConvertedTextBuffer.toCharArray()); myBufferIsEmpty = false; } @@ -261,15 +314,15 @@ public class PluckerBookReader extends BookReader { if (data[ptr] == 0xA0) { data[ptr] = 0x20; } - if (!myParagraphStarted && (textStart == ptr) /*&& isspace(data[ptr])*/) { + if (!myParagraphStarted && (textStart == ptr) && (data[ptr] == ' ')) { ++textStart; } } } if (end > textStart) { safeBeginParagraph(); - myConvertedTextBuffer = "";//erase(); - //myConverter.convert(myConvertedTextBuffer, textStart, end); + // myConvertedTextBuffer = "";//erase(); + myConvertedTextBuffer = myConverter.convert(data, textStart, end); addData(myConvertedTextBuffer.toCharArray()); myBufferIsEmpty = false; } @@ -425,17 +478,19 @@ public class PluckerBookReader extends BookReader { if (myParagraphStarted) { addHyperlinkControl(FBTextKind.INTERNAL_HYPERLINK, id); } else { - myDelayedHyperlinks.add(myDelayedHyperlinks.size()-1, (id)); + myDelayedHyperlinks.add(id); } } private void safeBeginParagraph() { + System.out.println("safe begin par "); if (!myParagraphStarted) { myParagraphStarted = true; myBufferIsEmpty = true; + System.out.println("Calling begin text par"); beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH); if (!myParagraphStored) { - myParagraphVector.add(myParagraphVector.size()-1, getModel().getBookTextModel().getParagraphsNumber() - 1); + myParagraphVector.add(getModel().getBookTextModel().getParagraphsNumber() - 1); myParagraphStored = true; } for (Iterator it = myDelayedControls.iterator(); it.hasNext(); ) { @@ -454,11 +509,13 @@ public class PluckerBookReader extends BookReader { } } private void safeEndParagraph() { + // System.out.println("safe end par "); if (myParagraphStarted) { if (myBufferIsEmpty) { final String SPACE = " "; addData(SPACE.toCharArray()); } + System.out.println("Calling end par"); endParagraph(); myParagraphStarted = false; } @@ -495,24 +552,6 @@ public class PluckerBookReader extends BookReader { exitTitle(); } } - - private String myFilePath; - private InputStream myStream; - private int myFont; - private char[] myCharBuffer; - private String myConvertedTextBuffer; - private boolean myParagraphStarted; - private boolean myBufferIsEmpty; - private ZLTextForcedControlEntry myForcedEntry; - private ArrayList/* >*/ myDelayedControls; - private ArrayList/* */myDelayedHyperlinks; - private short myCompressionVersion; - private char myBytesToSkip; - - private ArrayList/* >*/ myReferencedParagraphs; - private HashMap/* >*/ myParagraphMap; - private ArrayList myParagraphVector; - private boolean myParagraphStored; static private class Pair { public Object myFirst; diff --git a/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java b/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java index 804c2d535..a7e83aff8 100644 --- a/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java +++ b/src/org/geometerplus/fbreader/formats/plucker/PluckerPlugin.java @@ -24,7 +24,7 @@ import java.io.InputStream; import org.geometerplus.fbreader.bookmodel.BookModel; import org.geometerplus.fbreader.description.BookDescription; -import org.geometerplus.fbreader.formats.pdb.PdbPlugin; +import org.geometerplus.fbreader.formats.pdb.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; public class PluckerPlugin extends PdbPlugin { @@ -33,25 +33,24 @@ public class PluckerPlugin extends PdbPlugin { } public boolean acceptsFile(ZLFile file) { - System.err.println("fileType = " + fileType(file)); return "DataPlkr".equals(fileType(file)); } public boolean readDescription(String path, BookDescription description) { ZLFile file = new ZLFile(path); - InputStream stream = null; try { - stream = file.getInputStream(); - detectEncodingAndLanguage(description, stream); + PdbStream stream = new PluckerTextStream(file); + if (stream.open()) { + //detectEncodingAndLanguage(description, stream); + stream.close(); + } } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); } - if (description.getEncoding().length() == 0) { - return false; - } + //if (description.getEncoding().length() == 0) { + // return false; + //} return true; } diff --git a/src/org/geometerplus/fbreader/formats/plucker/PluckerTextStream.java b/src/org/geometerplus/fbreader/formats/plucker/PluckerTextStream.java index f8c60bf43..2bce2372d 100644 --- a/src/org/geometerplus/fbreader/formats/plucker/PluckerTextStream.java +++ b/src/org/geometerplus/fbreader/formats/plucker/PluckerTextStream.java @@ -28,6 +28,10 @@ import org.geometerplus.fbreader.formats.pdb.PdbUtil; import org.geometerplus.zlibrary.core.filesystem.ZLFile; public class PluckerTextStream extends PdbStream { + private short myCompressionVersion; + private byte[] myFullBuffer; + private int myRecordIndex; + public PluckerTextStream(ZLFile file) { super(file); myFullBuffer = null; @@ -66,15 +70,13 @@ public class PluckerTextStream extends PdbStream { } ++myRecordIndex; int currentOffset = myHeader.Offsets[myRecordIndex]; - /* - if (currentOffset < ((PdbStream)myBase).offset()) { - return false; - } - */ - //myBase.skip(currentOffset - offset()); + //if (currentOffset < myBase.offset()) { + // return false; + //} + //((PdbStream)myBase).seek(currentOffset, true); int nextOffset = (myRecordIndex + 1 < myHeader.Offsets.length) ? - myHeader.Offsets[myRecordIndex + 1] : ((PdbStream)myBase).sizeOfOpened(); + myHeader.Offsets[myRecordIndex + 1] : 0;//myBase.sizeOfOpened(); if (nextOffset < currentOffset) { return false; } @@ -162,8 +164,4 @@ public class PluckerTextStream extends PdbStream { myBufferLength += end - textStart; } } - - private short myCompressionVersion; - private byte[] myFullBuffer; - private int myRecordIndex; }