package com.hughes.android.dictionary.parser; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public final class WikiTokenizer { //private static final Pattern wikiTokenEvent = Pattern.compile("($)", Pattern.MULTILINE); private static final Pattern wikiTokenEvent = Pattern.compile("(\\{\\{|\\}\\}|\\[\\[|\\]\\]|", "\n"); return this; } if (wikiText.startsWith("}}", start) || wikiText.startsWith("]]", start)) { System.err.println("Close without open!"); end += 2; return this; } if (this.matcher.find(start)) { end = this.matcher.start(1); if (end == start) { System.err.println(this.matcher.group()); assert false; } return this; } end = wikiText.length(); return this; } public String token() { return wikiText.substring(start, end); } private int escapedFind(final int start, final String toFind) { assert tokenStack.isEmpty(); int end = start; while (end < wikiText.length()) { if (matcher.find(end)) { final String matchText = matcher.group(); final int matchStart = matcher.start(); if (matchText.length() == 0) { assert matchStart == wikiText.length() || wikiText.charAt(matchStart) == '\n'; if (tokenStack.isEmpty() && toFind.equals("\n")) { return matchStart; } ++end; } else if (tokenStack.isEmpty() && matchText.equals(toFind)) { // The normal return.... return matcher.end(); } else if (matchText.equals("[[") || matchText.equals("{{")) { tokenStack.add(matchText); } else if (matchText.equals("]]") || matchText.equals("}}")) { if (tokenStack.size() > 0) { final String removed = tokenStack.remove(tokenStack.size() - 1); if (removed.equals("{{") && !matcher.group().equals("}}")) { System.err.println("Unmatched {{ error: " + wikiText.substring(start)); return safeIndexOf(wikiText, start, "\n", "\n"); } else if (removed.equals("[[") && !matcher.group().equals("]]")) { System.err.println("Unmatched [[ error: " + wikiText.substring(start)); return safeIndexOf(wikiText, start, "\n", "\n"); } } else { System.err.println("Pop too many error: " + wikiText.substring(start).replaceAll("\n", "\\n")); // If we were looking for a newline return safeIndexOf(wikiText, start, "\n", "\n"); } } else if (matchText.equals(""); if (end == -1) { System.err.println("Unmatched