Commit | Line | Data |
---|---|---|
73785268 NR |
1 | package be.nikiroo.gofetch.output; |
2 | ||
73785268 NR |
3 | import be.nikiroo.gofetch.data.Comment; |
4 | import be.nikiroo.gofetch.data.Story; | |
c715ea02 | 5 | import be.nikiroo.gofetch.support.BasicSupport; |
3e62b034 NR |
6 | import be.nikiroo.gofetch.support.Type; |
7 | import be.nikiroo.utils.StringUtils; | |
73785268 NR |
8 | |
9 | public class Html extends Output { | |
70b18499 NR |
10 | public Html(Type type, String hostname, String preselector, int port) { |
11 | super(type, hostname, preselector, port); | |
73785268 NR |
12 | } |
13 | ||
14 | @Override | |
c715ea02 | 15 | public String getMainIndexHeader() { |
e236e220 NR |
16 | String sel = preselector; |
17 | if (!sel.isEmpty()) { | |
18 | sel = "/1" + sel; | |
19 | } | |
5c056aad | 20 | |
e236e220 | 21 | String gopherUrl = "gopher://" + hostname + sel + ":" + port; |
27008a87 | 22 | |
ab07d4d5 NR |
23 | StringBuilder builder = new StringBuilder(); |
24 | appendPre(builder); | |
70b18499 | 25 | |
c715ea02 | 26 | builder.append("<h2>News</h2>\n"// |
70b18499 NR |
27 | + "<p>You will find here a few pages full of news, mirroring <a href='" |
28 | + gopherUrl + "'>" | |
29 | + gopherUrl | |
30 | + "</a>.</p>\n"// | |
70b18499 | 31 | + "<p>They are simply scrapped from their associated webpage and updated a few times a day.</p>\n"// |
ab07d4d5 | 32 | ); |
27008a87 | 33 | |
ab07d4d5 | 34 | appendPost(builder); |
27008a87 | 35 | |
ab07d4d5 | 36 | return builder.toString(); |
73785268 NR |
37 | } |
38 | ||
39 | @Override | |
c715ea02 NR |
40 | public String getMainIndexFooter() { |
41 | return ""; | |
42 | } | |
43 | ||
44 | @Override | |
45 | public String getIndexHeader(BasicSupport support) { | |
46 | return "<h1>" + support.getDescription() + "</h1>\n<br/><br/>"; | |
47 | } | |
48 | ||
49 | @Override | |
50 | public String getIndexFooter(BasicSupport support) { | |
73785268 NR |
51 | return ""; |
52 | } | |
53 | ||
54 | @Override | |
5c056aad | 55 | public String exportHeader(Story story) { |
70b18499 NR |
56 | StringBuilder builder = new StringBuilder(); |
57 | ||
bb0d9eb2 NR |
58 | appendPre(builder); |
59 | ||
70b18499 NR |
60 | builder.append("<div class='story-header'>\n"); |
61 | appendHtml(builder, story, true); | |
62 | builder.append("<hr/>\n"); | |
63 | builder.append("</div>\n"); | |
64 | ||
bb0d9eb2 NR |
65 | appendPost(builder); |
66 | ||
70b18499 | 67 | return builder.toString(); |
73785268 NR |
68 | } |
69 | ||
70 | @Override | |
5c056aad | 71 | public String export(Story story) { |
73785268 | 72 | StringBuilder builder = new StringBuilder(); |
bb0d9eb2 | 73 | appendPre(builder); |
73785268 | 74 | |
70b18499 NR |
75 | builder.append("<div class='story'>\n"); |
76 | appendHtml(builder, story, false); | |
77 | builder.append("<hr/>\n"); | |
73785268 | 78 | |
5c056aad NR |
79 | if (story.getComments() != null) { |
80 | for (Comment comment : story.getComments()) { | |
70b18499 NR |
81 | appendHtml(builder, comment, " "); |
82 | } | |
73785268 NR |
83 | } |
84 | ||
70b18499 NR |
85 | builder.append("</div>\n"); |
86 | ||
bb0d9eb2 NR |
87 | appendPost(builder); |
88 | ||
73785268 NR |
89 | return builder.toString(); |
90 | } | |
91 | ||
bb0d9eb2 NR |
92 | private void appendPre(StringBuilder builder) { |
93 | builder.append("<!DOCTYPE html>\n"); | |
94 | builder.append("<html>\n"); | |
95 | builder.append("<head>\n"); | |
96 | builder.append(" <meta http-equiv='content-type' content='text/html; charset=utf-8'>\n"); | |
97 | builder.append(" <meta name='viewport' content='width=device-width, initial-scale=1.0'>\n"); | |
ab07d4d5 NR |
98 | builder.append(" <style type='text/css'>\n"); |
99 | builder.append(" body { margin: 1em 15%; }\n"); | |
100 | builder.append(" </style>\n"); | |
bb0d9eb2 NR |
101 | builder.append("</head>\n"); |
102 | builder.append("<body>\n"); | |
103 | } | |
104 | ||
105 | private void appendPost(StringBuilder builder) { | |
106 | builder.append("</body>\n"); | |
107 | } | |
108 | ||
73785268 | 109 | private void appendHtml(StringBuilder builder, Comment comment, String space) { |
bb0d9eb2 NR |
110 | builder.append(space) |
111 | .append("<div class='comment' style='display: block; margin-left: 80px'>\n"); | |
c715ea02 NR |
112 | builder.append(space).append(" <h3>").append(comment.getTitle()) |
113 | .append("</h3>\n"); | |
3e62b034 NR |
114 | builder.append(space) |
115 | .append(" <div class='by' style='font-style: italic;'>") | |
73785268 | 116 | .append(comment.getAuthor()).append("</div>\n"); |
27008a87 NR |
117 | builder.append(space).append(" <div class='comment_content'>"); |
118 | for (String line : comment.getContentLines()) { | |
119 | builder.append("<p>" + line + "</p>"); | |
120 | } | |
121 | builder.append("</div>\n"); | |
73785268 NR |
122 | for (Comment subComment : comment) { |
123 | appendHtml(builder, subComment, space + " "); | |
124 | } | |
bb0d9eb2 | 125 | builder.append(space).append("</div>\n"); |
73785268 NR |
126 | } |
127 | ||
128 | private StringBuilder appendHtml(StringBuilder builder, Story story, | |
70b18499 NR |
129 | boolean resume) { |
130 | if (resume) { | |
c715ea02 NR |
131 | builder.append(" <h2><a href='" + story.getId() + ".html'>" |
132 | + story.getTitle() + "</a></h2>\n"); | |
73785268 | 133 | } else { |
c715ea02 | 134 | builder.append(" <h2>" + story.getTitle() + "</h2>\n"); |
73785268 | 135 | } |
100a8395 NR |
136 | |
137 | builder.append(" <div class='details'>"); | |
138 | if (story.getDetails() != null && !story.getDetails().isEmpty()) { | |
3e62b034 NR |
139 | builder.append("(") |
140 | .append(StringUtils.xmlEscape(story.getDetails())) | |
141 | .append(")"); | |
100a8395 NR |
142 | } |
143 | builder.append("</div>\n"); | |
70b18499 NR |
144 | builder.append(" <br/>\n"); |
145 | ||
146 | if (!resume) { | |
147 | builder.append(" <ul>\n"); | |
c715ea02 NR |
148 | builder.append(" <li>Reference: <a href=''>" + story.getId() |
149 | + "</a></li>\n"); | |
70b18499 NR |
150 | builder.append(" <li>News link: <a href='" |
151 | + story.getUrlInternal() + "'>" + story.getUrlInternal() | |
152 | + "</a></li>\n"); | |
153 | builder.append(" <li>Source link: <a href='" | |
154 | + story.getUrlExternal() + "'>" + story.getUrlExternal() | |
155 | + "</a></li>\n"); | |
156 | builder.append(" </ul>\n"); | |
157 | builder.append(" <br/>\n"); | |
158 | } | |
159 | ||
ab07d4d5 | 160 | builder.append(" <div class='content' style='text-align: justify'>\n"); |
5c056aad | 161 | if (resume) { |
e818d449 NR |
162 | builder.append(" " |
163 | + StringUtils.xmlEscape(story.getContent()).replace("\n", | |
164 | "<br/>") + "\n"); | |
5c056aad | 165 | } else { |
100a8395 | 166 | builder.append(" " |
3e62b034 | 167 | + StringUtils.xmlEscape(story.getFullContent()) |
c715ea02 NR |
168 | .replace("\n", "<br/>").replace("[ ", "<h3>") |
169 | .replace(" ]", "</h3>") + "\n"); | |
5c056aad | 170 | } |
70b18499 | 171 | builder.append(" </div>\n"); |
73785268 NR |
172 | |
173 | return builder; | |
174 | } | |
175 | } |