From 1dc446fc8973dce2da0bbb3c6eb97aa035d0d191 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Thu, 5 Jan 2017 17:15:02 +0100 Subject: Add initial page rendering using liquid and yaml front matter --- .../tools/dottydoc/core/ContextDottydoc.scala | 5 +- .../src/dotty/tools/dottydoc/staticsite/Page.scala | 50 ++++++++++++++++ doc-tool/test/YamlTest.scala | 69 ++++++++++++++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala create mode 100644 doc-tool/test/YamlTest.scala (limited to 'doc-tool') diff --git a/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala b/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala index 963c72bc9..c2dd3fdef 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala @@ -8,7 +8,9 @@ import model.Package import com.vladsch.flexmark.parser.ParserEmulationFamily import com.vladsch.flexmark.parser.Parser import com.vladsch.flexmark.ext.tables.TablesExtension +import com.vladsch.flexmark.ext.front.matter.YamlFrontMatterExtension import com.vladsch.flexmark.util.options.{ DataHolder, MutableDataSet } +import java.util.{ Collections => JCollections } class ContextDottydoc extends ContextDocstrings { import scala.collection.mutable @@ -28,5 +30,6 @@ class ContextDottydoc extends ContextDocstrings { val markdownOptions: DataHolder = new MutableDataSet() .setFrom(ParserEmulationFamily.KRAMDOWN.getOptions) - .set(Parser.EXTENSIONS, java.util.Collections.singleton(TablesExtension.create())) + .set(Parser.EXTENSIONS, JCollections.singleton(TablesExtension.create())) + .set(Parser.EXTENSIONS, JCollections.singleton(YamlFrontMatterExtension.create())) } diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala new file mode 100644 index 000000000..7048109fd --- /dev/null +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala @@ -0,0 +1,50 @@ +package dotty.tools +package dottydoc +package staticsite + +import dotc.core.Contexts.Context +import dotty.tools.dottydoc.util.syntax._ + +import com.vladsch.flexmark.html.HtmlRenderer +import com.vladsch.flexmark.parser.Parser +import com.vladsch.flexmark.ext.front.matter.AbstractYamlFrontMatterVisitor +import liqp.{ Template => LiquidTemplate } + +class MarkdownPage(fileContents: => String, params: Map[String, AnyRef]) { + import scala.collection.JavaConverters._ + + def yaml(implicit ctx: Context): Map[String, String] = { + if (_yaml eq null) initFields() + _yaml + } + + def html(implicit ctx: Context): String = { + if (_html eq null) initFields() + _html + } + + private[this] var _yaml: Map[String, String] = _ + private[this] var _html: String = _ + private[this] def initFields()(implicit ctx: Context) = { + val template = LiquidTemplate.parse(fileContents) + val yamlCollector = new AbstractYamlFrontMatterVisitor() + val mdParser = Parser.builder(ctx.docbase.markdownOptions).build + + yamlCollector.visit(mdParser.parse(fileContents)) + + _yaml = yamlCollector + .getData().asScala + .mapValues(_.asScala.headOption.getOrElse("")) + .toMap + + // make accessible via "{{ page.title }}" in templates + val page = Map("page" -> _yaml.asJava) + val renderedTemplate = template.render((page ++ params).asJava) + + _html = HtmlRenderer + .builder(ctx.docbase.markdownOptions) + .escapeHtml(false) + .build() + .render(mdParser.parse(renderedTemplate)) + } +} diff --git a/doc-tool/test/YamlTest.scala b/doc-tool/test/YamlTest.scala new file mode 100644 index 000000000..2d633d12c --- /dev/null +++ b/doc-tool/test/YamlTest.scala @@ -0,0 +1,69 @@ +package dotty.tools +package dottydoc + +import org.junit.Test +import org.junit.Assert._ + +import staticsite.MarkdownPage + +class YamlTest extends DottyDocTest { + import scala.collection.JavaConverters._ + + @Test def has1Key = { + 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 + ) + } +} -- cgit v1.2.3