diff options
-rw-r--r-- | doc-tool/resources/_includes/toc.html | 52 | ||||
-rw-r--r-- | doc-tool/resources/css/dottydoc.css | 9 | ||||
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala | 41 | ||||
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala | 1 | ||||
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala | 12 | ||||
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.scala | 23 | ||||
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala | 37 | ||||
-rw-r--r-- | docs/sidebar.yml | 47 | ||||
-rw-r--r-- | project/Build.scala | 1 |
9 files changed, 169 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 + } + } } diff --git a/docs/sidebar.yml b/docs/sidebar.yml new file mode 100644 index 000000000..6353b3c90 --- /dev/null +++ b/docs/sidebar.yml @@ -0,0 +1,47 @@ +sidebar: + - title: Blog + url: blog/index.html + - title: Docs + url: docs/index.html + - title: Usage + subsection: + - title: cbt-projects + url: docs/usage/cbt-projects.html + - title: sbt-projects + url: docs/usage/sbt-projects.html + - title: Migrating + url: docs/usage/migrating.html + - title: Contributing + subsection: + - title: Eclipse + url: docs/contributing/eclipse.html + - title: Getting Started + url: docs/contributing/getting-started.html + - title: IntelliJ IDEA + url: docs/contributing/intellij-idea.html + - title: Workflow + url: docs/contributing/workflow.html + - title: Internals + subsection: + - title: Backend + url: docs/internals/backend.html + - title: Benchmarks + url: docs/internals/benchmarks.html + - title: Classpaths + url: docs/internals/classpaths.html + - title: Core Data Structrues + url: docs/internals/core-data-structures.html + - title: Contexts + url: docs/internals/contexts.html + - title: Dotc vs Scalac + url: docs/internals/dotc-scalac.html + - title: Higher-Kinded Types + url: docs/internals/higher-kinded-v2.html + - title: Overall Structure + url: docs/internals/overall-structure.html + - title: Periods + url: docs/internals/periods.html + - title: Syntax + url: docs/internals/syntax.html + - title: Type System + url: docs/internals/type-system.html diff --git a/project/Build.scala b/project/Build.scala index f7e8e4754..0abdc99be 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -195,6 +195,7 @@ object DottyBuild extends Build { "com.vladsch.flexmark" % "flexmark-ext-emoji" % "0.11.1", "com.vladsch.flexmark" % "flexmark-ext-gfm-strikethrough" % "0.11.1", "com.vladsch.flexmark" % "flexmark-ext-yaml-front-matter" % "0.11.1", + "com.fasterxml.jackson.dataformat" % "jackson-dataformat-yaml" % "2.8.6", "nl.big-o" % "liqp" % "0.6.7", "com.novocode" % "junit-interface" % "0.11" % "test", "com.github.spullara.mustache.java" % "compiler" % "0.9.3", |