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