Gopher: (WIP): menu -> text for news
[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
029feaed
NR
19 appendCenter(builder, true, "NEWS", true);
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()) {
029feaed 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
NR
93
94 builder.append("i\r\n");
95 for (Comment subComment : comment) {
029feaed 96 append(builder, menu, subComment, space + " ");
73785268
NR
97 builder.append("i\r\n");
98 }
99
100 return builder;
101 }
102
103 private StringBuilder append(StringBuilder builder, Story story,
5c056aad
NR
104 boolean resume) {
105 if (!resume) {
029feaed
NR
106 appendCenter(builder, false, story.getTitle(), true);
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
029feaed 132 builder.append((resume ? "i" : "") + "\r\n");
73785268
NR
133
134 return builder;
135 }
136
137 // note: adds "i"
029feaed
NR
138 private static void appendCenter(StringBuilder builder, boolean menu,
139 String text, boolean allCaps) {
73785268
NR
140 if (allCaps) {
141 text = text.toUpperCase();
142 }
143
144 for (String line : StringJustifier.center(text, LINE_SIZE)) {
029feaed 145 builder.append(menu ? "i" : "").append(line).append("\r\n");
73785268
NR
146 }
147 }
148
029feaed
NR
149 private static void appendJustified(StringBuilder builder, boolean menu,
150 String text, String space) {
100a8395
NR
151 for (String line : text.split("\n")) {
152 for (String subline : StringJustifier.full(line,
153 LINE_SIZE - space.length())) {
029feaed 154 builder.append(menu ? "i" : "").append(subline).append("\r\n");
100a8395 155 }
301dfeb2
NR
156 }
157 }
158
029feaed
NR
159 private static void appendLeft(StringBuilder builder, boolean menu,
160 String text, String space) {
161 appendLeft(builder, menu, text, "", "", space);
70b18499
NR
162 }
163
029feaed
NR
164 private static void appendLeft(StringBuilder builder, boolean menu,
165 String text, String prependFirst, String prependOthers, String space) {
73785268 166 String prepend = prependFirst;
100a8395
NR
167 for (String line : text.split("\n")) {
168 for (String subline : StringJustifier.left(line,
169 LINE_SIZE - space.length())) {
029feaed 170 builder.append(menu ? "i" : "").append(space).append(prepend)
100a8395
NR
171 .append(subline).append("\r\n");
172 prepend = prependOthers;
173 }
73785268
NR
174 }
175 }
176}