Commit | Line | Data |
---|---|---|
73785268 NR |
1 | package be.nikiroo.gofetch.output; |
2 | ||
3 | import java.util.List; | |
4 | ||
5 | import be.nikiroo.gofetch.StringJustifier; | |
6 | import be.nikiroo.gofetch.data.Comment; | |
7 | import be.nikiroo.gofetch.data.Story; | |
8 | import be.nikiroo.gofetch.support.BasicSupport.Type; | |
9 | ||
10 | public 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 | } |