385df8bf8da919416ccf672a623fa9288c0ab585
[gofetch.git] / src / be / nikiroo / gofetch / output / Html.java
1 package be.nikiroo.gofetch.output;
2
3 import be.nikiroo.gofetch.data.Comment;
4 import be.nikiroo.gofetch.data.Story;
5 import be.nikiroo.gofetch.support.Type;
6 import be.nikiroo.utils.StringUtils;
7
8 public class Html extends Output {
9 public Html(Type type, String hostname, String preselector, int port) {
10 super(type, hostname, preselector, port);
11 }
12
13 @Override
14 public String getIndexHeader() {
15 String sel = preselector;
16 if (!sel.isEmpty()) {
17 sel = "/1" + sel;
18 }
19
20 String gopherUrl = "gopher://" + hostname + sel + ":" + port;
21
22 StringBuilder builder = new StringBuilder();
23 appendPre(builder);
24
25 builder.append("<h1>News</h1>\n"//
26 + "<p>You will find here a few pages full of news, mirroring <a href='"
27 + gopherUrl + "'>"
28 + gopherUrl
29 + "</a>.</p>\n"//
30 + "<p>They are simply scrapped from their associated webpage and updated a few times a day.</p>\n"//
31 );
32
33 appendPost(builder);
34
35 return builder.toString();
36 }
37
38 @Override
39 public String getIndexFooter() {
40 return "";
41 }
42
43 @Override
44 public String exportHeader(Story story) {
45 StringBuilder builder = new StringBuilder();
46
47 appendPre(builder);
48
49 builder.append("<div class='story-header'>\n");
50 appendHtml(builder, story, true);
51 builder.append("<hr/>\n");
52 builder.append("</div>\n");
53
54 appendPost(builder);
55
56 return builder.toString();
57 }
58
59 @Override
60 public String export(Story story) {
61 StringBuilder builder = new StringBuilder();
62 appendPre(builder);
63
64 builder.append("<div class='story'>\n");
65 appendHtml(builder, story, false);
66 builder.append("<hr/>\n");
67
68 if (story.getComments() != null) {
69 for (Comment comment : story.getComments()) {
70 appendHtml(builder, comment, " ");
71 }
72 }
73
74 builder.append("</div>\n");
75
76 appendPost(builder);
77
78 return builder.toString();
79 }
80
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");
87 builder.append(" <style type='text/css'>\n");
88 builder.append(" body { margin: 1em 15%; }\n");
89 builder.append(" </style>\n");
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
98 private void appendHtml(StringBuilder builder, Comment comment, String space) {
99 builder.append(space)
100 .append("<div class='comment' style='display: block; margin-left: 80px'>\n");
101 builder.append(space).append(" <h2>").append(comment.getTitle())
102 .append("</h2>\n");
103 builder.append(space)
104 .append(" <div class='by' style='font-style: italic;'>")
105 .append(comment.getAuthor()).append("</div>\n");
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");
111 for (Comment subComment : comment) {
112 appendHtml(builder, subComment, space + " ");
113 }
114 builder.append(space).append("</div>\n");
115 }
116
117 private StringBuilder appendHtml(StringBuilder builder, Story story,
118 boolean resume) {
119 if (resume) {
120 builder.append(" <h1><a href='" + story.getId() + ".html'>"
121 + story.getTitle() + "</a></h1>\n");
122 } else {
123 builder.append(" <h1>" + story.getTitle() + "</h1>\n");
124 }
125
126 builder.append(" <div class='details'>");
127 if (story.getDetails() != null && !story.getDetails().isEmpty()) {
128 builder.append("(")
129 .append(StringUtils.xmlEscape(story.getDetails()))
130 .append(")");
131 }
132 builder.append("</div>\n");
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
147 builder.append(" <div class='content' style='text-align: justify'>\n");
148 if (resume) {
149 builder.append(" " + StringUtils.xmlEscape(story.getContent())
150 + "\n");
151 } else {
152 builder.append(" "
153 + StringUtils.xmlEscape(story.getFullContent())
154 .replace("\n", "<br/>").replace("[ ", "<h2>")
155 .replace(" ]", "</h2>") + "\n");
156 }
157 builder.append(" </div>\n");
158
159 return builder;
160 }
161 }