package be.nikiroo.fanfix.output;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import be.nikiroo.fanfix.Instance;
import be.nikiroo.fanfix.bundles.Config;
import be.nikiroo.fanfix.data.Chapter;
import be.nikiroo.fanfix.data.MetaData;
import be.nikiroo.fanfix.data.Paragraph;
import be.nikiroo.fanfix.data.Paragraph.ParagraphType;
import be.nikiroo.fanfix.data.Story;
import be.nikiroo.utils.IOUtils;
import be.nikiroo.utils.StringUtils;
class Html extends BasicOutput {
private File dir;
protected BufferedWriter writer;
private boolean inDialogue = false;
private boolean inNormal = false;
@Override
public File process(Story story, File targetDir, String targetName)
throws IOException {
String targetNameOrig = targetName;
File target = new File(targetDir, targetName);
target.mkdir();
dir = target;
target = new File(targetDir, targetName + getDefaultExtension(true));
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(target), "UTF-8"));
try {
super.process(story, targetDir, targetNameOrig);
} finally {
writer.close();
writer = null;
}
// write a copy of the originals inside
InfoCover.writeInfo(dir, targetName, story.getMeta());
InfoCover.writeCover(dir, targetName, story.getMeta());
BasicOutput.getOutput(OutputType.TEXT, isWriteInfo(), isWriteCover())
.process(story, dir, targetNameOrig);
if (story.getMeta().getCover() != null) {
Instance.getInstance().getCache().saveAsImage(story.getMeta().getCover(), new File(dir, "cover"), true);
}
return target;
}
@Override
public String getDefaultExtension(boolean readerTarget) {
if (readerTarget) {
return File.separator + "index.html";
}
return "";
}
@Override
protected void writeStoryHeader(Story story) throws IOException {
String title = "";
String tags = "";
String author = "";
Chapter resume = null;
if (story.getMeta() != null) {
MetaData meta = story.getMeta();
title = meta.getTitle();
resume = meta.getResume();
if (meta.getTags() != null) {
for (String tag : meta.getTags()) {
if (!tags.isEmpty()) {
tags += ", ";
}
tags += tag;
}
if (!tags.isEmpty()) {
tags = "(" + tags + ")";
}
}
author = meta.getAuthor();
}
String format = Instance.getInstance().getConfig()
.getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase();
InputStream inStyle = getClass().getResourceAsStream("html.style.css");
if (inStyle == null) {
throw new IOException("Cannot find style.css resource");
}
try {
IOUtils.write(inStyle, new File(dir, "style.css"));
} finally {
inStyle.close();
}
writer.write("");
writer.write("\n");
writer.write("\n
");
writer.write("\n ");
writer.write("\n ");
writer.write("\n ");
writer.write("\n " + StringUtils.xmlEscape(title) + "");
writer.write("\n");
writer.write("\n\n");
writer.write("\n ");
writer.write("\n
" + StringUtils.xmlEscape(title) + "
");
writer.write("\n
" + StringUtils.xmlEscape(tags)
+ "
");
writer.write("\n
");
writer.write("\n
");
writer.write("\n
");
writer.write("\n
"
+ StringUtils.xmlEscape(author) + "
");
writer.write("\n
");
writer.write("\n
");
if (resume != null) {
for (Paragraph para : resume) {
writeParagraph(para);
}
if (inDialogue) {
writer.write(" \n");
inDialogue = false;
}
if (inNormal) {
writer.write(" \n");
inNormal = false;
}
}
writer.write("\n
");
}
@Override
protected void writeStoryFooter(Story story) throws IOException {
writer.write("\n");
}
@Override
protected void writeChapterHeader(Chapter chap) throws IOException {
String nameOrNumber;
if (chap.getName() != null && !chap.getName().isEmpty()) {
nameOrNumber = chap.getName();
} else {
nameOrNumber = Integer.toString(chap.getNumber());
}
writer.write("\n ");
writer.write("\n Chapter "
+ chap.getNumber() + ": ");
writer.write("\n "
+ StringUtils.xmlEscape(nameOrNumber) + "");
writer.write("\n
");
writer.write("\n ");
writer.write("\n \n");
inDialogue = false;
inNormal = false;
}
@Override
protected void writeChapterFooter(Chapter chap) throws IOException {
if (inDialogue) {
writer.write("
\n");
inDialogue = false;
}
if (inNormal) {
writer.write(" \n");
inNormal = false;
}
writer.write("\n ");
}
@Override
protected void writeParagraphHeader(Paragraph para) throws IOException {
if (para.getType() == ParagraphType.QUOTE && !inDialogue) {
writer.write(" \n");
inDialogue = true;
} else if (para.getType() != ParagraphType.QUOTE && inDialogue) {
writer.write("
\n");
inDialogue = false;
}
if (para.getType() == ParagraphType.NORMAL && !inNormal) {
writer.write(" \n");
inNormal = true;
} else if (para.getType() != ParagraphType.NORMAL && inNormal) {
writer.write("
\n");
inNormal = false;
}
switch (para.getType()) {
case BLANK:
writer.write(" ");
break;
case BREAK:
writer.write("
");
break;
case NORMAL:
writer.write(" ");
break;
case QUOTE:
writer.write(" — ");
break;
case IMAGE:
// TODO
writer.write("
"
+ StringUtils.xmlEscape(para.getContent()) + "");
break;
}
}
@Override
protected void writeParagraphFooter(Paragraph para) throws IOException {
switch (para.getType()) {
case NORMAL:
writer.write("\n");
break;
case QUOTE:
writer.write("
\n");
break;
default:
writer.write("\n");
break;
}
}
@Override
protected void writeTextLine(ParagraphType type, String line)
throws IOException {
switch (type) {
case QUOTE:
case NORMAL:
writer.write(decorateText(StringUtils.xmlEscape(line)));
break;
default:
break;
}
}
@Override
protected String enbold(String word) {
return "" + word + "";
}
@Override
protected String italize(String word) {
return "" + word + "";
}
}