@@ -15,13 +15,12 @@ import com.vladsch.flexmark.parser.{Parser, ParserEmulationProfile}
1515import com .vladsch .flexmark .util .options .{DataHolder , MutableDataSet }
1616import com .vladsch .flexmark .html .HtmlRenderer
1717import liqp .Template
18- import java .util .{ Map => JMap , HashMap => HMap , ArrayList , Collection }
19-
2018import scala .collection .JavaConverters ._
19+
2120import scala .io .Source
2221
2322case class RenderingContext (
24- properties : Map [String , Element ],
23+ properties : Map [String , Object ],
2524 layouts : Map [String , TemplateFile ] = Map (),
2625 resolving : Set [String ] = Set (),
2726 resources : List [String ] = Nil
@@ -35,7 +34,6 @@ case class RenderingContext(
3534 )
3635
3736case class ResolvedPage (code : String , resources : List [String ] = Nil )
38- type Element = String | List [String ] | Object // Object represents Map[String, Element] since it is not possible to get circullar dependency
3937/**
4038 * case class for the template files.
4139 * Template file is a file `.md` or `.html` handling settings.
@@ -48,7 +46,7 @@ case class TemplateFile(
4846 file : File ,
4947 isHtml : Boolean ,
5048 rawCode : String ,
51- settings : Map [String , Element ],
49+ settings : Map [String , Object ],
5250 name : String ,
5351 title : String ,
5452 hasFrame : Boolean ,
@@ -66,13 +64,15 @@ case class TemplateFile(
6664 val layoutTemplate = layout.map(name =>
6765 ctx.layouts.getOrElse(name, throw new RuntimeException (s " No layouts named $name in ${ctx.layouts}" )))
6866
69- def toJava (m : Any ): Any = m match
70- case sm : Map [_, _] => sm.map(kv => (kv._1, toJava(kv._2))).asJava
71- case sl : Iterable [_] => new ArrayList (sl.map( toJava ).asJava.asInstanceOf [Collection [_]])
72- case _ => m
67+ def asJavaElement (k : String , v : Object ): Object = v match
68+ case m : Map [_, _] => m.transform {
69+ case (k : String , v : Object ) => asJavaElement(k, v)
70+ }.asJava
71+ case l : List [_] => l.asJava
72+ case other => other
7373
7474 // Library requires mutable maps..
75- val mutableProperties = new HMap [ String , Object ](toJava( ctx.properties). asInstanceOf [ JMap [ String , Object ]] )
75+ val mutableProperties = HMap ( ctx.properties.transform(asJavaElement).asJava )
7676 val rendered = Template .parse(this .rawCode).render(mutableProperties)
7777 // We want to render markdown only if next template is html
7878 val code = if (isHtml || layoutTemplate.exists(! _.isHtml)) rendered else
@@ -83,38 +83,3 @@ case class TemplateFile(
8383 case None => ResolvedPage (code, resources ++ ctx.resources)
8484 case Some (layoutTemplate) =>
8585 layoutTemplate.resolveInner(ctx.nest(code, file, resources))
86-
87- object TemplateFile :
88- extension (settings : Map [String , Element ]):
89- private def stringSetting (name : String ): Option [String ] = settings.getOrElse(name, null ).match {
90- case List (elem : String ) => Some (elem)
91- case elem : String => Some (elem)
92- case _ => None
93- }.map(_.stripPrefix(" \" " ).stripSuffix(" \" " ))
94-
95- private def listSetting (name : String ): Option [List [String ]] = settings.getOrElse(name, null ).match {
96- case elem : List [_] => Some (elem.asInstanceOf [List [String ]])
97- case elem : String => Some (List (elem))
98- case _ => None
99- }
100-
101- def apply (
102- file : File ,
103- isHtml : Boolean ,
104- rawCode : String ,
105- settings : Map [String , Element ],
106- ): TemplateFile = {
107- val name = settings.stringSetting(" name" ).getOrElse(file.getName.stripSuffix(if (isHtml) " .html" else " .md" ))
108-
109- TemplateFile (
110- file = file,
111- isHtml,
112- rawCode = rawCode,
113- settings = settings,
114- name = name,
115- title = settings.getOrElse(" page" , settings).asInstanceOf [Map [String , Object ]].stringSetting(" title" ).getOrElse(name),
116- hasFrame = ! settings.stringSetting(" hasFrame" ).contains(" false" ),
117- resources = (settings.listSetting(" extraCSS" ) ++ settings.listSetting(" extraJS" )).flatten.toList,
118- layout = settings.stringSetting(" layout" )
119- )
120- }
0 commit comments