From de4787898fbf91662cd894c5a9a0f30ad097fa5f Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Sun, 8 Jan 2017 16:00:35 +0100 Subject: Fix recursive expansion of templates --- doc-tool/resources/_layouts/index.html | 4 + doc-tool/resources/index.md | 5 + .../src/dotty/tools/dottydoc/staticsite/Site.scala | 18 ++-- doc-tool/test/StaticPageTests.scala | 106 --------------------- doc-tool/test/StaticSiteTests.scala | 40 -------- .../tools/dottydoc/staticsite/PageTests.scala | 105 ++++++++++++++++++++ .../tools/dottydoc/staticsite/SiteTests.scala | 59 ++++++++++++ 7 files changed, 183 insertions(+), 154 deletions(-) create mode 100644 doc-tool/resources/_layouts/index.html create mode 100644 doc-tool/resources/index.md delete mode 100644 doc-tool/test/StaticPageTests.scala delete mode 100644 doc-tool/test/StaticSiteTests.scala create mode 100644 doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala create mode 100644 doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala (limited to 'doc-tool') diff --git a/doc-tool/resources/_layouts/index.html b/doc-tool/resources/_layouts/index.html new file mode 100644 index 000000000..5be2d9794 --- /dev/null +++ b/doc-tool/resources/_layouts/index.html @@ -0,0 +1,4 @@ +--- +layout: main +--- +

{{ content }}

