Commit | Line | Data |
---|---|---|
2206ef66 NR |
1 | package be.nikiroo.fanfix.output; |
2 | ||
a6395bef NR |
3 | import java.io.File; |
4 | import java.io.FileWriter; | |
5 | import java.io.IOException; | |
2206ef66 | 6 | |
a6395bef NR |
7 | import be.nikiroo.fanfix.Instance; |
8 | import be.nikiroo.fanfix.bundles.StringId; | |
9 | import be.nikiroo.fanfix.data.Chapter; | |
10 | import be.nikiroo.fanfix.data.Paragraph; | |
11 | import be.nikiroo.fanfix.data.Paragraph.ParagraphType; | |
12 | import be.nikiroo.fanfix.data.Story; | |
13 | import be.nikiroo.utils.StringUtils; | |
14 | ||
15 | class 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'>— "); | |
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 | } |