Kawai Wiki

Rev

Rev 202 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.kawai.tag.kcode;

import java.util.Iterator;
import java.util.Map;

import javax.servlet.jsp.PageContext;

import org.mentaregex.Regex;

/**
 * KCode class Code.
 *
 * @author Sergio Oliveira
 *
 */

public class Code implements KCode {

    /**
     * {@inheritDoc}.
     */

    @Override
    public boolean hasBody() {
        return true;
    }

    /**
     * {@inheritDoc}
     */

    @Override
    public String getTag() {
        return "code";
    }

    /**
     * {@inheritDoc}
     */

    @Override
    public String process(PageContext context, Map<String, String> attrs, String html) {

        StringBuilder sb = new StringBuilder(1024 * 10);

        boolean indent = false;

        if (attrs.containsKey("ul")) {
            indent = attrs.get("ul").equals("true");
        }

        if (indent) sb.append("<ul>");
        sb.append(buildOpenShTag(attrs));
        sb.append(escapeAngleBrackets(html));
        sb.append("</pre>");
        if (indent) sb.append("</ul>");
       
        boolean noBR = true;
        if (attrs.containsKey("noBR")) {
                noBR = attrs.get("noBR").equals("true");
        }
        if (!noBR) sb.append("<br/>");
        return sb.toString();
    }

    /**
     * Escapes the angle brackets.
     * @param html String
     * @return String
     */

    public static String escapeAngleBrackets(String html) {
        String s = Regex.sub(html, "s/\\</\\&lt\\;/g");
        s = Regex.sub(s, "s/\\>/\\&gt\\;/g");
        return s;
    }

    /**
     * Builds the tag for syntax highlight.
     * @param map Map<String, String>
     * @return String
     */

    private static String buildOpenShTag(Map<String, String> map) {
        StringBuilder sb = new StringBuilder(256);
        sb.append("<pre class=\"");
        if (map.containsKey("brush")) {
            sb.append("brush: ").append(map.get("brush")).append(";");
        } else {
            sb.append("brush: java;");
        }
        map.remove("brush");
        if (map.containsKey("highlight")) {
            sb.append(" highlight: [").append(map.get("highlight")).append("];");
        }
        map.remove("highlight");
        Iterator<String> iter = map.keySet().iterator();
        while (iter.hasNext()) {
            String name = iter.next();
            if (name.equals("ul")) continue;
            String value = map.get(name);
            sb.append(" ").append(name).append(": ").append(value).append(";");
        }
        sb.append("\">");
        return sb.toString();
    }
}