From ce4ba7f7718fb1b5f698e784fa7f89902f5bf098 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Mon, 9 Jan 2017 13:55:43 +0100 Subject: Preserve `page` object on expansion --- .../src/dotty/tools/dottydoc/staticsite/Page.scala | 23 +++++++++++++++++++--- .../src/dotty/tools/dottydoc/staticsite/Site.scala | 3 ++- .../tools/dottydoc/staticsite/SiteTests.scala | 22 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) (limited to 'doc-tool') diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala index 33667cf61..0293c3367 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala @@ -10,6 +10,7 @@ import com.vladsch.flexmark.html.HtmlRenderer import com.vladsch.flexmark.parser.Parser import com.vladsch.flexmark.ext.front.matter.AbstractYamlFrontMatterVisitor import liqp.{ Template => LiquidTemplate } +import _root_.java.util.{ Map => JMap } case class IllegalFrontMatter(message: String) extends Exception(message) @@ -37,10 +38,12 @@ trait Page { val yamlCollector = new AbstractYamlFrontMatterVisitor() yamlCollector.visit(md) - _yaml = yamlCollector + _yaml = updatedYaml { + yamlCollector .getData().asScala .mapValues(_.asScala.headOption.getOrElse("")) .toMap + } // YAML must start with "---" and end in either "---" or "..." val withoutYaml = @@ -57,11 +60,25 @@ trait Page { else pageContent // make accessible via "{{ page.title }}" in templates - val page = Map("page" -> _yaml.asJava) + val page = Map("page" -> _yaml.asJava) _html = LiquidTemplate .parse(withoutYaml) - .render((page ++ params).asJava) + .render((params ++ page).asJava) } + + /** Takes "page" from `params` map in case this is a second expansion, and + * removes "layout" from the parameters if it exists. We don't want to + * preserve the layout from the previously expanded template + */ + private def updatedYaml(newYaml: Map[String, String]): Map[String, String] = + params + .get("page") + .flatMap { + case page: Map[String, String] @unchecked => + Some(page - "layout" ++ newYaml) + case _ => None + } + .getOrElse(newYaml) } class HtmlPage(fileContents: => String, val params: Map[String, AnyRef]) extends Page { diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala index 11e2faeef..ac609e6b6 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala @@ -57,7 +57,8 @@ class Site(val root: JFile) { case None => page.html case Some(layout) => - val expandedTemplate = new HtmlPage(layout, Map("content" -> page.html) ++ params) + val newParams = Map("content" -> page.html) ++ params ++ Map("page" -> page.yaml) + val expandedTemplate = new HtmlPage(layout, newParams) render(expandedTemplate, params) } } diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala index b73d7555b..2a8b6ac9b 100644 --- a/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala +++ b/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala @@ -56,4 +56,26 @@ class SiteTests extends DottyDocTest { "html page did not render properly" ) } + + @Test def preservesPageYaml = { + val site = new Site(new java.io.File("../doc-tool/resources/")) + + val renderedPage = site.render(new HtmlPage( + """|--- + |title: Hello, world + |layout: index + |--- + |Hello, world!""".stripMargin, + Map.empty + ), Map.empty) + + assert( + renderedPage.contains("

Hello, world!

") && + !renderedPage.contains("---\nlayout: main\n---\n") && + !renderedPage.contains("---\nlayout: index\n---\n") && + renderedPage.contains("Hello, world") && + renderedPage.contains(""), + "html page did not render properly" + ) + } } -- cgit v1.2.3