Simplify some code
[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.util.template.Filter
5 import net.pterodactylus.util.template.TemplateContext
6 import net.pterodactylus.util.template.TemplateContextFactory
7 import net.pterodactylus.util.template.TemplateParser
8 import java.io.StringReader
9 import java.io.StringWriter
10 import javax.inject.Inject
11
12 /**
13  * Renders all kinds of [LinkedElement]s.
14  */
15 class LinkedElementRenderFilter @Inject constructor(private val templateContextFactory: TemplateContextFactory): Filter {
16
17         companion object {
18                 private val loadedImageTemplate = """<%include linked/image.html>""".parse()
19                 private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".parse()
20                 private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".parse()
21
22                 private fun String.parse() = StringReader(this).use { TemplateParser.parse(it) }!!
23         }
24
25         override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
26                         when {
27                                 data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
28                                 data is LinkedElement && data.properties["type"] == "image" -> renderLinkedImage(data)
29                                 data is LinkedElement && data.properties["type"] == "html" -> renderHtmlPage(data)
30                                 else -> null
31                         }
32
33         private fun renderLinkedImage(linkedElement: LinkedElement) =
34                         StringWriter().use {
35                                 val templateContext = templateContextFactory.createTemplateContext()
36                                 templateContext["link"] = linkedElement.link
37                                 it.also { loadedImageTemplate.render(templateContext, it) }
38                         }.toString()
39
40         private fun renderHtmlPage(linkedElement: LinkedElement) =
41                         StringWriter().use {
42                                 val templateContext = templateContextFactory.createTemplateContext()
43                                 templateContext["link"] = linkedElement.link
44                                 templateContext["title"] = linkedElement.properties["title"] ?: "No title"
45                                 templateContext["description"] = linkedElement.properties["description"] ?: "No description"
46                                 it.also { loadedHtmlPageTemplate.render(templateContext, it) }
47                         }.toString()
48
49         private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
50                         StringWriter().use {
51                                 val templateContext = templateContextFactory.createTemplateContext()
52                                 templateContext["link"] = linkedElement.link
53                                 it.also { notLoadedImageTemplate.render(templateContext, it) }
54                         }.toString()
55
56 }