initial contribution
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / renderer / WikipediaContentRenderer.java
diff --git a/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/renderer/WikipediaContentRenderer.java b/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/renderer/WikipediaContentRenderer.java
new file mode 100644 (file)
index 0000000..c2d6e2c
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Thanks to Bent Andre Solheim for the improved header rendering.
+ */
+package net.sourceforge.phpeclipse.wiki.renderer;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import net.sourceforge.phpeclipse.wiki.builder.BuilderRenderEngine;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.resources.IProject;
+import org.radeox.api.engine.RenderEngine;
+import org.radeox.api.engine.context.InitialRenderContext;
+import org.radeox.engine.context.BaseInitialRenderContext;
+import org.radeox.macro.MacroRepository;
+
+public final class WikipediaContentRenderer extends AbstractContentRenderer {
+  public static final String BULLET_MARKUP = "*";
+
+  public static final String ALT_BULLET_MARKUP = "-";
+
+  protected InitialRenderContext context;
+
+  protected BuilderRenderEngine engine;
+
+  protected void initialise() {
+
+  }
+
+  protected void appendHeader(String line) {
+    String header = getHeaderText(line);
+    String headerStartTag = "<h1 " + getHeaderCss(getHeaderSize(line)) + ">";
+    getBuffer().append(headerStartTag);
+    getBuffer().append(header);
+    getBuffer().append("</h1>");
+  }
+
+  private int getHeaderSize(String line) {
+    int size = 0;
+    int index = 0;
+    while (index < line.length() && line.charAt(index) != ' ') {
+      if (line.charAt(index) == '1') {
+        size++;
+      }
+      index++;
+    }
+    return size;
+  }
+
+  private String getHeaderCss(int size) {
+    int max = Math.min(3, size);
+    StringBuffer css = new StringBuffer();
+    css.append("class=\"").append("heading");
+    for (int i = 0; i < max; i++) {
+      css.append("-1");
+    }
+    css.append("\"");
+    return css.toString();
+  }
+
+  protected String getHeaderText(String line) {
+    return line.substring(line.indexOf(' ')).trim();
+  }
+
+  protected int getListDepth(String line) {
+    char bullet = getBullet(line);
+    for (int i = 0; i < line.length(); i++) {
+      if (line.charAt(i) != bullet) {
+        return i;
+      }
+    }
+    return line.length();
+  }
+
+  private char getBullet(String line) {
+    char bullet = line.startsWith(WikipediaContentRenderer.BULLET_MARKUP) ? WikipediaContentRenderer.BULLET_MARKUP.charAt(0)
+        : WikipediaContentRenderer.ALT_BULLET_MARKUP.charAt(0);
+    return bullet;
+  }
+
+  protected boolean isHeader(String line) {
+    return line.startsWith("1") && line.indexOf(' ') > 0;
+  }
+
+  protected boolean isList(String line) {
+    return !line.trim().equals("----")
+        && (line.startsWith(WikipediaContentRenderer.BULLET_MARKUP) || line.startsWith(WikipediaContentRenderer.ALT_BULLET_MARKUP));
+  }
+
+  protected boolean process(String line) {
+    if (line.trim().matches("^----*$")) {
+      appendHR();
+      return true;
+    }
+    return false;
+  }
+
+  protected String processTags(String line) {
+    line = line.replaceAll("\\\\", "<br>");
+    line = extractMacroMarkup(line);
+    line = replacePair(line, "__", "<b>", "</b>");
+    line = replacePair(line, "~~", "<i>", "</i>");
+    line = replacePair(line, "--", "<strike>", "</strike>");
+    return line;
+  }
+
+  private String extractMacroMarkup(String line) {
+    return line.replaceAll("\\{.*?\\}", "");
+  }
+
+  protected String getListtext(String line) {
+    return line.substring(getListDepth(line)).trim();
+  }
+
+  protected String getTableTag() {
+    return "<table class=\"wiki-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
+  }
+
+  public final void render(String content, StringBuffer buf, int level, boolean completeHTMLPage) {
+    try {
+      buffer = buf;
+      if (completeHTMLPage) {
+        appendHeader();
+      }
+      StringWriter writer = new StringWriter();
+      try {
+        engine.setLevel(level);
+        engine.render(writer, content, context);
+        buffer.append(writer);
+      } catch (IOException e) {
+        // never reach
+      }
+      if (completeHTMLPage) {
+        appendFooter();
+      }
+      //             return buffer.toString();
+    } catch (Exception e) {
+      WikiEditorPlugin.getDefault().log(buffer.toString());
+      WikiEditorPlugin.getDefault().log(e.getLocalizedMessage(), e);
+      //             return "<html><body><p>" + e.getLocalizedMessage() + "</p></body></html>";
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer#setProject(org.eclipse.core.resources.IProject)
+   */
+  public void setProject(IProject project) {
+    super.setProject(project);
+    context = new BaseInitialRenderContext();
+    engine = new BuilderRenderEngine(project, context);
+    context.setRenderEngine(engine);
+    MacroRepository repository = MacroRepository.getInstance();
+    repository.setInitialContext(context);
+  }
+}
\ No newline at end of file