Use Sone text parser from web interface in parser filter.
[Sone.git] / src / main / java / net / pterodactylus / sone / template / ParserFilter.java
index 02d12f0..26afe2e 100644 (file)
@@ -51,7 +51,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 +70,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;
        }
 
        /**
@@ -95,7 +97,7 @@ public class ParserFilter implements Filter {
                SoneTextParserContext context = new SoneTextParserContext(request, sone);
                StringWriter parsedTextWriter = new StringWriter();
                try {
-                       render(parsedTextWriter, textParser.parse(context, new StringReader(text)));
+                       render(parsedTextWriter, soneTextParser.parse(context, new StringReader(text)));
                } catch (IOException ioe1) {
                        /* no exceptions in a StringReader or StringWriter, ignore. */
                }
@@ -106,42 +108,121 @@ public class ParserFilter implements Filter {
        // PRIVATE METHODS
        //
 
-       private void render(Writer writer, Iterable<Part> parts) throws IOException {
+       /**
+        * Renders the given parts.
+        *
+        * @param writer
+        *            The writer to render the parts to
+        * @param parts
+        *            The parts to render
+        */
+       private void render(Writer writer, Iterable<Part> parts) {
                for (Part part : parts) {
                        render(writer, part);
                }
        }
 
-       private void render(Writer writer, Part part) throws IOException {
+       /**
+        * Renders the given part.
+        *
+        * @param writer
+        *            The writer to render the part to
+        * @param part
+        *            The part to render
+        */
+       @SuppressWarnings("unchecked")
+       private void render(Writer writer, Part part) {
                if (part instanceof PlainTextPart) {
                        render(writer, (PlainTextPart) part);
                } else if (part instanceof FreenetLinkPart) {
                        render(writer, (FreenetLinkPart) part);
+               } else if (part instanceof LinkPart) {
+                       render(writer, (LinkPart) part);
+               } else if (part instanceof SonePart) {
+                       render(writer, (SonePart) part);
+               } else if (part instanceof PostPart) {
+                       render(writer, (PostPart) part);
+               } else if (part instanceof Iterable<?>) {
+                       render(writer, (Iterable<Part>) part);
                }
        }
 
-       private void render(Writer writer, PlainTextPart plainTextPart) throws IOException {
+       /**
+        * Renders the given plain-text part.
+        *
+        * @param writer
+        *            The writer to render the part to
+        * @param plainTextPart
+        *            The part to render
+        */
+       private void render(Writer writer, PlainTextPart plainTextPart) {
                TemplateContext templateContext = templateContextFactory.createTemplateContext();
                templateContext.set("text", plainTextPart.getText());
                plainTextTemplate.render(templateContext, writer);
        }
 
-       private void render(Writer writer, FreenetLinkPart freenetLinkPart) throws IOException {
+       /**
+        * Renders the given freenet link part.
+        *
+        * @param writer
+        *            The writer to render the part to
+        * @param freenetLinkPart
+        *            The part to render
+        */
+       private void render(Writer writer, FreenetLinkPart freenetLinkPart) {
                renderLink(writer, "/" + freenetLinkPart.getLink(), freenetLinkPart.getText(), freenetLinkPart.getTitle(), freenetLinkPart.isTrusted() ? "freenet-trusted" : "freenet");
        }
 
-       private void render(Writer writer, LinkPart linkPart) throws IOException {
+       /**
+        * Renders the given link part.
+        *
+        * @param writer
+        *            The writer to render the part to
+        * @param linkPart
+        *            The part to render
+        */
+       private void render(Writer writer, LinkPart linkPart) {
                renderLink(writer, "/?_CHECKED_HTTP_=" + linkPart.getLink(), linkPart.getText(), linkPart.getTitle(), "internet");
        }
 
-       private void render(Writer writer, SonePart sonePart) throws IOException {
+       /**
+        * Renders the given Sone part.
+        *
+        * @param writer
+        *            The writer to render the part to
+        * @param sonePart
+        *            The part to render
+        */
+       private void render(Writer writer, SonePart sonePart) {
                renderLink(writer, "viewSone.html?sone=" + sonePart.getSone().getId(), SoneAccessor.getNiceName(sonePart.getSone()), SoneAccessor.getNiceName(sonePart.getSone()), "in-sone");
        }
 
-       private void render(Writer writer, PostPart postPart) throws IOException {
+       /**
+        * Renders the given post part.
+        *
+        * @param writer
+        *            The writer to render the part to
+        * @param postPart
+        *            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");
        }
 
+       /**
+        * Renders the given link.
+        *
+        * @param writer
+        *            The writer to render the link to
+        * @param link
+        *            The link to render
+        * @param text
+        *            The text of the link
+        * @param title
+        *            The title of the link
+        * @param cssClass
+        *            The CSS class of the link
+        */
        private void renderLink(Writer writer, String link, String text, String title, String cssClass) {
                TemplateContext templateContext = templateContextFactory.createTemplateContext();
                templateContext.set("cssClass", cssClass);
@@ -155,6 +236,16 @@ public class ParserFilter implements Filter {
        // STATIC METHODS
        //
 
+       /**
+        * Returns up to {@code length} characters from the given text, appending
+        * “…” if the text is longer.
+        *
+        * @param text
+        *            The text to get an excerpt from
+        * @param length
+        *            The maximum length of the excerpt (without the ellipsis)
+        * @return The excerpt of the text
+        */
        private static String getExcerpt(String text, int length) {
                if (text.length() > length) {
                        return text.substring(0, length) + "…";