Skip to content

Commit 0b9b69a

Browse files
KacperFKorbantanishiking
authored andcommitted
Better inkuire results display
1 parent ebb68a5 commit 0b9b69a

File tree

6 files changed

+85
-18
lines changed

6 files changed

+85
-18
lines changed

scaladoc-js/resources/scaladoc-searchbar.css

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,13 @@
8080
background-color: var(--leftbar-bg);
8181
color: var(--leftbar-fg);
8282
line-height: 24px;
83-
display: flex;
8483
padding: 4px 10px 4px 10px;
8584
}
8685

86+
.scaladoc-searchbar-result-row {
87+
display: flex;
88+
}
89+
8790
.scaladoc-searchbar-result .micon {
8891
height: 16px;
8992
width: 16px;

scaladoc-js/src/searchbar/PageEntry.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ case class PageEntry(
2020
tokens: List[String]
2121
)
2222

23+
case class InkuireMatch(
24+
prettifiedSignature: String,
25+
functionName: String,
26+
packageLocation: String,
27+
pageLocation: String,
28+
entryType: String
29+
)
30+
2331
object PageEntry {
2432
def apply(jsObj: PageEntryJS): PageEntry = PageEntry(
2533
jsObj.t,

scaladoc-js/src/searchbar/SearchbarComponent.scala

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ import scala.concurrent.duration._
88
class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearchEngine, parser: QueryParser):
99
val resultsChunkSize = 100
1010
extension (p: PageEntry)
11-
def toHTML(inkuire: Boolean = false) =
11+
def toHTML =
1212
val wrapper = document.createElement("div").asInstanceOf[html.Div]
1313
wrapper.classList.add("scaladoc-searchbar-result")
14+
wrapper.classList.add("scaladoc-searchbar-result-row")
1415
wrapper.classList.add("monospace")
1516

1617
val icon = document.createElement("span").asInstanceOf[html.Span]
1718
icon.classList.add("micon")
1819
icon.classList.add(p.kind.take(2))
1920

2021
val resultA = document.createElement("a").asInstanceOf[html.Anchor]
21-
resultA.href = if inkuire then p.location else Globals.pathToRoot + p.location
22+
resultA.href = Globals.pathToRoot + p.location
2223
resultA.text = s"${p.fullName}"
2324

2425
val location = document.createElement("span")
@@ -34,8 +35,52 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch
3435
})
3536
wrapper
3637

