Skip to content

Scaladoc/Inkuire-M2 #13153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jul 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion scaladoc-js/resources/scaladoc-searchbar.css
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,13 @@
background-color: var(--leftbar-bg);
color: var(--leftbar-fg);
line-height: 24px;
display: flex;
padding: 4px 10px 4px 10px;
}

.scaladoc-searchbar-result-row {
display: flex;
}

.scaladoc-searchbar-result .micon {
height: 16px;
width: 16px;
Expand Down
8 changes: 8 additions & 0 deletions scaladoc-js/src/searchbar/PageEntry.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ case class PageEntry(
tokens: List[String]
)

case class InkuireMatch(
prettifiedSignature: String,
functionName: String,
packageLocation: String,
pageLocation: String,
entryType: String
)

object PageEntry {
def apply(jsObj: PageEntryJS): PageEntry = PageEntry(
jsObj.t,
Expand Down
55 changes: 50 additions & 5 deletions scaladoc-js/src/searchbar/SearchbarComponent.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@ import scala.concurrent.duration._
class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearchEngine, parser: QueryParser):
val resultsChunkSize = 100
extension (p: PageEntry)
def toHTML(inkuire: Boolean = false) =
def toHTML =
val wrapper = document.createElement("div").asInstanceOf[html.Div]
wrapper.classList.add("scaladoc-searchbar-result")
wrapper.classList.add("scaladoc-searchbar-result-row")
wrapper.classList.add("monospace")

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

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

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

extension (m: InkuireMatch)
def toHTML =
val wrapper = document.createElement("div").asInstanceOf[html.Div]
wrapper.classList.add("scaladoc-searchbar-result")
wrapper.classList.add("monospace")

val resultDiv = document.createElement("div").asInstanceOf[html.Div]
resultDiv.classList.add("scaladoc-searchbar-result-row")

val icon = document.createElement("span").asInstanceOf[html.Span]
icon.classList.add("micon")
icon.classList.add(m.entryType.take(2))

val resultA = document.createElement("a").asInstanceOf[html.Anchor]
resultA.href = m.pageLocation
resultA.text = m.functionName

val packageDiv = document.createElement("div").asInstanceOf[html.Div]
packageDiv.classList.add("scaladoc-searchbar-inkuire-package")

val packageIcon = document.createElement("span").asInstanceOf[html.Span]
packageIcon.classList.add("micon")
packageIcon.classList.add("pa")

val packageSpan = document.createElement("span").asInstanceOf[html.Span]
packageSpan.textContent = m.packageLocation

val signature = document.createElement("span")
signature.classList.add("pull-right")
signature.classList.add("scaladoc-searchbar-inkuire-signature")
signature.textContent = m.prettifiedSignature

wrapper.appendChild(resultDiv)
resultDiv.appendChild(icon)
resultDiv.appendChild(resultA)
resultA.appendChild(signature)
wrapper.appendChild(packageDiv)
packageDiv.appendChild(packageIcon)
packageDiv.appendChild(packageSpan)
wrapper.addEventListener("mouseover", {
case e: MouseEvent => handleHover(wrapper)
})
wrapper

def handleNewFluffQuery(matchers: List[Matchers]) =
val result = engine.query(matchers).map(_.toHTML(inkuire = false))
val result = engine.query(matchers).map(_.toHTML)
resultsDiv.scrollTop = 0
while (resultsDiv.hasChildNodes()) resultsDiv.removeChild(resultsDiv.lastChild)
val fragment = document.createDocumentFragment()
Expand Down Expand Up @@ -86,8 +131,8 @@ class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireJSSearch
animation.classList.add("loading")
loading.appendChild(animation)
properResultsDiv.appendChild(loading)
inkuireEngine.query(query) { (p: PageEntry) =>
properResultsDiv.appendChild(p.toHTML(inkuire = true))
inkuireEngine.query(query) { (m: InkuireMatch) =>
properResultsDiv.appendChild(m.toHTML)
} { (s: String) =>
animation.classList.remove("loading")
properResultsDiv.appendChild(s.toHTMLError)
Expand Down
17 changes: 7 additions & 10 deletions scaladoc-js/src/searchbar/engine/InkuireJSSearchEngine.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,18 @@ class InkuireJSSearchEngine {
val scriptPath = Globals.pathToRoot + "scripts/"
val worker: Worker = new Worker(scriptPath + "inkuire-worker.js")

def dynamicToPageEntry(d: Dynamic): PageEntry = {
PageEntry(
d.functionName.asInstanceOf[String],
def dynamicToMatch(d: Dynamic): InkuireMatch = {
InkuireMatch(
d.prettifiedSignature.asInstanceOf[String],
d.pageLocation.asInstanceOf[String],
d.functionName.asInstanceOf[String],
"def",
List.empty
d.packageLocation.asInstanceOf[String],
d.pageLocation.asInstanceOf[String],
d.entryType.asInstanceOf[String]
)
}

def query(s: String)(callback: PageEntry => Unit)(endCallback: String => Unit): List[PageEntry] = {
def query(s: String)(callback: InkuireMatch => Unit)(endCallback: String => Unit): Unit = {
worker.onmessage = _ => ()
val res = ListBuffer[PageEntry]()
val func = (msg: MessageEvent) => {
msg.data.asInstanceOf[String] match {
case "engine_ready" =>
Expand All @@ -38,13 +36,12 @@ class InkuireJSSearchEngine {
endCallback(endMsg.drop("query_ended".length))
case q =>
val matches = JSON.parse(q).matches
val actualMatches = matches.asInstanceOf[js.Array[Dynamic]].map(dynamicToPageEntry)
val actualMatches = matches.asInstanceOf[js.Array[Dynamic]].map(dynamicToMatch)
actualMatches.foreach(callback)
}
}
worker.onmessage = func
worker.postMessage(s)
res.toList
}

}
2 changes: 1 addition & 1 deletion scaladoc-js/src/searchbar/engine/QueryParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class QueryParser:
val kindRegex = ("(?i)" + kinds.mkString("(","|",")") + " (.*)").r
val restRegex = raw"(.*)".r
val escapedRegex = raw"`(.*)`".r
val signatureRegex = raw"([^=>]+=>.*)".r
val signatureRegex = raw"(.*=>.*)".r

def parseMatchers(query: String): List[Matchers] = query match {
case escapedRegex(rest) => List(ByName(rest))
Expand Down
5 changes: 5 additions & 0 deletions scaladoc-testcases/src/tests/inkuire.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@ class JustAClass {
class JustAnotherClass extends JustAClass {
def method(i: InType2): OutType2 = ???
}

object InkuireObject {
def function(i: InType1): OutType1 = ???
val value: InType1 => OutType1 = ???
}
38 changes: 29 additions & 9 deletions scaladoc/resources/dotty_res/styles/search-bar.css
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@

/* Loading */
.loading-wrapper {
align-self: center;
text-align: center;
padding: 4px;
}

Expand All @@ -75,18 +75,21 @@
width: 10px;
height: 10px;
border-radius: 5px;
background-color: var(--shadow);
color: var(--shadow);
animation: dotFlashing 1s infinite alternate;
background-color: var(--leftbar-bg);
color: var(--leftbar-bg);
animation-name: dotFlashing;
animation-duration: 1.6s;
animation-iteration-count: infinite;
animation-direction: normal;
animation-timing-function: ease-in-out;
display: inline-block;
position: absolute;
top: 0;
}

.loading {
left: 50%;
position: relative;
animation-delay: .5s;
animation-delay: .2s;
}

.loading::before {
Expand All @@ -96,14 +99,31 @@

.loading::after {
left: 15px;
animation-delay: 1s;
animation-delay: .4s;
}

@keyframes dotFlashing {
0% {
background-color: var(--leftbar-bg);
}
100% {
25% {
background-color: var(--shadow);
}
}
50% {
background-color: var(--leftbar-bg);
}
}

.scaladoc-searchbar-inkuire-package {
display: none;
color: var(--symbol-fg)
}

div[selected] > .scaladoc-searchbar-inkuire-package {
display: flex;
}

.scaladoc-searchbar-inkuire-package > .micon {
float: right;
margin-left: auto !important;
}
Loading