1 package net.pterodactylus.sone.template
3 import net.pterodactylus.sone.core.*
4 import net.pterodactylus.sone.utils.*
5 import net.pterodactylus.util.template.*
9 * Renders all kinds of [LinkedElement]s.
11 class LinkedElementRenderFilter : Filter {
13 private val templateContextFactory = TemplateContextFactory().apply {
14 addFilter("html", HtmlFilter())
15 addProvider(ClassPathTemplateProvider(LinkedElementRenderFilter::class.java, "/templates/"))
18 override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
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)
26 private fun renderLinkedImage(linkedElement: LinkedElement) =
28 val templateContext = templateContextFactory.createTemplateContext()
29 templateContext["link"] = linkedElement.link
30 it.also { loadedImageTemplate.render(templateContext, it) }
33 private fun renderHtmlPage(linkedElement: LinkedElement) =
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) }
42 private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
44 val templateContext = templateContextFactory.createTemplateContext()
45 templateContext["link"] = linkedElement.link
46 it.also { notLoadedImageTemplate.render(templateContext, it) }
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()