First version (slashdot supported)
[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
13 private String hostname;
14 private int port;
15
16 public Gopher(Type type, String hostname, int port) {
17 super(type);
18
19 this.hostname = hostname;
20 this.port = port;
21 }
22
23 @Override
24 public String getIndexHeader() {
25 return "iHello world!\r\niThis is my news site.\r\ni\r\n";
26 }
27
28 @Override
29 public String getIndexFooter() {
30 return "";
31 }
32
33 @Override
34 public String export(Story story) {
35 return append(new StringBuilder(), story, false).append("i\r\ni\r\n")
36 .toString();
37 }
38
39 @Override
40 public String export(Story story, List<Comment> comments) {
41 StringBuilder builder = new StringBuilder();
42 append(builder, story, true);
43
44 builder.append("i\r\n");
45
46 for (Comment comment : comments) {
47 append(builder, comment, "");
48 }
49
50 builder.append("i\r\n");
51
52 return builder.toString();
53 }
54
55 private StringBuilder append(StringBuilder builder, Comment comment,
56 String space) {
57
58 if (space.length() > LINE_SIZE - 20) {
59 space = space.substring(0, LINE_SIZE - 20);
60 }
61
62 appendLeft(builder, comment.getTitle(), ">> ", " ", space);
63 appendLeft(builder, "(" + comment.getAuthor() + ")", " ", " ",
64 space);
65
66 builder.append("i\r\n");
67
68 appendLeft(builder, comment.getContent(), " ", " ", space);
69
70 builder.append("i\r\n");
71 for (Comment subComment : comment) {
72 append(builder, subComment, space + " ");
73 builder.append("i\r\n");
74 }
75
76 return builder;
77 }
78
79 private StringBuilder append(StringBuilder builder, Story story,
80 boolean links) {
81 if (links) {
82 appendCenter(builder, story.getTitle(), true);
83 builder.append("i\r\n");
84 appendLeft(builder, story.getDetails(), "", "", " ");
85 builder.append("i\r\n");
86 builder.append("i o News link: ").append(story.getUrlInternal());
87 builder.append("i\r\n");
88 builder.append("i o Source link: ").append(story.getUrlExternal());
89 builder.append("i\r\n");
90 } else {
91 builder.append('1').append(story.getTitle()) //
92 .append('\t').append("0").append(story.getSelector()) //
93 .append('\t').append(hostname) //
94 .append('\t').append(port) //
95 .append("\r\n");
96 appendLeft(builder, story.getDetails(), "", "", " ");
97 }
98
99 builder.append("i\r\n");
100
101 appendLeft(builder, story.getContent(), "", "", " ");
102
103 builder.append("i\r\n");
104
105 return builder;
106 }
107
108 // note: adds "i"
109 private static void appendCenter(StringBuilder builder, String text,
110 boolean allCaps) {
111 if (allCaps) {
112 text = text.toUpperCase();
113 }
114
115 for (String line : StringJustifier.center(text, LINE_SIZE)) {
116 builder.append("i").append(line).append("\r\n");
117 }
118 }
119
120 // note: adds "i"
121 private static void appendLeft(StringBuilder builder, String text,
122 String prependFirst, String prependOthers, String space) {
123 String prepend = prependFirst;
124 for (String line : StringJustifier.left(text,
125 LINE_SIZE - space.length())) {
126 builder.append("i").append(space).append(prepend).append(line)
127 .append("\r\n");
128 prepend = prependOthers;
129 }
130 }
131}