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