Use web package from utils.
[Sone.git] / src / main / java / net / pterodactylus / sone / template / ParserFilter.java
index 632af02..3494c21 100644 (file)
@@ -21,6 +21,8 @@ import java.io.IOException;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import net.pterodactylus.sone.core.Core;
@@ -33,7 +35,7 @@ import net.pterodactylus.sone.text.PostPart;
 import net.pterodactylus.sone.text.SonePart;
 import net.pterodactylus.sone.text.SoneTextParser;
 import net.pterodactylus.sone.text.SoneTextParserContext;
-import net.pterodactylus.sone.web.page.Page.Request;
+import net.pterodactylus.sone.web.page.FreenetRequest;
 import net.pterodactylus.util.template.Filter;
 import net.pterodactylus.util.template.Template;
 import net.pterodactylus.util.template.TemplateContext;
@@ -51,7 +53,7 @@ public class ParserFilter implements Filter {
        private final Core core;
 
        /** The link parser. */
-       private final SoneTextParser textParser;
+       private final SoneTextParser soneTextParser;
 
        /** The template context factory. */
        private final TemplateContextFactory templateContextFactory;
@@ -70,11 +72,13 @@ public class ParserFilter implements Filter {
         *            The core
         * @param templateContextFactory
         *            The context factory for rendering the parts
+        * @param soneTextParser
+        *            The Sone text parser
         */
-       public ParserFilter(Core core, TemplateContextFactory templateContextFactory) {
+       public ParserFilter(Core core, TemplateContextFactory templateContextFactory, SoneTextParser soneTextParser) {
                this.core = core;
                this.templateContextFactory = templateContextFactory;
-               textParser = new SoneTextParser(core);
+               this.soneTextParser = soneTextParser;
        }
 
        /**
@@ -83,6 +87,19 @@ public class ParserFilter implements Filter {
        @Override
        public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
                String text = String.valueOf(data);
+               int length = -1;
+               try {
+                       length = Integer.parseInt(parameters.get("length"));
+               } catch (NumberFormatException nfe1) {
+                       /* ignore. */
+               }
+               if ((length == -1) && (parameters.get("length") != null)) {
+                       try {
+                               length = Integer.parseInt(String.valueOf(templateContext.get(parameters.get("length"))));
+                       } catch (NumberFormatException nfe1) {
+                               /* ignore. */
+                       }
+               }
                String soneKey = parameters.get("sone");
                if (soneKey == null) {
                        soneKey = "sone";
@@ -91,11 +108,35 @@ public class ParserFilter implements Filter {
                if (sone == null) {
                        sone = core.getSone(soneKey, false);
                }
-               Request request = (Request) templateContext.get("request");
+               FreenetRequest request = (FreenetRequest) templateContext.get("request");
                SoneTextParserContext context = new SoneTextParserContext(request, sone);
                StringWriter parsedTextWriter = new StringWriter();
                try {
-                       render(parsedTextWriter, textParser.parse(context, new StringReader(text)));
+                       Iterable<Part> parts = soneTextParser.parse(context, new StringReader(text));
+                       if (length > -1) {
+                               List<Part> shortenedParts = new ArrayList<Part>();
+                               for (Part part : parts) {
+                                       if (part instanceof PlainTextPart) {
+                                               String longText = ((PlainTextPart) part).getText();
+                                               if (length >= longText.length()) {
+                                                       shortenedParts.add(part);
+                                               } else {
+                                                       shortenedParts.add(new PlainTextPart(longText.substring(0, length) + "…"));
+                                               }
+                                               length -= longText.length();
+                                       } else if (part instanceof LinkPart) {
+                                               shortenedParts.add(part);
+                                               length -= ((LinkPart) part).getText().length();
+                                       } else {
+                                               shortenedParts.add(part);
+                                       }
+                                       if (length <= 0) {
+                                               break;
+                                       }
+                               }
+                               parts = shortenedParts;
+                       }
+                       render(parsedTextWriter, parts);
                } catch (IOException ioe1) {
                        /* no exceptions in a StringReader or StringWriter, ignore. */
                }
@@ -245,10 +286,11 @@ public class ParserFilter implements Filter {
         * @return The excerpt of the text
         */
        private static String getExcerpt(String text, int length) {
-               if (text.length() > length) {
-                       return text.substring(0, length) + "…";
+               String filteredText = text.replaceAll("(\r\n)+", "\r\n").replaceAll("\n+", "\n").replace("\r\n", " ").replace('\n', ' ');
+               if (filteredText.length() > length) {
+                       return filteredText.substring(0, length) + "…";
                }
-               return text;
+               return filteredText;
        }
 
 }