org.bsc.maven.plugin.confluence.PegdownParse.java Source code

Java tutorial

Introduction

Here is the source code for org.bsc.maven.plugin.confluence.PegdownParse.java

Source

package org.bsc.maven.plugin.confluence;

import org.bsc.markdown.ToConfluenceSerializer;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.pegdown.PegDownProcessor;
import org.pegdown.ast.AnchorLinkNode;
import org.pegdown.ast.ExpLinkNode;
import org.pegdown.ast.Node;
import org.pegdown.ast.RefLinkNode;
import org.pegdown.ast.RootNode;
import org.pegdown.ast.StrongEmphSuperNode;
import org.pegdown.ast.VerbatimNode;
import org.pegdown.ast.Visitor;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/*
public static final int NONE = 0;
public static final int SMARTS = 1;
public static final int QUOTES = 2;
public static final int SMARTYPANTS = 3;
public static final int ABBREVIATIONS = 4;
public static final int HARDWRAPS = 8;
public static final int AUTOLINKS = 16;
public static final int TABLES = 32;
public static final int DEFINITIONS = 64;
public static final int FENCED_CODE_BLOCKS = 128;
public static final int WIKILINKS = 256;
public static final int STRIKETHROUGH = 512;
public static final int ANCHORLINKS = 768;
public static final int ALL = 65535;
public static final int SUPPRESS_HTML_BLOCKS = 65536;
public static final int SUPPRESS_INLINE_HTML = 131072;
public static final int SUPPRESS_ALL_HTML = 196608;
*/
/**
 *
 * @author softphone
 */
public abstract class PegdownParse {

    interface F<P extends Node> {
        void f(P node);
    }

    //private static final String FILE0 = "TEST1.md";

    protected char[] loadResource(String name) throws IOException {

        final ClassLoader cl = PegdownParse.class.getClassLoader();

        final java.io.InputStream is = cl.getResourceAsStream(name);
        try {

            java.io.CharArrayWriter caw = new java.io.CharArrayWriter();

            for (int c = is.read(); c != -1; c = is.read()) {
                caw.write(c);
            }

            return caw.toCharArray();

        } finally {
            IOUtils.closeQuietly(is);
        }

    }

    protected abstract char[] loadResource() throws IOException;

    static class IfContext {

        static final IfContext IsTrue = new IfContext(true);
        static final IfContext IsFalse = new IfContext(false);

        final boolean condition;

        public IfContext(boolean condition) {
            this.condition = condition;
        }

        <T extends Node> IfContext elseIf(Object n, Class<T> clazz, F<T> cb) {
            return (condition) ? IsTrue : iF(n, clazz, cb);
        }

        static <T extends Node> IfContext iF(Object n, Class<T> clazz, F<T> cb) {

            if (clazz.isInstance(n)) {

                cb.f(clazz.cast(n));
                return IsTrue;
            }
            return IsFalse;
        }

    }

    final F<StrongEmphSuperNode> sesn = new F<StrongEmphSuperNode>() {

        @Override
        public void f(StrongEmphSuperNode node) {
            System.out.printf(" chars=[%s], strong=%b, closed=%b", node.getChars(), node.isStrong(),
                    node.isClosed());

        }

    };

    final F<ExpLinkNode> eln = new F<ExpLinkNode>() {

        @Override
        public void f(ExpLinkNode node) {
            System.out.printf(" title=[%s], url=[%s]", node.title, node.url);

        }

    };
    final F<AnchorLinkNode> aln = new F<AnchorLinkNode>() {

        @Override
        public void f(AnchorLinkNode node) {
            System.out.printf(" name=[%s], text=[%s]", node.getName(), node.getText());

        }

    };
    final F<VerbatimNode> vln = new F<VerbatimNode>() {

        @Override
        public void f(VerbatimNode node) {
            System.out.printf(" text=[%s], type=[%s]", node.getText(), node.getType());

        }

    };
    final F<RefLinkNode> rln = new F<RefLinkNode>() {

        @Override
        public void f(RefLinkNode node) {
            System.out.printf(" separatorSpace=[%s]", node.separatorSpace);

            if (node.referenceKey != null) {
                System.out.println();
                node.referenceKey.accept(newVisitor(4));
            }
        }

    };

    Visitor newVisitor(final int start_indent) {
        final ClassLoader cl = PegdownParse.class.getClassLoader();

        final InvocationHandler handler = new InvocationHandler() {

            int indent;
            {
                this.indent = start_indent;
            }

            protected void visitChildren(Object proxy, Node node) {
                for (Node child : node.getChildren()) {
                    child.accept((Visitor) proxy);
                }
            }

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                for (int i = 0; i < indent; ++i)
                    System.out.print('\t');
                final Object n = args[0];

                System.out.printf("[%s]", n);
                IfContext.iF(n, StrongEmphSuperNode.class, sesn).elseIf(n, ExpLinkNode.class, eln)
                        .elseIf(n, AnchorLinkNode.class, aln).elseIf(n, VerbatimNode.class, vln)
                        .elseIf(n, RefLinkNode.class, rln)

                ;
                System.out.println();

                if (n instanceof Node) {
                    ++indent;
                    visitChildren(proxy, (Node) args[0]);
                    --indent;
                }
                return null;
            }

        };

        final Visitor proxy = (Visitor) Proxy.newProxyInstance(cl, new Class[] { Visitor.class }, handler);

        return proxy;

    }

    @Test
    public void parseTest() throws IOException {

        final PegDownProcessor p = new PegDownProcessor(ToConfluenceSerializer.extensions());

        final RootNode root = p.parseMarkdown(loadResource());

        root.accept(newVisitor(0));
    }

    @Test
    public void serializerTest() throws IOException {

        final PegDownProcessor p = new PegDownProcessor(ToConfluenceSerializer.extensions());

        final RootNode root = p.parseMarkdown(loadResource());

        ToConfluenceSerializer ser = new ToConfluenceSerializer() {

            @Override
            protected void notImplementedYet(Node node) {
                throw new UnsupportedOperationException(
                        String.format("Node [%s] not supported yet. ", node.getClass().getSimpleName()));
            }

            @Override
            protected String getHomePageTitle() {
                return "Parent Page Title";
            }

        };

        root.accept(ser);

        System.out.println(ser.toString());

    }
}