Bug fixes + rework of BasicSupport
[gofetch.git] / src / be / nikiroo / gofetch / output / Html.java
CommitLineData
73785268
NR
1package be.nikiroo.gofetch.output;
2
73785268
NR
3import be.nikiroo.gofetch.data.Comment;
4import be.nikiroo.gofetch.data.Story;
3e62b034
NR
5import be.nikiroo.gofetch.support.Type;
6import be.nikiroo.utils.StringUtils;
73785268
NR
7
8public 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}