Bug fixes + rework of BasicSupport
[gofetch.git] / src / be / nikiroo / gofetch / output / Gopher.java
index 8cce4a571d1c5c11f51b0e52bd75eac18588f770..12a420cd84482b988cde4775c6b29f3962fe574b 100644 (file)
@@ -1,28 +1,35 @@
 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.gofetch.support.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
@@ -31,101 +38,158 @@ public class Gopher extends Output {
        }
 
        @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);
 
-               builder.append("i\r\n");
+               if (comment.getAuthor() != null
+                               && !comment.getAuthor().trim().isEmpty()) {
+                       appendLeft(builder, menu, "(" + comment.getAuthor() + ")", "   ",
+                                       "   ", space);
+                       builder.append((menu ? "i" : "") + "\r\n");
+               }
+
+               for (String line : comment.getContentLines()) {
+                       int depth = 0;
+                       while (line.length() > depth && line.charAt(depth) == '>') {
+                               depth++;
+                       }
+                       line = line.substring(depth).trim();
+
+                       String prep = "   ";
+                       for (int i = 0; i < depth; i++) {
+                               prep += ">";
+                       }
 
-               appendLeft(builder, comment.getContent(), "   ", "   ", space);
+                       if (depth > 0) {
+                               prep += " ";
+                       }
+
+                       appendLeft(builder, menu, line, prep, prep, space);
+               }
 
-               builder.append("i\r\n");
+               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(), "    ");
+                       builder.append("\r\n");
                } 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");
-
-               appendLeft(builder, story.getContent(), "", "", "    ");
+                       appendJustified(builder, true, story.getDetails(), "  ");
+                       builder.append("i\r\n");
 
-               builder.append("i\r\n");
+                       String content = story.getContent();
+                       if (!content.isEmpty()) {
+                               appendJustified(builder, true, content, "    ");
+                               builder.append("i\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;
+                       }
                }
        }
 }