package org.kvj.bravo7.format; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; public class PlainTextFormatter<T> { private static final String TAG = "TextFormatter"; TextFormatter<T>[] formatters; public PlainTextFormatter(TextFormatter<T>... formatters) { this.formatters = formatters; } public static void addSpan(SpannableStringBuilder buffer, String text, Object... span) { if (null == text) { return; } int start = buffer.length(); int end = start + text.length(); buffer.append(text); if (null != span) { for (int i = 0; i < span.length; i++) { if (null != span[i]) { buffer.setSpan(span[i], start, end, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); } } } } public void setFormatters(TextFormatter<T>[] formatters) { this.formatters = formatters; } private void writePlainText(T note, SpannableStringBuilder sb, int defColor, String text, int index, boolean selected) { boolean textEmpty = TextUtils.isEmpty(text); if (index >= formatters.length || textEmpty) { if (!textEmpty) { // Not write default addSpan(sb, text, new ForegroundColorSpan(defColor)); } return; } TextFormatter<T> formatter = formatters[index]; Matcher m = null; Pattern p = formatter.getPattern(note, selected); if (null != p) { m = p.matcher(text); } if (null == m || !m.find()) { writePlainText(note, sb, defColor, text, index + 1, selected); return; } do { StringBuffer buffer = new StringBuffer(); m.appendReplacement(buffer, ""); if (0 != buffer.length()) { writePlainText(note, sb, defColor, buffer.toString(), index + 1, selected); } formatter.format(note, sb, m, m.group(), selected); } while (m.find()); StringBuffer buffer = new StringBuffer(); m.appendTail(buffer); if (0 != buffer.length()) { writePlainText(note, sb, defColor, buffer.toString(), index + 1, selected); } } public void writePlainText(T note, SpannableStringBuilder sb, int defColor, String text, boolean selected) { writePlainText(note, sb, defColor, text, 0, selected); } }