X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Foutput%2FHtml.java;h=da79466a40d9cc2fcf80872d77ef6e588398e732;hb=d66deb8d8b30cff6b54db352eef34a3508939f84;hp=4226bf84b75dfa6ea97d3770c93a44416f04e38d;hpb=2206ef66ee00ad42d806f04a7b7ad6f8cb2d8828;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/output/Html.java b/src/be/nikiroo/fanfix/output/Html.java index 4226bf8..da79466 100644 --- a/src/be/nikiroo/fanfix/output/Html.java +++ b/src/be/nikiroo/fanfix/output/Html.java @@ -1,6 +1,264 @@ package be.nikiroo.fanfix.output; -//TODO: implement it for LocalReader -class Html extends Text { +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 + ""; + } }