org.pegdown.JshRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.pegdown.JshRenderer.java

Source

/**
 * markdown-converter
 *
 * @FeatureDomain                Converter
 * @author                       Michael Schreiner <michael.schreiner@your-it-fellow.de>
 * @category                     markdown-services
 * @copyright                    Copyright (c) 2016, Michael Schreiner
 * @license                      http://mozilla.org/MPL/2.0/ Mozilla Public License 2.0
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package org.pegdown;

import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JshRenderer {

    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(JshRenderer.class);

    protected HashMap<String, HashMap<String, String>> allTagStyles = new HashMap<>();
    protected int nextTocId = 1;
    protected JshConfig config;

    protected static Pattern regExpToggler = Pattern.compile("^(TOGGLER) *([-#_a-zA-Z,;0-9\\.]*?) *");
    protected static Pattern regExpTogglerAppend = Pattern
            .compile("^(TOGGLER\\.AFTER|TOGGLER\\.BEFORE) *([-#_a-zA-Z,;0-9\\.: ]*?) *");
    protected static Pattern regExpSplitter = Pattern.compile("([\\s\\S]*?)(:\\|:)(.*)([\\s\\S]*)");
    protected static Pattern regExpToc = Pattern.compile("^(TOC) *([-#_a-zA-Z,;0-9\\.]*?) *");
    protected static Pattern regExpRuleBoxStart = Pattern
            .compile("^(BOX\\.INFO|BOX\\.WARN|BOX\\.ALERT|BOX|CONTAINER|STYLE?) *([#-_a-zA-Z,;0-9\\.: ]*?) *");
    protected static Pattern regExpRuleBoxEnd = Pattern
            .compile("^/(BOX\\.INFO|BOX\\.WARN|BOX\\.ALERT|BOX|CONTAINER|STYLE?) *([#-_a-zA-Z,;0-9\\.: ]*?) *");

    public JshRenderer(JshConfig config) {
        this.config = config;
    }

    public String renderJshNode(JshNode node) {
        String res = "";
        String src = node.getText();

        Matcher matcher;

        matcher = regExpRuleBoxStart.matcher(src);
        if (matcher.matches() && matcher.group(1) != null) {
            res = renderExtendedMarkdownBoxStart(matcher.group(1), matcher.group(2));
            return res;
        }

        matcher = regExpRuleBoxEnd.matcher(src);
        if (matcher.matches() && matcher.group(1) != null) {
            res = renderExtendedMarkdownBoxEnd(matcher.group(1), matcher.group(2));
            return res;
        }

        matcher = regExpToggler.matcher(src);
        if (matcher.matches() && matcher.group(1) != null) {
            res = renderExtendedMarkdownToggler(matcher.group(1), matcher.group(2));
            return res;
        }
        matcher = regExpTogglerAppend.matcher(src);
        if (matcher.matches() && matcher.group(1) != null) {
            res = renderExtendedMarkdownTogglerAppend(matcher.group(1), matcher.group(2));
            return res;
        }

        matcher = regExpToc.matcher(src);
        if (matcher.matches() && matcher.group(1) != null) {
            res = renderExtendedMarkdownTOC(matcher.group(1), matcher.group(2));
            return res;
        }

        return res;
    }

    public String renderJshNodeSplitter1(JshNodeSplitter1 node) {
        return renderExtendedMarkdownSplitter1("splitter", "", node.getText());
    }

    public String renderJshNodeSplitter2(JshNodeSplitter2 node) {
        return renderExtendedMarkdownSplitter2("splitter", "", node.getText());
    }

    /*
     * services
     */
    public String genStyleClassesForTag(String tag) {
        HashMap<String, String> styles = allTagStyles.get(tag);
        if (MapUtils.isEmpty(styles)) {
            return "";
        }
        return StringUtils.join(styles.keySet(), " ");
    };

    public String genStyleClassAttrForTag(String tag) {
        String styleClasses = genStyleClassesForTag(tag);
        if (StringUtils.isEmpty(styleClasses)) {
            return "";
        }
        return " class=\"" + styleClasses + "\"";
    };

    public void initStylesClassesForTags(String prefix) {
        String[] tags = new String[] { "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "img", "a", "p", "table",
                "tr", "td", "th", "tbody", "thead", "br", "li", "ul", "ol", "container", "code", "box", "box-ue",
                "box-container", "infobox", "infobox-ue", "infobox-container", "warnbox", "warnbox-ue",
                "warnbox-container", "alertbox", "alertbox-ue", "alertbox-container", "togglerparent", "splitter1",
                "splitter2" };
        for (java.lang.String tag : tags) {
            String style = (StringUtils.isNotEmpty(prefix) ? prefix : "") + "md-" + tag;
            HashMap<String, String> tagStyles = allTagStyles.get(tag);
            if (MapUtils.isEmpty(tagStyles)) {
                tagStyles = new HashMap<String, String>();
            }
            tagStyles.put(style, style);
            allTagStyles.put(tag, tagStyles);
        }
    };

    public String renderExtendedMarkdownBoxhtmlStart(String type, String param) {
        return "<div class=\"" + genStyleClassesForTag(type + "box") + "\">" + "<div class=\""
                + genStyleClassesForTag(type + "box-ue") + "\">" + param + "</div>" + "<div class=\""
                + genStyleClassesForTag(type + "box-container") + "\">";
    };

    public String renderExtendedMarkdownBoxStart(String type, String param) {
        String res = "";
        if ("box".equalsIgnoreCase(type)) {
            res = "<div class=\"" + genStyleClassesForTag("box") + " " + param + "\">";
        } else if ("container".equalsIgnoreCase(type)) {
            res = "<div class=\"" + genStyleClassesForTag("container") + " md-container-" + param
                    + "\" id=\"md-container-" + param + "\">";
        } else if ("box.info".equalsIgnoreCase(type)) {
            res = renderExtendedMarkdownBoxhtmlStart("info", param);
        } else if ("box.warn".equalsIgnoreCase(type)) {
            res = renderExtendedMarkdownBoxhtmlStart("warn", param);
        } else if ("box.alert".equalsIgnoreCase(type)) {
            res = renderExtendedMarkdownBoxhtmlStart("alert", param);
        } else if ("style".equalsIgnoreCase(type) && StringUtils.isNotEmpty(param)) {
            // do set style for next elements

            // split params elements:styles
            String[] params = param.split(":");
            String[] tags = new String[] {};
            String[] styles = new String[] {};
            if (params.length > 0) {
                tags = params[0].split(" ");
                if (params.length > 1) {
                    styles = params[1].split(" ");
                }
            }
            // set styles for all tags
            for (String tag : tags) {
                HashMap<String, String> tagStyles = allTagStyles.get(tag);
                if (MapUtils.isEmpty(tagStyles)) {
                    tagStyles = new HashMap<>();
                }
                for (String style : styles) {
                    tagStyles.put(style, style);
                }
                allTagStyles.put(tag, tagStyles);
            }
        }

        return res;
    };

    public String renderExtendedMarkdownBoxEnd(String type, String param) {
        String res = "";

        if ("box".equalsIgnoreCase(type)) {
            res = "</div>";
        } else if ("box.info".equalsIgnoreCase(type) || "box.alert".equalsIgnoreCase(type)
                || "box.warn".equalsIgnoreCase(type)) {
            res = "</div></div>";
        } else if ("container".equalsIgnoreCase(type)) {
            res = "</div>";
        } else if ("style".equalsIgnoreCase(type) && StringUtils.isNotEmpty(param)) {
            // do reset style for next elements
            // split params elements:styles
            String[] params = param.split(":");
            String[] tags = new String[] {};
            String[] styles = new String[] {};
            if (params.length > 0) {
                tags = params[0].split(" ");
                if (params.length > 1) {
                    styles = params[1].split(" ");
                }
            }
            // reset styles for all tags
            for (String tag : tags) {
                for (String style : styles) {
                    if (allTagStyles.containsKey(tag) && allTagStyles.get(tag).containsKey(style)) {
                        allTagStyles.get(tag).remove(style);
                    }
                }
            }
        }
        return res;
    };

    public String renderExtendedMarkdownToggler(String type, String attr) {
        String res = "";
        String[] params = (StringUtils.isNotEmpty(attr) ? attr : "").split(",");
        String togglerType = "icon";
        String id = null;
        if (params.length > 0) {
            id = params[0].replaceAll(" ", "");
            if (params.length > 1) {
                togglerType = params[1];
            }
        }

        if ("toggler".equalsIgnoreCase(type) && StringUtils.isNotEmpty(id)) {
            res = "<div class=\"" + genStyleClassesForTag("togglerparent") + " md-togglerparent-" + id
                    + "\" id=\"md-togglerparent-" + id + "\"></div>" + "<script>" + config.getAppBaseVarName()
                    + ".get(\"UIToggler\").appendToggler(\".md-togglerparent-" + id + "\", \".md-container-" + id
                    + "\", \"" + togglerType + "\");</script>";
        }
        return res;
    };

    public String renderExtendedMarkdownTogglerAppend(String type, String attr) {
        String res = "";
        String[] params = (StringUtils.isNotEmpty(attr) ? attr : "").split(",");
        String togglerType = "icon";
        String[] tags = new String[] {};
        String[] styles = new String[] {};
        boolean flgInsertBefore = (type.equalsIgnoreCase("TOGGLER.BEFORE"));
        if (params.length > 0) {
            if (params.length > 1) {
                togglerType = params[1];
            }

            // split params elements:styles
            String[] filter = params[0].replaceAll(" ", "").split(":");
            if (filter.length > 0) {
                tags = filter[0].split(" ");
                if (filter.length > 1) {
                    styles = filter[1].split(" ");
                }
            }
            for (String tag : tags) {
                for (String style : styles) {
                    res = "<script>" + config.getAppBaseVarName()
                            + ".get(\"UIToggler\").appendTogglerForElements(\"" + tag + "." + style + "\", \""
                            + togglerType + "\", " + flgInsertBefore + ");</script>";
                }
            }
        }

        return res;
    };

    public String renderExtendedMarkdownTOC(String type, String attr) {
        String res = "";
        String[] params = (StringUtils.isNotEmpty(attr) ? attr : "").split(",");
        String togglerType = "icon";
        String id;
        if (params.length > 0) {
            id = params[0].replaceAll(" ", "");
            if (params.length > 1) {
                togglerType = params[1];
            }
        }
        if ("toc".equalsIgnoreCase(type)) {
            String tocId = "jsh-md-toc-container-" + nextTocId,
                    tocElement = config.getAppBaseVarName() + ".$(\"div." + tocId + "\")",
                    srcElement = tocElement + ".parents(\"div\")", settings = "undefined";
            res = "<div class=\"jsh-md-toc-container " + tocId + "\" id=\"" + tocId + "\"></div>" + "<script>"
                    + config.getAppBaseVarName() + ".get(\"Renderer\").addTOCForBlock(" + tocElement + ", "
                    + srcElement + ", " + settings + ");</script>";
        }
        nextTocId++;
        return res;
    };

    public String renderExtendedMarkdownSplitter(String type, String attr, String first, String second) {
        return "<label class=\"" + genStyleClassesForTag("splitter1") + "\">" + first + "</label>"
                + "<span class=\"" + genStyleClassesForTag("splitter2") + "\">" + second + "</span>";
    };

    public String renderExtendedMarkdownSplitter1(String type, String attr, String first) {
        return "<label class=\"" + genStyleClassesForTag("splitter1") + "\">" + first + "</label>";
    };

    public String renderExtendedMarkdownSplitter2(String type, String attr, String second) {
        return "<span class=\"" + genStyleClassesForTag("splitter2") + "\">" + second + "</span>";
    };
}