b11dc79aca2946fd66c283ef714470fd98a3f627
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / template / LinkedElementRenderFilter.kt
1 package net.pterodactylus.sone.template
2
3 import net.pterodactylus.sone.core.*
4 import net.pterodactylus.sone.utils.*
5 import net.pterodactylus.util.template.*
6 import java.io.*
7 import javax.inject.*
8
9 /**
10  * Renders all kinds of [LinkedElement]s.
11  */
12 class LinkedElementRenderFilter @Inject constructor(private val templateContextFactory: TemplateContextFactory) : Filter {
13
14         override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
15                         when {
16                                 data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
17                                 data is LinkedElement && data.properties["type"] == "image" -> renderLinkedImage(data)
18                                 data is LinkedElement && data.properties["type"] == "html" -> renderHtmlPage(data)
19                                 else -> null
20                         }
21
22         private fun renderLinkedImage(linkedElement: LinkedElement) =
23                         StringWriter().use {
24                                 val templateContext = templateContextFactory.createTemplateContext()
25                                 templateContext["link"] = linkedElement.link
26                                 it.also { loadedImageTemplate.render(templateContext, it) }
27                         }.toString()
28
29         private fun renderHtmlPage(linkedElement: LinkedElement) =
30                         StringWriter().use {
31                                 val templateContext = templateContextFactory.createTemplateContext()
32                                 templateContext["link"] = linkedElement.link
33                                 templateContext["title"] = linkedElement.properties["title"] ?: "No title"
34                                 templateContext["description"] = linkedElement.properties["description"] ?: "No description"
35                                 it.also { loadedHtmlPageTemplate.render(templateContext, it) }
36                         }.toString()
37
38         private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
39                         StringWriter().use {
40                                 val templateContext = templateContextFactory.createTemplateContext()
41                                 templateContext["link"] = linkedElement.link
42                                 it.also { notLoadedImageTemplate.render(templateContext, it) }
43                         }.toString()
44
45 }
46
47 private val loadedImageTemplate = """<%include linked/image.html>""".asTemplate()
48 private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".asTemplate()
49 private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".asTemplate()