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)
23 data is LinkedElement && data.properties["type"] == "audio" -> renderAudioPlayer(data)
27 private fun renderLinkedImage(linkedElement: LinkedElement) =
28 renderTemplate(loadedImageTemplate) { templateContext ->
29 templateContext["link"] = linkedElement.link
32 private fun renderHtmlPage(linkedElement: LinkedElement) =
33 renderTemplate(loadedHtmlPageTemplate) { templateContext ->
34 templateContext["link"] = linkedElement.link
35 templateContext["title"] = linkedElement.properties["title"] ?: "No title"
36 templateContext["description"] = linkedElement.properties["description"] ?: "No description"
39 private fun renderAudioPlayer(linkedElement: LinkedElement) =
40 renderTemplate(loadedAudioTemplate) { templateContext ->
41 templateContext["link"] = linkedElement.link
44 private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
45 renderTemplate(notLoadedImageTemplate) { templateContext ->
46 templateContext["link"] = linkedElement.link
49 private fun renderTemplate(template: Template, fillTemplateContext: (TemplateContext) -> Unit) =
50 StringWriter().use { stringWriter ->
52 templateContextFactory.createTemplateContext().also { templateContext ->
53 fillTemplateContext(templateContext)
54 template.render(templateContext, stringWriter)
61 private val loadedImageTemplate = """<%include linked/image.html>""".asTemplate()
62 private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".asTemplate()
63 private val loadedAudioTemplate = """<%include linked/audio.html>""".asTemplate()
64 private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".asTemplate()