Add title in index pages, add reference in story
[gofetch.git] / src / be / nikiroo / gofetch / output / Gopher.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 import be.nikiroo.utils.StringUtils.Alignment;
9
10 public class Gopher extends Output {
11 static private final int LINE_SIZE = 67;
12
13 public Gopher(Type type, String hostname, String preselector, int port) {
14 super(type, hostname, preselector, port);
15 }
16
17 @Override
18 public String getMainIndexHeader() {
19 StringBuilder builder = new StringBuilder();
20
21 appendCenter(builder, true, "NEWS", "", true);
22 appendLeft(builder, true, "", "");
23 appendLeft(builder, true,
24 "You will find here a few pages full of news.", "");
25 appendLeft(builder, true, "", "");
26 appendLeft(
27 builder,
28 true,
29 "They are simply scrapped from their associated webpage and converted into a gopher friendly format, updated a few times a day.",
30 "");
31 appendLeft(builder, true, "", "");
32
33 return builder.toString();
34 }
35
36 @Override
37 public String getMainIndexFooter() {
38 return "";
39 }
40
41 @Override
42 public String getIndexHeader(BasicSupport support) {
43 StringBuilder builder = new StringBuilder();
44 appendCenter(builder, true, support.getDescription(), "", true);
45 builder.append("\r\n");
46 builder.append("\r\n");
47 builder.append("\r\n");
48 return builder.toString();
49 }
50
51 @Override
52 public String getIndexFooter(BasicSupport support) {
53 return "";
54 }
55
56 @Override
57 public String exportHeader(Story story) {
58 return append(new StringBuilder(), story, true).toString();
59 }
60
61 @Override
62 public String export(Story story) {
63 StringBuilder builder = new StringBuilder();
64 append(builder, story, false);
65
66 builder.append("\r\n");
67
68 if (story.getComments() != null) {
69 for (Comment comment : story.getComments()) {
70 append(builder, false, comment, " ");
71 }
72 }
73
74 builder.append("\r\n");
75
76 return builder.toString();
77 }
78
79 private StringBuilder append(StringBuilder builder, boolean menu,
80 Comment comment, String space) {
81
82 if (space.length() > LINE_SIZE - 20) {
83 space = space.substring(0, LINE_SIZE - 20);
84 }
85
86 appendLeft(builder, menu, comment.getTitle(), "** ", " ", space);
87
88 if (comment.getAuthor() != null
89 && !comment.getAuthor().trim().isEmpty()) {
90 appendLeft(builder, menu, "(" + comment.getAuthor() + ")", " ",
91 " ", space);
92 builder.append((menu ? "i" : "") + "\r\n");
93 }
94
95 for (String line : comment.getContentLines()) {
96 int depth = 0;
97 while (line.length() > depth && line.charAt(depth) == '>') {
98 depth++;
99 }
100 line = line.substring(depth).trim();
101
102 String prep = " ";
103 for (int i = 0; i < depth; i++) {
104 prep += ">";
105 }
106
107 if (depth > 0) {
108 prep += " ";
109 }
110
111 appendLeft(builder, menu, line, prep, prep, space);
112 }
113
114 builder.append((menu ? "i" : "") + "\r\n");
115 for (Comment subComment : comment) {
116 append(builder, menu, subComment, space + " ");
117 builder.append((menu ? "i" : "") + "\r\n");
118 }
119
120 return builder;
121 }
122
123 private StringBuilder append(StringBuilder builder, Story story,
124 boolean resume) {
125 if (!resume) {
126 appendCenter(builder, false, story.getTitle(), " ", true);
127 builder.append("\r\n");
128 appendJustified(builder, false, story.getDetails(), " ");
129 builder.append("\r\n");
130
131 builder.append(" o Reference: ").append(story.getId())
132 .append("\r\n");
133 builder.append(" o News link: ").append(story.getUrlInternal())
134 .append("\r\n");
135 builder.append(" o Source link: ").append(story.getUrlExternal())
136 .append("\r\n");
137 builder.append("\r\n");
138
139 builder.append("\r\n");
140
141 appendJustified(builder, false, story.getFullContent(), " ");
142 builder.append("\r\n");
143 } else {
144 builder.append('0').append(story.getTitle()) //
145 .append('\t').append(story.getSelector()) //
146 .append('\t').append(hostname) //
147 .append('\t').append(port) //
148 .append("\r\n");
149 appendJustified(builder, true, story.getDetails(), " ");
150 builder.append("i\r\n");
151
152 String content = story.getContent();
153 if (!content.isEmpty()) {
154 appendJustified(builder, true, content, " ");
155 builder.append("i\r\n");
156 }
157 }
158
159 return builder;
160 }
161
162 // note: adds "i"
163 private static void appendCenter(StringBuilder builder, boolean menu,
164 String text, String space, boolean allCaps) {
165 if (allCaps) {
166 text = text.toUpperCase();
167 }
168
169 int size = LINE_SIZE - space.length();
170 for (String line : StringUtils
171 .justifyText(text, size, Alignment.CENTER)) {
172 builder.append(menu ? "i" : "") //
173 .append(space) //
174 .append(line) //
175 .append("\r\n");
176 }
177 }
178
179 private static void appendJustified(StringBuilder builder, boolean menu,
180 String text, String space) {
181 for (String line : text.split("\n")) {
182 int size = LINE_SIZE - space.length();
183 for (String subline : StringUtils.justifyText(line, size,
184 Alignment.JUSTIFY)) {
185 builder.append(menu ? "i" : "") //
186 .append(space) //
187 .append(subline) //
188 .append("\r\n");
189 }
190 }
191 }
192
193 private static void appendLeft(StringBuilder builder, boolean menu,
194 String text, String space) {
195 appendLeft(builder, menu, text, "", "", space);
196 }
197
198 private static void appendLeft(StringBuilder builder, boolean menu,
199 String text, String prependFirst, String prependOthers, String space) {
200 String prepend = prependFirst;
201 for (String line : text.split("\n")) {
202 for (String subline : StringUtils.justifyText(line, LINE_SIZE
203 - space.length(), Alignment.LEFT)) {
204 builder.append(menu ? "i" : "") //
205 .append(space) //
206 .append(prepend) //
207 .append(subline) //
208 .append("\r\n");
209 prepend = prependOthers;
210 }
211 }
212 }
213 }