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 | ||
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 | } |