summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Furlanetto <pedrofurla@gmail.com>2010-09-16 04:55:45 +0000
committerPedro Furlanetto <pedrofurla@gmail.com>2010-09-16 04:55:45 +0000
commite57245492c143186033a7ffa9555988338f5f509 (patch)
tree65a0b93b97ceeef8abae2956aaded94ff27586de
parent18a4de80a9f73b279528262e51f530d879efd5d9 (diff)
downloadscala-e57245492c143186033a7ffa9555988338f5f509.tar.gz
scala-e57245492c143186033a7ffa9555988338f5f509.tar.bz2
scala-e57245492c143186033a7ffa9555988338f5f509.zip
Adds a reference index to the documentation.
Currently there is no link from the main index but can be viewed by replacing 'index.html' with 'index/index-a.html' in the browser address bar. Review by dubochet.
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocFactory.scala4
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala10
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala54
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css28
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala60
5 files changed, 152 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/doc/DocFactory.scala b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
index 42b07a917a..4ce675cfb2 100644
--- a/src/compiler/scala/tools/nsc/doc/DocFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
@@ -62,6 +62,8 @@ class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor
/** Generate document(s) for all `files` containing scaladoc documenataion.
* @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */
def document(files: List[String]): Unit =
- universe(files) foreach { docModel => (new html.HtmlFactory(docModel)).generate }
+ universe(files) foreach { docModel =>
+ new html.HtmlFactory(docModel, new model.IndexModelFactory makeModel(docModel)) generate
+ }
}
diff --git a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
index 3c8286809e..1869fbb9fd 100644
--- a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
@@ -16,7 +16,7 @@ import scala.collection._
/** A class that can generate Scaladoc sites to some fixed root folder.
* @author David Bernard
* @author Gilles Dubochet */
-class HtmlFactory(val universe: Universe) {
+class HtmlFactory(val universe: Universe, indexModel: IndexModelFactory#IndexModel) {
/** The character encoding to be used for generated Scaladoc sites. This value is currently always UTF-8. */
def encoding: String = "UTF-8"
@@ -45,10 +45,11 @@ class HtmlFactory(val universe: Universe) {
copyResource("lib/jquery.layout.js")
copyResource("lib/tools.tooltip.js")
copyResource("lib/scheduler.js")
- copyResource("lib/index.css")
copyResource("lib/index.js")
- copyResource("lib/template.css")
copyResource("lib/template.js")
+ copyResource("lib/index.css")
+ copyResource("lib/ref-index.css")
+ copyResource("lib/template.css")
copyResource("lib/class.png")
copyResource("lib/class_big.png")
copyResource("lib/object.png")
@@ -74,6 +75,9 @@ class HtmlFactory(val universe: Universe) {
writeTemplate(universe.rootPackage)
+ for(letter <- indexModel) {
+ new html.page.ReferenceIndex(letter._1,indexModel, universe) writeFor this
+ }
}
}
diff --git a/src/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala b/src/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
new file mode 100755
index 0000000000..124b6852ba
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
@@ -0,0 +1,54 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2010 LAMP/EPFL
+ * @author Pedro Furlanetto
+ */
+
+package scala.tools.nsc
+package doc
+package html
+package page
+
+
+class ReferenceIndex(letter: Char, indexModel: model.IndexModelFactory#IndexModel, universe: Universe) extends HtmlPage {
+
+ def path = List("index-"+letter+".html","index")
+
+ def title = {
+ val s = universe.settings
+ ( if (!s.doctitle.isDefault) s.doctitle.value else "" ) +
+ ( if (!s.docversion.isDefault) (" " + s.docversion.value) else "" )
+ }
+
+ def headers =
+ <xml:group>
+ <link href={ relativeLinkTo(List("ref-index.css", "lib")) } media="screen" type="text/css" rel="stylesheet"/>
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery.js", "lib")} }></script>
+ </xml:group>
+ val groupedMembers = indexModel(letter)
+ def indexLinks =
+ <div class="letters">
+ { for(l <- indexModel.keySet.toList.sortBy( _.toString )) yield { // TODO there should be a better way to do that
+ val ch = if(l=='#') "%23" else l // url encoding if needed
+ ( if(letter != l)
+ <span><a href={"index-"+ch+".html"}>{l.toUpper}</a></span>
+ else
+ xml.Text(l.toUpper.toString) ) ++ xml.Text(" | ")
+ } }
+ </div>
+
+ def body =
+ <body>
+ { indexLinks }
+ { for(groups <- groupedMembers) yield {
+ <div class="entry">
+ <div class="name">{ groups._1 }</div>
+ <div class="occurrences">
+ { for(owner <- groups._2.view) yield {
+ templateToHtml(owner) ++ xml.Text(" ")
+ } }
+ </div>
+ </div>
+ } }
+ </body>
+
+}
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
new file mode 100755
index 0000000000..687fe4634c
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
@@ -0,0 +1,28 @@
+body {
+ font-size: 10pt;
+ font-family: sans-serif;
+}
+
+a {
+ color:#69481D;
+}
+
+.letters {
+ width:100%;
+ text-align:center;
+ margin:0.6em;
+ padding:0.1em;
+ border-bottom:1px solid gray;
+}
+
+.entry {
+
+}
+
+.name {
+ background-color:#E5E5E5;
+}
+
+.occurrences {
+ margin-left:0.7em
+} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
new file mode 100755
index 0000000000..53fb1b60f9
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
@@ -0,0 +1,60 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2010 LAMP/EPFL
+ * @author Pedro Furlanetto
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+
+class IndexModelFactory {
+
+ /** SortedMap[symbol name, SortedSet[owner template]] */
+ type SymbolMap = immutable.SortedMap[String,SortedSet[model.TemplateEntity]]
+ /** Map[symbol's first letter, SymbolMap] */
+ type IndexModel = Map[Char, SymbolMap]
+
+ def makeModel(universe:Universe)={
+ import model._
+
+ val index = new mutable.HashMap[Char,SymbolMap] {
+ /* Owner template ordering */
+ implicit def orderingSet = math.Ordering.String.on { x:TemplateEntity => x.name.toLowerCase }
+ /* symbol name ordering */
+ implicit def orderingMap = math.Ordering.String.on { x:String => x.toLowerCase }
+
+ def addMember(d:MemberEntity) = {
+ val firstLetter = {
+ val ch = d.name.head.toLower
+ if(ch.isLetterOrDigit) ch else '#'
+ }
+ this(firstLetter) =
+ if(this.contains(firstLetter)) {
+ val letter = this(firstLetter)
+ val value = this(firstLetter).get(d.name).getOrElse(SortedSet.empty[TemplateEntity]) + d.inDefinitionTemplates.head
+ letter + ((d.name, value))
+ } else {
+ immutable.SortedMap( (d.name, SortedSet(d.inDefinitionTemplates.head)) )
+ }
+ }
+ }
+
+ //@scala.annotation.tailrec // TODO
+ def gather(owner:DocTemplateEntity):Unit =
+ for(m <- owner.members if m.inDefinitionTemplates.isEmpty || m.inDefinitionTemplates.head == owner)
+ m match {
+ case tpl:DocTemplateEntity =>
+ index.addMember(tpl)
+ gather(tpl)
+ case alias:AliasType => index.addMember(alias)
+ case absType:AbstractType => index.addMember(absType)
+ case non:NonTemplateMemberEntity if !non.isConstructor => index.addMember(non)
+ case x @ _ =>
+ }
+
+ gather(universe.rootPackage)
+ index.toMap
+ }
+} \ No newline at end of file