import java.util.regex.Pattern;
public final class WikiTokenizer {
-
+
+ public static interface Callback {
+ void onPlainText(WikiTokenizer wikiTokenizer);
+ void onMarkup(WikiTokenizer wikiTokenizer);
+ void onWikiLink(WikiTokenizer wikiTokenizer);
+ void onNewline(WikiTokenizer wikiTokenizer);
+ void onFunction(String functionName, List<String> functionPositionArgs,
+ Map<String, String> functionNamedArgs);
+ void onHeading(WikiTokenizer wikiTokenizer);
+ void onListItem(WikiTokenizer wikiTokenizer);
+ void onComment(WikiTokenizer wikiTokenizer);
+ }
+
//private static final Pattern wikiTokenEvent = Pattern.compile("($)", Pattern.MULTILINE);
private static final Pattern wikiTokenEvent = Pattern.compile("(" +
"\\{\\{|\\}\\}|" +
namedArgs.clear();
}
+ public void dispatch(final Callback callback) {
+ while (nextToken() != null) {
+ if (isPlainText()) {
+ callback.onPlainText(this);
+ } else if (isMarkup()) {
+ callback.onMarkup(this);
+ } else if (isWikiLink) {
+ callback.onWikiLink(this);
+ } else if (isNewline()) {
+ callback.onNewline(this);
+ } else if (isFunction()) {
+ callback.onFunction(functionName(), functionPositionArgs(), functionNamedArgs());
+ } else if (isHeading()) {
+ callback.onHeading(this);
+ } else if (isListItem()) {
+ callback.onListItem(this);
+ } else if (isComment()) {
+ callback.onComment(this);
+ } else {
+ throw new IllegalStateException("Unknown wiki state.");
+ }
+ }
+ }
+
public boolean isNewline() {
return justReturnedNewline;
}
return s.length();
}
- public static String toPlainText(String sense) {
- final WikiTokenizer wikiTokenizer = new WikiTokenizer(sense);
+ public static String toPlainText(final String wikiText) {
+ final WikiTokenizer wikiTokenizer = new WikiTokenizer(wikiText);
final StringBuilder builder = new StringBuilder();
while (wikiTokenizer.nextToken() != null) {
if (wikiTokenizer.isPlainText()) {
return builder.toString();
}
+ public static StringBuilder appendFunction(final StringBuilder builder, final String name, List<String> args,
+ final Map<String, String> namedArgs) {
+ builder.append(name);
+ for (final String arg : args) {
+ builder.append("|").append(arg);
+ }
+ for (final Map.Entry<String, String> entry : namedArgs.entrySet()) {
+ builder.append("|").append(entry.getKey()).append("=").append(entry.getValue());
+ }
+ return builder;
+ }
+
}