Add custom find/replace to SafeHtml

Apps can now specify a list of find/replace strings to SafeHtml.  This is
currently used to turn string identifiers into links.

Signed-off-by: Brad Larson <bklarson@gmail.com>
diff --git a/src/main/java/com/google/gwtexpui/safehtml/client/RegexFindReplace.java b/src/main/java/com/google/gwtexpui/safehtml/client/RegexFindReplace.java
new file mode 100644
index 0000000..fe272d4
--- /dev/null
+++ b/src/main/java/com/google/gwtexpui/safehtml/client/RegexFindReplace.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gwtexpui.safehtml.client;
+
+/** A Find/Replace pair used against the SafeHtml block of text */
+public class RegexFindReplace {
+  private String find;
+  private String replace;
+
+  protected RegexFindReplace() {
+  }
+
+  public RegexFindReplace(final String find, final String replace) {
+    this.find = find;
+    this.replace = replace;
+  }
+
+  public String find() {
+    return find;
+  }
+
+  public String replace() {
+    return replace;
+  }
+
+  @Override
+  public String toString() {
+    return "find = " + find + ", replace = " + replace;
+  }
+}
diff --git a/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java b/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java
index b19ad6c..4be11de 100644
--- a/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java
+++ b/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java
@@ -22,6 +22,8 @@
 import com.google.gwt.user.client.ui.InlineHTML;
 import com.google.gwt.user.client.ui.Widget;
 
+import java.util.List;
+
 /** Immutable string safely placed as HTML without further escaping. */
 public abstract class SafeHtml {
   /** @return the existing HTML property of a widget. */
@@ -173,6 +175,21 @@
     return new SafeHtmlString(asString().replaceAll(regex, repl));
   }
 
+  /**
+   * Go through the {@link RegexFindReplace} list, calling {@link #replaceAll()}
+   * on the HTML string for every find/replace pair in the list.
+   */
+  public SafeHtml replaceAll(final List<RegexFindReplace> findReplaceList) {
+    if (findReplaceList == null) {
+      return this;
+    }
+    String html = this.asString();
+    for (RegexFindReplace findReplace : findReplaceList) {
+      html = html.replaceAll(findReplace.find(), findReplace.replace());
+    }
+    return new SafeHtmlString(html);
+  }
+
   /** @return a GWT block display widget displaying this HTML. */
   public Widget toBlockWidget() {
     return new HTML(asString());