Fix encoding of anchors in Markdown links

Do not encode # as %23 in a directory path.
Instead leave as-is so the browser can jump.

Change-Id: Ic13190dce5d95989d093c4d9cf9a5a3abe2d7fa8
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java
index 078ee1e..7b30e27 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/MarkdownToHtml.java
@@ -371,12 +371,19 @@
 
   @VisibleForTesting
   String href(String target) {
-    if (HtmlBuilder.isValidHttpUri(target)) {
+    if (target.startsWith("#") || HtmlBuilder.isValidHttpUri(target)) {
       return target;
     }
 
+    String anchor = "";
+    int hash = target.indexOf('#');
+    if (hash >= 0) {
+      anchor = target.substring(hash);
+      target = target.substring(0, hash);
+    }
+
     if (target.startsWith("/")) {
-      return toPath(target);
+      return toPath(target) + anchor;
     }
 
     String dir = trimLastComponent(filePath);
@@ -395,7 +402,8 @@
         break;
       }
     }
-    return toPath(dir + '/' + target);
+
+    return toPath(dir + '/' + target) + anchor;
   }
 
   private static String trimLastComponent(String path) {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
index 7942253..51154b0 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/doc/LinkTest.java
@@ -96,6 +96,10 @@
   }
 
   private static void testMarkdownInRoot(MarkdownToHtml md) {
+    assertThat(md.href("#Help")).isEqualTo("#Help");
+    assertThat(md.href("setup.md#Help"))
+        .isEqualTo("/g/repo/+/HEAD/setup.md#Help");
+
     assertThat(md.href("setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
     assertThat(md.href("./setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
     assertThat(md.href("./")).isEqualTo("/g/repo/+/HEAD/");
@@ -108,6 +112,10 @@
   }
 
   private static void testMarkdownInTree(MarkdownToHtml md) {
+    assertThat(md.href("#Help")).isEqualTo("#Help");
+    assertThat(md.href("setup.md#Help"))
+        .isEqualTo("/g/repo/+/HEAD/doc/setup.md#Help");
+
     assertThat(md.href("setup.md")).isEqualTo("/g/repo/+/HEAD/doc/setup.md");
     assertThat(md.href("./setup.md")).isEqualTo("/g/repo/+/HEAD/doc/setup.md");
     assertThat(md.href("../setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");