1 package net.pterodactylus.sone.template
3 import net.pterodactylus.sone.core.LinkedElement
4 import net.pterodactylus.sone.utils.asTemplate
5 import net.pterodactylus.util.template.Filter
6 import net.pterodactylus.util.template.TemplateContext
7 import net.pterodactylus.util.template.TemplateContextFactory
8 import java.io.StringWriter
9 import javax.inject.Inject
12 * Renders all kinds of [LinkedElement]s.
14 class LinkedElementRenderFilter @Inject constructor(private val templateContextFactory: TemplateContextFactory): Filter {
17 private val loadedImageTemplate = """<%include linked/image.html>""".asTemplate()
18 private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".asTemplate()
19 private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".asTemplate()
22 override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
24 data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
25 data is LinkedElement && data.properties["type"] == "image" -> renderLinkedImage(data)
26 data is LinkedElement && data.properties["type"] == "html" -> renderHtmlPage(data)
30 private fun renderLinkedImage(linkedElement: LinkedElement) =
32 val templateContext = templateContextFactory.createTemplateContext()
33 templateContext["link"] = linkedElement.link
34 it.also { loadedImageTemplate.render(templateContext, it) }
37 private fun renderHtmlPage(linkedElement: LinkedElement) =
39 val templateContext = templateContextFactory.createTemplateContext()
40 templateContext["link"] = linkedElement.link
41 templateContext["title"] = linkedElement.properties["title"] ?: "No title"
42 templateContext["description"] = linkedElement.properties["description"] ?: "No description"
43 it.also { loadedHtmlPageTemplate.render(templateContext, it) }
46 private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
48 val templateContext = templateContextFactory.createTemplateContext()
49 templateContext["link"] = linkedElement.link
50 it.also { notLoadedImageTemplate.render(templateContext, it) }