Commit | Line | Data |
---|---|---|
73785268 NR |
1 | package be.nikiroo.gofetch.output; |
2 | ||
73785268 NR |
3 | import be.nikiroo.gofetch.StringJustifier; |
4 | import be.nikiroo.gofetch.data.Comment; | |
5 | import be.nikiroo.gofetch.data.Story; | |
6 | import be.nikiroo.gofetch.support.BasicSupport.Type; | |
7 | ||
8 | public 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 | } |