1 package be
.nikiroo
.gofetch
.output
;
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
;
8 public class Gopher
extends Output
{
9 static private final int LINE_SIZE
= 67;
11 public Gopher(Type type
, String hostname
, String preselector
, int port
) {
12 super(type
, hostname
, preselector
, port
);
16 public String
getIndexHeader() {
17 StringBuilder builder
= new StringBuilder();
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, "", "");
27 "They are simply scrapped from their associated webpage and converted into a gopher friendly format, updated a few times a day.",
29 appendLeft(builder
, true, "", "");
31 return builder
.toString();
35 public String
getIndexFooter() {
40 public String
exportHeader(Story story
) {
41 return append(new StringBuilder(), story
, true).toString();
45 public String
export(Story story
) {
46 StringBuilder builder
= new StringBuilder();
47 append(builder
, story
, false);
49 builder
.append("\r\n");
51 if (story
.getComments() != null) {
52 for (Comment comment
: story
.getComments()) {
53 append(builder
, false, comment
, " ");
57 builder
.append("\r\n");
59 return builder
.toString();
62 private StringBuilder
append(StringBuilder builder
, boolean menu
,
63 Comment comment
, String space
) {
65 if (space
.length() > LINE_SIZE
- 20) {
66 space
= space
.substring(0, LINE_SIZE
- 20);
69 appendLeft(builder
, menu
, comment
.getTitle(), "** ", " ", space
);
70 appendLeft(builder
, menu
, "(" + comment
.getAuthor() + ")", " ",
73 builder
.append((menu ?
"i" : "") + "\r\n");
75 for (String line
: comment
.getContentLines()) {
77 while (line
.length() > depth
&& line
.charAt(depth
) == '>') {
80 line
= line
.substring(depth
).trim();
83 for (int i
= 0; i
< depth
; i
++) {
91 appendLeft(builder
, menu
, line
, prep
, prep
, space
);
94 builder
.append((menu ?
"i" : "") + "\r\n");
95 for (Comment subComment
: comment
) {
96 append(builder
, menu
, subComment
, space
+ " ");
97 builder
.append((menu ?
"i" : "") + "\r\n");
103 private StringBuilder
append(StringBuilder builder
, Story story
,
106 appendCenter(builder
, false, story
.getTitle(), " ", true);
107 builder
.append("\r\n");
108 appendJustified(builder
, false, story
.getDetails(), " ");
109 builder
.append("\r\n");
111 builder
.append(" o News link: ").append(story
.getUrlInternal())
113 builder
.append(" o Source link: ").append(story
.getUrlExternal())
115 builder
.append("\r\n");
117 builder
.append("\r\n");
119 appendJustified(builder
, false, story
.getFullContent(), " ");
121 builder
.append('0').append(story
.getTitle()) //
122 .append('\t').append(story
.getSelector()) //
123 .append('\t').append(hostname
) //
124 .append('\t').append(port
) //
126 appendJustified(builder
, true, story
.getDetails(), " ");
127 builder
.append("i\r\n");
129 appendJustified(builder
, true, story
.getContent(), " ");
132 builder
.append(resume ?
"i" : "").append("\r\n");
138 private static void appendCenter(StringBuilder builder
, boolean menu
,
139 String text
, String space
, boolean allCaps
) {
141 text
= text
.toUpperCase();
144 int size
= LINE_SIZE
- space
.length();
145 for (String line
: StringJustifier
.center(text
, size
)) {
146 builder
.append(menu ?
"i" : "")
148 .append(line
).append("\r\n");
152 private static void appendJustified(StringBuilder builder
, boolean menu
,
153 String text
, String space
) {
154 for (String line
: text
.split("\n")) {
155 int size
= LINE_SIZE
- space
.length();
156 for (String subline
: StringJustifier
.full(line
, size
)) {
157 builder
.append(menu ?
"i" : "")
165 private static void appendLeft(StringBuilder builder
, boolean menu
,
166 String text
, String space
) {
167 appendLeft(builder
, menu
, text
, "", "", space
);
170 private static void appendLeft(StringBuilder builder
, boolean menu
,
171 String text
, String prependFirst
, String prependOthers
, String space
) {
172 String prepend
= prependFirst
;
173 for (String line
: text
.split("\n")) {
174 for (String subline
: StringJustifier
.left(line
,
175 LINE_SIZE
- space
.length())) {
176 builder
.append(menu ?
"i" : "").append(space
).append(prepend
)
177 .append(subline
).append("\r\n");
178 prepend
= prependOthers
;