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 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<String, Any?>?) =
when {
data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
- data is LinkedElement -> renderLinkedImage(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
- loadedImageTemplate.render(templateContext, it)
- it
- }.toString()
+ }
+
+ 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) =
- StringWriter().use {
- val templateContext = templateContextFactory.createTemplateContext()
+ renderTemplate(notLoadedImageTemplate) { templateContext ->
templateContext["link"] = linkedElement.link
- notLoadedImageTemplate.render(templateContext, it)
- 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()