--- /dev/null
+/*
+ * 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;
+ }
+}