All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.insanusmokrassar.AutoPostTelegramBot.utils.extensions.Message.kt Maven / Gradle / Ivy

package com.github.insanusmokrassar.AutoPostTelegramBot.utils.extensions

import com.pengrad.telegrambot.model.Message
import com.pengrad.telegrambot.model.MessageEntity

private class MessageEntityDeformatter(
    private val sourceText: String,
    val range: IntRange,
    private val messageEntity: MessageEntity? = null
) {
    val deformatted: String by lazy {
        messageEntity?.asPreformattedPart(
            sourceText
        ) ?: sourceText.substring(
            range
        ).toMarkdown()
    }
}

private fun MessageEntity.asPreformattedPart(stringToModify: String): String {
    val range = offset() until (offset() + length())
    val text = stringToModify.substring(range)
    return when(type()) {
        MessageEntity.Type.url -> "[$text](${url()})"
        MessageEntity.Type.bold -> "*$text*"
        MessageEntity.Type.italic -> "_${text}_"
        MessageEntity.Type.code -> "`$text`"
        MessageEntity.Type.pre -> "```$text```"
        MessageEntity.Type.text_link -> "[$text](${url()})"
        else -> text.toMarkdown()
    }
}

fun Message.textOrCaptionToMarkdown(): String? {
    val text = caption() ?: text() ?: return null
    val entities: List = (captionEntities() ?: entities()) ?.sortedBy { it.offset() } ?: kotlin.collections.emptyList()

    val deformatters = kotlin.collections.mutableListOf()

    fun previousLast(): Int = deformatters.lastOrNull() ?.range ?.last ?.plus(1) ?: 0

    entities.forEach {
        val simpleTextRange = previousLast() until it.offset()
        if (!simpleTextRange.isEmpty()) {
            deformatters.add(
                MessageEntityDeformatter(
                    text,
                    simpleTextRange
                )
            )
        }
        deformatters.add(
            MessageEntityDeformatter(
                text,
                it.offset() until (it.offset() + it.length()),
                it
            )
        )
    }
    val simpleTextRange = previousLast() until text.length
    if (!simpleTextRange.isEmpty()) {
        deformatters.add(
            MessageEntityDeformatter(
                text,
                simpleTextRange
            )
        )
    }

    return deformatters.joinToString("", "", "") {
        it.deformatted
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy