From 0f2808227be055fb4603e7a0600a063a5756dfa0 Mon Sep 17 00:00:00 2001 From: Gilles Dubochet Date: Thu, 30 Sep 2010 10:08:20 +0000 Subject: [scaladoc] JavaScript template search uses a st... [scaladoc] JavaScript template search uses a statically built index to considerably increase performance. Contributed by Kato Kazuyoshi. Review by dubochet. --- .../scala/tools/nsc/doc/html/page/Index.scala | 76 +++++++++++++++++----- .../scala/tools/nsc/doc/html/resource/lib/index.js | 68 ++++++++++++------- 2 files changed, 103 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Index.scala b/src/compiler/scala/tools/nsc/doc/html/page/Index.scala index 09da71fc1f..9a964ee30f 100644 --- a/src/compiler/scala/tools/nsc/doc/html/page/Index.scala +++ b/src/compiler/scala/tools/nsc/doc/html/page/Index.scala @@ -47,6 +47,21 @@ class Index(universe: Universe, indexModel: IndexModelFactory#IndexModel) extend + + def isExcluded(dtpl: DocTemplateEntity) = { + val qname = dtpl.qualifiedName + ( ( qname.startsWith("scala.Tuple") || qname.startsWith("scala.Product") || + qname.startsWith("scala.Function") || qname.startsWith("scala.runtime.AbstractFunction") + ) && !( + qname == "scala.Tuple1" || qname == "scala.Tuple2" || + qname == "scala.Product" || qname == "scala.Product1" || qname == "scala.Product2" || + qname == "scala.Function" || qname == "scala.Function1" || qname == "scala.Function2" || + qname == "scala.runtime.AbstractFunction0" || qname == "scala.runtime.AbstractFunction1" || + qname == "scala.runtime.AbstractFunction2" + ) + ) + } + def browser =
@@ -61,19 +76,6 @@ class Index(universe: Universe, indexModel: IndexModelFactory#IndexModel) extend
{ - def isExcluded(dtpl: DocTemplateEntity) = { - val qname = dtpl.qualifiedName - ( ( qname.startsWith("scala.Tuple") || qname.startsWith("scala.Product") || - qname.startsWith("scala.Function") || qname.startsWith("scala.runtime.AbstractFunction") - ) && !( - qname == "scala.Tuple1" || qname == "scala.Tuple2" || - qname == "scala.Product" || qname == "scala.Product1" || qname == "scala.Product2" || - qname == "scala.Function" || qname == "scala.Function1" || qname == "scala.Function2" || - qname == "scala.runtime.AbstractFunction0" || qname == "scala.runtime.AbstractFunction1" || - qname == "scala.runtime.AbstractFunction2" - ) - ) - } def packageElem(pack: model.Package): NodeSeq = { { if (!pack.isRootPackage) @@ -116,22 +118,64 @@ class Index(universe: Universe, indexModel: IndexModelFactory#IndexModel) extend placeholderSeq ++ createLink(entry, includePlaceholder = false, includeText = true) } -
  • { +
  • { itemContents }
  • } }
      { for (sp <- pack.packages sortBy (_.name.toLowerCase)) yield -
    1. { packageElem(sp) }
    2. +
    3. { packageElem(sp) }
    4. }
    } packageElem(universe.rootPackage) - }
    + }
    { scriptElement }
    + def toId(str: String) = { + val pattern = "[^A-Za-z0-9-]".r + pattern.replaceSomeIn(str, (m: scala.util.matching.Regex.Match) => { + Some("-" + m.group(0).charAt(0).toInt) + }) + } + + def scriptElement = { + val templatesOf = allPackagesWithTemplates + + val elements = templatesOf.keys.map(pack => { + List( + "{ name: '", pack, "', children: ", + templatesOf(pack).map(t => "'" + t + "'").mkString("[", ",", "]"), + "}" + ).mkString("") + }) + + + } + + def allPackagesWithTemplates: Map[Package, List[DocTemplateEntity]] = { + Map(allPackages.map((key) => { + key -> key.templates.filter(t => !t.isPackage && !isExcluded(t)) + }) : _*) + } + + def allPackages: List[Package] = { + def f(parent: Package): List[Package] = { + parent.packages.flatMap( + p => f(p) :+ p + ) + } + f(universe.rootPackage).sortBy(_.toString) + } + def packageQualifiedName(ety: DocTemplateEntity): String = if (ety.inTemplate.isPackage) ety.name else (packageQualifiedName(ety.inTemplate) + "." + ety.name) diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js index e598dca727..5c1d29fca6 100644 --- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js +++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js @@ -60,6 +60,24 @@ $(document).ready(function() { }); +var Index = {}; + +(function (ns) { + function toId(name) { + return name.replace(/[^A-Za-z0-9-]/g, function (str) { + return '-' + str.charCodeAt(0); + }); + } + + ns.idOfTemplate = function (name) { + return 'template-' + toId(name); + } + + ns.idOfPackage = function (name) { + return 'package-' + toId(name); + } +})(Index); + function configureEntityList() { kindFilterSync(); configureHideFilter(); @@ -141,37 +159,37 @@ function textFilter() { else { // if query is all lower case make a normal case insensitive search queryRegExp = new RegExp(query, "i"); } - scheduler.addForAll("filter", domCache.packs, function(pack0) { - var pack = $(pack0); - $("> ol.templates > li", pack).each(function(){ - var item = $(this).attr("title"); - if (item == "" || queryRegExp.test(item)) { - $(this).show(); - $(this).removeClass("hide"); - } - else { - $(this).addClass("hide"); - $(this).hide(); + + $.each(Index.PACKAGES, function (i, package) { + var empty = true; + var matchedSet = {}; + + $.each(package.children, function (j, child) { + if (queryRegExp.test(child)) { + matchedSet[child] = 1; + empty = false; } }); - if ($("> ol > li:not(.hide)", pack).length > 0) { - pack.show(); - pack.removeClass("hide"); - } - else { - pack.addClass("hide"); - pack.hide(); - } - if ($("> ol.templates > li:not(.hide)", pack).length > 0) { - $("> h3", pack).show(); - $("> .packhide", pack).show(); - $("> .packfocus", pack).show(); - } - else { + + var pack = $('#' + Index.idOfPackage(package.name)); + if (empty) { $("> h3", pack).hide(); + $("> .templates", pack).hide(); $("> .packhide", pack).hide(); $("> .packfocus", pack).hide(); + + return; } + + $("> h3", pack).show(); + $.each(package.children, function (j, child) { + $('#' + Index.idOfTemplate(child))[ + matchedSet[child] ? 'show' : 'hide' + ](); + }); + $("> .templates", pack).show(); + $("> .packhide", pack).show(); + $("> .packfocus", pack).show(); }); }); } -- cgit v1.2.3