38+
extension (m: InkuireMatch)
39+
def toHTML =
40+
val wrapper = document.createElement("div").asInstanceOf[html.Div]
41+
wrapper.classList.add("scaladoc-searchbar-result")
42+
wrapper.classList.add("monospace")
43+
44+
val resultDiv = document.createElement("div").asInstanceOf[html.Div]
45+
resultDiv.classList.add("scaladoc-searchbar-result-row")
46+
47+
val icon = document.createElement("span").asInstanceOf[html.Span]
48+
icon.classList.add("micon")
49+
icon.classList.add(m.entryType.take(2))
50+
51+
val resultA = document.createElement("a").asInstanceOf[html.Anchor]
52+
resultA.href = m.pageLocation
53+
resultA.text = m.functionName
54+
55+
val packageDiv = document.createElement("div").asInstanceOf[html.Div]
56+
packageDiv.classList.add("scaladoc-searchbar-inkuire-package")
57+
58+
val packageIcon = document.createElement("span").asInstanceOf[html.Span]
59+
packageIcon.classList.add("micon")
60+
packageIcon.classList.add("pa")
61+
62+
val packageSpan = document.createElement("span").asInstanceOf[html.Span]
63+
packageSpan.textContent = m.packageLocation
64+
65+
val signature = document.createElement("span")
66+
signature.classList.add("pull-right")
67+
signature.classList.add("scaladoc-searchbar-inkuire-signature")
68+
signature.textContent = m.prettifiedSignature
69+
70+
wrapper.appendChild(resultDiv)
71+
resultDiv.appendChild(icon)
72+
resultDiv.appendChild(resultA)
73+
resultA.appendChild(signature)
74+
wrapper.appendChild(packageDiv)
75+
packageDiv.appendChild(packageIcon)
76+
packageDiv.appendChild(packageSpan)
77+
wrapper.addEventListener("mouseover", {
78+
case e: MouseEvent => handleHover(wrapper)
79+
})
80+
wrapper
81+
3782
def handleNewFluffQuery(matchers: List[Matchers]) =
38-
val result = engine.query(matchers).map(_.toHTML(inkuire = false))
83+
val result = engine.query(matchers).map(_.toHTML)
3984
resultsDiv.scrollTop = 0
4085
while (resultsDiv.hasChildNodes()) resultsDiv.removeChild(resultsDiv.lastChild)
4186
val fragment = document.createDocumentFragment()
@@ -86,8 +131,8 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch
86131
animation.classList.add("loading")
87132
loading.appendChild(animation)
88133
properResultsDiv.appendChild(loading)
89-
inkuireEngine.query(query) { (p: PageEntry) =>
90-
properResultsDiv.appendChild(p.toHTML(inkuire = true))
134+
inkuireEngine.query(query) { (m: InkuireMatch) =>
135+
properResultsDiv.appendChild(m.toHTML)
91136
} { (s: String) =>
92137
animation.classList.remove("loading")
93138
properResultsDiv.appendChild(s.toHTMLError)

scaladoc-js/src/searchbar/engine/InkuireJSSearchEngine.scala

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,18 @@ class InkuireJSSearchEngine {
1616
val scriptPath = Globals.pathToRoot + "scripts/"
1717
val worker: Worker = new Worker(scriptPath + "inkuire-worker.js")
1818

19-
def dynamicToPageEntry(d: Dynamic): PageEntry = {
20-
PageEntry(
21-
d.functionName.asInstanceOf[String],
19+
def dynamicToMatch(d: Dynamic): InkuireMatch = {
20+
InkuireMatch(
2221
d.prettifiedSignature.asInstanceOf[String],
23-
d.pageLocation.asInstanceOf[String],
2422
d.functionName.asInstanceOf[String],
25-
d.entryType.asInstanceOf[String],
26-
List.empty
23+
d.packageLocation.asInstanceOf[String],
24+
d.pageLocation.asInstanceOf[String],
25+
d.entryType.asInstanceOf[String]
2726
)
2827
}
2928

30-
def query(s: String)(callback: PageEntry => Unit)(endCallback: String => Unit): List[PageEntry] = {
29+
def query(s: String)(callback: InkuireMatch => Unit)(endCallback: String => Unit): Unit = {
3130
worker.onmessage = _ => ()
32-
val res = ListBuffer[PageEntry]()
3331
val func = (msg: MessageEvent) => {
3432
msg.data.asInstanceOf[String] match {
3533
case "engine_ready" =>
@@ -38,13 +36,12 @@ class InkuireJSSearchEngine {
3836
endCallback(endMsg.drop("query_ended".length))
3937
case q =>
4038
val matches = JSON.parse(q).matches
41-
val actualMatches = matches.asInstanceOf[js.Array[Dynamic]].map(dynamicToPageEntry)
39+
val actualMatches = matches.asInstanceOf[js.Array[Dynamic]].map(dynamicToMatch)
4240
actualMatches.foreach(callback)
4341
}
4442
}
4543
worker.onmessage = func
4644
worker.postMessage(s)
47-
res.toList
4845
}
4946

5047
}

scaladoc-js/src/searchbar/engine/QueryParser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class QueryParser:
1919
val kindRegex = ("(?i)" + kinds.mkString("(","|",")") + " (.*)").r
2020
val restRegex = raw"(.*)".r
2121
val escapedRegex = raw"`(.*)`".r
22-
val signatureRegex = raw"([^=>]+=>.*)".r
22+
val signatureRegex = raw"(.*=>.*)".r
2323

2424
def parseMatchers(query: String): List[Matchers] = query match {
2525
case escapedRegex(rest) => List(ByName(rest))

scaladoc/resources/dotty_res/styles/search-bar.css

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,18 @@
112112
50% {
113113
background-color: var(--leftbar-bg);
114114
}
115-
}
115+
}
116+
117+
.scaladoc-searchbar-inkuire-package {
118+
display: none;
119+
color: var(--symbol-fg)
120+
}
121+
122+
div[selected] > .scaladoc-searchbar-inkuire-package {
123+
display: flex;
124+
}
125+
126+
.scaladoc-searchbar-inkuire-package > .micon {
127+
float: right;
128+
margin-left: auto !important;
129+
}

0 commit comments

Comments
 (0)