1 package be
.nikiroo
.fanfix
.output
;
3 import java
.io
.BufferedWriter
;
5 import java
.io
.FileOutputStream
;
6 import java
.io
.IOException
;
7 import java
.io
.InputStream
;
8 import java
.io
.OutputStreamWriter
;
10 import javax
.imageio
.ImageIO
;
12 import be
.nikiroo
.fanfix
.Instance
;
13 import be
.nikiroo
.fanfix
.bundles
.Config
;
14 import be
.nikiroo
.fanfix
.data
.Chapter
;
15 import be
.nikiroo
.fanfix
.data
.MetaData
;
16 import be
.nikiroo
.fanfix
.data
.Paragraph
;
17 import be
.nikiroo
.fanfix
.data
.Paragraph
.ParagraphType
;
18 import be
.nikiroo
.fanfix
.data
.Story
;
19 import be
.nikiroo
.utils
.IOUtils
;
20 import be
.nikiroo
.utils
.StringUtils
;
22 class Html
extends BasicOutput
{
24 protected BufferedWriter writer
;
25 private boolean inDialogue
= false;
26 private boolean inNormal
= false;
29 public File
process(Story story
, File targetDir
, String targetName
)
31 String targetNameOrig
= targetName
;
33 File target
= new File(targetDir
, targetName
);
37 // write a copy of the originals inside
38 InfoCover
.writeInfo(dir
, targetName
, story
.getMeta());
39 InfoCover
.writeCover(dir
, targetName
, story
.getMeta());
40 BasicOutput
.getOutput(OutputType
.TEXT
, isWriteInfo(), isWriteCover())
41 .process(story
, dir
, targetNameOrig
);
43 target
= new File(targetDir
, targetName
+ getDefaultExtension(true));
45 writer
= new BufferedWriter(new OutputStreamWriter(
46 new FileOutputStream(target
), "UTF-8"));
48 super.process(story
, targetDir
, targetNameOrig
);
54 String format
= Instance
.getConfig()
55 .getString(Config
.IMAGE_FORMAT_COVER
).toLowerCase();
56 if (story
.getMeta().getCover() != null) {
57 ImageIO
.write(story
.getMeta().getCover(), format
, new File(dir
,
65 public String
getDefaultExtension(boolean readerTarget
) {
67 return File
.separator
+ "index.html";
74 protected void writeStoryHeader(Story story
) throws IOException
{
78 Chapter resume
= null;
79 if (story
.getMeta() != null) {
80 MetaData meta
= story
.getMeta();
81 title
= meta
.getTitle();
82 resume
= meta
.getResume();
83 if (meta
.getTags() != null) {
84 for (String tag
: meta
.getTags()) {
85 if (!tags
.isEmpty()) {
91 if (!tags
.isEmpty()) {
92 tags
= "(" + tags
+ ")";
95 author
= meta
.getAuthor();
98 String format
= Instance
.getConfig()
99 .getString(Config
.IMAGE_FORMAT_COVER
).toLowerCase();
101 InputStream inStyle
= getClass().getResourceAsStream("html.style.css");
102 if (inStyle
== null) {
103 throw new IOException("Cannot find style.css resource");
106 IOUtils
.write(inStyle
, new File(dir
, "style.css"));
111 writer
.write("<!DOCTYPE html>");
112 writer
.write("\n<html>");
113 writer
.write("\n<head>");
114 writer
.write("\n <meta http-equiv='content-type' content='text/html; charset=utf-8'>");
115 writer
.write("\n <meta name='viewport' content='width=device-width, initial-scale=1.0'>");
116 writer
.write("\n <link rel='stylesheet' type='text/css' href='style.css'>");
117 writer
.write("\n <title>" + StringUtils
.xmlEscape(title
) + "</title>");
118 writer
.write("\n</head>");
119 writer
.write("\n<body>\n");
121 writer
.write("\n <div class=\"titlepage\">");
122 writer
.write("\n <h1>" + StringUtils
.xmlEscape(title
) + "</h1>");
123 writer
.write("\n <div class=\"type\">" + StringUtils
.xmlEscape(tags
)
125 writer
.write("\n <div class=\"cover\">");
126 writer
.write("\n <img src=\"cover." + format
+ "\"></img>");
127 writer
.write("\n </div>");
128 writer
.write("\n <div class=\"author\">"
129 + StringUtils
.xmlEscape(author
) + "</div>");
130 writer
.write("\n </div>");
132 writer
.write("\n <hr/><br/>");
134 if (resume
!= null) {
135 for (Paragraph para
: resume
) {
136 writeParagraph(para
);
139 writer
.write(" </div>\n");
143 writer
.write(" </div>\n");
148 writer
.write("\n <br/>");
152 protected void writeStoryFooter(Story story
) throws IOException
{
153 writer
.write("</body>\n");
157 protected void writeChapterHeader(Chapter chap
) throws IOException
{
159 if (chap
.getName() != null && !chap
.getName().isEmpty()) {
160 nameOrNumber
= chap
.getName();
162 nameOrNumber
= Integer
.toString(chap
.getNumber());
165 writer
.write("\n <h2>");
166 writer
.write("\n <span class='chap'>Chapter <span class='chapnumber'>"
167 + chap
.getNumber() + "</span>:</span> ");
168 writer
.write("\n <span class='chaptitle'>"
169 + StringUtils
.xmlEscape(nameOrNumber
) + "</span>");
170 writer
.write("\n </h2>");
172 writer
.write("\n <div class='chapter_content'>\n");
179 protected void writeChapterFooter(Chapter chap
) throws IOException
{
181 writer
.write(" </div>\n");
185 writer
.write(" </div>\n");
189 writer
.write("\n </div>");
193 protected void writeParagraphHeader(Paragraph para
) throws IOException
{
194 if (para
.getType() == ParagraphType
.QUOTE
&& !inDialogue
) {
195 writer
.write(" <div class='dialogues'>\n");
197 } else if (para
.getType() != ParagraphType
.QUOTE
&& inDialogue
) {
198 writer
.write(" </div>\n");
202 if (para
.getType() == ParagraphType
.NORMAL
&& !inNormal
) {
203 writer
.write(" <div class='normals'>\n");
205 } else if (para
.getType() != ParagraphType
.NORMAL
&& inNormal
) {
206 writer
.write(" </div>\n");
210 switch (para
.getType()) {
212 writer
.write(" <div class='blank'></div>");
215 writer
.write(" <hr class='break'/>");
218 writer
.write(" <span class='normal'>");
221 writer
.write(" <div class='dialogue'>— ");
225 writer
.write("<a href='"
226 + StringUtils
.xmlEscapeQuote(para
.getContent()) + "'>"
227 + StringUtils
.xmlEscape(para
.getContent()) + "</a>");
233 protected void writeParagraphFooter(Paragraph para
) throws IOException
{
234 switch (para
.getType()) {
236 writer
.write("</span>\n");
239 writer
.write("</div>\n");
248 protected void writeTextLine(ParagraphType type
, String line
)
253 writer
.write(decorateText(StringUtils
.xmlEscape(line
)));
261 protected String
enbold(String word
) {
262 return "<strong>" + word
+ "</strong>";
266 protected String
italize(String word
) {
267 return "<emph>" + word
+ "</emph>";