Add title in index pages, add reference in story
[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.BasicSupport;
6 import be.nikiroo.gofetch.support.Type;
7 import be.nikiroo.utils.StringUtils;
8
9 public class Html extends Output {
10 public Html(Type type, String hostname, String preselector, int port) {
11 super(type, hostname, preselector, port);
12 }
13
14 @Override
15 public String getMainIndexHeader() {
16 String sel = preselector;
17 if (!sel.isEmpty()) {
18 sel = "/1" + sel;
19 }
20
21 String gopherUrl = "gopher://" + hostname + sel + ":" + port;
22
23 StringBuilder builder = new StringBuilder();
24 appendPre(builder);
25
26 builder.append("<h2>News</h2>\n"//
27 + "<p>You will find here a few pages full of news, mirroring <a href='"
28 + gopherUrl + "'>"
29 + gopherUrl
30 + "</a>.</p>\n"//
31 + "<p>They are simply scrapped from their associated webpage and updated a few times a day.</p>\n"//
32 );
33
34 appendPost(builder);
35
36 return builder.toString();
37 }
38
39 @Override
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) {
51 return "";
52 }
53
54 @Override
55 public String exportHeader(Story story) {
56 StringBuilder builder = new StringBuilder();
57
58 appendPre(builder);
59
60 builder.append("<div class='story-header'>\n");
61 appendHtml(builder, story, true);
62 builder.append("<hr/>\n");
63 builder.append("</div>\n");
64
65 appendPost(builder);
66
67 return builder.toString();
68 }
69
70 @Override
71 public String export(Story story) {
72 StringBuilder builder = new StringBuilder();
73 appendPre(builder);
74
75 builder.append("<div class='story'>\n");
76 appendHtml(builder, story, false);
77 builder.append("<hr/>\n");
78
79 if (story.getComments() != null) {
80 for (Comment comment : story.getComments()) {
81 appendHtml(builder, comment, " ");
82 }
83 }
84
85 builder.append("</div>\n");
86
87 appendPost(builder);
88
89 return builder.toString();
90 }
91
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");
98 builder.append(" <style type='text/css'>\n");
99 builder.append(" body { margin: 1em 15%; }\n");
100 builder.append(" </style>\n");
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
109 private void appendHtml(StringBuilder builder, Comment comment, String space) {
110 builder.append(space)
111 .append("<div class='comment' style='display: block; margin-left: 80px'>\n");
112 builder.append(space).append(" <h3>").append(comment.getTitle())
113 .append("</h3>\n");
114 builder.append(space)
115 .append(" <div class='by' style='font-style: italic;'>")
116 .append(comment.getAuthor()).append("</div>\n");
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");
122 for (Comment subComment : comment) {
123 appendHtml(builder, subComment, space + " ");
124 }
125 builder.append(space).append("</div>\n");
126 }
127
128 private StringBuilder appendHtml(StringBuilder builder, Story story,
129 boolean resume) {
130 if (resume) {
131 builder.append(" <h2><a href='" + story.getId() + ".html'>"
132 + story.getTitle() + "</a></h2>\n");
133 } else {
134 builder.append(" <h2>" + story.getTitle() + "</h2>\n");
135 }
136
137 builder.append(" <div class='details'>");
138 if (story.getDetails() != null && !story.getDetails().isEmpty()) {
139 builder.append("(")
140 .append(StringUtils.xmlEscape(story.getDetails()))
141 .append(")");
142 }
143 builder.append("</div>\n");
144 builder.append(" <br/>\n");
145
146 if (!resume) {
147 builder.append(" <ul>\n");
148 builder.append(" <li>Reference: <a href=''>" + story.getId()
149 + "</a></li>\n");
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
160 builder.append(" <div class='content' style='text-align: justify'>\n");
161 if (resume) {
162 builder.append(" " + StringUtils.xmlEscape(story.getContent())
163 + "\n");
164 } else {
165 builder.append(" "
166 + StringUtils.xmlEscape(story.getFullContent())
167 .replace("\n", "<br/>").replace("[ ", "<h3>")
168 .replace(" ]", "</h3>") + "\n");
169 }
170 builder.append(" </div>\n");
171
172 return builder;
173 }
174 }