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