Lot of fixes + first (bad, ugly) working GUI
[fanfix.git] / src / be / nikiroo / fanfix / output / Html.java
index 29a0f32b6404e6b1c0822e6e45d11b6783601905..6e0bb6d22d0d0e706e99b7dc605bdc590c1b596b 100644 (file)
@@ -3,16 +3,22 @@ package be.nikiroo.fanfix.output;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStream;
+
+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 {
+       private File dir;
        protected FileWriter writer;
        private boolean inDialogue = false;
        private boolean inNormal = false;
@@ -20,12 +26,13 @@ class Html extends BasicOutput {
        @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();
 
                target = new File(targetDir, targetName);
@@ -38,6 +45,13 @@ class Html extends BasicOutput {
                        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;
        }
 
@@ -49,8 +63,39 @@ class Html extends BasicOutput {
        @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>");
@@ -58,11 +103,39 @@ class Html extends BasicOutput {
                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
@@ -72,21 +145,40 @@ class Html extends BasicOutput {
 
        @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) {