Add support for lwn.net (WIP)
[gofetch.git] / src / be / nikiroo / gofetch / output / Gopher.java
CommitLineData
73785268
NR
1package be.nikiroo.gofetch.output;
2
3import java.util.List;
4
5import be.nikiroo.gofetch.StringJustifier;
6import be.nikiroo.gofetch.data.Comment;
7import be.nikiroo.gofetch.data.Story;
8import be.nikiroo.gofetch.support.BasicSupport.Type;
9
10public class Gopher extends Output {
11 static private final int LINE_SIZE = 70;
12
70b18499
NR
13 public Gopher(Type type, String hostname, String preselector, int port) {
14 super(type, hostname, preselector, port);
73785268
NR
15 }
16
17 @Override
18 public String getIndexHeader() {
70b18499
NR
19 StringBuilder builder = new StringBuilder();
20
21 appendCenter(builder, "NEWS", true);
22 appendLeft(builder, "", "");
23 appendLeft(builder, "You will find here a few pages full of news.", "");
24 appendLeft(builder, "", "");
25 appendLeft(
26 builder,
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, "", "");
30
31 return builder.toString();
73785268
NR
32 }
33
34 @Override
35 public String getIndexFooter() {
36 return "";
37 }
38
39 @Override
40 public String export(Story story) {
41 return append(new StringBuilder(), story, false).append("i\r\ni\r\n")
42 .toString();
43 }
44
45 @Override
46 public String export(Story story, List<Comment> comments) {
47 StringBuilder builder = new StringBuilder();
48 append(builder, story, true);
49
50 builder.append("i\r\n");
51
70b18499
NR
52 if (comments != null) {
53 for (Comment comment : comments) {
54 append(builder, comment, "");
55 }
73785268
NR
56 }
57
58 builder.append("i\r\n");
59
60 return builder.toString();
61 }
62
63 private StringBuilder append(StringBuilder builder, Comment comment,
64 String space) {
65
66 if (space.length() > LINE_SIZE - 20) {
67 space = space.substring(0, LINE_SIZE - 20);
68 }
69
70 appendLeft(builder, comment.getTitle(), ">> ", " ", space);
71 appendLeft(builder, "(" + comment.getAuthor() + ")", " ", " ",
72 space);
73
74 builder.append("i\r\n");
75
76 appendLeft(builder, comment.getContent(), " ", " ", space);
77
78 builder.append("i\r\n");
79 for (Comment subComment : comment) {
80 append(builder, subComment, space + " ");
81 builder.append("i\r\n");
82 }
83
84 return builder;
85 }
86
87 private StringBuilder append(StringBuilder builder, Story story,
88 boolean links) {
89 if (links) {
90 appendCenter(builder, story.getTitle(), true);
91 builder.append("i\r\n");
70b18499 92 appendLeft(builder, story.getDetails(), " ");
73785268 93 builder.append("i\r\n");
70b18499
NR
94 builder.append("i o News link: ").append(story.getUrlInternal())
95 .append("\r\n");
96 builder.append("i o Source link: ").append(story.getUrlExternal())
97 .append("\r\n");
73785268
NR
98 builder.append("i\r\n");
99 } else {
100 builder.append('1').append(story.getTitle()) //
101 .append('\t').append("0").append(story.getSelector()) //
102 .append('\t').append(hostname) //
103 .append('\t').append(port) //
104 .append("\r\n");
70b18499 105 appendLeft(builder, story.getDetails(), " ");
73785268
NR
106 }
107
108 builder.append("i\r\n");
109
70b18499 110 appendLeft(builder, story.getContent(), " ");
73785268
NR
111
112 builder.append("i\r\n");
113
114 return builder;
115 }
116
117 // note: adds "i"
118 private static void appendCenter(StringBuilder builder, String text,
119 boolean allCaps) {
120 if (allCaps) {
121 text = text.toUpperCase();
122 }
123
124 for (String line : StringJustifier.center(text, LINE_SIZE)) {
125 builder.append("i").append(line).append("\r\n");
126 }
127 }
128
70b18499
NR
129 // note: adds "i"
130 private static void appendLeft(StringBuilder builder, String text,
131 String space) {
132 appendLeft(builder, text, "", "", space);
133 }
134
73785268
NR
135 // note: adds "i"
136 private static void appendLeft(StringBuilder builder, String text,
137 String prependFirst, String prependOthers, String space) {
138 String prepend = prependFirst;
139 for (String line : StringJustifier.left(text,
140 LINE_SIZE - space.length())) {
141 builder.append("i").append(space).append(prepend).append(line)
142 .append("\r\n");
143 prepend = prependOthers;
144 }
145 }
146}