✨ Show audio player for links to audio files
[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
8 /**
9  * Renders all kinds of [LinkedElement]s.
10  */
11 class LinkedElementRenderFilter : Filter {
12
13         private val templateContextFactory = TemplateContextFactory().apply {
14                 addFilter("html", HtmlFilter())
15                 addProvider(ClassPathTemplateProvider(LinkedElementRenderFilter::class.java, "/templates/"))
16         }
17
18         override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?) =
19                         when {
20                                 data is LinkedElement && data.loading -> renderNotLoadedLinkedElement(data)
21                                 data is LinkedElement && data.properties["type"] == "image" -> renderLinkedImage(data)
22                                 data is LinkedElement && data.properties["type"] == "html" -> renderHtmlPage(data)
23                                 data is LinkedElement && data.properties["type"] == "audio" -> renderAudioPlayer(data)
24                                 else -> null
25                         }
26
27         private fun renderLinkedImage(linkedElement: LinkedElement) =
28                         renderTemplate(loadedImageTemplate) { templateContext ->
29                                 templateContext["link"] = linkedElement.link
30                         }
31
32         private fun renderHtmlPage(linkedElement: LinkedElement) =
33                         renderTemplate(loadedHtmlPageTemplate) { templateContext ->
34                                 templateContext["link"] = linkedElement.link
35                                 templateContext["title"] = linkedElement.properties["title"] ?: "No title"
36                                 templateContext["description"] = linkedElement.properties["description"] ?: "No description"
37                         }
38
39         private fun renderAudioPlayer(linkedElement: LinkedElement) =
40                         renderTemplate(loadedAudioTemplate) { templateContext ->
41                                 templateContext["link"] = linkedElement.link
42                         }
43
44         private fun renderNotLoadedLinkedElement(linkedElement: LinkedElement) =
45                         renderTemplate(notLoadedImageTemplate) { templateContext ->
46                                 templateContext["link"] = linkedElement.link
47                         }
48
49         private fun renderTemplate(template: Template, fillTemplateContext: (TemplateContext) -> Unit) =
50                         StringWriter().use { stringWriter ->
51                                 stringWriter.also {
52                                         templateContextFactory.createTemplateContext().also { templateContext ->
53                                                 fillTemplateContext(templateContext)
54                                                 template.render(templateContext, stringWriter)
55                                         }
56                                 }
57                         }.toString()
58
59 }
60
61 private val loadedImageTemplate = """<%include linked/image.html>""".asTemplate()
62 private val loadedHtmlPageTemplate = """<%include linked/html-page.html>""".asTemplate()
63 private val loadedAudioTemplate = """<%include linked/audio.html>""".asTemplate()
64 private val notLoadedImageTemplate = """<%include linked/notLoaded.html>""".asTemplate()