private static class FormatRule { private Pattern mPattern; private String mReplaceWith; /** * Create a wiki formatting rule. * * @param pattern Search string to be compiled into a {@link Pattern}. * @param replaceWith String to replace any found occurances with. This * string can also include back-references into the given * pattern. * @param flags Any flags to compile the {@link Pattern} with. */ public FormatRule(String pattern, String replaceWith, int flags) { mPattern = Pattern.compile(pattern, flags); mReplaceWith = replaceWith; } /** * Create a wiki formatting rule. * * @param pattern Search string to be compiled into a {@link Pattern}. * @param replaceWith String to replace any found occurances with. This * string can also include back-references into the given * pattern. */ public FormatRule(String pattern, String replaceWith) { this(pattern, replaceWith, 0); } /** * Apply this formatting rule to the given input string, and return the * resulting new string. */ public String apply(String input) { Matcher m = mPattern.matcher(input); return m.replaceAll(mReplaceWith); } } /** * List of internal formatting rules to apply when parsing wiki text. These * include indenting various bullets, apply italic and bold styles, and * adding internal linking. */ private static final List<FormatRule> sFormatRules = new ArrayList<FormatRule>(); static { // Format header blocks and wrap outside content in ordered list sFormatRules.add(new FormatRule("^=+(.+?)=+", "</ol><h2>$1</h2><ol>", Pattern.MULTILINE)); // Indent quoted blocks, handle ordered and bullet lists sFormatRules.add(new FormatRule("^#+\\*?:(.+?)$", "<blockquote>$1</blockquote>", Pattern.MULTILINE)); sFormatRules.add(new FormatRule("^#+:?\\*(.+?)$", "<ul><li>$1</li></ul>", Pattern.MULTILINE)); sFormatRules.add(new FormatRule("^#+(.+?)$", "<li>$1</li>", Pattern.MULTILINE)); // Add internal links sFormatRules.add(new FormatRule("\\[\\[([^:\\|\\]]+)\\]\\]", String.format("<a href=\"%s://%s/$1\">$1</a>", WIKI_AUTHORITY, WIKI_LOOKUP_HOST))); sFormatRules.add(new FormatRule("\\[\\[([^:\\|\\]]+)\\|([^\\]]+)\\]\\]", String.format("<a href=\"%s://%s/$1\">$2</a>", WIKI_AUTHORITY, WIKI_LOOKUP_HOST))); // Add bold and italic formatting sFormatRules.add(new FormatRule("'''(.+?)'''", "<b>$1</b>")); sFormatRules.add(new FormatRule("([^'])''([^'].*?[^'])''([^'])", "$1<i>$2</i>$3")); // Remove odd category links and convert remaining links into flat text sFormatRules.add(new FormatRule("(\\{+.+?\\}+|\\[\\[[^:]+:[^\\\\|\\]]+\\]\\]|" + "\\[http.+?\\]|\\[\\[Category:.+?\\]\\])", "", Pattern.MULTILINE | Pattern.DOTALL)); sFormatRules.add(new FormatRule("\\[\\[([^\\|\\]]+\\|)?(.+?)\\]\\]", "$2", Pattern.MULTILINE)); }