package be.nikiroo.fanfix.output;
+import java.io.BufferedWriter;
import java.io.File;
-import java.io.FileWriter;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+
+import javax.imageio.ImageIO;
import be.nikiroo.fanfix.Instance;
-import be.nikiroo.fanfix.bundles.StringId;
+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 {
- protected FileWriter writer;
+ 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;
- targetName = new File(targetName, "index").getPath();
-
- String targetNameOrig = targetName;
- targetName += getDefaultExtension();
+ // write a copy of the originals inside
+ InfoCover.writeInfo(dir, targetName, story.getMeta());
+ InfoCover.writeCover(dir, targetName, story.getMeta());
+ new InfoText().process(story, dir, targetNameOrig);
- target = new File(targetDir, targetName);
+ target = new File(targetDir, targetName + getDefaultExtension(true));
- writer = new FileWriter(target);
+ writer = new BufferedWriter(new OutputStreamWriter(
+ new FileOutputStream(target), "UTF-8"));
try {
super.process(story, targetDir, targetNameOrig);
} finally {
writer = null;
}
+ String format = Instance.getConfig()
+ .getString(Config.IMAGE_FORMAT_COVER).toLowerCase();
+ if (story.getMeta().getCover() != null) {
+ ImageIO.write(story.getMeta().getCover(), format, new File(dir,
+ "cover." + format));
+ }
+
return target;
}
@Override
- public String getDefaultExtension() {
- return ".html";
+ public String getDefaultExtension(boolean readerTarget) {
+ if (readerTarget) {
+ return File.separator + "index.html";
+ } else {
+ return "";
+ }
}
@Override
protected void writeStoryHeader(Story story) throws IOException {
String title = "";
+ String tags = "";
+ String author = "";
+ Chapter resume = null;
if (story.getMeta() != null) {
- title = story.getMeta().getTitle();
+ 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.getConfig()
+ .getString(Config.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("<!DOCTYPE html>");
writer.write("\n<head>");
writer.write("\n <meta http-equiv='content-type' content='text/html; charset=utf-8'>");
writer.write("\n <meta name='viewport' content='width=device-width, initial-scale=1.0'>");
+ writer.write("\n <link rel='stylesheet' type='text/css' href='style.css'>");
writer.write("\n <title>" + StringUtils.xmlEscape(title) + "</title>");
writer.write("\n</head>");
writer.write("\n<body>\n");
- writer.write("<h1>" + StringUtils.xmlEscape(title) + "</h1>\n\n");
+ writer.write("\n <div class=\"titlepage\">");
+ writer.write("\n <h1>" + StringUtils.xmlEscape(title) + "</h1>");
+ writer.write("\n <div class=\"type\">" + StringUtils.xmlEscape(tags)
+ + "</div>");
+ writer.write("\n <div class=\"cover\">");
+ writer.write("\n <img src=\"cover." + format + "\"></img>");
+ writer.write("\n </div>");
+ writer.write("\n <div class=\"author\">"
+ + StringUtils.xmlEscape(author) + "</div>");
+ writer.write("\n </div>");
+
+ writer.write("\n <hr/><br/>");
+
+ if (resume != null) {
+ for (Paragraph para : resume) {
+ writeParagraph(para);
+ }
+ if (inDialogue) {
+ writer.write(" </div>\n");
+ inDialogue = false;
+ }
+ if (inNormal) {
+ writer.write(" </div>\n");
+ inNormal = false;
+ }
+ }
+
+ writer.write("\n <br/>");
}
@Override
@Override
protected void writeChapterHeader(Chapter chap) throws IOException {
- String txt;
+ String nameOrNumber;
if (chap.getName() != null && !chap.getName().isEmpty()) {
- txt = Instance.getTrans().getString(StringId.CHAPTER_NAMED,
- chap.getNumber(), chap.getName());
+ nameOrNumber = chap.getName();
} else {
- txt = Instance.getTrans().getString(StringId.CHAPTER_UNNAMED,
- chap.getNumber());
+ nameOrNumber = Integer.toString(chap.getNumber());
}
- writer.write("<h1>" + StringUtils.xmlEscape(txt) + "</h1>\n\n");
+ writer.write("\n <h2>");
+ writer.write("\n <span class='chap'>Chapter <span class='chapnumber'>"
+ + chap.getNumber() + "</span>:</span> ");
+ writer.write("\n <span class='chaptitle'>"
+ + StringUtils.xmlEscape(nameOrNumber) + "</span>");
+ writer.write("\n </h2>");
+ writer.write("\n ");
+ writer.write("\n <div class='chapter_content'>\n");
inDialogue = false;
inNormal = false;
}
+ @Override
+ protected void writeChapterFooter(Chapter chap) throws IOException {
+ if (inDialogue) {
+ writer.write(" </div>\n");
+ inDialogue = false;
+ }
+ if (inNormal) {
+ writer.write(" </div>\n");
+ inNormal = false;
+ }
+
+ writer.write("\n </div>");
+ }
+
@Override
protected void writeParagraphHeader(Paragraph para) throws IOException {
if (para.getType() == ParagraphType.QUOTE && !inDialogue) {
writer.write(" <div class='blank'></div>");
break;
case BREAK:
- writer.write(" <hr/>");
+ writer.write(" <hr class='break'/>");
break;
case NORMAL:
writer.write(" <span class='normal'>");