Skip to content

Commit 5692592

Browse files
committed
Merge searchbar engines
1 parent 9ad69ad commit 5692592

File tree

8 files changed

+555
-509
lines changed

8 files changed

+555
-509
lines changed

scaladoc-js/src/searchbar/Searchbar.scala

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ package dotty.tools.scaladoc
22

33
class Searchbar {
44
val pages = SearchbarGlobals.pages.toList.map(PageEntry.apply)
5-
val engine = SearchbarEngine(pages)
65
val parser = QueryParser()
7-
// val component = SearchbarComponent(q => engine.query(parser.parse(q)))
8-
val inkuireEngine = InkuireJSSearchEngine()
9-
val component = SearchbarComponent(inkuireEngine.query)
6+
val searchEngine = SearchbarEngine(pages)
7+
val inkuireEngine = InkuireDelegateSearchEngine()
8+
val component = SearchbarComponent(searchEngine, inkuireEngine, parser)
109
}

scaladoc-js/src/searchbar/SearchbarComponent.scala

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package dotty.tools.scaladoc
33
import org.scalajs.dom._
44
import org.scalajs.dom.html.Input
55

6-
class SearchbarComponent(val callback: (String) => (PageEntry => Node) => Unit):
6+
class SearchbarComponent(engine: SearchbarEngine, inkuireEngine: InkuireDelegateSearchEngine, parser: QueryParser):
77
val resultsChunkSize = 100
88
extension (p: PageEntry)
99
def toHTML =
@@ -12,7 +12,7 @@ class SearchbarComponent(val callback: (String) => (PageEntry => Node) => Unit):
1212
wrapper.classList.add("monospace")
1313

1414
val resultA = document.createElement("a").asInstanceOf[html.Anchor]
15-
resultA.href = Globals.pathToRoot + p.location
15+
resultA.href = Globals.pathToRoot + p.location.drop(21) //TODO change when generating XD
1616
resultA.text = s"${p.fullName}"
1717

1818
val location = document.createElement("span")
@@ -27,12 +27,37 @@ class SearchbarComponent(val callback: (String) => (PageEntry => Node) => Unit):
2727
})
2828
wrapper
2929

