package org.geometerplus.fbreader.formats.umd;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.geometerplus.fbreader.bookmodel.BookModel;
import org.geometerplus.fbreader.bookmodel.BookReader;
import org.geometerplus.zlibrary.core.constants.MimeTypes;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.image.ZLFileImage;
import org.geometerplus.zlibrary.core.xml.ZLStringMap;
import org.geometerplus.zlibrary.core.xml.ZLXMLReader;
import org.geometerplus.zlibrary.text.model.ZLTextParagraph;
/**
* @author hym E-mail:hymmyh@gmail.com
* @version 创建时间:2011-1-27 下午01:16:16
* 类说明
*/
public class UmdReader extends BookReader implements ZLXMLReader {
private UMDFile umdFile;
public UmdReader(BookModel model) {
super(model);
//
}
boolean readBook(ZLFile file) {
umdFile = new UMDFile();
boolean flag = umdFile.read(file.getPath());
int pageNum = umdFile.getContentSize();
startDocumentHandler();
if(UMDFile.UMD_BOOK_TYPE_TEXT == umdFile.bookInfo.type){
//文字类型
String tmpstr="";
boolean flag1 = false;
for(int j=0;j<pageNum;j++){
// beginContentsParagraph(j);
beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
String txttmp=umdFile.getContentText(j);
if(Model.Book.getZnFlag()){
//智能处理文本,速度慢。
String str= txttmp;
String[] strarr=str.split("\n");
if(str.charAt(str.length()-1) != '\n'){
flag1=true;
}else{
flag1=false;
}
// 处理文本
String ttstr="";
for(int i=0;i<strarr.length;i++){
String ttmpstr=strarr[i].trim();
ttmpstr=ttmpstr.replaceAll(" ", "");
ttstr+=ttmpstr;
if(i==0){
ttstr=tmpstr+ttstr;
tmpstr="";
}
if(i==strarr.length-1&&flag1){
tmpstr=ttstr;
break;
}
// ttstr=ttstr.trim();
if(!ttstr.equals("")){
ttstr=" "+ttstr+"\r\n";
characterDataHandler(ttstr.toCharArray(), 0,ttstr.length());
endParagraph();
beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
ttstr="";
}
}
}else{//普通加载 速度快。
char[] buffer=txttmp.toCharArray();
int count = buffer.length;
int start = 0;
for (int i = 0; i < count; i++) {
if (buffer[i] == '\n') {
if (start != i) {
characterDataHandler(buffer, start, i - start);
// System.out.println(new String(buffer, start, i - start));
endParagraph();
beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
}
start = i + 1;
} else if (buffer[i] == '\r') {
continue;
} else if (buffer[i] == ' ' || buffer[i] == '\t') {
buffer[i] = ' ';
if(i-2>=0&&buffer[i-1] == ' '&&buffer[i-2] == ' '){
buffer[i-2] = ' ';
}
} else {
}
}
if (start != count) {
characterDataHandlerFinal(buffer, start, count - start);
}
}
}
if(!tmpstr.equals("")){
tmpstr=" "+tmpstr+"\r\n";
characterDataHandler(tmpstr.toCharArray(), 0,tmpstr.length());
}
endParagraph();
endDocumentHandler();
// int start = 0;
// for (int i = 0; i < count; i++) {
// if (buffer[i] == '\n') {
// if (start != i) {
// characterDataHandler(buffer, start, i - start);
// // System.out.println(new String(buffer, start, i - start));
// //分段。
// endParagraph();
// beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
// }
// start = i + 1;
// } else if (buffer[i] == '\r') {
// continue;
// } else if (buffer[i] == ' ' || buffer[i] == '\t') {
// buffer[i] = ' ';
// } else {
// }
// }
// if (start != count) {
// characterDataHandlerFinal(buffer, start, count - start);
// }
// endParagraph();
// //分章节---
// insertEndOfSectionParagraph();
//// beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
//// endContentsParagraph();
}else{
//图片类型
for(int i=0;i<pageNum;i++){
beginParagraph();
final String imageName = "UMDIMG"+i;
addHyperlinkLabel(imageName);
// characterDataHandler(imageName.toCharArray(),0,imageName.toCharArray().length);
addImageReference(imageName, (short)0);
UmdFileImage umdimg= new UmdFileImage(MimeTypes.MIME_IMAGE_AUTO,umdFile);
umdimg.setImg(umdFile.getContentBytes(i));
addImage(imageName, umdimg);
endParagraph();
insertEndOfSectionParagraph();
}
}
endDocumentHandler();
return true;
}
@Override
public void addExternalEntities(HashMap<String, char[]> entityMap) {
//
}
@Override
public void characterDataHandler(char[] ch, int start, int length) {
if (length == 0) {
return;
}
addData(ch, start, length,false);
}
@Override
public void characterDataHandlerFinal(char[] ch, int start, int length) {
if (length == 0) {
return;
}
addData(ch, start, length,false);
}
@Override
public boolean dontCacheAttributeValues() {
//
return false;
}
@Override
public void endDocumentHandler() {
unsetCurrentTextModel();
}
@Override
public boolean endElementHandler(String tag) {
//
return false;
}
@Override
public List<String> externalDTDs() {
//
return null;
}
@Override
public void namespaceMapChangedHandler(Map<String, String> namespaces) {
//
}
@Override
public boolean processNamespaces() {
//
return false;
}
@Override
public void startDocumentHandler() {
setMainTextModel();
}
@Override
public boolean startElementHandler(String tag, ZLStringMap attributes) {
//
return false;
}
}