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