package net.pterodactylus.sone.template import net.pterodactylus.sone.core.* import net.pterodactylus.sone.utils.* import net.pterodactylus.util.template.* import java.io.* /** * Renders all kinds of [LinkedElement]s. */ class LinkedElementRenderFilter : Filter { private val templateContextFactory = TemplateContextFactory().apply { addFilter("html", HtmlFilter()) addProvider(ClassPathTemplateProvider(LinkedElementRenderFilter::class.java, "/templates/")) } override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map?) = when { data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data) data is LinkedElement && data.properties["type"] == "image" -> renderLinkedImage(data) data is LinkedElement && data.properties["type"] == "html" -> renderHtmlPage(data) data is LinkedElement && data.properties["type"] == "audio" -> renderAudioPlayer(data) else -> null } private fun renderLinkedImage(linkedElement: LinkedElement) = renderTemplate(loadedImageTemplate) { templateContext -> templateContext["link"] = linkedElement.link } private fun renderHtmlPage(linkedElement: LinkedElement) = renderTemplate(loadedHtmlPageTemplate) { templateContext -> templateContext["link"] = linkedElement.link templateContext["title"] = linkedElement.properties["title"] ?: "No title" templateContext["description"] = linkedElement.properties["description"] ?: "No description" } private fun renderAudioPlayer(linkedElement: LinkedElement) = renderTemplate(loadedAudioTemplate) { templateContext -> templateContext["link"] = linkedElement.link } private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) = renderTemplate(notLoadedImageTemplate) { templateContext -> templateContext["link"] = linkedElement.link } private fun renderTemplate(template: Template, fillTemplateContext: (TemplateContext) -> Unit) = StringWriter().use { stringWriter -> stringWriter.also { templateContextFactory.createTemplateContext().also { templateContext -> fillTemplateContext(templateContext) template.render(templateContext, stringWriter) } } }.toString() } private val loadedImageTemplate = """<%include linked/image.html>""".asTemplate() private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".asTemplate() private val loadedAudioTemplate = """<%include linked/audio.html>""".asTemplate() private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".asTemplate()