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