Improve wiki formatting for preformatted text and lists We now format a paragraph that contains at least one line with manual indentation as a pre-formatted text block. This fixes the case presented by dbort in GERRIT-134: == key_passwords[None] = None # comment explaining why for k in sorted(keylist): if not k: continue p = subprocess... == The entire block is now preformatted. We also now format paragraphs that contain lines starting with "- " or "* " as a list, with each line being a unique item in that list. Bug: GERRIT-134 Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java b/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java index 1e4da6e..a14a8c4 100644 --- a/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java +++ b/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java
@@ -66,10 +66,49 @@ * </pre> */ public SafeHtml wikify() { - SafeHtml s = linkify(); - s = s.replaceAll("(^|\n)([ \t][^\n]*)", "$1<span class=\"gwtexpui-SafeHtml-WikiPreFormat\">$2</span><br />"); - s = s.replaceAll("\n\n", "\n<p />\n"); - return s; + final SafeHtmlBuilder r = new SafeHtmlBuilder(); + for (final String p : linkify().asString().split("\n\n")) { + if (isPreFormat(p)) { + r.openElement("p"); + for (final String line : p.split("\n")) { + r.openSpan(); + r.setStyleName("gwtexpui-SafeHtml-WikiPreFormat"); + r.append(new SafeHtmlString(line)); + r.closeSpan(); + r.br(); + } + r.closeElement("p"); + + } else if (isList(p)) { + r.openElement("ul"); + r.setStyleName("gwtexpui-SafeHtml-WikiList"); + for (String line : p.split("\n")) { + if (line.startsWith("-") || line.startsWith("*")) { + line = line.substring(1).trim(); + } + r.openElement("li"); + r.append(new SafeHtmlString(line)); + r.closeElement("li"); + } + r.closeElement("ul"); + + } else { + r.openElement("p"); + r.append(new SafeHtmlString(p)); + r.closeElement("p"); + } + } + return r.toSafeHtml(); + } + + private static boolean isPreFormat(final String p) { + return p.contains("\n ") || p.contains("\n\t") || p.startsWith(" ") + || p.startsWith("\t"); + } + + private static boolean isList(final String p) { + return p.contains("\n- ") || p.contains("\n* ") || p.startsWith("- ") + || p.startsWith("* "); } /**