Create links to posts using an excerpt from the parsed post, not the raw text.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 7 Sep 2012 07:27:11 +0000 (09:27 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 7 Sep 2012 07:27:14 +0000 (09:27 +0200)
This resolves #282.

src/main/java/net/pterodactylus/sone/template/ParserFilter.java
src/main/java/net/pterodactylus/sone/text/LinkPart.java
src/main/java/net/pterodactylus/sone/text/Part.java
src/main/java/net/pterodactylus/sone/text/PartContainer.java
src/main/java/net/pterodactylus/sone/text/PlainTextPart.java
src/main/java/net/pterodactylus/sone/text/PostPart.java
src/main/java/net/pterodactylus/sone/text/SonePart.java

index 8302369..5f156f1 100644 (file)
@@ -60,10 +60,10 @@ public class ParserFilter implements Filter {
        private final TemplateContextFactory templateContextFactory;
 
        /** The template for {@link PlainTextPart}s. */
-       private final Template plainTextTemplate = TemplateParser.parse(new StringReader("<%text|html>"));
+       private static final Template plainTextTemplate = TemplateParser.parse(new StringReader("<%text|html>"));
 
        /** The template for {@link FreenetLinkPart}s. */
-       private final Template linkTemplate = TemplateParser.parse(new StringReader("<a class=\"<%cssClass|html>\" href=\"<%link|html>\" title=\"<%title|html>\"><%text|html></a>"));
+       private static final Template linkTemplate = TemplateParser.parse(new StringReader("<a class=\"<%cssClass|html>\" href=\"<%link|html>\" title=\"<%title|html>\"><%text|html></a>"));
 
        /**
         * Creates a new filter that runs its input through a {@link SoneTextParser}
@@ -241,7 +241,22 @@ public class ParserFilter implements Filter {
         *            The part to render
         */
        private void render(Writer writer, PostPart postPart) {
-               renderLink(writer, "viewPost.html?post=" + postPart.getPost().getId(), getExcerpt(postPart.getPost().getText(), 20), SoneAccessor.getNiceName(postPart.getPost().getSone()), "in-sone");
+               SoneTextParser parser = new SoneTextParser(core, core);
+               SoneTextParserContext parserContext = new SoneTextParserContext(null, postPart.getPost().getSone());
+               try {
+                       Iterable<Part> parts = parser.parse(parserContext, new StringReader(postPart.getPost().getText()));
+                       StringBuilder excerpt = new StringBuilder();
+                       for (Part part : parts) {
+                               excerpt.append(part.getText());
+                               if (excerpt.length() > 20) {
+                                       excerpt.setLength(20);
+                                       break;
+                               }
+                       }
+                       renderLink(writer, "viewPost.html?post=" + postPart.getPost().getId(), excerpt.toString(), SoneAccessor.getNiceName(postPart.getPost().getSone()), "in-sone");
+               } catch (IOException ioe1) {
+                       /* StringReader shouldn’t throw. */
+               }
        }
 
        /**
index 1b47080..202b9db 100644 (file)
@@ -77,21 +77,26 @@ public class LinkPart implements Part {
        }
 
        /**
-        * Returns the text of this part.
+        * Returns the title of this part.
         *
-        * @return The text of this part
+        * @return The title of this part
         */
-       public String getText() {
-               return text;
+       public String getTitle() {
+               return title;
        }
 
+       //
+       // PART METHODS
+       //
+
        /**
-        * Returns the title of this part.
+        * Returns the text of this part.
         *
-        * @return The title of this part
+        * @return The text of this part
         */
-       public String getTitle() {
-               return title;
+       @Override
+       public String getText() {
+               return text;
        }
 
 }
index 76e80ef..79c59dc 100644 (file)
@@ -26,6 +26,12 @@ package net.pterodactylus.sone.text;
  */
 public interface Part {
 
-       /* no methods. */
+       /**
+        * Returns the text contained in this part. This should return plain text
+        * without any format information.
+        *
+        * @return The plain text of this part
+        */
+       public String getText();
 
 }
index e456cd9..a8a7e85 100644 (file)
@@ -81,6 +81,22 @@ public class PartContainer implements Part, Iterable<Part> {
        }
 
        //
+       // PART METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String getText() {
+               StringBuilder partText = new StringBuilder();
+               for (Part part : parts) {
+                       partText.append(part.getText());
+               }
+               return partText.toString();
+       }
+
+       //
        // ITERABLE METHODS
        //
 
index 09c1fba..2c29ee2 100644 (file)
@@ -38,7 +38,7 @@ public class PlainTextPart implements Part {
        }
 
        //
-       // ACCESSORS
+       // PART METHODS
        //
 
        /**
@@ -46,6 +46,7 @@ public class PlainTextPart implements Part {
         *
         * @return The text of this part
         */
+       @Override
        public String getText() {
                return text;
        }
index c416c57..6241b7a 100644 (file)
@@ -52,4 +52,16 @@ public class PostPart implements Part {
                return post;
        }
 
+       //
+       // PART METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String getText() {
+               return post.getText();
+       }
+
 }
index 475c091..37f098b 100644 (file)
@@ -18,6 +18,7 @@
 package net.pterodactylus.sone.text;
 
 import net.pterodactylus.sone.data.Sone;
+import net.pterodactylus.sone.template.SoneAccessor;
 
 /**
  * {@link Part} implementation that stores a reference to a {@link Sone}.
@@ -52,4 +53,16 @@ public class SonePart implements Part {
                return sone;
        }
 
+       //
+       // PART METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String getText() {
+               return SoneAccessor.getNiceName(sone);
+       }
+
 }