package be.nikiroo.gofetch.output;
-import java.util.List;
-
-import be.nikiroo.gofetch.StringJustifier;
import be.nikiroo.gofetch.data.Comment;
import be.nikiroo.gofetch.data.Story;
import be.nikiroo.gofetch.support.BasicSupport.Type;
+import be.nikiroo.utils.StringUtils;
+import be.nikiroo.utils.StringUtils.Alignment;
public class Gopher extends Output {
- static private final int LINE_SIZE = 70;
-
- private String hostname;
- private int port;
-
- public Gopher(Type type, String hostname, int port) {
- super(type);
+ static private final int LINE_SIZE = 67;
- this.hostname = hostname;
- this.port = port;
+ public Gopher(Type type, String hostname, String preselector, int port) {
+ super(type, hostname, preselector, port);
}
@Override
public String getIndexHeader() {
- return "iHello world!\r\niThis is my news site.\r\ni\r\n";
+ StringBuilder builder = new StringBuilder();
+
+ appendCenter(builder, true, "NEWS", "", true);
+ appendLeft(builder, true, "", "");
+ appendLeft(builder, true,
+ "You will find here a few pages full of news.", "");
+ appendLeft(builder, true, "", "");
+ appendLeft(
+ builder,
+ true,
+ "They are simply scrapped from their associated webpage and converted into a gopher friendly format, updated a few times a day.",
+ "");
+ appendLeft(builder, true, "", "");
+
+ return builder.toString();
}
@Override
}
@Override
- public String export(Story story) {
- return append(new StringBuilder(), story, false).append("i\r\ni\r\n")
- .toString();
+ public String exportHeader(Story story) {
+ return append(new StringBuilder(), story, true).toString();
}
@Override
- public String export(Story story, List<Comment> comments) {
+ public String export(Story story) {
StringBuilder builder = new StringBuilder();
- append(builder, story, true);
+ append(builder, story, false);
- builder.append("i\r\n");
+ builder.append("\r\n");
- for (Comment comment : comments) {
- append(builder, comment, "");
+ if (story.getComments() != null) {
+ for (Comment comment : story.getComments()) {
+ append(builder, false, comment, " ");
+ }
}
- builder.append("i\r\n");
+ builder.append("\r\n");
return builder.toString();
}
- private StringBuilder append(StringBuilder builder, Comment comment,
- String space) {
+ private StringBuilder append(StringBuilder builder, boolean menu,
+ Comment comment, String space) {
if (space.length() > LINE_SIZE - 20) {
space = space.substring(0, LINE_SIZE - 20);
}
- appendLeft(builder, comment.getTitle(), ">> ", " ", space);
- appendLeft(builder, "(" + comment.getAuthor() + ")", " ", " ",
- space);
+ appendLeft(builder, menu, comment.getTitle(), "** ", " ", space);
+ appendLeft(builder, menu, "(" + comment.getAuthor() + ")", " ",
+ " ", space);
- builder.append("i\r\n");
+ builder.append((menu ? "i" : "") + "\r\n");
- appendLeft(builder, comment.getContent(), " ", " ", space);
+ for (String line : comment.getContentLines()) {
+ int depth = 0;
+ while (line.length() > depth && line.charAt(depth) == '>') {
+ depth++;
+ }
+ line = line.substring(depth).trim();
- builder.append("i\r\n");
+ String prep = " ";
+ for (int i = 0; i < depth; i++) {
+ prep += ">";
+ }
+
+ if (depth > 0) {
+ prep += " ";
+ }
+
+ appendLeft(builder, menu, line, prep, prep, space);
+ }
+
+ builder.append((menu ? "i" : "") + "\r\n");
for (Comment subComment : comment) {
- append(builder, subComment, space + " ");
- builder.append("i\r\n");
+ append(builder, menu, subComment, space + " ");
+ builder.append((menu ? "i" : "") + "\r\n");
}
return builder;
}
private StringBuilder append(StringBuilder builder, Story story,
- boolean links) {
- if (links) {
- appendCenter(builder, story.getTitle(), true);
- builder.append("i\r\n");
- appendLeft(builder, story.getDetails(), "", "", " ");
- builder.append("i\r\n");
- builder.append("i o News link: ").append(story.getUrlInternal());
- builder.append("i\r\n");
- builder.append("i o Source link: ").append(story.getUrlExternal());
- builder.append("i\r\n");
+ boolean resume) {
+ if (!resume) {
+ appendCenter(builder, false, story.getTitle(), " ", true);
+ builder.append("\r\n");
+ appendJustified(builder, false, story.getDetails(), " ");
+ builder.append("\r\n");
+
+ builder.append(" o News link: ").append(story.getUrlInternal())
+ .append("\r\n");
+ builder.append(" o Source link: ").append(story.getUrlExternal())
+ .append("\r\n");
+ builder.append("\r\n");
+
+ builder.append("\r\n");
+
+ appendJustified(builder, false, story.getFullContent(), " ");
} else {
- builder.append('1').append(story.getTitle()) //
- .append('\t').append("0").append(story.getSelector()) //
+ builder.append('0').append(story.getTitle()) //
+ .append('\t').append(story.getSelector()) //
.append('\t').append(hostname) //
.append('\t').append(port) //
.append("\r\n");
- appendLeft(builder, story.getDetails(), "", "", " ");
- }
-
- builder.append("i\r\n");
+ appendJustified(builder, true, story.getDetails(), " ");
+ builder.append("i\r\n");
- appendLeft(builder, story.getContent(), "", "", " ");
+ appendJustified(builder, true, story.getContent(), " ");
+ }
- builder.append("i\r\n");
+ builder.append(resume ? "i" : "").append("\r\n");
return builder;
}
// note: adds "i"
- private static void appendCenter(StringBuilder builder, String text,
- boolean allCaps) {
+ private static void appendCenter(StringBuilder builder, boolean menu,
+ String text, String space, boolean allCaps) {
if (allCaps) {
text = text.toUpperCase();
}
- for (String line : StringJustifier.center(text, LINE_SIZE)) {
- builder.append("i").append(line).append("\r\n");
+ int size = LINE_SIZE - space.length();
+ for (String line : StringUtils
+ .justifyText(text, size, Alignment.CENTER)) {
+ builder.append(menu ? "i" : "") //
+ .append(space) //
+ .append(line) //
+ .append("\r\n");
}
}
- // note: adds "i"
- private static void appendLeft(StringBuilder builder, String text,
- String prependFirst, String prependOthers, String space) {
+ private static void appendJustified(StringBuilder builder, boolean menu,
+ String text, String space) {
+ for (String line : text.split("\n")) {
+ int size = LINE_SIZE - space.length();
+ for (String subline : StringUtils.justifyText(line, size,
+ Alignment.JUSTIFY)) {
+ builder.append(menu ? "i" : "") //
+ .append(space) //
+ .append(subline) //
+ .append("\r\n");
+ }
+ }
+ }
+
+ private static void appendLeft(StringBuilder builder, boolean menu,
+ String text, String space) {
+ appendLeft(builder, menu, text, "", "", space);
+ }
+
+ private static void appendLeft(StringBuilder builder, boolean menu,
+ String text, String prependFirst, String prependOthers, String space) {
String prepend = prependFirst;
- for (String line : StringJustifier.left(text,
- LINE_SIZE - space.length())) {
- builder.append("i").append(space).append(prepend).append(line)
- .append("\r\n");
- prepend = prependOthers;
+ for (String line : text.split("\n")) {
+ for (String subline : StringUtils.justifyText(line, LINE_SIZE
+ - space.length(), Alignment.LEFT)) {
+ builder.append(menu ? "i" : "") //
+ .append(space) //
+ .append(prepend) //
+ .append(subline) //
+ .append("\r\n");
+ prepend = prependOthers;
+ }
}
}
}