♻️ Create template context factory in render filter
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / template / LinkedElementRenderFilter.kt
1 package net.pterodactylus.sone.template
2
3 import net.pterodactylus.sone.core.*
4 import net.pterodactylus.sone.utils.*
5 import net.pterodactylus.util.template.*
6 import java.io.*
7
8 /**
9  * Renders all kinds of [LinkedElement]s.
10  */
11 class LinkedElementRenderFilter : Filter {
12
13         private val templateContextFactory = TemplateContextFactory().apply {
14                 addFilter("html", HtmlFilter())
15                 addProvider(ClassPathTemplateProvider(LinkedElementRenderFilter::class.java, "/templates/"))
16         }
17
18         override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
19                         when {
20                                 data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
21                                 data is LinkedElement && data.properties["type"] == "image" -> renderLinkedImage(data)
22                                 data is LinkedElement && data.properties["type"] == "html" -> renderHtmlPage(data)
23                                 else -> null
24                         }
25
26         private fun renderLinkedImage(linkedElement: LinkedElement) =
27                         StringWriter().use {
28                                 val templateContext = templateContextFactory.createTemplateContext()
29                                 templateContext["link"] = linkedElement.link
30                                 it.also { loadedImageTemplate.render(templateContext, it) }
31                         }.toString()
32
33         private fun renderHtmlPage(linkedElement: LinkedElement) =
34                         StringWriter().use {
35                                 val templateContext = templateContextFactory.createTemplateContext()
36                                 templateContext["link"] = linkedElement.link
37                                 templateContext["title"] = linkedElement.properties["title"] ?: "No title"
38                                 templateContext["description"] = linkedElement.properties["description"] ?: "No description"
39                                 it.also { loadedHtmlPageTemplate.render(templateContext, it) }
40                         }.toString()
41
42         private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
43                         StringWriter().use {
44                                 val templateContext = templateContextFactory.createTemplateContext()
45                                 templateContext["link"] = linkedElement.link
46                                 it.also { notLoadedImageTemplate.render(templateContext, it) }
47                         }.toString()
48
49 }
50
51 private val loadedImageTemplate = """<%include linked/image.html>""".asTemplate()
52 private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".asTemplate()
53 private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".asTemplate()