Navbar: Fix handling of [home] and [logo] metalinks

Change I556285369 fixed the "[extensions]" meta link from being
literally included in the rendered html, but had the side effect
of breaking the [home] and [logo] metalinks.

Rework the fix, and add tests for [home] and [logo] that would
have caught the regression.

Bug: https://crbug.com/gerrit/11023
Change-Id: I44ecbe64588077b988aa3671ae94884b6b78d71b
diff --git a/java/com/google/gitiles/doc/Navbar.java b/java/com/google/gitiles/doc/Navbar.java
index c866aa9..0fc2758 100644
--- a/java/com/google/gitiles/doc/Navbar.java
+++ b/java/com/google/gitiles/doc/Navbar.java
@@ -33,6 +33,8 @@
   private static final Pattern META_LINK =
       Pattern.compile(
           "^\\[(logo|home|extensions)\\]:\\s*(.+)$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
+  private static final Pattern EXTENSIONS_LINK =
+      Pattern.compile("^\\[extensions\\]:\\s*(.+)$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
 
   private MarkdownConfig cfg;
   private MarkdownToHtml fmt;
@@ -108,30 +110,27 @@
   }
 
   private String extractMetadata(String markdown) {
+    boolean extensionsFound = false;
     Matcher m = META_LINK.matcher(markdown);
-    boolean foundMetadata = m.find();
-    if (foundMetadata) {
-      StringBuffer sb = new StringBuffer();
-      do {
-        String key = m.group(1).toLowerCase();
-        String url = m.group(2).trim();
-        switch (key) {
-          case "logo":
-            logoUrl = url;
-            break;
-          case "home":
-            homeUrl = url;
-            break;
-          case "extensions":
-            Set<String> names = splitExtensionNames(url);
-            cfg = cfg.copyWithExtensions(enabled(names), disabled(names));
-            break;
-        }
-        m.appendReplacement(sb, "");
-        foundMetadata = m.find();
-      } while (foundMetadata);
-      m.appendTail(sb);
-      return sb.toString();
+    while (m.find()) {
+      String key = m.group(1).toLowerCase();
+      String url = m.group(2).trim();
+      switch (key) {
+        case "logo":
+          logoUrl = url;
+          break;
+        case "home":
+          homeUrl = url;
+          break;
+        case "extensions":
+          extensionsFound = true;
+          Set<String> names = splitExtensionNames(url);
+          cfg = cfg.copyWithExtensions(enabled(names), disabled(names));
+          break;
+      }
+    }
+    if (extensionsFound) {
+      return EXTENSIONS_LINK.matcher(markdown).replaceAll("");
     }
     return markdown;
   }
diff --git a/javatests/com/google/gitiles/doc/DocServletTest.java b/javatests/com/google/gitiles/doc/DocServletTest.java
index 48300fc..2a9c2c5 100644
--- a/javatests/com/google/gitiles/doc/DocServletTest.java
+++ b/javatests/com/google/gitiles/doc/DocServletTest.java
@@ -43,7 +43,10 @@
     String navbar =
         "# Site Title\n"
             + "\n"
-            + "* [Home](index.md)\n"
+            + "[home]: index.md\n"
+            + "[logo]: logo.png\n"
+            + "\n"
+            + "* [Home][home]\n"
             + "* [README](README.md)\n"
             + "[extensions]: blocknote\n";
     repo.branch("master")
@@ -54,7 +57,7 @@
 
     String html = buildHtml("/repo/+doc/master/README.md");
     assertThat(html).contains("<title>Site Title - page</title>");
-
+    assertThat(html).contains("Header-anchorLogo");
     assertThat(html).contains("<span class=\"Header-anchorTitle\">Site Title</span>");
     assertThat(html).contains("<li><a href=\"/b/repo/+/master/index.md\">Home</a></li>");
     assertThat(html).contains("<li><a href=\"/b/repo/+/master/README.md\">README</a></li>");