package org.emdev.utils.wiki; import java.util.StringTokenizer; import org.emdev.utils.LengthUtils; public class Wiki { public static CharSequence fromWiki(final String text) { final StringBuilder buf = new StringBuilder("<html><body>"); final StringTokenizer st = new StringTokenizer(text, "\n\r"); int listLevel = 0; while (st.hasMoreElements()) { final String s = (String) st.nextElement(); final String trimmed = s.trim(); if (LengthUtils.isEmpty(trimmed)) { if (listLevel > 0) { do { buf.append("</ul>"); } while (--listLevel > 0); buf.append("\n"); } buf.append("<br>"); buf.append("\n"); continue; } else if (trimmed.startsWith("#")) { continue; } else if (trimmed.startsWith("=")) { if (listLevel > 0) { do { buf.append("</ul>"); } while (--listLevel > 0); buf.append("\n"); } int count = 1; for (int i = 1; i < s.length() && s.charAt(i) == '='; i++, count++) { } int end = s.indexOf("=", count); if (end == -1) { end = s.length(); } buf.append("<h").append(count).append(">"); buf.append(replacePreformatted(s.substring(count, end).trim())); buf.append("</h").append(count).append("/>"); buf.append("\n"); } else if (trimmed.startsWith("*")) { final int count = s.indexOf("*"); if (count > listLevel) { do { buf.append("<ul>"); } while (count > ++listLevel); buf.append("\n"); } else if (count < listLevel) { do { buf.append("</ul>"); } while (count < --listLevel); buf.append("\n"); } buf.append("<li>"); buf.append(replacePreformatted(trimmed.substring(1).trim())); buf.append("</li>"); buf.append("\n"); } else { while (listLevel > 0) { buf.append("</ul>"); listLevel--; } buf.append("<br>"); buf.append(replacePreformatted(trimmed)); } } final String content = buf.append("</body></html>").toString(); return content; } private static String replacePreformatted(final String str) { final int start = str.indexOf("{{{"); if (start == -1) { return str; } final int end = str.indexOf("}}}"); if (end == -1) { return str; } String s = str.substring(start + 3, end); s = s.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); return str.substring(0, start) + s + str.substring(end + 3); } }