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 check if images work OK 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 + ""; } }