From e7f7c2ef108fa64dd4101e1545f0d77628a912d3 Mon Sep 17 00:00:00 2001 From: Jan Chyb Date: Fri, 11 Feb 2022 15:29:03 +0100 Subject: [PATCH 1/3] Add id attributes to anchors of members in Scaladoc searchbar This allows to snap to a specific member after clicking, even if it is found under the same URL. --- scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala | 1 + scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala index bcdaa2bb5a5a..ac42a1f92342 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/Locations.scala @@ -82,6 +82,7 @@ trait Locations(using ctx: DocContext): def resolveRoot(dri: DRI, path: String): String = resolveRoot(rawLocation(dri), path) def absolutePath(dri: DRI, extension: String = "html"): String = rawLocation(dri).mkString("", "/", s".$extension") + def absolutePathWithAnchor(dri: DRI, extension: String = "html"): String = s"${absolutePath(dri, extension)}#${dri.anchor}" def resolveLink(dri: DRI, url: String): String = if URI(url).isAbsolute then url else resolveRoot(dri, url) diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala index 7857c1bbd06a..5a5e60f08879 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala @@ -133,7 +133,7 @@ trait Resources(using ctx: DocContext) extends Locations, Writer: }.mkString def mkEntry(dri: DRI, name: String, text: String, descr: String, kind: String) = jsonObject( - "l" -> jsonString(absolutePath(dri)), + "l" -> jsonString(absolutePathWithAnchor(dri)), "n" -> jsonString(name), "t" -> jsonString(text), "d" -> jsonString(descr), From 8f0640b218361df31e7498cee56aa3c043ac9519 Mon Sep 17 00:00:00 2001 From: Jan Chyb Date: Fri, 11 Feb 2022 15:32:45 +0100 Subject: [PATCH 2/3] Close searchbar after clicking a result in Scaladoc Previously the searchbar would disappear automatically after going to another URL, but would not be closed if the member was found in the current address, even if snapped to another location. Now, both events should result in the same outcome of searchbar closing. --- scaladoc-js/main/src/searchbar/SearchbarComponent.scala | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scaladoc-js/main/src/searchbar/SearchbarComponent.scala b/scaladoc-js/main/src/searchbar/SearchbarComponent.scala index c77c8b6b9d83..4229f0c77220 100644 --- a/scaladoc-js/main/src/searchbar/SearchbarComponent.scala +++ b/scaladoc-js/main/src/searchbar/SearchbarComponent.scala @@ -22,6 +22,10 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch val resultA = document.createElement("a").asInstanceOf[html.Anchor] resultA.href = Globals.pathToRoot + p.location resultA.text = s"${p.fullName}" + resultA.onclick = (event: Event) => + if (document.body.contains(rootDiv)) { + document.body.removeChild(rootDiv) + } val location = document.createElement("span") location.classList.add("pull-right") @@ -53,6 +57,10 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch val resultA = document.createElement("a").asInstanceOf[html.Anchor] resultA.href = m.pageLocation resultA.text = m.functionName + resultA.onclick = (event: Event) => + if (document.body.contains(rootDiv)) { + document.body.removeChild(rootDiv) + } val packageDiv = document.createElement("div").asInstanceOf[html.Div] packageDiv.classList.add("scaladoc-searchbar-inkuire-package") From 91e3e99ef57788039e7869fda4711894ca88a2dd Mon Sep 17 00:00:00 2001 From: Jan Chyb Date: Fri, 11 Feb 2022 16:11:20 +0100 Subject: [PATCH 3/3] Fix anchors in Inkuire results in Scaladoc Previously, non-external pages would not be linked in Scaladoc if searched using Inkuire. Now it should behave similarly to standard searching by symbolic name, with results linking to specific member locations on pages. --- .../main/src/searchbar/SearchbarComponent.scala | 9 ++++++++- .../dotty/tools/scaladoc/tasty/InkuireSupport.scala | 10 +++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/scaladoc-js/main/src/searchbar/SearchbarComponent.scala b/scaladoc-js/main/src/searchbar/SearchbarComponent.scala index 4229f0c77220..33f38e690a1e 100644 --- a/scaladoc-js/main/src/searchbar/SearchbarComponent.scala +++ b/scaladoc-js/main/src/searchbar/SearchbarComponent.scala @@ -6,6 +6,8 @@ import org.scalajs.dom.html.Input import scala.scalajs.js.timers._ import scala.concurrent.duration._ +import java.net.URI + class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearchEngine, parser: QueryParser): val resultsChunkSize = 100 extension (p: PageEntry) @@ -55,7 +57,12 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch icon.classList.add(m.entryType.take(2)) val resultA = document.createElement("a").asInstanceOf[html.Anchor] - resultA.href = m.pageLocation + resultA.href = + if(new URI(m.pageLocation).isAbsolute()) { + m.pageLocation + } else { + Globals.pathToRoot + m.pageLocation + } resultA.text = m.functionName resultA.onclick = (event: Event) => if (document.body.contains(rootDiv)) { diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/InkuireSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/InkuireSupport.scala index 3e1a09574b16..36b29ff05eee 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/InkuireSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/InkuireSupport.scala @@ -4,6 +4,7 @@ import collection.JavaConverters._ import dotty.tools.scaladoc._ import dotty.tools.scaladoc.{Signature => DSignature} import dotty.tools.scaladoc.Inkuire +import dotty.tools.scaladoc.renderers.Resources import scala.util.Random import scala.quoted._ @@ -13,10 +14,13 @@ import SymOps._ import NameNormalizer._ import SyntheticsSupport._ -trait InkuireSupport: +trait InkuireSupport(using DocContext) extends Resources: self: TastyParser => import qctx.reflect._ + // Unused in InkuireSupport, required for Resources + override def effectiveMembers: Map[DRI, Member] = Map.empty + private given qctx.type = qctx def doInkuireStuff(classDef: ClassDef): Unit = { @@ -110,7 +114,7 @@ trait InkuireSupport: ), name = name, packageName = ownerName, - uri = methodSymbol.dri.externalLink.getOrElse(""), + uri = methodSymbol.dri.externalLink.getOrElse(absolutePathWithAnchor(methodSymbol.dri)), entryType = "def" ) val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature)) @@ -138,7 +142,7 @@ trait InkuireSupport: ), name = name, packageName = ownerName, - uri = valSymbol.dri.externalLink.getOrElse(""), + uri = valSymbol.dri.externalLink.getOrElse(absolutePathWithAnchor(valSymbol.dri)), entryType = "val" ) val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))