Skip to content

Commit 7b07a78

Browse files
committed
Scaladoc: Add new search, featuring entity and member search
This commit adds a revamped search function for the scaladoc tool. It also contains a number of small fixes for HTML-layout and JavaScript issues. The search is implemented by enhancing the scheduler and using JavaScript promises. List of changes/additions: * Revamped search functionality - Search members as well as entities - Preserve keyboard navigation - Scroll to selected entity if outside of viewport - Non-blocking, cancelable * Display of library name (top left) * Refactored scheduler * Cleanup of HTML layout - Remove left pane - Better mobile layout, no need for dynamic offsets - Remove unused element classes - Remove iframe structure - Better layout for kinds
1 parent c524f18 commit 7b07a78

24 files changed

+2212
-999
lines changed

src/scaladoc/scala/tools/nsc/doc/doclet/Indexer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ trait Indexer extends Generator with Universer {
1818
indexField != null
1919
}
2020

21-
}
21+
}

src/scaladoc/scala/tools/nsc/doc/html/Doclet.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
* @author David Bernard, Manohar Jonnalagedda
44
*/
55

6-
package scala.tools.nsc.doc
6+
package scala.tools.nsc
7+
package doc
78
package html
89

910
import doclet._
@@ -13,7 +14,7 @@ import doclet._
1314
class Doclet extends Generator with Universer with Indexer {
1415

1516
def generateImpl() {
16-
new html.HtmlFactory(universe, index).generate()
17+
new html.HtmlFactory(universe, index, new ScalaDocReporter(universe.settings)).generate()
1718
}
1819

1920
}

src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import page.diagram._
1616
/** A class that can generate Scaladoc sites to some fixed root folder.
1717
* @author David Bernard
1818
* @author Gilles Dubochet */
19-
class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
19+
class HtmlFactory(val universe: doc.Universe, index: doc.Index, val reporter: ScalaDocReporter) {
20+
import page.{IndexScript, EntityPage}
2021

2122
/** The character encoding to be used for generated Scaladoc sites.
2223
* This value is currently always UTF-8. */
@@ -34,6 +35,9 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
3435
"trait_comp.svg",
3536
"permalink.svg",
3637
"abstract_type.svg",
38+
"lato-v11-latin-100.eot",
39+
"lato-v11-latin-100.ttf",
40+
"lato-v11-latin-100.woff",
3741
"lato-v11-latin-regular.eot",
3842
"lato-v11-latin-regular.ttf",
3943
"lato-v11-latin-regular.woff",
@@ -96,14 +100,15 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
96100

97101
libResources foreach (s => copyResource("lib/" + s))
98102

99-
new page.Index(universe, index) writeFor this
100-
new page.IndexScript(universe, index) writeFor this
103+
IndexScript(universe, index) writeFor this
104+
101105
if (index.hasDeprecatedMembers)
102-
new page.DeprecatedIndex(universe, index) writeFor this
106+
new page.DeprecatedIndex(universe, index, reporter) writeFor this
103107
try {
104108
writeTemplates(_ writeFor this)
109+
105110
for (letter <- index.firstLetterIndex) {
106-
new html.page.ReferenceIndex(letter._1, index, universe) writeFor this
111+
new html.page.ReferenceIndex(letter._1, index, universe, reporter) writeFor this
107112
}
108113
} finally {
109114
DiagramStats.printStats(universe.settings)
@@ -117,7 +122,7 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
117122
def writeTemplate(tpl: DocTemplateEntity) {
118123
if (!(written contains tpl)) {
119124
val diagramGenerator: DiagramGenerator = new DotDiagramGenerator(universe.settings, universe.dotRunner)
120-
writeForThis(new page.Template(universe, diagramGenerator, tpl))
125+
writeForThis(page.EntityPage(universe, diagramGenerator, tpl, reporter))
121126
written += tpl
122127
tpl.templates collect { case d: DocTemplateEntity => d } map writeTemplate
123128
}

src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ abstract class HtmlPage extends Page { thisPage =>
2626
/** The title of this page. */
2727
protected def title: String
2828

29+
/** ScalaDoc reporter for error handling */
30+
protected def reporter: ScalaDocReporter
31+
2932
/** The page description */
3033
protected def description: String =
3134
// unless overwritten, will display the title in a spaced format, keeping - and .
@@ -48,7 +51,7 @@ abstract class HtmlPage extends Page { thisPage =>
4851
<html>
4952
<head>
5053
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
51-
<meta name="viewport" content="width=device-width, initial-scale=1"/>
54+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
5255
<title>{ title }</title>
5356
<meta name="description" content={ description }/>
5457
<meta name="keywords" content={ keywords }/>
@@ -281,20 +284,16 @@ abstract class HtmlPage extends Page { thisPage =>
281284
}
282285
}</span>
283286

284-
def memberToUrl(template: Entity, isSelf: Boolean = true): String = {
287+
private def memberToUrl(template: Entity, isSelf: Boolean = true): String = {
285288
val (signature: Option[String], containingTemplate: TemplateEntity) = template match {
286289
case dte: DocTemplateEntity if (!isSelf) => (Some(dte.signature), dte.inTemplate)
287290
case dte: DocTemplateEntity => (None, dte)
288291
case me: MemberEntity => (Some(me.signature), me.inTemplate)
289292
case tpl => (None, tpl)
290293
}
291294

292-
def hashFromPath(templatePath: List[String]): String =
293-
((templatePath.head.replace(".html", "") :: templatePath.tail).reverse).mkString(".")
294-
295-
val containingTemplatePath = templateToPath(containingTemplate)
296-
val url = "../" * (containingTemplatePath.size - 1) + "index.html"
297-
val hash = hashFromPath(containingTemplatePath)
298-
s"$url#$hash" + signature.map("@" + _).getOrElse("")
295+
val templatePath = templateToPath(containingTemplate)
296+
val url = "../" * (templatePath.size - 1) + templatePath.reverse.mkString("/")
297+
url + signature.map("#" + _).getOrElse("")
299298
}
300299
}

src/scaladoc/scala/tools/nsc/doc/html/Page.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ abstract class Page {
7878
}
7979
val (file, pack) =
8080
tpl match {
81-
case p: Package => ("package.html", p)
81+
case p: Package => ("index.html", p)
8282
case _ => downInner(doName(tpl), tpl)
8383
}
8484
file :: downPacks(pack)

src/scaladoc/scala/tools/nsc/doc/html/page/DeprecatedIndex.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ package page
1111

1212
import doc.model._
1313

14-
class DeprecatedIndex(universe: Universe, index: doc.Index) extends HtmlPage {
14+
class DeprecatedIndex(universe: Universe, index: doc.Index, rep: ScalaDocReporter) extends HtmlPage {
15+
16+
def reporter = rep
1517

1618
def path = List("deprecated-list.html")
1719

0 commit comments

Comments
 (0)