1 package net.pterodactylus.sone.template
3 import net.pterodactylus.sone.text.LinkPart
4 import net.pterodactylus.sone.text.Part
5 import net.pterodactylus.sone.text.PlainTextPart
6 import net.pterodactylus.util.template.Filter
7 import net.pterodactylus.util.template.TemplateContext
11 * [Filter] that shortens a number of [Part]s in order to restrict the maximum visible text length.
13 class ShortenFilter : Filter {
15 override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map<String, Any?>?): Any? {
16 @Suppress("UNCHECKED_CAST")
17 val parts = data as? Iterable<Part> ?: return null
18 val length = parameters?.parseInt("length") ?: -1
19 val cutOffLength = parameters?.parseInt("cut-off-length") ?: length
21 var allPartsLength = 0
22 val shortenedParts = ArrayList<Part>()
24 if (part is PlainTextPart) {
25 val longText = part.text
26 if (allPartsLength < cutOffLength) {
27 if (allPartsLength + longText.length > cutOffLength) {
28 shortenedParts.add(PlainTextPart(longText.substring(0, cutOffLength - allPartsLength) + "…"))
30 shortenedParts.add(part)
33 allPartsLength += longText.length
34 } else if (part is LinkPart) {
35 if (allPartsLength < cutOffLength) {
36 shortenedParts.add(part)
38 allPartsLength += part.text.length
40 if (allPartsLength < cutOffLength) {
41 shortenedParts.add(part)
45 if (allPartsLength > length) {
52 private fun Map<String, Any?>.parseInt(key: String) = this[key]?.toString()?.toInt()