X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ftemplate%2FLinkedElementRenderFilter.kt;h=5cc602c5fc54bae24cd493ac71dd889eba75fafd;hb=refs%2Fheads%2Fadd-audio-player;hp=a527a1d2fb9c27cf9bd203047a30f57fff4c1775;hpb=d9165cde615f02b1ab342d17456dd124ebc4f5bf;p=Sone.git diff --git a/src/main/kotlin/net/pterodactylus/sone/template/LinkedElementRenderFilter.kt b/src/main/kotlin/net/pterodactylus/sone/template/LinkedElementRenderFilter.kt index a527a1d..5cc602c 100644 --- a/src/main/kotlin/net/pterodactylus/sone/template/LinkedElementRenderFilter.kt +++ b/src/main/kotlin/net/pterodactylus/sone/template/LinkedElementRenderFilter.kt @@ -1,25 +1,18 @@ package net.pterodactylus.sone.template -import net.pterodactylus.sone.core.LinkedElement -import net.pterodactylus.util.template.Filter -import net.pterodactylus.util.template.TemplateContext -import net.pterodactylus.util.template.TemplateContextFactory -import net.pterodactylus.util.template.TemplateParser -import java.io.StringReader -import java.io.StringWriter -import javax.inject.Inject +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 @Inject constructor(private val templateContextFactory: TemplateContextFactory): Filter { +class LinkedElementRenderFilter : Filter { - companion object { - private val loadedImageTemplate = """<%include linked/image.html>""".parse() - private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".parse() - private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".parse() - - private fun String.parse() = StringReader(this).use { TemplateParser.parse(it) }!! + private val templateContextFactory = TemplateContextFactory().apply { + addFilter("html", HtmlFilter()) + addProvider(ClassPathTemplateProvider(LinkedElementRenderFilter::class.java, "/templates/")) } override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map?) = @@ -27,30 +20,45 @@ class LinkedElementRenderFilter @Inject constructor(private val templateContextF 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) = - StringWriter().use { - val templateContext = templateContextFactory.createTemplateContext() + renderTemplate(loadedImageTemplate) { templateContext -> templateContext["link"] = linkedElement.link - it.also { loadedImageTemplate.render(templateContext, it) } - }.toString() + } private fun renderHtmlPage(linkedElement: LinkedElement) = - StringWriter().use { - val templateContext = templateContextFactory.createTemplateContext() + renderTemplate(loadedHtmlPageTemplate) { templateContext -> templateContext["link"] = linkedElement.link templateContext["title"] = linkedElement.properties["title"] ?: "No title" templateContext["description"] = linkedElement.properties["description"] ?: "No description" - it.also { loadedHtmlPageTemplate.render(templateContext, it) } - }.toString() + } + + private fun renderAudioPlayer(linkedElement: LinkedElement) = + renderTemplate(loadedAudioTemplate) { templateContext -> + templateContext["link"] = linkedElement.link + } private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) = - StringWriter().use { - val templateContext = templateContextFactory.createTemplateContext() + renderTemplate(notLoadedImageTemplate) { templateContext -> templateContext["link"] = linkedElement.link - it.also { notLoadedImageTemplate.render(templateContext, it) } + } + + 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()