package com.iambookmaster.server.logic;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import com.iambookmaster.client.beans.Greeting;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.beans.ParagraphConnection;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppMessages;
import com.iambookmaster.client.model.Model;
import com.iambookmaster.client.model.ParagraphParsingHandler;
import com.iambookmaster.client.paragraph.BookDecorator;
public class MOBIBookDecrator implements BookDecorator {
private static final String ENCODING = "UTF-8";
private static final String SERVER_SIDE_FILE = "server.asp";
private static final Object PARAGRAPH_NUMBER = "n";
private static final String ENCODING_SERVER = "1251";
private static final String ENCODING_SERVER_FULL = "windows-1251";
private StringBuffer buffer;
private final AppConstants appConstants;
private final AppMessages appMessages;
private final Model model;
private int numberCounter;
private StringBuilder headerBuffer;
private StringBuilder titleBuffer;
public MOBIBookDecrator(Model mod,AppConstants appConstants,AppMessages appMessages) {
this.model = mod;
this.appConstants = appConstants;
this.appMessages = appMessages;
headerBuffer = new StringBuilder();
headerBuffer.append("<?xml version=\"1.0\" encoding=\"");
headerBuffer.append(ENCODING);
headerBuffer.append("\"?>\n");
headerBuffer.append("<package unique-identifier=\"uid\"><metadata>\n");
headerBuffer.append("<dc-metadata xmlns:dc=\"http://purl.org/metadata/dublin_core\" xmlns:oebpackage=\"http://openebook.org/namespaces/oeb-package/1.0/\">\n");
headerBuffer.append("<dc:Identifier id=\"uid\">");
headerBuffer.append(model.getGameId());
headerBuffer.append("</dc:Identifier>\n");
headerBuffer.append("<dc:Title>");
headerBuffer.append(model.getSettings().getBookTitle());
headerBuffer.append("</dc:Title>\n");
headerBuffer.append("<dc:Date>");
headerBuffer.append(new Date().toString());
headerBuffer.append("</dc:Date>\n");
headerBuffer.append("<dc:Language>");
headerBuffer.append(appConstants.locale());
headerBuffer.append("</dc:Language>\n");
headerBuffer.append("</dc-metadata><x-metadata/></metadata><manifest>\n");
headerBuffer.append("<item id=\"engine\" href=\"");
headerBuffer.append(SERVER_SIDE_FILE);
headerBuffer.append("\" media-type=\"text/asp\" />\n");
headerBuffer.append("<item id=\"default\" href=\"default.htm\" media-type=\"text/x-oeb1-document\" />\n");
headerBuffer.append("</manifest><spine><itemref idref=\"default\"/></spine><guide></guide></package>\n");
// titelBuffer.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
// titelBuffer.append("<html><head>\n");
// titelBuffer.append("<meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\">");
// titelBuffer.append("<title>");
// titelBuffer.append(model.getSettings().getBookTitle());
// titelBuffer.append("<title></head><body>\n");
}
public void appendParagraph(int number,String text,Paragraph paragraph,ArrayList<ParagraphConnection> connections,ArrayList<ParagraphConnection> incomeConnections) {
// buffer.append("case ");
// buffer.append(number);
// buffer.append(":Response.Write('");
// String txt = text.replace("\n", "<br/>").replace("'", "\\'");
// buffer.append(txt);
// buffer.append("');break;\n");
// buffer.append("Case ");
// buffer.append(number);
// buffer.append("\r\n Response.Write('");
// String txt = text.replace("\n", "<br/>").replace("'", "\\'");
// buffer.append(txt);
// buffer.append(number);
// buffer.append("');\r\n");
buffer.append("if (counter==");
buffer.append(number);
// buffer.append(") Response.Write('");
// buffer.append("');\r\n");
buffer.append(")%>");
String txt = text.replace("\n", "<br/>").replace("'", "\\'");
buffer.append(txt);
// buffer.append(number);
buffer.append("<%\r\n");
numberCounter = 0;
}
public String decorateNumber(int number,Paragraph from,Paragraph to, ParagraphConnection connection) {
StringBuffer buffer = new StringBuffer();
buffer.append(" <a href=\"");
buffer.append(SERVER_SIDE_FILE);
buffer.append('?');
buffer.append(PARAGRAPH_NUMBER);
buffer.append('=');
buffer.append(number);
buffer.append("\">«");
buffer.append(++numberCounter);
buffer.append("»</a> ");
return buffer.toString();
}
public void setStartParagraph(Paragraph paragraph) {
titleBuffer = new StringBuilder();
titleBuffer.append("<html><head><meta content=\"text/html; charset=");
titleBuffer.append(ENCODING);
titleBuffer.append("\" http-equiv=\"content-type\"></head><body>\n");
titleBuffer.append("<p>");
titleBuffer.append(model.getSettings().getBookTitle());
titleBuffer.append("</p><p>");
titleBuffer.append(model.getSettings().getBookAuthors());
titleBuffer.append("</p><p>");
titleBuffer.append(model.getSettings().getBookDescription());
titleBuffer.append("</p><p><a href=\"");
titleBuffer.append(SERVER_SIDE_FILE);
titleBuffer.append('?');
titleBuffer.append(PARAGRAPH_NUMBER);
titleBuffer.append('=');
titleBuffer.append(model.getStartParagraph().getNumber());
titleBuffer.append("\">");
titleBuffer.append(appConstants.decoratorStart());
titleBuffer.append("</a></p>");
}
public void endBook() {
titleBuffer.append("</body></html>\n");
// buffer.append("Case Else\r\nResponse.Write('Wrong Paragraph Number');\r\nEnd Select;\r\n%></p>\r\n</body></html>\r\n");
buffer.append("%></p>\r\n</body></html>\r\n");
// buffer.append("default:Response.Write('Wrong Paragraph Number');\n}\n%></p>\n</body></html>\n");
}
public void startBook() {
buffer = new StringBuffer();
//: \
buffer.append("<%@ Language=JavaScript Codepage=");
buffer.append(ENCODING_SERVER);
buffer.append("%><html><head></head><body>\r\n");
//Response.CharSet=\"utf-8\";\r\n
buffer.append("<p><%var counter=");
buffer.append(model.getStartParagraph().getNumber());
buffer.append(";\r\n");
buffer.append("if (typeof Request('");
buffer.append(PARAGRAPH_NUMBER);
buffer.append("') != 'undefined')\r\n");
buffer.append("counter = 1*Request('");
buffer.append(PARAGRAPH_NUMBER);
buffer.append("');\r\n");
// buffer.append("Select Case counter\r\n");
// buffer.append("switch(counter){");
}
public byte[] toBytes() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(outputStream);
try {
ZipEntry ze= new ZipEntry("output.opf");
zos.putNextEntry(ze);
zos.write(headerBuffer.toString().getBytes(ENCODING));
zos.closeEntry();
ze= new ZipEntry("default.htm");
zos.putNextEntry(ze);
zos.write(titleBuffer.toString().getBytes(ENCODING));
zos.closeEntry();
ze= new ZipEntry(SERVER_SIDE_FILE);
zos.putNextEntry(ze);
zos.write(buffer.toString().getBytes(ENCODING_SERVER_FULL));
zos.closeEntry();
zos.close();
return outputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public void addGreeting(Greeting greeting) {
// buffer.append("<p class=\"greeting\">");
// if (greeting.getImageUrl() != null && greeting.getImageUrl().length()>0) {
// buffer.append("<img src=\"");
// buffer.append(greeting.getImageUrl());
// buffer.append("\"/>");
// }
// if (greeting.getUrl() != null && greeting.getUrl().length()>0) {
// buffer.append("<a href=\"");
// buffer.append(greeting.getUrl());
// buffer.append("\">");
// buffer.append(greeting.getName());
// buffer.append("</a>");
// } else {
// buffer.append(greeting.getName());
// }
// if (greeting.getText() != null && greeting.getText().length()>0) {
// buffer.append("<p class=\"greetingText\">");
// buffer.append(greeting.getText());
// buffer.append("</p>");
// }
// buffer.append("</p>");
}
public void endGreeting() {
// buffer.append("</p>");
}
public void startGreeting() {
// buffer.append("<p class=\"greetingBox\">");
// buffer.append(appConstants.decoratorStartGreetings());
}
public boolean isPlayerMode() {
return false;
}
public ParagraphParsingHandler getParagraphParsingHandler() {
return null;
}
public boolean isHideAbsoluteModificators() {
return true;
}
}