Skip to content

Commit e28f3d7

Browse files
committed
Add basic matchers and query parser
1 parent 0d3a27a commit e28f3d7

File tree

5 files changed

+45
-4
lines changed

5 files changed

+45
-4
lines changed

scala3doc-js/src/searchbar/Searchbar.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ package dotty.dokka
33
class Searchbar {
44
val pages = SearchbarGlobals.pages.toList.map(PageEntry.apply)
55
val engine = SearchbarEngine(pages)
6-
val component = SearchbarComponent(engine.query)
6+
val parser = QueryParser()
7+
val component = SearchbarComponent(q => engine.query(parser.parse(q)))
78
}

scala3doc-js/src/searchbar/SearchbarComponent.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]) {
4444
private val input: html.Input = {
4545
val element = document.createElement("input").asInstanceOf[html.Input]
4646
element.id = "scala3doc-searchbar-input"
47-
element.addEventListener("keyup", (e) => handleNewQuery(e.target.asInstanceOf[html.Input].value))
47+
element.addEventListener("input", (e) => handleNewQuery(e.target.asInstanceOf[html.Input].value))
4848
element
4949
}
5050

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dotty.dokka
2+
3+
enum Matchers(func: (PageEntry) => Int) extends Function1[PageEntry, Int]:
4+
export func.apply
5+
case ByName(query: String) extends Matchers( (p) => {
6+
val name = p.searchKeys.headOption.map(_.toLowerCase)
7+
name.filter(_.contains(query)).map(_ => p.name.size - query.size).getOrElse(-1)
8+
})
9+
case ByKind(kind: String) extends Matchers((p) => p.name.split(" ").headOption.filter(_ == kind).fold(-1)(_ => 1))
10+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dotty.dokka
2+
3+
import scala.util.matching.Regex._
4+
import scala.util.matching._
5+
6+
class QueryParser:
7+
val kinds = Seq(
8+
"class",
9+
"trait",
10+
"enum",
11+
"object",
12+
"def",
13+
"val",
14+
"var",
15+
"package",
16+
"given",
17+
)
18+
val kindRegex = (kinds.mkString("(","|",")") + " (.+)").r
19+
val restRegex = raw"(.+)".r
20+
val escapedRegex = raw"`(.+)`".r
21+
22+
def parse(query: String): List[Matchers] = query.toLowerCase match {
23+
case escapedRegex(rest) => List(Matchers.ByName(rest))
24+
case kindRegex(kind, rest) => List(Matchers.ByKind(kind)) ++ parse(rest)
25+
case restRegex(name) => List(Matchers.ByName(name))
26+
case _ => List()
27+
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package dotty.dokka
22

3+
import math.Ordering.Implicits.seqOrdering
4+
35
class SearchbarEngine(pages: List[PageEntry]) {
4-
//TODO: Query should be parsed by QueryParser to list of filtering strategies called Matchers
5-
def query(query: String): List[PageEntry] = pages
6+
def query(query: List[Matchers]): List[PageEntry] = {
7+
pages.map(p => p -> query.map(_(p))).filterNot(_(1).exists(_ < 0)).sortBy(_(1)).map(_(0))
8+
}
69
}

0 commit comments

Comments
 (0)