void onHtml(WikiTokenizer wikiTokenizer);
}
+ public static class DoNothingCallback implements Callback {
+
+ @Override
+ public void onPlainText(String text) {
+ }
+
+ @Override
+ public void onMarkup(WikiTokenizer wikiTokenizer) {
+ }
+
+ @Override
+ public void onWikiLink(WikiTokenizer wikiTokenizer) {
+ }
+
+ @Override
+ public void onNewline(WikiTokenizer wikiTokenizer) {
+ }
+
+ @Override
+ public void onFunction(WikiTokenizer tokenizer, String functionName,
+ List<String> functionPositionArgs, Map<String, String> functionNamedArgs) {
+ }
+
+ @Override
+ public void onHeading(WikiTokenizer wikiTokenizer) {
+ }
+
+ @Override
+ public void onListItem(WikiTokenizer wikiTokenizer) {
+ }
+
+ @Override
+ public void onComment(WikiTokenizer wikiTokenizer) {
+ }
+
+ @Override
+ public void onHtml(WikiTokenizer wikiTokenizer) {
+ }
+ }
+
//private static final Pattern wikiTokenEvent = Pattern.compile("($)", Pattern.MULTILINE);
private static final Pattern wikiTokenEvent = Pattern.compile("(" +
"\\{\\{|\\}\\}|" +
"=|" + // Need the = because we might have to find unescaped =
"<!--|" +
"''|" +
+ "<pre>|" +
+ "<math>|" +
+ "<ref>|" +
"$)", Pattern.MULTILINE);
private static final String listChars = "*#:;";
this(wikiText, true);
}
- public WikiTokenizer(final String wikiText, final boolean isNewline) {
- this.wikiText = wikiText.replaceAll("\u2028", "\n");
+ public WikiTokenizer(String wikiText, final boolean isNewline) {
+ wikiText = wikiText.replaceAll("\u2028", "\n");
+ wikiText = wikiText.replaceAll("\u0085", "\n");
+ this.wikiText = wikiText;
this.matcher = wikiTokenEvent.matcher(wikiText);
justReturnedNewline = isNewline;
}
"\\[\\[|" +
"<!--|" +
"''|" +
+ "<pre>|" +
+ "<math>|" +
+ "<ref>|" +
"[\n]"
);
callback.onPlainText(tokenizer.token());
} else if (tokenizer.isMarkup()) {
callback.onMarkup(tokenizer);
- } else if (tokenizer.isWikiLink) {
+ } else if (tokenizer.isWikiLink()) {
callback.onWikiLink(tokenizer);
} else if (tokenizer.isNewline()) {
callback.onNewline(tokenizer);
assert isListItem();
return wikiText.substring(start, listPrefixEnd);
}
+
+ public static String getListTag(char c) {
+ if (c == '#') {
+ return "ol";
+ }
+ return "ul";
+ }
public String listItemWikiText() {
assert isListItem();
if (firstUnescapedPipePos != -1) {
return trimNewlines(wikiText.substring(start + 2, firstUnescapedPipePos).trim());
}
- return trimNewlines(wikiText.substring(start + 2, end - 2).trim());
+ final int safeEnd = Math.max(start + 2, end - 2);
+ return trimNewlines(wikiText.substring(start + 2, safeEnd).trim());
}
public List<String> functionPositionArgs() {
return this;
}
- if (justReturnedNewline) {
+ if (justReturnedNewline) {
justReturnedNewline = false;
final char firstChar = wikiText.charAt(end);
return this;
}
+ if (wikiText.startsWith("<ref>", start)) {
+ end = safeIndexOf(wikiText, start, "</ref>", "\n");
+ isHtml = true;
+ return this;
+ }
+
if (wikiText.startsWith("<math>", start)) {
end = safeIndexOf(wikiText, start, "</math>", "\n");
isHtml = true;
errors.add("Unmatched <!-- error: " + wikiText.substring(start));
return safeIndexOf(wikiText, start, "\n", "\n");
}
- } else if (matchText.equals("''")) {
+ } else if (matchText.equals("''") || (matchText.startsWith("<") && matchText.endsWith(">"))) {
// Don't care.
} else {
assert false : "Match text='" + matchText + "'";