Show loading animation while loading elements
[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.core.LinkedImage
5 import net.pterodactylus.util.template.Filter
6 import net.pterodactylus.util.template.TemplateContext
7 import net.pterodactylus.util.template.TemplateContextFactory
8 import net.pterodactylus.util.template.TemplateParser
9 import java.io.StringReader
10 import java.io.StringWriter
11
12 /**
13  * Renders all kinds of [LinkedElement]s.
14  */
15 class LinkedElementRenderFilter(private val templateContextFactory: TemplateContextFactory) : Filter {
16
17         companion object {
18                 private val loadedImageTemplate = """<a href="/<% link|html>"><span class="linked-element" title="<% link|html>" style="background-image: url('/<% link|html>')"></span></a>""".parse()
19                 private val notLoadedImageTemplate = """<span class="linked-element" title="<% link|html>" style="background-image: url('images/loading-animation.gif')"></span>""".parse()
20
21                 private fun String.parse() = StringReader(this).use { TemplateParser.parse(it) }
22         }
23
24         override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
25                         when {
26                                 data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
27                                 data is LinkedImage -> renderLinkedImage(data)
28                                 else -> null
29                         }
30
31         private fun renderLinkedImage(linkedImage: LinkedImage) =
32                         StringWriter().use {
33                                 val templateContext = templateContextFactory.createTemplateContext()
34                                 templateContext["link"] = linkedImage.link
35                                 loadedImageTemplate.render(templateContext, it)
36                                 it
37                         }.toString()
38
39         private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
40                         StringWriter().use {
41                                 val templateContext = templateContextFactory.createTemplateContext()
42                                 templateContext["link"] = linkedElement.link
43                                 notLoadedImageTemplate.render(templateContext, it)
44                                 it
45                         }.toString()
46
47 }