Skip to content

Commit de5491d

Browse files
committed
Add search by acronym
1 parent 454a8e1 commit de5491d

File tree

5 files changed

+23
-10
lines changed

5 files changed

+23
-10
lines changed

scala3doc-js/src/searchbar/PageEntry.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,19 @@ trait PageEntryJS extends js.Object {
1111
}
1212

1313
case class PageEntry(
14-
name: String,
14+
fullName: String,
1515
description: String,
1616
location: String,
17-
searchKeys: Array[String]
17+
shortName: String,
18+
acronym: Option[String],
1819
)
1920

2021
object PageEntry {
2122
def apply(jsObj: PageEntryJS): PageEntry = PageEntry(
2223
jsObj.name,
2324
jsObj.description,
2425
jsObj.location,
25-
jsObj.searchKeys.toArray
26+
jsObj.searchKeys.head.toLowerCase,
27+
Option.when(jsObj.searchKeys.size > 1)(jsObj.searchKeys.last)
2628
)
2729
}

scala3doc-js/src/searchbar/SearchbarComponent.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
1212

1313
val resultA = document.createElement("a").asInstanceOf[html.Anchor]
1414
resultA.href = Globals.pathToRoot + p.location
15-
resultA.text = s"${p.name}"
15+
resultA.text = s"${p.fullName}"
1616

1717
val location = document.createElement("span")
1818
location.classList.add("pull-right")

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,17 @@ package dotty.dokka
33
enum Matchers(func: (PageEntry) => Int) extends Function1[PageEntry, Int]:
44
export func.apply
55
case ByName(query: String) extends Matchers( (p) => {
6-
val name = p.searchKeys.headOption.map(_.toLowerCase)
6+
val nameOption = Option(p.shortName)
7+
val acronym = p.acronym
78
//Edge case for empty query string
89
if query == "" then 1
9-
else name.filter(_.contains(query)).map(_ => p.name.size - query.size).getOrElse(-1)
10+
else {
11+
val results = List(
12+
nameOption.filter(_.contains(query.toLowerCase)).fold(-1)(_.size - query.size),
13+
acronym.filter(_.contains(query)).fold(-1)(_.size - query.size + 1)
14+
)
15+
if results.forall(_ == -1) then -1 else results.filter(_ != -1).min
16+
}
1017
})
11-
case ByKind(kind: String) extends Matchers((p) => p.name.split(" ").headOption.filter(_ == kind).fold(-1)(_ => 1))
18+
case ByKind(kind: String) extends Matchers((p) => p.fullName.split(" ").headOption.filter(_.equalsIgnoreCase(kind)).fold(-1)(_ => 1))
1219

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ class QueryParser:
1414
"var",
1515
"package",
1616
"given",
17+
"type"
1718
)
18-
val kindRegex = (kinds.mkString("(","|",")") + " (.*)").r
19+
val kindRegex = ("(?i)" + kinds.mkString("(","|",")") + " (.*)").r
1920
val restRegex = raw"(.*)".r
2021
val escapedRegex = raw"`(.*)`".r
2122

22-
def parse(query: String): List[Matchers] = query.toLowerCase match {
23+
def parse(query: String): List[Matchers] = query match {
2324
case escapedRegex(rest) => List(Matchers.ByName(rest))
2425
case kindRegex(kind, rest) => List(Matchers.ByKind(kind)) ++ parse(rest)
2526
case restRegex(name) => List(Matchers.ByName(name))

scala3doc/src/dotty/renderers/ScalaSearchbarDataInstaller.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,11 @@ class ScalaSearchbarDataInstaller(val ctx: DokkaContext) extends SearchbarDataIn
6060
pages.addOne(p.getName + link, PageEntry(p.getName, p.getName, link, ""))
6161
}
6262

63+
private def createAcronym(s: String): Option[String] =
64+
if s.head.isUpper then Some(s.filter(_.isUpper)) else None
65+
6366
override def generatePagesList(): String = {
6467
val mapper = jacksonObjectMapper()
65-
val pagesList = pages.values.map(p => createSearchRecord(p.signature, p.pkg, p.link, List(p.name).asJava)).toList.asJava
68+
val pagesList = pages.values.map(p => createSearchRecord(p.signature, p.pkg, p.link, (List(p.name) ++ createAcronym(p.name)).asJava)).toList.asJava
6669
mapper.writeValueAsString(pagesList)
6770
}

0 commit comments

Comments
 (0)