summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
blob: d629b73572b58ec3c5cb8576f8512c5be32a5661 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* NSC -- new Scala compiler
 * Copyright 2007-2011 LAMP/EPFL
 * @author  David Bernard, Manohar Jonnalagedda
 */

package scala.tools.nsc
package doc
package html

import model._
import java.io.{ File => JFile }
import io.{ Streamable, Directory }
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: doc.Universe, index: doc.Index) {

  /** The character encoding to be used for generated Scaladoc sites.
    * This value is currently always UTF-8. */
  def encoding: String = "UTF-8"

  def siteRoot: JFile = new JFile(universe.settings.outdir.value)

  /** Generates the Scaladoc site for a model into the site root.
    * A scaladoc site is a set of HTML and related files
    * that document a model extracted from a compiler run.
    * @param model The model to generate in the form of a sequence of packages. */
  def generate() {

    def copyResource(subPath: String) {
      val bytes = new Streamable.Bytes {
        val inputStream = getClass.getResourceAsStream("/scala/tools/nsc/doc/html/resource/" + subPath)
        assert(inputStream != null)
      }.toByteArray
      val dest = Directory(siteRoot) / subPath
      dest.parent.createDirectory()
      val out = dest.toFile.bufferedOutput()
      try out.write(bytes, 0, bytes.length)
      finally out.close()
    }

    copyResource("lib/jquery.js")
    copyResource("lib/jquery-ui.js")
    copyResource("lib/jquery.layout.js")
    copyResource("lib/tools.tooltip.js")
    copyResource("lib/scheduler.js")
    copyResource("lib/index.js")
    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")
    copyResource("lib/object_big.png")
    copyResource("lib/trait.png")
    copyResource("lib/trait_big.png")
    copyResource("lib/package.png")
    copyResource("lib/package_big.png")

    copyResource("lib/class_to_object_big.png")
    copyResource("lib/object_to_class_big.png")
    copyResource("lib/object_to_trait_big.png")
    copyResource("lib/trait_to_object_big.png")

    copyResource("lib/arrow-down.png")
    copyResource("lib/arrow-right.png")
    copyResource("lib/filter_box_left.png")
    copyResource("lib/filter_box_right.png")
    copyResource("lib/filter_box_left2.gif")
    copyResource("lib/filterbg.gif")
    copyResource("lib/filterboxbarbg.gif")
    copyResource("lib/filterboxbg.gif")

    copyResource("lib/constructorsbg.gif")
    copyResource("lib/defbg-blue.gif")
    copyResource("lib/defbg-green.gif")
    copyResource("lib/fullcommenttopbg.gif")
    copyResource("lib/ownderbg2.gif")
    copyResource("lib/ownerbg.gif")
    copyResource("lib/ownerbg2.gif")
    copyResource("lib/signaturebg.gif")
    copyResource("lib/signaturebg2.gif")
    copyResource("lib/packagesbg.gif")
    copyResource("lib/typebg.gif")
    copyResource("lib/valuemembersbg.gif")
    copyResource("lib/filterboxbarbg.png")

    copyResource("lib/remove.png")
    copyResource("lib/navigation-li-a.png")
    copyResource("lib/navigation-li.png")
    copyResource("lib/selected-right.png")
    copyResource("lib/selected.png")
    copyResource("lib/selected2-right.png")
    copyResource("lib/selected2.png")
    copyResource("lib/unselected.png")

    copyResource("lib/rootdoc.txt")

    new page.Index(universe, index) writeFor this
    new page.IndexScript(universe, index) writeFor this

    writeTemplates(page => page.writeFor(this))

    for(letter <- index.firstLetterIndex) {
      new html.page.ReferenceIndex(letter._1, index, universe) writeFor this
    }
  }

  def writeTemplates(writeForThis: HtmlPage => Unit) {
    val written = mutable.HashSet.empty[DocTemplateEntity]

    def writeTemplate(tpl: DocTemplateEntity) {
      if (!(written contains tpl)) {
        writeForThis(new page.Template(tpl))
        written += tpl
        tpl.templates map (writeTemplate(_))
      }
    }

    writeTemplate(universe.rootPackage)
  }

}