initial contribution
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / renderer / WikipediaContentRenderer.java
1 /*
2  * Thanks to Bent Andre Solheim for the improved header rendering.
3  */
4 package net.sourceforge.phpeclipse.wiki.renderer;
5
6 import java.io.IOException;
7 import java.io.StringWriter;
8
9 import net.sourceforge.phpeclipse.wiki.builder.BuilderRenderEngine;
10 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
11
12 import org.eclipse.core.resources.IProject;
13 import org.radeox.api.engine.RenderEngine;
14 import org.radeox.api.engine.context.InitialRenderContext;
15 import org.radeox.engine.context.BaseInitialRenderContext;
16 import org.radeox.macro.MacroRepository;
17
18 public final class WikipediaContentRenderer extends AbstractContentRenderer {
19   public static final String BULLET_MARKUP = "*";
20
21   public static final String ALT_BULLET_MARKUP = "-";
22
23   protected InitialRenderContext context;
24
25   protected BuilderRenderEngine engine;
26
27   protected void initialise() {
28
29   }
30
31   protected void appendHeader(String line) {
32     String header = getHeaderText(line);
33     String headerStartTag = "<h1 " + getHeaderCss(getHeaderSize(line)) + ">";
34     getBuffer().append(headerStartTag);
35     getBuffer().append(header);
36     getBuffer().append("</h1>");
37   }
38
39   private int getHeaderSize(String line) {
40     int size = 0;
41     int index = 0;
42     while (index < line.length() && line.charAt(index) != ' ') {
43       if (line.charAt(index) == '1') {
44         size++;
45       }
46       index++;
47     }
48     return size;
49   }
50
51   private String getHeaderCss(int size) {
52     int max = Math.min(3, size);
53     StringBuffer css = new StringBuffer();
54     css.append("class=\"").append("heading");
55     for (int i = 0; i < max; i++) {
56       css.append("-1");
57     }
58     css.append("\"");
59     return css.toString();
60   }
61
62   protected String getHeaderText(String line) {
63     return line.substring(line.indexOf(' ')).trim();
64   }
65
66   protected int getListDepth(String line) {
67     char bullet = getBullet(line);
68     for (int i = 0; i < line.length(); i++) {
69       if (line.charAt(i) != bullet) {
70         return i;
71       }
72     }
73     return line.length();
74   }
75
76   private char getBullet(String line) {
77     char bullet = line.startsWith(WikipediaContentRenderer.BULLET_MARKUP) ? WikipediaContentRenderer.BULLET_MARKUP.charAt(0)
78         : WikipediaContentRenderer.ALT_BULLET_MARKUP.charAt(0);
79     return bullet;
80   }
81
82   protected boolean isHeader(String line) {
83     return line.startsWith("1") && line.indexOf(' ') > 0;
84   }
85
86   protected boolean isList(String line) {
87     return !line.trim().equals("----")
88         && (line.startsWith(WikipediaContentRenderer.BULLET_MARKUP) || line.startsWith(WikipediaContentRenderer.ALT_BULLET_MARKUP));
89   }
90
91   protected boolean process(String line) {
92     if (line.trim().matches("^----*$")) {
93       appendHR();
94       return true;
95     }
96     return false;
97   }
98
99   protected String processTags(String line) {
100     line = line.replaceAll("\\\\", "<br>");
101     line = extractMacroMarkup(line);
102     line = replacePair(line, "__", "<b>", "</b>");
103     line = replacePair(line, "~~", "<i>", "</i>");
104     line = replacePair(line, "--", "<strike>", "</strike>");
105     return line;
106   }
107
108   private String extractMacroMarkup(String line) {
109     return line.replaceAll("\\{.*?\\}", "");
110   }
111
112   protected String getListtext(String line) {
113     return line.substring(getListDepth(line)).trim();
114   }
115
116   protected String getTableTag() {
117     return "<table class=\"wiki-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
118   }
119
120   public final void render(String content, StringBuffer buf, int level, boolean completeHTMLPage) {
121     try {
122       buffer = buf;
123       if (completeHTMLPage) {
124         appendHeader();
125       }
126       StringWriter writer = new StringWriter();
127       try {
128         engine.setLevel(level);
129         engine.render(writer, content, context);
130         buffer.append(writer);
131       } catch (IOException e) {
132         // never reach
133       }
134       if (completeHTMLPage) {
135         appendFooter();
136       }
137       //              return buffer.toString();
138     } catch (Exception e) {
139       WikiEditorPlugin.getDefault().log(buffer.toString());
140       WikiEditorPlugin.getDefault().log(e.getLocalizedMessage(), e);
141       //              return "<html><body><p>" + e.getLocalizedMessage() + "</p></body></html>";
142     }
143   }
144
145   /*
146    * (non-Javadoc)
147    * 
148    * @see net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer#setProject(org.eclipse.core.resources.IProject)
149    */
150   public void setProject(IProject project) {
151     super.setProject(project);
152     context = new BaseInitialRenderContext();
153     engine = new BuilderRenderEngine(project, context);
154     context.setRenderEngine(engine);
155     MacroRepository repository = MacroRepository.getInstance();
156     repository.setInitialContext(context);
157   }
158 }