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