aboutsummaryrefslogtreecommitdiff
path: root/doc-tool/src
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/src
parentc3b463a04141e67ee8559c8b422c0229a1a6351b (diff)
downloaddotty-7b2c84b51850a4e64107a99f9780d0ee578a1c4a.tar.gz
dotty-7b2c84b51850a4e64107a99f9780d0ee578a1c4a.tar.bz2
dotty-7b2c84b51850a4e64107a99f9780d0ee578a1c4a.zip
Generalize table of contents for dottydoc
Diffstat (limited to 'doc-tool/src')
-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
5 files changed, 111 insertions, 3 deletions
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
+ }
+ }
}