diff --git a/doc-tool/resources/index.md b/doc-tool/resources/index.md new file mode 100644 index 000000000..82f1d9cfc --- /dev/null +++ b/doc-tool/resources/index.md @@ -0,0 +1,5 @@ +--- +layout: main +--- + +Hello, world! diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala index d51b881e5..11e2faeef 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala @@ -33,11 +33,6 @@ class Site(val root: JFile) { } .toMap - def getResource(p: String): String = - Option(getClass.getResourceAsStream(p)).map(scala.io.Source.fromInputStream) - .map(_.mkString) - .getOrElse(throw ResourceNotFoundException(p)) - val userDefinedLayouts = root .listFiles.find(d => d.getName == "_layouts" && d.isDirectory) @@ -45,18 +40,25 @@ class Site(val root: JFile) { .getOrElse(Map.empty) val defaultLayouts: Map[String, String] = Map( - "main" -> "/_layouts/main.html" + "main" -> "/_layouts/main.html", + "index" -> "/_layouts/index.html" ).mapValues(getResource) defaultLayouts ++ userDefinedLayouts } + private def getResource(r: String): String = + Option(getClass.getResourceAsStream(r)).map(scala.io.Source.fromInputStream) + .map(_.mkString) + .getOrElse(throw ResourceNotFoundException(r)) + def render(page: Page, params: Map[String, AnyRef])(implicit ctx: Context): String = { page.yaml.get("layout").flatMap(layouts.get(_)) match { - case Some(layout) => - (new HtmlPage(layout, Map("content" -> page.html) ++ params)).html case None => page.html + case Some(layout) => + val expandedTemplate = new HtmlPage(layout, Map("content" -> page.html) ++ params) + render(expandedTemplate, params) } } } diff --git a/doc-tool/test/StaticPageTests.scala b/doc-tool/test/StaticPageTests.scala deleted file mode 100644 index 1b22665c8..000000000 --- a/doc-tool/test/StaticPageTests.scala +++ /dev/null @@ -1,106 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -import staticsite.{ MarkdownPage, HtmlPage, IllegalFrontMatter } - -class StaticPageTests extends DottyDocTest { - import scala.collection.JavaConverters._ - - @Test def mdHas1Key = { - val page = new MarkdownPage( - """|--- - |key: - |--- - | - |great""".stripMargin, - Map.empty - ) - - assert( - page.yaml == Map("key" -> ""), - s"""incorrect yaml, expected "key:" without key in: ${page.yaml}""" - ) - - assertEquals("

great

\n", page.html) - } - - @Test def yamlPreservesLiquidTags = { - val page1 = new MarkdownPage( - """|--- - |key: - |--- - | - |{{ content }}""".stripMargin, - Map("content" -> "Hello, world!") - ) - - assert( - page1.yaml == Map("key" -> ""), - s"""incorrect yaml, expected "key:" without key in: ${page1.yaml}""" - ) - - assertEquals("

Hello, world!

\n", page1.html) - - val page2 = new MarkdownPage( - """|{{ content }}""".stripMargin, - Map("content" -> "hello") - ) - assert( - page2.yaml == Map(), - s"""incorrect yaml, expected "key:" without key in: ${page2.yaml}""" - ) - assertEquals("

hello

\n", page2.html) - - val page3 = new MarkdownPage( - """|{% if product.title == "Awesome Shoes" %} - |These shoes are awesome! - |{% endif %}""".stripMargin, - Map("product" -> Map("title" -> "Awesome Shoes").asJava) - ) - - assertEquals( - "

These shoes are awesome!

\n", - page3.html - ) - } - - @Test def simpleHtmlPage = { - val p1 = new HtmlPage("""

{{ "hello, world!" }}

""", Map.empty) - assert(p1.yaml == Map(), "non-empty yaml found") - assertEquals("

hello, world!

", p1.html) - } - - @Test def htmlPageHasNoYaml = { - val page = new HtmlPage( - """|--- - |layout: main - |--- - | - |Hello, world!""".stripMargin, - Map.empty - ) - - assert(!page.html.contains("---\nlayout: main\n---"), - s"page still contains yaml:\n${page.html}") - } - - @Test def illegalYamlFrontMatter = try { - val page = new HtmlPage( - """|--- - |layout: main - | - | - |Hello, world!""".stripMargin, - Map.empty - ) - - page.html - fail("illegal front matter didn't throw exception") - } catch { - case IllegalFrontMatter(x) => // success! - case t: Throwable => throw t - } -} diff --git a/doc-tool/test/StaticSiteTests.scala b/doc-tool/test/StaticSiteTests.scala deleted file mode 100644 index a2f174eb3..000000000 --- a/doc-tool/test/StaticSiteTests.scala +++ /dev/null @@ -1,40 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -import staticsite.{ Site, HtmlPage } - -class StaticSiteTests extends DottyDocTest { - @Test def hasCorrectLayoutFiles = { - val site = new Site(new java.io.File("../doc-tool/resources/")) - - assert(site.root.exists && site.root.isDirectory, - s"'${site.root.getName}' is not a directory") - - val expectedLayouts = Set("main") - assert(site.layouts.keys == expectedLayouts, - s"Incorrect layouts in: ${site.layouts.keys}, expected: $expectedLayouts") - } - - @Test def renderHelloInMainLayout = { - val site = new Site(new java.io.File("../doc-tool/resources/")) - - val renderedPage = site.render(new HtmlPage( - """|--- - |layout: main - |--- - | - |Hello, world!""".stripMargin, - Map.empty - ), Map.empty) - - assert( - renderedPage.contains("Hello, world!") && - !renderedPage.contains("---\nlayout: main\n---\n") && - renderedPage.contains(""), - "html page did not render properly" - ) - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala new file mode 100644 index 000000000..87358d738 --- /dev/null +++ b/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala @@ -0,0 +1,105 @@ +package dotty.tools +package dottydoc +package staticsite + +import org.junit.Test +import org.junit.Assert._ + +class PageTests extends DottyDocTest { + import scala.collection.JavaConverters._ + + @Test def mdHas1Key = { + val page = new MarkdownPage( + """|--- + |key: + |--- + | + |great""".stripMargin, + Map.empty + ) + + assert( + page.yaml == Map("key" -> ""), + s"""incorrect yaml, expected "key:" without key in: ${page.yaml}""" + ) + + assertEquals("

great

\n", page.html) + } + + @Test def yamlPreservesLiquidTags = { + val page1 = new MarkdownPage( + """|--- + |key: + |--- + | + |{{ content }}""".stripMargin, + Map("content" -> "Hello, world!") + ) + + assert( + page1.yaml == Map("key" -> ""), + s"""incorrect yaml, expected "key:" without key in: ${page1.yaml}""" + ) + + assertEquals("

Hello, world!

\n", page1.html) + + val page2 = new MarkdownPage( + """|{{ content }}""".stripMargin, + Map("content" -> "hello") + ) + assert( + page2.yaml == Map(), + s"""incorrect yaml, expected "key:" without key in: ${page2.yaml}""" + ) + assertEquals("

hello

\n", page2.html) + + val page3 = new MarkdownPage( + """|{% if product.title == "Awesome Shoes" %} + |These shoes are awesome! + |{% endif %}""".stripMargin, + Map("product" -> Map("title" -> "Awesome Shoes").asJava) + ) + + assertEquals( + "

These shoes are awesome!

\n", + page3.html + ) + } + + @Test def simpleHtmlPage = { + val p1 = new HtmlPage("""

{{ "hello, world!" }}

""", Map.empty) + assert(p1.yaml == Map(), "non-empty yaml found") + assertEquals("

hello, world!

", p1.html) + } + + @Test def htmlPageHasNoYaml = { + val page = new HtmlPage( + """|--- + |layout: main + |--- + | + |Hello, world!""".stripMargin, + Map.empty + ) + + assert(!page.html.contains("---\nlayout: main\n---"), + s"page still contains yaml:\n${page.html}") + } + + @Test def illegalYamlFrontMatter = try { + val page = new HtmlPage( + """|--- + |layout: main + | + | + |Hello, world!""".stripMargin, + Map.empty + ) + + page.html + fail("illegal front matter didn't throw exception") + } catch { + case IllegalFrontMatter(x) => // success! + case t: Throwable => throw t + } +} diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala new file mode 100644 index 000000000..b73d7555b --- /dev/null +++ b/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala @@ -0,0 +1,59 @@ +package dotty.tools +package dottydoc +package staticsite + +import org.junit.Test +import org.junit.Assert._ + +class SiteTests extends DottyDocTest { + @Test def hasCorrectLayoutFiles = { + val site = new Site(new java.io.File("../doc-tool/resources/")) + + assert(site.root.exists && site.root.isDirectory, + s"'${site.root.getName}' is not a directory") + + val expectedLayouts = Set("main", "index") + assert(site.layouts.keys == expectedLayouts, + s"Incorrect layouts in: ${site.layouts.keys}, expected: $expectedLayouts") + } + + @Test def renderHelloInMainLayout = { + val site = new Site(new java.io.File("../doc-tool/resources/")) + + val renderedPage = site.render(new HtmlPage( + """|--- + |layout: main + |--- + | + |Hello, world!""".stripMargin, + Map.empty + ), Map.empty) + + assert( + renderedPage.contains("Hello, world!") && + !renderedPage.contains("---\nlayout: main\n---\n") && + renderedPage.contains(""), + "html page did not render properly" + ) + } + + @Test def renderMultipleTemplates = { + val site = new Site(new java.io.File("../doc-tool/resources/")) + + val renderedPage = site.render(new HtmlPage( + """|--- + |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(""), + "html page did not render properly" + ) + } +} -- cgit v1.2.3