initial contribution
[phpeclipse.git] / archive / org.plog4u.wiki / src / org / plog4u / wiki / macro / CodeMacro.java
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 (file)
index 0000000..50a9889
--- /dev/null
@@ -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;
+  }
+}