Partial HTML implementation, partial GUI support
[fanfix.git] / src / be / nikiroo / fanfix / output / Html.java
CommitLineData
2206ef66
NR
1package be.nikiroo.fanfix.output;
2
a6395bef
NR
3import java.io.File;
4import java.io.FileWriter;
5import java.io.IOException;
2206ef66 6
a6395bef
NR
7import be.nikiroo.fanfix.Instance;
8import be.nikiroo.fanfix.bundles.StringId;
9import be.nikiroo.fanfix.data.Chapter;
10import be.nikiroo.fanfix.data.Paragraph;
11import be.nikiroo.fanfix.data.Paragraph.ParagraphType;
12import be.nikiroo.fanfix.data.Story;
13import be.nikiroo.utils.StringUtils;
14
15class Html extends BasicOutput {
16 protected FileWriter writer;
17 private boolean inDialogue = false;
18 private boolean inNormal = false;
19
20 @Override
21 public File process(Story story, File targetDir, String targetName)
22 throws IOException {
23 File target = new File(targetDir, targetName);
24 target.mkdir();
25
26 targetName = new File(targetName, "index").getPath();
27
28 String targetNameOrig = targetName;
29 targetName += getDefaultExtension();
30
31 target = new File(targetDir, targetName);
32
33 writer = new FileWriter(target);
34 try {
35 super.process(story, targetDir, targetNameOrig);
36 } finally {
37 writer.close();
38 writer = null;
39 }
40
41 return target;
42 }
43
44 @Override
45 public String getDefaultExtension() {
46 return ".html";
47 }
48
49 @Override
50 protected void writeStoryHeader(Story story) throws IOException {
51 String title = "";
52 if (story.getMeta() != null) {
53 title = story.getMeta().getTitle();
54 }
55
56 writer.write("<!DOCTYPE html>");
57 writer.write("\n<html>");
58 writer.write("\n<head>");
59 writer.write("\n <meta http-equiv='content-type' content='text/html; charset=utf-8'>");
60 writer.write("\n <meta name='viewport' content='width=device-width, initial-scale=1.0'>");
61 writer.write("\n <title>" + StringUtils.xmlEscape(title) + "</title>");
62 writer.write("\n</head>");
63 writer.write("\n<body>\n");
64
65 writer.write("<h1>" + StringUtils.xmlEscape(title) + "</h1>\n\n");
66 }
67
68 @Override
69 protected void writeStoryFooter(Story story) throws IOException {
70 writer.write("</body>\n");
71 }
72
73 @Override
74 protected void writeChapterHeader(Chapter chap) throws IOException {
75 String txt;
76 if (chap.getName() != null && !chap.getName().isEmpty()) {
77 txt = Instance.getTrans().getString(StringId.CHAPTER_NAMED,
78 chap.getNumber(), chap.getName());
79 } else {
80 txt = Instance.getTrans().getString(StringId.CHAPTER_UNNAMED,
81 chap.getNumber());
82 }
83
84 writer.write("<h1>" + StringUtils.xmlEscape(txt) + "</h1>\n\n");
85
86 inDialogue = false;
87 inNormal = false;
88 }
89
90 @Override
91 protected void writeParagraphHeader(Paragraph para) throws IOException {
92 if (para.getType() == ParagraphType.QUOTE && !inDialogue) {
93 writer.write(" <div class='dialogues'>\n");
94 inDialogue = true;
95 } else if (para.getType() != ParagraphType.QUOTE && inDialogue) {
96 writer.write(" </div>\n");
97 inDialogue = false;
98 }
99
100 if (para.getType() == ParagraphType.NORMAL && !inNormal) {
101 writer.write(" <div class='normals'>\n");
102 inNormal = true;
103 } else if (para.getType() != ParagraphType.NORMAL && inNormal) {
104 writer.write(" </div>\n");
105 inNormal = false;
106 }
107
108 switch (para.getType()) {
109 case BLANK:
110 writer.write(" <div class='blank'></div>");
111 break;
112 case BREAK:
113 writer.write(" <hr/>");
114 break;
115 case NORMAL:
116 writer.write(" <span class='normal'>");
117 break;
118 case QUOTE:
119 writer.write(" <div class='dialogue'>&mdash; ");
120 break;
121 case IMAGE:
122 // TODO
123 writer.write("<a href='"
124 + StringUtils.xmlEscapeQuote(para.getContent()) + "'>"
125 + StringUtils.xmlEscape(para.getContent()) + "</a>");
126 break;
127 }
128 }
129
130 @Override
131 protected void writeParagraphFooter(Paragraph para) throws IOException {
132 switch (para.getType()) {
133 case NORMAL:
134 writer.write("</span>\n");
135 break;
136 case QUOTE:
137 writer.write("</div>\n");
138 break;
139 default:
140 writer.write("\n");
141 break;
142 }
143 }
144
145 @Override
146 protected void writeTextLine(ParagraphType type, String line)
147 throws IOException {
148 switch (type) {
149 case QUOTE:
150 case NORMAL:
151 writer.write(decorateText(StringUtils.xmlEscape(line)));
152 break;
153 default:
154 break;
155 }
156 }
157
158 @Override
159 protected String enbold(String word) {
160 return "<strong>" + word + "</strong>";
161 }
162
163 @Override
164 protected String italize(String word) {
165 return "<emph>" + word + "</emph>";
166 }
2206ef66 167}