de.micromata.genome.gwiki.page.impl.wiki.macros.GWikiCodeMacro.java Source code

Java tutorial

Introduction

Here is the source code for de.micromata.genome.gwiki.page.impl.wiki.macros.GWikiCodeMacro.java

Source

//
// Copyright (C) 2010-2016 Roger Rene Kommer & Micromata GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package de.micromata.genome.gwiki.page.impl.wiki.macros;

import java.io.IOException;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import com.uwyn.jhighlight.renderer.GroovyXhtmlRenderer;
import com.uwyn.jhighlight.renderer.JavaXhtmlRenderer;
import com.uwyn.jhighlight.renderer.XhtmlRenderer;
import com.uwyn.jhighlight.renderer.XmlXhtmlRenderer;

import de.micromata.genome.gwiki.page.GWikiContext;
import de.micromata.genome.gwiki.page.RenderModes;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiBodyMacro;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiMacroBean;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiMacroClassFactory;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiMacroFactory;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiMacroRenderFlags;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiMacroRte;
import de.micromata.genome.gwiki.page.impl.wiki.GWikiRuntimeMacro;
import de.micromata.genome.gwiki.page.impl.wiki.MacroAttributes;
import de.micromata.genome.gwiki.page.impl.wiki.MacroInfo;
import de.micromata.genome.gwiki.page.impl.wiki.MacroInfoParam;
import de.micromata.genome.gwiki.utils.WebUtils;
import de.micromata.genome.gwiki.utils.html.Html2WikiTransformInfo;

/**
 * GWiki macro code.
 * 
 * @author Roger Rene Kommer (r.kommer@micromata.de)
 * 
 */
@MacroInfo(info = "The macro code wrap a text as source code.", params = {
        @MacroInfoParam(name = "title", info = "Title for the code"),
        @MacroInfoParam(name = "lang", defaultValue = "java", info = "Code language", enumValues = { "wiki",
                "markup", "groovy", "java", "xml", "css", "javascript", "json", "c", "cpp", "objectivec", "pascal",
                "perl", "php", "python", "scala", "sql", "tcl" }) }, renderFlags = {
                        GWikiMacroRenderFlags.NoWrapWithP, GWikiMacroRenderFlags.NewLineBeforeEnd,
                        GWikiMacroRenderFlags.NewLineBlock, GWikiMacroRenderFlags.TrimTextContent })
public class GWikiCodeMacro extends GWikiMacroBean implements GWikiBodyMacro, GWikiRuntimeMacro, GWikiMacroRte {

    private static final long serialVersionUID = -5140863862389680264L;

    private String defaultValue;

    private String title = "";

    private String lang = "java";

    //  private static Html2WikiTransformInfo transformInfo = new Html2WikiTransformInfo("pre",
    //      CommonMatchers.and(SaxElementMatchers.nameMatcher("pre"),
    //          SaxElementMatchers.attribute("class", StringMatchers.containsString("wikiCode"))),
    //      "code", GWikiCodeMacro.class);

    public static GWikiMacroFactory getFactory() {
        return new GWikiMacroClassFactory(GWikiCodeMacro.class);
    }

    public GWikiCodeMacro() {
        setRenderModesFromAnnot();
    }

    @Override
    public boolean renderImpl(GWikiContext ctx, MacroAttributes attrs) {
        if (RenderModes.ForIndex.isSet(ctx.getRenderMode()) == true) {
            ctx.append(WebUtils.escapeHtml(attrs.getBody()));
            return true;
        }
        String body = attrs.getBody();
        body = StringUtils.trim(body);
        String clang = determineLang(body);
        if (RenderModes.ForRichTextEdit.isSet(ctx.getRenderMode()) == true) {
            ctx.append("<pre");
            if (StringUtils.isNotBlank(clang) == true) {
                ctx.append(" class='language-" + clang + "'");
            }
            ctx.append(" contenteditable='false'>");
            ctx.append(WebUtils.escapeHtml(body));
            ctx.append("</pre>");
            return true;

        }
        //      // TODO attributes rendering
        //      String body = attrs.getBody();
        //
        //      body = WebUtils.escapeHtml(body);
        //
        //      ctx.append("<pre class=\"wikiCode\"");
        //      Html2WikiTransformInfo.renderMacroArgs(ctx, attrs);
        //      ctx.append(">").append(body).append("</pre>");
        //      return true;
        //    }

        boolean forText = RenderModes.ForText.isSet(ctx.getRenderMode());

        ctx.append("<pre><code");

        if (StringUtils.isNotBlank(clang) == true) {
            ctx.append(" class='language-" + clang + "'");
        }
        if (forText == false) {
            body = StringEscapeUtils.escapeXml(body);
        }
        ctx.append(">").append(body).append("</code></pre>");

        return true;
    }

    private String determineLang(String body) {
        if (StringUtils.isNotBlank(lang) == true) {
            if (lang.equals("wiki") == true) {
                lang = "textile";
            }
            return lang;
        }
        if (body.trim().startsWith("<") == true) {
            return "xml";
        }
        return lang;
    }

    protected XhtmlRenderer getRenderer(String lang, String code) {
        if (StringUtils.isBlank(lang) == true) {
            if (code.trim().startsWith("<") == true) {
                lang = "xml";
            }
        }
        if (StringUtils.equals(lang, "java") == true) {
            return new JavaXhtmlRenderer();
        } else if (StringUtils.equals(lang, "groovy") == true) {
            return new GroovyXhtmlRenderer();
        } else if (StringUtils.equals(lang, "xml") == true || StringUtils.equals(lang, "html") == true) {
            return new XmlXhtmlRenderer();
        } else {
            return new JavaXhtmlRenderer();
        }

    }

    public String colorize(String lang, String code) {
        try {
            XhtmlRenderer renderer = getRenderer(lang, code);
            String ccode = renderer.highlight(title, code, "UTF-8", true);

            if (StringUtils.isEmpty(ccode)) {
                return "<pre>\n" + WebUtils.escapeHtml(code) + "</pre>\n";
            }
            int idx = ccode.indexOf("-->");
            if (idx != -1) {
                ccode = ccode.substring(idx + 3);
            }
            return ccode;
        } catch (IOException ex) {
            // throw new RuntimeIOException(ex);
        }
        return "<pre>\n" + WebUtils.escapeHtml(code) + "</pre>\n";
    }

    //  @Override
    //  public Html2WikiTransformInfo getTransformInfo()
    //  {
    //    return transformInfo;
    //  }

    public String getDefaultValue() {
        return defaultValue;
    }

    @Override
    public Html2WikiTransformInfo getTransformInfo() {
        return null;
    }

    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }

}