X-Git-Url: http://secure.phpeclipse.com diff --git a/archive/org.plog4u.wiki/src/org/plog4u/wiki/macro/CodeMacro.java b/archive/org.plog4u.wiki/src/org/plog4u/wiki/macro/CodeMacro.java new file mode 100644 index 0000000..50a9889 --- /dev/null +++ b/archive/org.plog4u.wiki/src/org/plog4u/wiki/macro/CodeMacro.java @@ -0,0 +1,143 @@ +/* + * This file is part of "SnipSnap Radeox Rendering Engine". + * + * Copyright (c) 2002 Stephan J. Schmidt, Matthias L. Jugel All Rights Reserved. + * + * Please visit http://radeox.org/ for updates and contact. + * + * --LICENSE NOTICE-- This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser + * General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any + * later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --LICENSE NOTICE-- + */ + +package org.plog4u.wiki.macro; + +import java.io.IOException; +import java.io.Writer; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle; + + +//import org.apache.commons.logging.Log; +//import org.apache.commons.logging.LogFactory; +import org.plog4u.wiki.filter.ICachableMacro; +import org.plog4u.wiki.filter.INoParserBodyFilterMacro; +import org.plog4u.wiki.macro.code.AbstractCPPBasedCodeFilter; +import org.radeox.api.engine.context.InitialRenderContext; +import org.radeox.api.engine.context.RenderContext; +import org.radeox.filter.context.BaseFilterContext; +import org.radeox.filter.context.FilterContext; +import org.radeox.macro.LocalePreserved; +import org.radeox.macro.code.SourceCodeFormatter; +import org.radeox.macro.parameter.MacroParameter; +import org.radeox.util.Encoder; +import org.radeox.util.Service; + +/* + * Macro for displaying programming language source code. CodeMacro knows about different source code formatters which can be + * plugged into radeox to display more languages. CodeMacro displays Java, Ruby or SQL code. + * + * @author stephan @team sonicteam + * + */ + +public class CodeMacro extends LocalePreserved implements INoParserBodyFilterMacro, ICachableMacro { +// private static Log log = LogFactory.getLog(CodeMacro.class); + + private Map formatters; + private FilterContext nullContext = new BaseFilterContext(); + + private String start; + private String end; + + private String[] paramDescription = { "?1: syntax highlighter to use, defaults to java" }; + + public String[] getParamDescription() { + return paramDescription; + } + + public String getLocaleKey() { + return "macro.code"; + } + + public void setInitialContext(InitialRenderContext context) { + super.setInitialContext(context); + Locale outputLocale = (Locale) context.get(RenderContext.OUTPUT_LOCALE); + String outputName = (String) context.get(RenderContext.OUTPUT_BUNDLE_NAME); + ResourceBundle outputMessages = ResourceBundle.getBundle(outputName, outputLocale); + + start = outputMessages.getString(getLocaleKey() + ".start"); + end = outputMessages.getString(getLocaleKey() + ".end"); + } + + public CodeMacro() { + formatters = new HashMap(); + + Iterator formatterIt = Service.providers(SourceCodeFormatter.class); + while (formatterIt.hasNext()) { + try { + SourceCodeFormatter formatter = (SourceCodeFormatter) formatterIt.next(); + String name = formatter.getName(); + if (formatters.containsKey(name)) { + SourceCodeFormatter existing = (SourceCodeFormatter) formatters.get(name); + if (existing.getPriority() < formatter.getPriority()) { + formatters.put(name, formatter); +// log.debug("Replacing formatter: " + formatter.getClass() + " (" + name + ")"); + } + } else { + formatters.put(name, formatter); +// log.debug("Loaded formatter: " + formatter.getClass() + " (" + name + ")"); + } + } catch (Exception e) { +// log.warn("CodeMacro: unable to load code formatter", e); + } + } + + addSpecial('['); + addSpecial(']'); + addSpecial('{'); + addSpecial('}'); + addSpecial('*'); + addSpecial('-'); + addSpecial('\\'); + } + + public void execute(Writer writer, MacroParameter params) throws IllegalArgumentException, IOException { + + SourceCodeFormatter formatter = null; + String result; + if (params.getLength() == 0 || !formatters.containsKey(params.get("0"))) { + formatter = (SourceCodeFormatter) formatters.get(initialContext.get(RenderContext.DEFAULT_FORMATTER)); + if (null == formatter) { + System.err.println("Formatter not found."); + formatter = (SourceCodeFormatter) formatters.get("java"); + result = formatter.filter(params.getContent(), nullContext); + } else if (formatter instanceof AbstractCPPBasedCodeFilter) { + result = formatter.filter(params.getContent(), nullContext); + } else { + result = formatter.filter(Encoder.escape(params.getContent()), nullContext); + } + } else { + formatter = (SourceCodeFormatter) formatters.get(params.get("0")); + if (formatter instanceof AbstractCPPBasedCodeFilter) { + result = formatter.filter(params.getContent(), nullContext); + } else { + result = formatter.filter(Encoder.escape(params.getContent()), nullContext); + } + } + + writer.write(start); + writer.write(replace(result.trim())); + writer.write(end); + return; + } +}