From dc4bd3d69c1671036dd85be5311c52fd0bc85c4f Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Mon, 23 Jan 2017 17:10:01 +0100 Subject: Add `{% docstring "scala.collection.Seq" %}` support --- .../tools/dottydoc/staticsite/DefaultParams.scala | 5 ++- .../tools/dottydoc/staticsite/LiquidTemplate.scala | 1 + .../src/dotty/tools/dottydoc/staticsite/Site.scala | 2 +- .../src/dotty/tools/dottydoc/staticsite/tags.scala | 36 ++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) (limited to 'doc-tool') diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala index 5bed79869..cc1f8862f 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala @@ -2,13 +2,14 @@ package dotty.tools package dottydoc package staticsite -import model.{ Entity, NonEntity } +import model.{ Entity, Package, NonEntity } import java.util.{ HashMap, List => JList, Map => JMap } import scala.collection.JavaConverters._ case class DefaultParams( docs: JList[_], + originalDocs: Map[String, Package], page: PageInfo, site: SiteInfo, sidebar: Sidebar, @@ -19,6 +20,8 @@ case class DefaultParams( def toMap: Map[String, AnyRef] = Map( "docs" -> docs, + "originalDocs" -> originalDocs, + "page" -> Map( "url" -> page.url, "date" -> page.date, diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala index ef7a59f1c..e5873d1a9 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala @@ -29,5 +29,6 @@ case class LiquidTemplate(contents: String) extends ResourceFinder { .`with`(ResourceInclude(params, includes)) .`with`(RenderReference(params)) .`with`(RenderTitle(params)) + .`with`(Docstring(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 3fb5dad24..de16293a1 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala @@ -132,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()), sidebar) + DefaultParams(docs, documentation, 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/tags.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala index fe6a05bbc..7f85846dc 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala @@ -9,6 +9,7 @@ import liqp.TemplateContext import liqp.nodes.LNode import java.util.{ Map => JMap } +import model._ object tags { @@ -168,4 +169,39 @@ object tags { case _ => null } } + + /** Allows the extraction of docstrings from the given path. E.g: + * + * ```html + * {% docstring "scala.collection.Seq" %} + * ``` + * + * In Scaladoc, objects are denoted by a name ending in '$'. This means that + * a path that goes through, or targets an object need to appropriately + * intersperse these, e.g: + * + * ```html + * {% docstring "scala.collection.Seq$" %} + * ``` + */ + case class Docstring(params: Map[String, AnyRef]) extends Tag("docstring") { + private def find(xs: List[String], ent: Entity with Members): Option[Entity] = xs match { + case Nil => None + case x :: Nil => + ent.members collect { case e: Entity with Members => e } find (_.path.last == x) + case x :: xs => + ent.members collect { case e: Entity with Members => e } find (_.path.last == x) flatMap (find(xs, _)) + } + + override def render(ctx: TemplateContext, nodes: LNode*): AnyRef = nodes(0).render(ctx) match { + case query: String => + params.get("originalDocs").collect { + case docs: Map[String, Package] @unchecked => + val search = query.split("\\.") + if (search.isEmpty || !docs.contains(search.head)) null + else find(search.tail.toList, docs(search.head)).flatMap(_.comment.map(_.body)).getOrElse(null) + }.getOrElse(null) + case _ => null + } + } } -- cgit v1.2.3