X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ftemplate%2FShortenFilter.kt;fp=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ftemplate%2FShortenFilter.kt;h=de7a930530608aa214ed81ac48b8dc0e4f6c163f;hb=b86b2cbef3b08619f99fb7aa68aaf55fab7bfcd2;hp=0000000000000000000000000000000000000000;hpb=de6d73a2f0718ff65832859a3ef7ba4f32299327;p=Sone.git diff --git a/src/main/kotlin/net/pterodactylus/sone/template/ShortenFilter.kt b/src/main/kotlin/net/pterodactylus/sone/template/ShortenFilter.kt new file mode 100644 index 0000000..de7a930 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/template/ShortenFilter.kt @@ -0,0 +1,54 @@ +package net.pterodactylus.sone.template + +import net.pterodactylus.sone.text.LinkPart +import net.pterodactylus.sone.text.Part +import net.pterodactylus.sone.text.PlainTextPart +import net.pterodactylus.util.template.Filter +import net.pterodactylus.util.template.TemplateContext +import java.util.* + +/** + * [Filter] that shortens a number of [Part]s in order to restrict the maximum visible text length. + */ +class ShortenFilter : Filter { + + override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map?): Any? { + @Suppress("UNCHECKED_CAST") + val parts = data as? Iterable ?: return null + val length = parameters?.parseInt("length") ?: -1 + val cutOffLength = parameters?.parseInt("cut-off-length") ?: length + if (length > -1) { + var allPartsLength = 0 + val shortenedParts = ArrayList() + for (part in parts) { + if (part is PlainTextPart) { + val longText = part.text + if (allPartsLength < cutOffLength) { + if (allPartsLength + longText.length > cutOffLength) { + shortenedParts.add(PlainTextPart(longText.substring(0, cutOffLength - allPartsLength) + "…")) + } else { + shortenedParts.add(part) + } + } + allPartsLength += longText.length + } else if (part is LinkPart) { + if (allPartsLength < cutOffLength) { + shortenedParts.add(part) + } + allPartsLength += part.text.length + } else { + if (allPartsLength < cutOffLength) { + shortenedParts.add(part) + } + } + } + if (allPartsLength > length) { + return shortenedParts + } + } + return parts + } + + private fun Map.parseInt(key: String) = this[key]?.toString()?.toInt() + +}