aboutsummaryrefslogtreecommitdiff
path: root/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala
diff options
context:
space:
mode:
Diffstat (limited to 'doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala')
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala53
1 files changed, 53 insertions, 0 deletions
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala
new file mode 100644
index 000000000..00d51f083
--- /dev/null
+++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala
@@ -0,0 +1,53 @@
+package dotty.tools
+package dottydoc
+package staticsite
+
+import scala.util.control.NonFatal
+import dotc.util.SourceFile
+
+trait Template {
+ def path: String
+ def content: SourceFile
+ def show: String = new String(content.content)
+}
+
+case class TemplateRenderingError(path: String, ex: Throwable)
+extends Exception(s"error rendering $path, $ex")
+
+case class Layout(path: String, content: SourceFile) extends Template
+
+case class Include(path: String, content: SourceFile) extends Template
+
+case class LiquidTemplate(path: String, content: String) extends ResourceFinder {
+ import scala.collection.JavaConverters._
+ import liqp.Template
+ import liqp.filters.Filter
+ import liqp.parser.Flavor.JEKYLL
+ import java.util.{ HashMap, Map => JMap }
+ import filters._
+ import tags._
+
+ /** Register filters to static container */
+ Filter.registerFilter(new Reverse)
+ Filter.registerFilter(new First)
+
+ // For some reason, liqp rejects a straight conversion using `.asJava`
+ private def toJavaMap(map: Map[String, AnyRef]): HashMap[String, Object] =
+ map.foldLeft(new HashMap[String, Object]()) { case (map, (k, v)) =>
+ map.put(k, v)
+ map
+ }
+
+ def render(params: Map[String, AnyRef], includes: Map[String, Include]): String =
+ try {
+ Template.parse(content, JEKYLL)
+ .`with`(ResourceInclude(params, includes))
+ .`with`(RenderReference(params))
+ .`with`(RenderTitle(params))
+ .`with`(Docstring(params))
+ .render(toJavaMap(params))
+ } catch {
+ case NonFatal(ex) =>
+ throw TemplateRenderingError(path, ex)
+ }
+}