Version 0.2.0: supports LWN, quotes, <br>s
[gofetch.git] / src / be / nikiroo / gofetch / output / Gopher.java
CommitLineData
73785268
NR
1package be.nikiroo.gofetch.output;
2
73785268
NR
3import be.nikiroo.gofetch.StringJustifier;
4import be.nikiroo.gofetch.data.Comment;
5import be.nikiroo.gofetch.data.Story;
6import be.nikiroo.gofetch.support.BasicSupport.Type;
7
8public class Gopher extends Output {
25271075 9 static private final int LINE_SIZE = 67;
73785268 10
70b18499
NR
11 public Gopher(Type type, String hostname, String preselector, int port) {
12 super(type, hostname, preselector, port);
73785268
NR
13 }
14
15 @Override
16 public String getIndexHeader() {
70b18499
NR
17 StringBuilder builder = new StringBuilder();
18
19 appendCenter(builder, "NEWS", true);
20 appendLeft(builder, "", "");
21 appendLeft(builder, "You will find here a few pages full of news.", "");
22 appendLeft(builder, "", "");
23 appendLeft(
24 builder,
25 "They are simply scrapped from their associated webpage and converted into a gopher friendly format, updated a few times a day.",
26 "");
27 appendLeft(builder, "", "");
28
29 return builder.toString();
73785268
NR
30 }
31
32 @Override
33 public String getIndexFooter() {
34 return "";
35 }
36
37 @Override
5c056aad 38 public String exportHeader(Story story) {
0774a513 39 return append(new StringBuilder(), story, true).append("i\r\ni\r\n")
73785268
NR
40 .toString();
41 }
42
43 @Override
5c056aad 44 public String export(Story story) {
73785268 45 StringBuilder builder = new StringBuilder();
0774a513 46 append(builder, story, false);
73785268
NR
47
48 builder.append("i\r\n");
49
5c056aad
NR
50 if (story.getComments() != null) {
51 for (Comment comment : story.getComments()) {
70b18499
NR
52 append(builder, comment, "");
53 }
73785268
NR
54 }
55
56 builder.append("i\r\n");
57
58 return builder.toString();
59 }
60
61 private StringBuilder append(StringBuilder builder, Comment comment,
62 String space) {
63
64 if (space.length() > LINE_SIZE - 20) {
65 space = space.substring(0, LINE_SIZE - 20);
66 }
67
27008a87 68 appendLeft(builder, comment.getTitle(), "** ", " ", space);
73785268
NR
69 appendLeft(builder, "(" + comment.getAuthor() + ")", " ", " ",
70 space);
71
72 builder.append("i\r\n");
73
27008a87
NR
74 for (String line : comment.getContentLines()) {
75 int depth = 0;
76 while (line.length() > depth && line.charAt(depth) == '>') {
77 depth++;
78 }
79 line = line.substring(depth).trim();
80
81 String prep = " ";
82 for (int i = 0; i < depth; i++) {
83 prep += ">";
84 }
85
86 if (depth > 0) {
87 prep += " ";
88 }
89
90 appendLeft(builder, line, prep, prep, space);
91 }
73785268
NR
92
93 builder.append("i\r\n");
94 for (Comment subComment : comment) {
95 append(builder, subComment, space + " ");
96 builder.append("i\r\n");
97 }
98
99 return builder;
100 }
101
102 private StringBuilder append(StringBuilder builder, Story story,
5c056aad
NR
103 boolean resume) {
104 if (!resume) {
73785268
NR
105 appendCenter(builder, story.getTitle(), true);
106 builder.append("i\r\n");
301dfeb2 107 appendJustified(builder, story.getDetails(), " ");
73785268 108 builder.append("i\r\n");
5c056aad 109
70b18499
NR
110 builder.append("i o News link: ").append(story.getUrlInternal())
111 .append("\r\n");
112 builder.append("i o Source link: ").append(story.getUrlExternal())
113 .append("\r\n");
73785268 114 builder.append("i\r\n");
5c056aad
NR
115
116 builder.append("i\r\n");
117
301dfeb2 118 appendJustified(builder, story.getFullContent(), " ");
73785268
NR
119 } else {
120 builder.append('1').append(story.getTitle()) //
93e09a08 121 .append('\t').append(story.getSelector()) //
73785268
NR
122 .append('\t').append(hostname) //
123 .append('\t').append(port) //
124 .append("\r\n");
301dfeb2 125 appendJustified(builder, story.getDetails(), " ");
5c056aad 126 builder.append("i\r\n");
73785268 127
301dfeb2 128 appendJustified(builder, story.getContent(), " ");
5c056aad 129 }
73785268
NR
130
131 builder.append("i\r\n");
132
133 return builder;
134 }
135
136 // note: adds "i"
137 private static void appendCenter(StringBuilder builder, String text,
138 boolean allCaps) {
139 if (allCaps) {
140 text = text.toUpperCase();
141 }
142
143 for (String line : StringJustifier.center(text, LINE_SIZE)) {
144 builder.append("i").append(line).append("\r\n");
145 }
146 }
147
301dfeb2
NR
148 // note: adds "i"
149 private static void appendJustified(StringBuilder builder, String text,
150 String space) {
151 for (String line : StringJustifier.full(text,
152 LINE_SIZE - space.length())) {
153 builder.append("i").append(line).append("\r\n");
154 }
155 }
156
70b18499
NR
157 // note: adds "i"
158 private static void appendLeft(StringBuilder builder, String text,
159 String space) {
160 appendLeft(builder, text, "", "", space);
161 }
162
73785268
NR
163 // note: adds "i"
164 private static void appendLeft(StringBuilder builder, String text,
165 String prependFirst, String prependOthers, String space) {
166 String prepend = prependFirst;
167 for (String line : StringJustifier.left(text,
168 LINE_SIZE - space.length())) {
169 builder.append("i").append(space).append(prepend).append(line)
170 .append("\r\n");
171 prepend = prependOthers;
172 }
173 }
174}