1+ package dotty .dokka .site
2+
3+ import com .vladsch .flexmark .html .HtmlRenderer
4+ import com .vladsch .flexmark .parser .Parser
5+ import org .junit .Assert .assertEquals
6+ import org .junit .Test
7+ import java .nio .file .Files
8+
9+ class TemplateFileTests :
10+ private def testTemplate (code : String , ext : String = " html" )(op : TemplateFile => Unit ): Unit =
11+ val tmpFile = Files .createTempFile(" headerTests" , s " . ${ext}" ).toFile()
12+ try
13+ Files .writeString(tmpFile.toPath, code)
14+ op(loadTemplateFile(tmpFile))
15+ finally tmpFile.delete()
16+
17+
18+ private def testTemplates (
19+ props : Map [String , String ],
20+ template : List [(String , String )])(
21+ op : RenderingContext => Unit
22+ ) =
23+ def rec (cxt : RenderingContext , remaining : List [(String , String )]): Unit =
24+ if (remaining.isEmpty) op(cxt)
25+ else
26+ val (code, ext) = remaining.head
27+ testTemplate(code, ext) { template =>
28+ val newCtx = cxt.copy(layouts = cxt.layouts + (template.name() -> template))
29+ rec(newCtx, remaining.drop(1 ))
30+ }
31+
32+ rec(RenderingContext (props), template)
33+
34+ private def fullRender (template : TemplateFile , ctx : RenderingContext ): String = template.resolveInner(ctx).code.trim()
35+
36+ @ Test
37+ def testParsingHeaders (): Unit =
38+ testTemplate(
39+ """ ---
40+ |title: myTitle
41+ |---
42+ |code""" .stripMargin
43+ ) { t =>
44+ assertEquals(t.rawCode, " code" )
45+ assertEquals(t.title(), " myTitle" )
46+ }
47+
48+
49+ @ Test
50+ def testLinks (): Unit =
51+ val base =
52+ """ ---
53+ |title: myTitle
54+ |name: base
55+ |---
56+ |Ala {{ content }}. {{p2}} with [link](link/target.md)!
57+ |""" .stripMargin
58+
59+ val content =
60+ """ ---
61+ |layout: base
62+ |name: content
63+ |---
64+ |ma kota w **{{ p1 }}** from [here](link/here.md)
65+ |""" .stripMargin
66+
67+
68+ val expected = """ <p>Ala ma kota w <strong>paski</strong> from <a href="link/here.md">here</a>. Hej with <a href="link/target.md">link</a>!</p>"""
69+
70+ testTemplates(
71+ Map (" p1" -> " paski" , " p2" -> " Hej" ),
72+ List (base -> " html" , content -> " md" )
73+ ) { it =>
74+ assertEquals(
75+ expected,
76+ fullRender(it.layouts(" content" ), it)
77+ )
78+ }
79+
80+ @ Test
81+ def layout (): Unit =
82+ val base =
83+ """ ---
84+ |title: myTitle
85+ |name: base
86+ |---
87+ |Ala {{ content }}. {{p2}}!
88+ |""" .stripMargin
89+
90+ val content =
91+ """ ---
92+ |layout: base
93+ |name: content
94+ |---
95+ |ma kota w **{{ p1 }}**
96+ |""" .stripMargin
97+
98+
99+ val expected = """ <p>Ala ma kota w <strong>paski</strong>. Hej!</p>""" .stripMargin
100+
101+ testTemplates(
102+ Map (" p1" -> " paski" , " p2" -> " Hej" ),
103+ List (base -> " html" , content -> " md" )
104+ ) { it =>
105+ assertEquals(
106+ expected,
107+ fullRender(it.layouts(" content" ), it)
108+ )
109+ }
110+
111+ @ Test
112+ def nestedLayout_htmlMdHtml (): Unit =
113+ val toplevel =
114+ """ ---
115+ |name: toplevel
116+ |---
117+ |[div id="root"]{{ content }}[/div]
118+ |""" .stripMargin
119+
120+ val basePage =
121+ """ ---
122+ |layout: toplevel
123+ |name: basePage
124+ |---
125+ |# {{ pageName }}
126+ |
127+ |{{content}}
128+ |
129+ |## {{ pageName }} end
130+ |""" .stripMargin
131+
132+ val content =
133+ """ ---
134+ |layout: basePage
135+ |name: content
136+ |---
137+ |Hello {{ name }}!
138+ |""" .stripMargin
139+
140+
141+ val expected =
142+ """ [div id="root"][h1]Test page[/h1]
143+ |[p]Hello world!![/p]
144+ |[h2]Test page end[/h2]
145+ |[/div]""" .stripMargin
146+
147+ testTemplates(
148+ Map (" pageName" -> " Test page" , " name" -> " world!" ),
149+ List (
150+ toplevel -> " html" ,
151+ basePage -> " md" ,
152+ content -> " md"
153+ )
154+ ) (it => fullRender(it.layouts(" content" ), it))
155+
156+ @ Test
157+ def nestedLayout_mdHtmlMd (): Unit =
158+ val toplevel =
159+ """ ---
160+ |name: toplevel
161+ |---
162+ |<h1>The Page</h1>
163+ |{{ content }}
164+ |""" .stripMargin
165+
166+ val basePage =
167+ """ ---
168+ |layout: toplevel
169+ |name: basePage
170+ |---
171+ |<h2>{{ pageName }}</h2>
172+ |
173+ |{{content}}
174+ |
175+ |<h3>{{ pageName }} end</h3>
176+ |""" .stripMargin
177+
178+ val content =
179+ """ ---
180+ |layout: basePage
181+ |name: content
182+ |---
183+ |Hello {{ name }}!
184+ |""" .stripMargin
185+
186+
187+ val expected =
188+ """ <h1>The Page</h1>
189+ |<h2>Test page</h2>
190+ |<p>Hello world!!</p>
191+ |<h3>Test page end</h3>""" .stripMargin
192+
193+ testTemplates(
194+ Map (" pageName" -> " Test page" , " name" -> " world!" ),
195+ List (
196+ toplevel -> " html" ,
197+ basePage -> " html" ,
198+ content -> " md"
199+ )
200+ ) { ctx => assertEquals(expected, fullRender(ctx.layouts(" content" ), ctx)) }
201+
202+ @ Test
203+ def markdown (): Unit =
204+ testTemplate(
205+ """ # Hello {{ msg }}!""" ,
206+ ext = " md"
207+ ) { t =>
208+ assertEquals(" # Hello there!" , t.resolveInner(RenderingContext (Map (" msg" -> " there" ))).code.trim())
209+ }
210+
211+ @ Test
212+ def mixedTemplates () : Unit =
213+ testTemplate(
214+ """ # Hello {{ msg }}!""" ,
215+ ext = " md"
216+ ) { t =>
217+ assertEquals(" # Hello there!" , t.resolveInner(RenderingContext (Map (" msg" -> " there" ))).code.trim())
218+ }
0 commit comments