30+
def handleNewFluffQuery(matchers: List[Matchers]) =
31+
val result = engine.query(matchers).map(_.toHTML)
32+
resultsDiv.scrollTop = 0
33+
while (resultsDiv.hasChildNodes()) resultsDiv.removeChild(resultsDiv.lastChild)
34+
val fragment = document.createDocumentFragment()
35+
result.take(resultsChunkSize).foreach(fragment.appendChild)
36+
resultsDiv.appendChild(fragment)
37+
def loadMoreResults(result: List[raw.HTMLElement]): Unit = {
38+
resultsDiv.onscroll = (event: Event) => {
39+
if (resultsDiv.scrollHeight - resultsDiv.scrollTop == resultsDiv.clientHeight)
40+
{
41+
val fragment = document.createDocumentFragment()
42+
result.take(resultsChunkSize).foreach(fragment.appendChild)
43+
resultsDiv.appendChild(fragment)
44+
loadMoreResults(result.drop(resultsChunkSize))
45+
}
46+
}
47+
}
48+
loadMoreResults(result.drop(resultsChunkSize))
49+
3050
def handleNewQuery(query: String) =
3151
resultsDiv.scrollTop = 0
3252
while (resultsDiv.hasChildNodes()) resultsDiv.removeChild(resultsDiv.lastChild)
3353
val fragment = document.createDocumentFragment()
34-
callback(query) { (p: PageEntry) =>
35-
resultsDiv.appendChild(p.toHTML)
54+
parser.parse(query) match {
55+
case EngineMatchersQuery(matchers) =>
56+
handleNewFluffQuery(matchers)
57+
case BySignature(signature) =>
58+
inkuireEngine.query(query) { (p: PageEntry) =>
59+
resultsDiv.appendChild(p.toHTML)
60+
}
3661
}
3762

3863
private val searchIcon: html.Div =

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

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ case class OutputFormat(
2727
matches: List[Match]
2828
)
2929

30-
//TODO CORS problems
3130
class InkuireDelegateSearchEngine {
3231

3332
given ec: ExecutionContext = global
@@ -53,38 +52,3 @@ class InkuireDelegateSearchEngine {
5352
}
5453

5554
}
56-
57-
class InkuireJSSearchEngine {
58-
59-
val scriptPath = Globals.pathToRoot + "scripts/"
60-
val worker = new Worker(s"${scriptPath}inkuire-worker.js")
61-
62-
def dynamicToPageEntry(d: Dynamic): PageEntry = {
63-
PageEntry(
64-
d.functionName.asInstanceOf[String],
65-
d.prettifiedSignature.asInstanceOf[String],
66-
d.pageLocation.asInstanceOf[String],
67-
d.functionName.asInstanceOf[String],
68-
List.empty
69-
)
70-
}
71-
72-
def query(s: String)(callback: PageEntry => Node): List[PageEntry] = {
73-
worker.onmessage = _ => ()
74-
val res = ListBuffer[PageEntry]()
75-
val func = (msg: MessageEvent) => {
76-
msg.data.asInstanceOf[String] match {
77-
case "engine_ready" =>
78-
case "new_query" =>
79-
case q =>
80-
val matches = JSON.parse(q).matches
81-
val actualMatches = matches.asInstanceOf[js.Array[Dynamic]].map(dynamicToPageEntry)
82-
actualMatches.foreach(callback)
83-
}
84-
}
85-
worker.onmessage = func
86-
worker.postMessage(s)
87-
res.toList
88-
}
89-
90-
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package dotty.tools.scaladoc
2+
3+
import scala.io.Source
4+
import dotty.tools.scaladoc.PageEntry
5+
import org.scalajs.dom.webworkers.Worker
6+
import org.scalajs.dom._
7+
import scala.scalajs.js.{ JSON, Dynamic }
8+
import scala.collection.mutable.ListBuffer
9+
import scala.scalajs.js
10+
import scala.scalajs.js.timers._
11+
import org.scalajs.dom.ext.Ajax
12+
import scala.scalajs.js.URIUtils
13+
14+
class InkuireJSSearchEngine {
15+
16+
val scriptPath = Globals.pathToRoot + "scripts/"
17+
val worker = new Worker(s"${scriptPath}inkuire-worker.js")
18+
19+
def dynamicToPageEntry(d: Dynamic): PageEntry = {
20+
PageEntry(
21+
d.functionName.asInstanceOf[String],
22+
d.prettifiedSignature.asInstanceOf[String],
23+
d.pageLocation.asInstanceOf[String],
24+
d.functionName.asInstanceOf[String],
25+
List.empty
26+
)
27+
}
28+
29+
def query(s: String)(callback: PageEntry => Node): List[PageEntry] = {
30+
worker.onmessage = _ => ()
31+
val res = ListBuffer[PageEntry]()
32+
val func = (msg: MessageEvent) => {
33+
msg.data.asInstanceOf[String] match {
34+
case "engine_ready" =>
35+
case "new_query" =>
36+
case q =>
37+
val matches = JSON.parse(q).matches
38+
val actualMatches = matches.asInstanceOf[js.Array[Dynamic]].map(dynamicToPageEntry)
39+
actualMatches.foreach(callback)
40+
}
41+
}
42+
worker.onmessage = func
43+
worker.postMessage(s)
44+
res.toList
45+
}
46+
47+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package dotty.tools.scaladoc
22

3+
sealed trait EngineQuery
4+
case class EngineMatchersQuery(matchers: List[Matchers]) extends EngineQuery
5+
case class BySignature(signature: String) extends EngineQuery
6+
37
sealed trait Matchers extends Function1[PageEntry, Int]
48

59
case class ByName(query: String) extends Matchers:

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@ class QueryParser:
1919
val kindRegex = ("(?i)" + kinds.mkString("(","|",")") + " (.*)").r
2020
val restRegex = raw"(.*)".r
2121
val escapedRegex = raw"`(.*)`".r
22+
val signatureRegex = raw"([^=>]+=>.*)".r
2223

23-
def parse(query: String): List[Matchers] = query match {
24+
def parseMatchers(query: String): List[Matchers] = query match {
2425
case escapedRegex(rest) => List(ByName(rest))
25-
case kindRegex(kind, rest) => List(ByKind(kind)) ++ parse(rest)
26+
case kindRegex(kind, rest) => List(ByKind(kind)) ++ parseMatchers(rest)
2627
case restRegex(name) => List(ByName(name))
2728
case _ => List()
29+
}
30+
31+
def parse(query: String): EngineQuery = query match {
32+
case signatureRegex(signature) => BySignature(signature)
33+
case other => EngineMatchersQuery(parseMatchers(other))
2834
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dotty.tools.scaladoc
22

33
import math.Ordering.Implicits.seqOrdering
4+
import org.scalajs.dom.Node
45

56
class SearchbarEngine(pages: List[PageEntry]):
67
def query(query: List[Matchers]): List[PageEntry] =

0 commit comments

Comments
 (0)