Skip to content

Commit 6bced24

Browse files
committed
Fix escaping special chars in searchbar links in Scaladoc
Unit tests for links with "#" character were also added.
1 parent d466f9f commit 6bced24

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed

scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ trait Locations(using ctx: DocContext):
8181

8282
def resolveRoot(dri: DRI, path: String): String = resolveRoot(rawLocation(dri), path)
8383
def absolutePath(dri: DRI, extension: String = "html"): String = rawLocation(dri).mkString("", "/", s".$extension")
84-
def absolutePathWithAnchor(dri: DRI, extension: String = "html"): String = s"${absolutePath(dri, extension)}#${dri.anchor}"
84+
85+
def escapedAbsolutePathWithAnchor(dri: DRI, extension: String = "html"): String =
86+
s"${escapeUrl(absolutePath(dri, extension))}#${dri.anchor}"
8587

8688
def resolveLink(dri: DRI, url: String): String =
8789
if URI(url).isAbsolute then url else resolveRoot(dri, url)

scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
133133
}.mkString
134134

135135
def mkEntry(dri: DRI, name: String, text: String, descr: String, kind: String) = jsonObject(
136-
"l" -> jsonString(absolutePathWithAnchor(dri)),
136+
"l" -> jsonString(escapedAbsolutePathWithAnchor(dri)),
137137
"n" -> jsonString(name),
138138
"t" -> jsonString(text),
139139
"d" -> jsonString(descr),

scaladoc/src/dotty/tools/scaladoc/tasty/InkuireSupport.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ trait InkuireSupport(using DocContext) extends Resources:
114114
),
115115
name = name,
116116
packageName = ownerName,
117-
uri = methodSymbol.dri.externalLink.getOrElse(absolutePathWithAnchor(methodSymbol.dri)),
117+
uri = methodSymbol.dri.externalLink.getOrElse(escapedAbsolutePathWithAnchor(methodSymbol.dri)),
118118
entryType = "def"
119119
)
120120
val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))
@@ -142,7 +142,7 @@ trait InkuireSupport(using DocContext) extends Resources:
142142
),
143143
name = name,
144144
packageName = ownerName,
145-
uri = valSymbol.dri.externalLink.getOrElse(absolutePathWithAnchor(valSymbol.dri)),
145+
uri = valSymbol.dri.externalLink.getOrElse(escapedAbsolutePathWithAnchor(valSymbol.dri)),
146146
entryType = "val"
147147
)
148148
val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))

scaladoc/test/dotty/tools/scaladoc/renderers/LocationTests.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,18 @@ class LocationTests:
3737
"../../annotation",
3838
path("api/scala/annotation/meta/beanGetter", "api/scala/annotation"),
3939
)
40+
41+
@Test
42+
def testAnchorLinks() =
43+
def pathWithAnchor(location: String, anchor: String) =
44+
locations.escapedAbsolutePathWithAnchor(new DRI(location, anchor))
45+
46+
assertEquals(
47+
"scala/%23::.html#abcde",
48+
pathWithAnchor("scala.#::", "abcde")
49+
)
50+
51+
assertEquals(
52+
"scala/collection/immutable/LazyList$$%23$.html#abcde",
53+
pathWithAnchor("scala.collection.immutable.LazyList$$#$", "abcde")
54+
)

0 commit comments

Comments
 (0)