aboutsummaryrefslogtreecommitdiff
path: root/doc-tool
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2017-01-23 16:04:20 +0100
committerFelix Mulder <felix.mulder@gmail.com>2017-01-31 14:32:40 +0100
commit7b2c84b51850a4e64107a99f9780d0ee578a1c4a (patch)
tree319475329afbef6a27b8a364a3477ad60192cc93 /doc-tool
parentc3b463a04141e67ee8559c8b422c0229a1a6351b (diff)
downloaddotty-7b2c84b51850a4e64107a99f9780d0ee578a1c4a.tar.gz
dotty-7b2c84b51850a4e64107a99f9780d0ee578a1c4a.tar.bz2
dotty-7b2c84b51850a4e64107a99f9780d0ee578a1c4a.zip
Generalize table of contents for dottydoc
Diffstat (limited to 'doc-tool')
-rw-r--r--doc-tool/resources/_includes/toc.html52
-rw-r--r--doc-tool/resources/css/dottydoc.css9
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala41
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala1
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala12
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.scala23
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala37
7 files changed, 121 insertions, 54 deletions
diff --git a/doc-tool/resources/_includes/toc.html b/doc-tool/resources/_includes/toc.html
index 0ff3f9586..15952ef78 100644
--- a/doc-tool/resources/_includes/toc.html
+++ b/doc-tool/resources/_includes/toc.html
@@ -1,55 +1,11 @@
-{% assign parent = page.path | first %}
<ul class="toc">
<li class="logo-li">
<a id="home-button" href="{{ site.baseurl }}/index.html">
{% include "scala-logo.svg" %}
</a>
</li>
- <li>
- <a href="{{ site.baseurl }}/blog/index.html">Blog</a>
- </li>
- <li class="toc-title">
- <a href="{{ site.baseurl }}/docs/index.html">Docs</a>
- </li>
- <li>
- <a class="toggle-children" onclick="tocToggleChild('usage')">Usage</a>
- <ul id="usage" class="{% if parent == "usage" %} show {% else %} hide {% endif %}">
- <li><a href="{{ site.baseurl }}/docs/usage/cbt-projects.html">cbt-projects</a></li>
- <li><a href="{{ site.baseurl }}/docs/usage/sbt-projects.html">sbt-projects</a></li>
- <li><a href="{{ site.baseurl }}/docs/usage/migrating.html">migrating</a></li>
- </ul>
- </li>
- <li>
- <a class="toggle-children" onclick="tocToggleChild('contributing')">Contributing</a>
- <ul id="contributing" class="{% if parent == "contributing" %} show {% else %} hide {% endif %}">
- <li><a href="{{ site.baseurl }}/docs/contributing/eclipse.html">Eclipse</a></li>
- <li><a href="{{ site.baseurl }}/docs/contributing/getting-started.html">Getting Started</a></li>
- <li><a href="{{ site.baseurl }}/docs/contributing/intellij-idea.html">IntelliJ IDEA</a></li>
- <li><a href="{{ site.baseurl }}/docs/contributing/workflow.html">Workflow</a></li>
- </ul>
- </li>
- <li>
- <a class="toggle-children" onclick="tocToggleChild('internals')">Internals</a>
- <ul id="internals" class="{% if parent == "internals" %} show {% else %} hide {% endif %}">
- <li><a href="{{ site.baseurl }}/docs/internals/backend.html">Backend</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/benchmarks.html">Benchmarks</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/classpaths.html">Classpaths</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/core-data-structures.html">Core Data Structures</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/contexts.html">Contexts</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/dotc-scalac.html">Dotc vs Scalac</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/higher-kinded-v2.html">Higher-Kinded Types</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/overall-structure.html">Overall Structure</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/periods.html">Periods</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/syntax.html">Syntax</a></li>
- <li><a href="{{ site.baseurl }}/docs/internals/type-system.html">Type System</a></li>
- </ul>
- </li>
+ {% assign parent = page.path | first %}
+ {% for title in sidebar %}
+ <li>{% renderTitle title, parent %}</li>
+ {% endfor %}
</ul>
-
-<script>
-function tocToggleChild(c) {
- var child = document.getElementById(c);
- child.classList.toggle("show");
- child.classList.toggle("hide");
-}
-</script>
diff --git a/doc-tool/resources/css/dottydoc.css b/doc-tool/resources/css/dottydoc.css
index bb0d6506b..aa197de07 100644
--- a/doc-tool/resources/css/dottydoc.css
+++ b/doc-tool/resources/css/dottydoc.css
@@ -85,7 +85,7 @@ ul.toc > li > a#home-button svg g#logo-background {
fill: rgba(202, 68, 94, 0.45);
}
-ul.toc > li > a.toggle-children {
+ul.toc > li > a {
width: 100%;
user-select: none;
}
@@ -182,13 +182,16 @@ ul.index-entities > li.index-title > span {
padding: 0 24px;
}
+ul.index-entities > li.index-title:hover {
+ background-color: transparent;
+}
+
li.index-entity > a:focus {
text-decoration: none;
}
ul.index-entities > li:hover,
-ul.toc > li.toc-title:hover,
-ul.toc > li > a.toggle-children:hover {
+ul.toc > li > a:hover {
background-color: rgba(0, 0, 0, 0.2);
}
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala
index d64ebcd90..5bed79869 100644
--- a/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala
+++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala
@@ -2,17 +2,19 @@ package dotty.tools
package dottydoc
package staticsite
-import java.util.{ List => JList }
import model.{ Entity, NonEntity }
+import java.util.{ HashMap, List => JList, Map => JMap }
+import scala.collection.JavaConverters._
+
case class DefaultParams(
docs: JList[_],
page: PageInfo,
site: SiteInfo,
+ sidebar: Sidebar,
entity: Entity = NonEntity
) {
import model.java._
- import scala.collection.JavaConverters._
def toMap: Map[String, AnyRef] = Map(
"docs" -> docs,
@@ -29,6 +31,8 @@ case class DefaultParams(
"project" -> site.projectTitle
).asJava,
+ "sidebar" -> sidebar.titles.asJava,
+
"entity" -> entity.asJava()
)
@@ -48,3 +52,36 @@ case class PageInfo(url: String, date: String = "") {
}
case class SiteInfo(baseurl: String, projectTitle: String, posts: Array[BlogPost])
+
+case class Sidebar(titles: List[Title])
+
+object Sidebar {
+ def apply(map: HashMap[String, AnyRef]): Option[Sidebar] = Option(map.get("sidebar")).map {
+ case list: JList[JMap[String, AnyRef]] @unchecked if !list.isEmpty =>
+ new Sidebar(list.asScala.map(Title.apply).flatMap(x => x).toList)
+ case _ => Sidebar.empty
+ }
+
+ def empty: Sidebar = Sidebar(Nil)
+}
+
+case class Title(title: String, url: Option[String], subsection: List[Title])
+
+object Title {
+ def apply(map: JMap[String, AnyRef]): Option[Title] = {
+ val title = Option(map.get("title")).collect {
+ case s: String => s
+ }
+ val url = Option(map.get("url")).collect {
+ case s: String => s
+ }
+ val subsection = Option(map.get("subsection")).collect {
+ case xs: JList[JMap[String, AnyRef]] @unchecked =>
+ xs.asScala.map(Title.apply).toList.flatMap(x => x)
+ }.getOrElse(Nil)
+
+ title.map {
+ case title: String => Title(title, url, subsection)
+ }
+ }
+}
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala
index 87209b47a..ef7a59f1c 100644
--- a/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala
+++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala
@@ -28,5 +28,6 @@ case class LiquidTemplate(contents: String) extends ResourceFinder {
Template.parse(contents, JEKYLL)
.`with`(ResourceInclude(params, includes))
.`with`(RenderReference(params))
+ .`with`(RenderTitle(params))
.render(toJavaMap(params))
}
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala
index d522c597c..3fb5dad24 100644
--- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala
+++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala
@@ -68,6 +68,16 @@ case class Site(val root: JFile, val projectTitle: String, val documentation: Ma
_blogposts
}
+
+ val sidebar: Sidebar =
+ root
+ .listFiles
+ .find(_.getName == "sidebar.yml")
+ .map("---\n" + Source.fromFile(_).mkString + "\n---")
+ .map(Yaml.apply)
+ .flatMap(Sidebar.apply)
+ .getOrElse(Sidebar.empty)
+
protected lazy val blogInfo: Array[BlogPost] =
blogposts
.map { file =>
@@ -122,7 +132,7 @@ case class Site(val root: JFile, val projectTitle: String, val documentation: Ma
"../" * (assetLen - rootLen - 1 + additionalDepth) + "."
}
- DefaultParams(docs, PageInfo(pathFromRoot), SiteInfo(baseUrl, projectTitle, Array()))
+ DefaultParams(docs, PageInfo(pathFromRoot), SiteInfo(baseUrl, projectTitle, Array()), sidebar)
}
private def createOutput(outDir: JFile)(op: => Unit): this.type = {
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.scala
new file mode 100644
index 000000000..07bc27562
--- /dev/null
+++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.scala
@@ -0,0 +1,23 @@
+package dotty.tools
+package dottydoc
+package staticsite
+
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.core.`type`.TypeReference
+
+object Yaml {
+ import scala.collection.JavaConverters._
+ import java.util.HashMap
+ import java.io.ByteArrayInputStream
+
+ def apply(input: String): HashMap[String, AnyRef] = {
+ val is = new ByteArrayInputStream(input.getBytes("UTF-8"))
+ val mapper = new ObjectMapper(new YAMLFactory())
+
+ val typeRef: TypeReference[HashMap[String, AnyRef]] =
+ new TypeReference[HashMap[String, AnyRef]] {}
+
+ mapper.readValue(is, typeRef)
+ }
+}
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala
index 868e28bce..fe6a05bbc 100644
--- a/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala
+++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala
@@ -131,4 +131,41 @@ object tags {
}
}
}
+
+ /** Can be used to render the `sidebar.yml` entries, represented here as
+ * `Title`.
+ *
+ * ```html
+ * {% renderTitle title, parent %}
+ * ```
+ *
+ * The rendering currently works on depths up to 2. This means that each
+ * title can have a subsection with its own titles.
+ */
+ case class RenderTitle(params: Map[String, AnyRef]) extends Tag("renderTitle") with ParamConverter {
+ private def renderTitle(t: Title, parent: String): String = {
+ if (!t.url.isDefined && t.subsection.nonEmpty) {
+ val onclickFunction =
+ s"""(function(){var child=document.getElementById("${t.title}");child.classList.toggle("show");child.classList.toggle("hide");})();"""
+ s"""|<a class="toggle-children" onclick='$onclickFunction'>${t.title}</a>
+ |<ul id="${t.title}" class="${if (parent.toLowerCase == t.title.toLowerCase) "show" else "hide"}">
+ | ${t.subsection.map(renderTitle(_, parent)).mkString("<li>", "</li><li>", "</li>")}
+ |</ul>""".stripMargin
+ }
+ else if (t.url.isDefined) {
+ val url = t.url.get
+ s"""<a href="$baseurl/$url">${t.title}</a>"""
+ }
+ else /*if (t.subsection.nonEmpty)*/ {
+ /*dottydoc.*/println(s"url was defined for subsection with title: ${t.title}, remove url to get toggleable entries")
+ t.title
+ }
+ }
+
+ override def render(ctx: TemplateContext, nodes: LNode*): AnyRef =
+ (nodes(0).render(ctx), nodes(1).render(ctx)) match {
+ case (t: Title, parent: String) => renderTitle(t, parent)
+ case _ => null
+ }
+ }
}