Version 0.2.0: supports LWN, quotes, <br>s
[gofetch.git] / src / be / nikiroo / gofetch / output / Gopher.java
1 package be.nikiroo.gofetch.output;
2
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 {
9 static private final int LINE_SIZE = 67;
10
11 public Gopher(Type type, String hostname, String preselector, int port) {
12 super(type, hostname, preselector, port);
13 }
14
15 @Override
16 public String getIndexHeader() {
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();
30 }
31
32 @Override
33 public String getIndexFooter() {
34 return "";
35 }
36
37 @Override
38 public String exportHeader(Story story) {
39 return append(new StringBuilder(), story, true).append("i\r\ni\r\n")
40 .toString();
41 }
42
43 @Override
44 public String export(Story story) {
45 StringBuilder builder = new StringBuilder();
46 append(builder, story, false);
47
48 builder.append("i\r\n");
49
50 if (story.getComments() != null) {
51 for (Comment comment : story.getComments()) {
52 append(builder, comment, "");
53 }
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
68 appendLeft(builder, comment.getTitle(), "** ", " ", space);
69 appendLeft(builder, "(" + comment.getAuthor() + ")", " ", " ",
70 space);
71
72 builder.append("i\r\n");
73
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 }
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,
103 boolean resume) {
104 if (!resume) {
105 appendCenter(builder, story.getTitle(), true);
106 builder.append("i\r\n");
107 appendJustified(builder, story.getDetails(), " ");
108 builder.append("i\r\n");
109
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");
114 builder.append("i\r\n");
115
116 builder.append("i\r\n");
117
118 appendJustified(builder, story.getFullContent(), " ");
119 } else {
120 builder.append('1').append(story.getTitle()) //
121 .append('\t').append(story.getSelector()) //
122 .append('\t').append(hostname) //
123 .append('\t').append(port) //
124 .append("\r\n");
125 appendJustified(builder, story.getDetails(), " ");
126 builder.append("i\r\n");
127
128 appendJustified(builder, story.getContent(), " ");
129 }
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
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
157 // note: adds "i"
158 private static void appendLeft(StringBuilder builder, String text,
159 String space) {
160 appendLeft(builder, text, "", "", space);
161 }
162
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 }