diff options
author | Felix Mulder <felix.mulder@gmail.com> | 2017-01-06 13:54:07 +0100 |
---|---|---|
committer | Felix Mulder <felix.mulder@gmail.com> | 2017-01-31 14:29:18 +0100 |
commit | c8a1a80776630535150d041a0aef34c508476cb3 (patch) | |
tree | 087c8ea46b7d50edf0c75eb64280397b3179e421 /doc-tool/src/dotty/tools/dottydoc/staticsite | |
parent | 1dc446fc8973dce2da0bbb3c6eb97aa035d0d191 (diff) | |
download | dotty-c8a1a80776630535150d041a0aef34c508476cb3.tar.gz dotty-c8a1a80776630535150d041a0aef34c508476cb3.tar.bz2 dotty-c8a1a80776630535150d041a0aef34c508476cb3.zip |
Add `Page` trait with concrete classes for HTML and MD
Diffstat (limited to 'doc-tool/src/dotty/tools/dottydoc/staticsite')
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala index 7048109fd..33667cf61 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala @@ -4,15 +4,22 @@ package staticsite import dotc.core.Contexts.Context import dotty.tools.dottydoc.util.syntax._ +import dotc.config.Printers.dottydoc 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]) { +case class IllegalFrontMatter(message: String) extends Exception(message) + +trait Page { import scala.collection.JavaConverters._ + + def pageContent: String + def params: Map[String, AnyRef] + def yaml(implicit ctx: Context): Map[String, String] = { if (_yaml eq null) initFields() _yaml @@ -23,28 +30,54 @@ class MarkdownPage(fileContents: => String, params: Map[String, AnyRef]) { _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) + protected[this] var _yaml: Map[String, String] = _ + protected[this] var _html: String = _ + protected[this] def initFields()(implicit ctx: Context) = { + val md = Parser.builder(ctx.docbase.markdownOptions).build.parse(pageContent) val yamlCollector = new AbstractYamlFrontMatterVisitor() - val mdParser = Parser.builder(ctx.docbase.markdownOptions).build - - yamlCollector.visit(mdParser.parse(fileContents)) + yamlCollector.visit(md) _yaml = yamlCollector .getData().asScala .mapValues(_.asScala.headOption.getOrElse("")) .toMap + // YAML must start with "---" and end in either "---" or "..." + val withoutYaml = + if (pageContent.startsWith("---\n")) { + val str = + pageContent.lines + .drop(1) + .dropWhile(line => line != "---" && line != "...") + .drop(1).mkString("\n") + + if (str.isEmpty) throw IllegalFrontMatter(pageContent) + else str + } + else pageContent + // make accessible via "{{ page.title }}" in templates val page = Map("page" -> _yaml.asJava) - val renderedTemplate = template.render((page ++ params).asJava) + _html = LiquidTemplate + .parse(withoutYaml) + .render((page ++ params).asJava) + } +} + +class HtmlPage(fileContents: => String, val params: Map[String, AnyRef]) extends Page { + lazy val pageContent = fileContents +} + +class MarkdownPage(fileContents: => String, val params: Map[String, AnyRef]) extends Page { + lazy val pageContent = fileContents + override protected[this] def initFields()(implicit ctx: Context) = { + super.initFields() + val md = Parser.builder(ctx.docbase.markdownOptions).build.parse(_html) _html = HtmlRenderer .builder(ctx.docbase.markdownOptions) .escapeHtml(false) .build() - .render(mdParser.parse(renderedTemplate)) + .render(md) } } |