Skip to content

Commit ca35a82

Browse files
committed
Fix handling of the external links in Scaladoc
This includes both fixing links found in searchbar, and ones accessible from method names. In searchbar, links are resolved based on whether they are absolute (pointing to an external website, like java docs) or relative (pointing to another sub-website, with root being appended on runtime). This is achieved by serializing another boolean field in PageEntry.
1 parent 6bced24 commit ca35a82

File tree

6 files changed

+23
-8
lines changed

6 files changed

+23
-8
lines changed

scaladoc-js/main/src/searchbar/PageEntry.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@ import scala.scalajs.js
44

55
@js.native
66
trait PageEntryJS extends js.Object {
7-
val n: String = js.native
8-
val t: String = js.native
9-
val d: String = js.native
10-
val l: String = js.native
11-
val k: String = js.native
7+
val n: String = js.native
8+
val t: String = js.native
9+
val d: String = js.native
10+
val l: String = js.native
11+
val e: Boolean = js.native
12+
val k: String = js.native
1213
}
1314

1415
case class PageEntry(
1516
fullName: String,
1617
description: String,
1718
location: String,
19+
isLocationExternal: Boolean,
1820
shortName: String,
1921
kind: String,
2022
tokens: List[String]
@@ -34,6 +36,7 @@ object PageEntry {
3436
jsObj.t,
3537
jsObj.d,
3638
jsObj.l,
39+
jsObj.e,
3740
jsObj.n.toLowerCase,
3841
jsObj.k,
3942
StringUtils.createCamelCaseTokens(jsObj.n)

scaladoc-js/main/src/searchbar/SearchbarComponent.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch
2222
icon.classList.add(p.kind.take(2))
2323

2424
val resultA = document.createElement("a").asInstanceOf[html.Anchor]
25-
resultA.href = Globals.pathToRoot + p.location
25+
resultA.href =
26+
if (p.isLocationExternal) {
27+
p.location
28+
} else {
29+
Globals.pathToRoot + p.location
30+
}
2631
resultA.text = s"${p.fullName}"
2732
resultA.onclick = (event: Event) =>
2833
if (document.body.contains(rootDiv)) {

scaladoc-js/main/test/dotty/tools/scaladoc/MatchersTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class MatchersTest:
3434
s"$kind $name",
3535
"",
3636
"",
37+
false,
3738
s"$name",
3839
kind,
3940
StringUtils.createCamelCaseTokens(name)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ trait Locations(using ctx: DocContext):
8585
def escapedAbsolutePathWithAnchor(dri: DRI, extension: String = "html"): String =
8686
s"${escapeUrl(absolutePath(dri, extension))}#${dri.anchor}"
8787

88+
def relativeInternalOrAbsoluteExternalPath(dri: DRI): String =
89+
dri.externalLink.getOrElse(escapedAbsolutePathWithAnchor(dri))
90+
8891
def resolveLink(dri: DRI, url: String): String =
8992
if URI(url).isAbsolute then url else resolveRoot(dri, url)
9093

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ abstract class Renderer(rootPackage: Member, val members: Map[DRI, Member], prot
118118
val signatureRenderer = new SignatureRenderer:
119119
def currentDri: DRI = page.link.dri
120120
def link(dri: DRI): Option[String] =
121-
Some(pathToPage(currentDri, dri)).filter(_ != UnresolvedLocationLink)
121+
dri.externalLink.orElse(
122+
Some(pathToPage(currentDri, dri)).filter(_ != UnresolvedLocationLink)
123+
)
122124

123125
MemberRenderer(signatureRenderer).fullMember(m)
124126
case t: ResolvedTemplate => siteContent(page.link.dri, t)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ 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(escapedAbsolutePathWithAnchor(dri)),
136+
"l" -> jsonString(relativeInternalOrAbsoluteExternalPath(dri)),
137+
"e" -> (if dri.externalLink.isDefined then rawJSON("true") else rawJSON("false")),
137138
"n" -> jsonString(name),
138139
"t" -> jsonString(text),
139140
"d" -> jsonString(descr),

0 commit comments

Comments
 (0)