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));
}