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