Merge branch 'master' of github.com:nikiroo/gofetch
[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;
c715ea02 5import be.nikiroo.gofetch.support.BasicSupport;
3e62b034
NR
6import be.nikiroo.gofetch.support.Type;
7import be.nikiroo.utils.StringUtils;
73785268
NR
8
9public 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}