mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-22 16:23:48 +00:00
add simple text dsl for textsources
This commit is contained in:
parent
54cfea9adf
commit
3620350cc0
@ -23,4 +23,4 @@ interface CaptionedInput : Captioned {
|
|||||||
* Convert its [CaptionedInput.captionEntities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
* Convert its [CaptionedInput.captionEntities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
||||||
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
||||||
*/
|
*/
|
||||||
fun CaptionedInput.fullEntitiesList(): FullTextSourcesList = caption ?.fullListOfSubSource(captionEntities) ?.map { it.source } ?: emptyList()
|
fun CaptionedInput.fullEntitiesList(): TextSourcesList = caption ?.fullListOfSubSource(captionEntities) ?.map { it.source } ?: emptyList()
|
||||||
|
@ -29,4 +29,4 @@ interface ExplainedInput : Explained {
|
|||||||
* Convert its [ExplainedInput.explanationEntities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
* Convert its [ExplainedInput.explanationEntities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
||||||
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
||||||
*/
|
*/
|
||||||
fun ExplainedInput.fullEntitiesList(): FullTextSourcesList = explanation ?.fullListOfSubSource(explanationEntities) ?.map { it.source } ?: emptyList()
|
fun ExplainedInput.fullEntitiesList(): TextSourcesList = explanation ?.fullListOfSubSource(explanationEntities) ?.map { it.source } ?: emptyList()
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
package dev.inmo.tgbotapi.CommonAbstracts
|
package dev.inmo.tgbotapi.CommonAbstracts
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.types.MessageEntity.textsources.regular
|
||||||
import dev.inmo.tgbotapi.types.MessageEntity.toTextParts
|
import dev.inmo.tgbotapi.types.MessageEntity.toTextParts
|
||||||
import dev.inmo.tgbotapi.types.captionLength
|
import dev.inmo.tgbotapi.types.captionLength
|
||||||
import dev.inmo.tgbotapi.types.textLength
|
import dev.inmo.tgbotapi.types.textLength
|
||||||
|
|
||||||
|
const val DirectInvocationOfTextSourceConstructor = "It is strongly not recommended to use constructors directly instead of factory methods"
|
||||||
|
|
||||||
|
typealias TextSourcesList = List<TextSource>
|
||||||
|
@Deprecated("All lists of TextSource in public API now are full. So, this typealias is redundant")
|
||||||
typealias FullTextSourcesList = List<TextSource>
|
typealias FullTextSourcesList = List<TextSource>
|
||||||
|
@Deprecated("All lists of TextPart in public API now are full. So, this typealias is redundant")
|
||||||
typealias FullTextPartsList = List<TextPart>
|
typealias FullTextPartsList = List<TextPart>
|
||||||
|
|
||||||
interface TextSource {
|
interface TextSource {
|
||||||
@ -12,8 +18,19 @@ interface TextSource {
|
|||||||
val asMarkdownV2Source: String
|
val asMarkdownV2Source: String
|
||||||
val asHtmlSource: String
|
val asHtmlSource: String
|
||||||
val source: String
|
val source: String
|
||||||
|
|
||||||
|
val asText: String
|
||||||
|
get() = source
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline operator fun TextSource.plus(other: TextSource) = listOf(this, other)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline operator fun TextSource.plus(other: List<TextSource>) = listOf(this) + other
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline operator fun TextSource.plus(text: String) = listOf(this, regular(text))
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline operator fun List<TextSource>.plus(text: String) = this + regular(text)
|
||||||
|
|
||||||
interface MultilevelTextSource : TextSource {
|
interface MultilevelTextSource : TextSource {
|
||||||
@Deprecated("Will be removed in near major release")
|
@Deprecated("Will be removed in near major release")
|
||||||
|
@ -29,4 +29,4 @@ interface TextedInput : Texted {
|
|||||||
* Convert its [TextedInput.textEntities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
* Convert its [TextedInput.textEntities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
||||||
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
||||||
*/
|
*/
|
||||||
fun TextedInput.fullEntitiesList(): FullTextSourcesList = text ?.fullListOfSubSource(textEntities) ?.map { it.source } ?: emptyList()
|
fun TextedInput.fullEntitiesList(): TextSourcesList = text ?.fullListOfSubSource(textEntities) ?.map { it.source } ?: emptyList()
|
||||||
|
@ -28,7 +28,7 @@ internal fun RawMessageEntity.asTextParts(
|
|||||||
"mention" -> MentionTextSource(sourceSubstring, shiftedSubSources)
|
"mention" -> MentionTextSource(sourceSubstring, shiftedSubSources)
|
||||||
"hashtag" -> HashTagTextSource(sourceSubstring, shiftedSubSources)
|
"hashtag" -> HashTagTextSource(sourceSubstring, shiftedSubSources)
|
||||||
"cashtag" -> CashTagTextSource(sourceSubstring, shiftedSubSources)
|
"cashtag" -> CashTagTextSource(sourceSubstring, shiftedSubSources)
|
||||||
"bot_command" -> BotCommandTextSource(sourceSubstring, shiftedSubSources)
|
"bot_command" -> BotCommandTextSource(sourceSubstring)
|
||||||
"url" -> URLTextSource(sourceSubstring)
|
"url" -> URLTextSource(sourceSubstring)
|
||||||
"email" -> EMailTextSource(sourceSubstring, shiftedSubSources)
|
"email" -> EMailTextSource(sourceSubstring, shiftedSubSources)
|
||||||
"phone_number" -> PhoneNumberTextSource(sourceSubstring, shiftedSubSources)
|
"phone_number" -> PhoneNumberTextSource(sourceSubstring, shiftedSubSources)
|
||||||
@ -130,6 +130,12 @@ internal fun List<TextSource>.toTextParts(preOffset: Int = 0): List<TextPart> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun String.removeLeading(word: String) = if (startsWith(word)){
|
||||||
|
substring(word.length)
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
|
||||||
internal fun List<TextSource>.toRawMessageEntities(): List<RawMessageEntity> = toTextParts().asRawMessageEntities()
|
internal fun List<TextSource>.toRawMessageEntities(): List<RawMessageEntity> = toTextParts().asRawMessageEntities()
|
||||||
|
|
||||||
internal fun RawMessageEntities.asTextParts(sourceString: String): List<TextPart> = sourceString.fullListOfSubSource(
|
internal fun RawMessageEntities.asTextParts(sourceString: String): List<TextPart> = sourceString.fullListOfSubSource(
|
||||||
|
@ -4,7 +4,10 @@ import dev.inmo.tgbotapi.CommonAbstracts.*
|
|||||||
import dev.inmo.tgbotapi.types.MessageEntity.toTextParts
|
import dev.inmo.tgbotapi.types.MessageEntity.toTextParts
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class BoldTextSource(
|
/**
|
||||||
|
* @see bold
|
||||||
|
*/
|
||||||
|
data class BoldTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
@ -13,7 +16,9 @@ class BoldTextSource(
|
|||||||
override val asHtmlSource: String by lazy { boldHTML() }
|
override val asHtmlSource: String by lazy { boldHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
|
||||||
inline fun bold(text: String) = BoldTextSource(text, emptyList())
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun bold(parts: List<TextSource>) = BoldTextSource(parts.makeString(), parts)
|
inline fun bold(parts: List<TextSource>) = BoldTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun bold(vararg parts: TextSource) = bold(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun bold(text: String) = bold(regular(text))
|
||||||
|
@ -1,19 +1,28 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
|
import dev.inmo.tgbotapi.types.MessageEntity.removeLeading
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
private val commandRegex = Regex("[/!][^@\\s]*")
|
private val commandRegex = Regex("[/!][^@\\s]*")
|
||||||
|
|
||||||
class BotCommandTextSource(
|
/**
|
||||||
override val source: String,
|
* @see botCommand
|
||||||
override val textSources: List<TextSource>
|
*/
|
||||||
) : MultilevelTextSource {
|
data class BotCommandTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
|
override val source: String
|
||||||
|
) : TextSource {
|
||||||
val command: String by lazy {
|
val command: String by lazy {
|
||||||
commandRegex.find(source) ?.value ?.substring(1) ?: source.substring(1)// skip first symbol like "/" or "!"
|
commandRegex.find(source) ?.value ?.substring(1) ?: source.substring(1)// skip first symbol like "/" or "!"
|
||||||
}
|
}
|
||||||
|
|
||||||
override val asMarkdownSource: String by lazy { source.commandMarkdown() }
|
override val asMarkdownSource: String by lazy { source.commandMarkdown() }
|
||||||
override val asMarkdownV2Source: String by lazy { commandMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { source.commandMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { commandHTML() }
|
override val asHtmlSource: String by lazy { source.commandHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param command Without leading "/"
|
||||||
|
*/
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun botCommand(command: String) = BotCommandTextSource("/$command")
|
||||||
|
@ -3,7 +3,10 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class CashTagTextSource(
|
/**
|
||||||
|
* @see cashTag
|
||||||
|
*/
|
||||||
|
data class CashTagTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
@ -11,3 +14,10 @@ class CashTagTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { cashTagMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { cashTagMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { cashTagHTML() }
|
override val asHtmlSource: String by lazy { cashTagHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun cashTag(parts: List<TextSource>) = CashTagTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun cashTag(vararg parts: TextSource) = cashTag(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun cashTag(tag: String) = cashTag(regular(tag))
|
||||||
|
@ -1,12 +1,19 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.CommonAbstracts.DirectInvocationOfTextSourceConstructor
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class CodeTextSource(
|
/**
|
||||||
|
* @see code
|
||||||
|
*/
|
||||||
|
data class CodeTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String
|
override val source: String
|
||||||
) : TextSource {
|
) : TextSource {
|
||||||
override val asMarkdownSource: String by lazy { source.codeMarkdown() }
|
override val asMarkdownSource: String by lazy { source.codeMarkdown() }
|
||||||
override val asMarkdownV2Source: String by lazy { source.codeMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { source.codeMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { source.codeHTML() }
|
override val asHtmlSource: String by lazy { source.codeHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun code(code: String) = CodeTextSource(code)
|
||||||
|
@ -3,7 +3,10 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class EMailTextSource(
|
/**
|
||||||
|
* @see email
|
||||||
|
*/
|
||||||
|
data class EMailTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
@ -11,3 +14,10 @@ class EMailTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { emailMarkdownV2(source) }
|
override val asMarkdownV2Source: String by lazy { emailMarkdownV2(source) }
|
||||||
override val asHtmlSource: String by lazy { emailHTML(source) }
|
override val asHtmlSource: String by lazy { emailHTML(source) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun email(parts: List<TextSource>) = EMailTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun email(vararg parts: TextSource) = email(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun email(emailAddress: String) = email(regular(emailAddress))
|
||||||
|
@ -3,18 +3,30 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
private val String.withoutSharp
|
/**
|
||||||
get() = if (startsWith("#")){
|
* @see hashtag
|
||||||
substring(1)
|
*/
|
||||||
} else {
|
data class HashTagTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
this
|
|
||||||
}
|
|
||||||
|
|
||||||
class HashTagTextSource(
|
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
override val asMarkdownSource: String by lazy { source.hashTagMarkdown() }
|
override val asMarkdownSource: String by lazy { source.hashTagMarkdown() }
|
||||||
override val asMarkdownV2Source: String by lazy { hashTagMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { hashTagMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { hashTagHTML() }
|
override val asHtmlSource: String by lazy { hashTagHTML() }
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (!source.startsWith("#")) {
|
||||||
|
error("HashTag source must starts with #, but actual value is \"$source\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE", "EXPERIMENTAL_API_USAGE")
|
||||||
|
inline fun hashtag(parts: List<TextSource>) = (regular("#") + parts).let { HashTagTextSource(it.makeString(), it) }
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun hashtag(vararg parts: TextSource) = hashtag(parts.toList())
|
||||||
|
/**
|
||||||
|
* Without sharp (#)
|
||||||
|
*/
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun hashtag(hashtag: String) = hashtag(regular(hashtag))
|
||||||
|
@ -3,7 +3,10 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class ItalicTextSource(
|
/**
|
||||||
|
* @see italic
|
||||||
|
*/
|
||||||
|
data class ItalicTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
@ -11,3 +14,11 @@ class ItalicTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { italicMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { italicMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { italicHTML() }
|
override val asHtmlSource: String by lazy { italicHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun italic(parts: List<TextSource>) = ItalicTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun italic(vararg parts: TextSource) = italic(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun italic(text: String) = italic(regular(text))
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
|
import dev.inmo.tgbotapi.types.MessageEntity.removeLeading
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
private val String.withoutCommercialAt
|
private val String.withoutCommercialAt
|
||||||
@ -10,11 +11,32 @@ private val String.withoutCommercialAt
|
|||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
||||||
class MentionTextSource(
|
/**
|
||||||
|
* @see mention
|
||||||
|
*/
|
||||||
|
data class MentionTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
override val asMarkdownSource: String by lazy { source.mentionMarkdown() }
|
override val asMarkdownSource: String by lazy { source.mentionMarkdown() }
|
||||||
override val asMarkdownV2Source: String by lazy { mentionMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { mentionMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { mentionHTML() }
|
override val asHtmlSource: String by lazy { mentionHTML() }
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (!source.startsWith("@")) {
|
||||||
|
error("Mention source must starts with @, but actual value is \"$source\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun mention(parts: List<TextSource>) = (regular("@") + parts).let { MentionTextSource(it.makeString(), it) }
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun mention(vararg parts: TextSource) = mention(parts.toList())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Without leading "@"
|
||||||
|
*/
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun mention(whoToMention: String) = mention(regular(whoToMention))
|
||||||
|
|
||||||
|
@ -3,7 +3,10 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class PhoneNumberTextSource(
|
/**
|
||||||
|
* @see phone
|
||||||
|
*/
|
||||||
|
data class PhoneNumberTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
@ -11,3 +14,11 @@ class PhoneNumberTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { phoneMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { phoneMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { phoneHTML() }
|
override val asHtmlSource: String by lazy { phoneHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun phone(parts: List<TextSource>) = PhoneNumberTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun phone(vararg parts: TextSource) = phone(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun phone(number: String) = phone(regular(number))
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class PreTextSource(
|
/**
|
||||||
|
* @see pre
|
||||||
|
*/
|
||||||
|
data class PreTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
val language: String? = null
|
val language: String? = null
|
||||||
) : TextSource {
|
) : TextSource {
|
||||||
@ -11,3 +14,7 @@ class PreTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { source.preMarkdownV2(language) }
|
override val asMarkdownV2Source: String by lazy { source.preMarkdownV2(language) }
|
||||||
override val asHtmlSource: String by lazy { source.preHTML(language) }
|
override val asHtmlSource: String by lazy { source.preHTML(language) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun pre(code: String, language: String? = null) = PreTextSource(code, language)
|
||||||
|
|
||||||
|
@ -1,12 +1,18 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class RegularTextSource(
|
/**
|
||||||
|
* @see regular
|
||||||
|
*/
|
||||||
|
data class RegularTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String
|
override val source: String
|
||||||
) : TextSource {
|
) : TextSource {
|
||||||
override val asMarkdownSource: String by lazy { source.regularMarkdown() }
|
override val asMarkdownSource: String by lazy { source.regularMarkdown() }
|
||||||
override val asMarkdownV2Source: String by lazy { source.regularMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { source.regularMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { source.regularHtml() }
|
override val asHtmlSource: String by lazy { source.regularHtml() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun regular(text: String) = RegularTextSource(text)
|
||||||
|
@ -3,11 +3,21 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class StrikethroughTextSource(
|
/**
|
||||||
|
* @see strikethrough
|
||||||
|
*/
|
||||||
|
data class StrikethroughTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
override val asHtmlSource: String by lazy { strikethroughHTML() }
|
override val asHtmlSource: String by lazy { strikethroughHTML() }
|
||||||
override val asMarkdownV2Source: String by lazy { strikethroughMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { strikethroughMarkdownV2() }
|
||||||
override val asMarkdownSource: String by lazy { source.strikethroughMarkdown() }
|
override val asMarkdownSource: String by lazy { source.strikethroughMarkdown() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun strikethrough(parts: List<TextSource>) = StrikethroughTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun strikethrough(vararg parts: TextSource) = strikethrough(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun strikethrough(text: String) = strikethrough(regular(text))
|
@ -1,9 +1,12 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class TextLinkTextSource(
|
/**
|
||||||
|
* @see link
|
||||||
|
*/
|
||||||
|
data class TextLinkTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
val url: String
|
val url: String
|
||||||
) : TextSource {
|
) : TextSource {
|
||||||
@ -11,3 +14,6 @@ class TextLinkTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { source.linkMarkdownV2(url) }
|
override val asMarkdownV2Source: String by lazy { source.linkMarkdownV2(url) }
|
||||||
override val asHtmlSource: String by lazy { source.linkHTML(url) }
|
override val asHtmlSource: String by lazy { source.linkHTML(url) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun link(text: String, url: String) = TextLinkTextSource(text, url)
|
||||||
|
@ -4,7 +4,10 @@ import dev.inmo.tgbotapi.CommonAbstracts.*
|
|||||||
import dev.inmo.tgbotapi.types.User
|
import dev.inmo.tgbotapi.types.User
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class TextMentionTextSource(
|
/**
|
||||||
|
* @see mention
|
||||||
|
*/
|
||||||
|
data class TextMentionTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
val user: User,
|
val user: User,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
@ -13,3 +16,10 @@ class TextMentionTextSource(
|
|||||||
override val asMarkdownV2Source: String by lazy { textMentionMarkdownV2(user.id) }
|
override val asMarkdownV2Source: String by lazy { textMentionMarkdownV2(user.id) }
|
||||||
override val asHtmlSource: String by lazy { textMentionHTML(user.id) }
|
override val asHtmlSource: String by lazy { textMentionHTML(user.id) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun mention(parts: List<TextSource>, user: User) = TextMentionTextSource(parts.makeString(), user, parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun mention(user: User, vararg parts: TextSource) = mention(parts.toList(), user)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun mention(text: String, user: User) = mention(user, regular(text))
|
||||||
|
@ -1,12 +1,18 @@
|
|||||||
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class URLTextSource(
|
/**
|
||||||
|
* @see link
|
||||||
|
*/
|
||||||
|
data class URLTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String
|
override val source: String
|
||||||
) : TextSource {
|
) : TextSource {
|
||||||
override val asMarkdownSource: String by lazy { source.linkMarkdown(source) }
|
override val asMarkdownSource: String by lazy { source.linkMarkdown(source) }
|
||||||
override val asMarkdownV2Source: String by lazy { source.linkMarkdownV2(source) }
|
override val asMarkdownV2Source: String by lazy { source.linkMarkdownV2(source) }
|
||||||
override val asHtmlSource: String by lazy { source.linkHTML(source) }
|
override val asHtmlSource: String by lazy { source.linkHTML(source) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun link(url: String) = URLTextSource(url)
|
||||||
|
@ -3,11 +3,21 @@ package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
|||||||
import dev.inmo.tgbotapi.CommonAbstracts.*
|
import dev.inmo.tgbotapi.CommonAbstracts.*
|
||||||
import dev.inmo.tgbotapi.utils.*
|
import dev.inmo.tgbotapi.utils.*
|
||||||
|
|
||||||
class UnderlineTextSource(
|
/**
|
||||||
|
* @see underline
|
||||||
|
*/
|
||||||
|
data class UnderlineTextSource @RiskFeature(DirectInvocationOfTextSourceConstructor) constructor (
|
||||||
override val source: String,
|
override val source: String,
|
||||||
override val textSources: List<TextSource>
|
override val textSources: List<TextSource>
|
||||||
) : MultilevelTextSource {
|
) : MultilevelTextSource {
|
||||||
override val asMarkdownSource: String by lazy { source.underlineMarkdown() }
|
override val asMarkdownSource: String by lazy { source.underlineMarkdown() }
|
||||||
override val asMarkdownV2Source: String by lazy { underlineMarkdownV2() }
|
override val asMarkdownV2Source: String by lazy { underlineMarkdownV2() }
|
||||||
override val asHtmlSource: String by lazy { underlineHTML() }
|
override val asHtmlSource: String by lazy { underlineHTML() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun underline(parts: List<TextSource>) = UnderlineTextSource(parts.makeString(), parts)
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun underline(vararg parts: TextSource) = underline(parts.toList())
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun underline(text: String) = underline(regular(text))
|
@ -1,6 +1,6 @@
|
|||||||
package dev.inmo.tgbotapi.types.message.content
|
package dev.inmo.tgbotapi.types.message.content
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.FullTextSourcesList
|
import dev.inmo.tgbotapi.CommonAbstracts.TextSourcesList
|
||||||
import dev.inmo.tgbotapi.CommonAbstracts.TextPart
|
import dev.inmo.tgbotapi.CommonAbstracts.TextPart
|
||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
|
import dev.inmo.tgbotapi.requests.abstracts.Request
|
||||||
import dev.inmo.tgbotapi.requests.send.SendTextMessage
|
import dev.inmo.tgbotapi.requests.send.SendTextMessage
|
||||||
@ -81,4 +81,4 @@ data class TextContent(
|
|||||||
* Convert its [TextContent.entities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
* Convert its [TextContent.entities] to list of [dev.inmo.tgbotapi.CommonAbstracts.TextSource]
|
||||||
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
* with [dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource]
|
||||||
*/
|
*/
|
||||||
fun TextContent.fullEntitiesList(): FullTextSourcesList = text.fullListOfSubSource(entities).map { it.source }
|
fun TextContent.fullEntitiesList(): TextSourcesList = text.fullListOfSubSource(entities).map { it.source }
|
||||||
|
@ -7,7 +7,7 @@ import dev.inmo.tgbotapi.types.message.content.TextContent
|
|||||||
import dev.inmo.tgbotapi.types.message.content.fullEntitiesList
|
import dev.inmo.tgbotapi.types.message.content.fullEntitiesList
|
||||||
|
|
||||||
internal fun createFormattedText(
|
internal fun createFormattedText(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last,
|
partLength: Int = textLength.last,
|
||||||
mode: ParseMode = MarkdownParseMode
|
mode: ParseMode = MarkdownParseMode
|
||||||
): List<String> {
|
): List<String> {
|
||||||
@ -48,17 +48,17 @@ internal fun createFormattedText(
|
|||||||
|
|
||||||
|
|
||||||
internal fun createMarkdownText(
|
internal fun createMarkdownText(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last
|
partLength: Int = textLength.last
|
||||||
): List<String> = createFormattedText(entities, partLength, MarkdownParseMode)
|
): List<String> = createFormattedText(entities, partLength, MarkdownParseMode)
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toMarkdownTexts(): List<String> = createMarkdownText(
|
internal fun TextSourcesList.toMarkdownTexts(): List<String> = createMarkdownText(
|
||||||
this,
|
this,
|
||||||
textLength.last
|
textLength.last
|
||||||
)
|
)
|
||||||
internal fun TextContent.toMarkdownTexts(): List<String> = fullEntitiesList().toMarkdownTexts()
|
internal fun TextContent.toMarkdownTexts(): List<String> = fullEntitiesList().toMarkdownTexts()
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toMarkdownExplanations(): List<String> = createMarkdownText(
|
internal fun TextSourcesList.toMarkdownExplanations(): List<String> = createMarkdownText(
|
||||||
this,
|
this,
|
||||||
explanationLimit.last
|
explanationLimit.last
|
||||||
)
|
)
|
||||||
@ -66,23 +66,23 @@ internal fun ExplainedInput.toMarkdownExplanations(): List<String> = fullEntitie
|
|||||||
|
|
||||||
|
|
||||||
internal fun createMarkdownV2Text(
|
internal fun createMarkdownV2Text(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last
|
partLength: Int = textLength.last
|
||||||
): List<String> = createFormattedText(entities, partLength, MarkdownV2ParseMode)
|
): List<String> = createFormattedText(entities, partLength, MarkdownV2ParseMode)
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toMarkdownV2Captions(): List<String> = createMarkdownV2Text(
|
internal fun TextSourcesList.toMarkdownV2Captions(): List<String> = createMarkdownV2Text(
|
||||||
this,
|
this,
|
||||||
captionLength.last
|
captionLength.last
|
||||||
)
|
)
|
||||||
internal fun CaptionedInput.toMarkdownV2Captions(): List<String> = fullEntitiesList().toMarkdownV2Captions()
|
internal fun CaptionedInput.toMarkdownV2Captions(): List<String> = fullEntitiesList().toMarkdownV2Captions()
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toMarkdownV2Texts(): List<String> = createMarkdownV2Text(
|
internal fun TextSourcesList.toMarkdownV2Texts(): List<String> = createMarkdownV2Text(
|
||||||
this,
|
this,
|
||||||
textLength.last
|
textLength.last
|
||||||
)
|
)
|
||||||
internal fun TextContent.toMarkdownV2Texts(): List<String> = fullEntitiesList().toMarkdownV2Texts()
|
internal fun TextContent.toMarkdownV2Texts(): List<String> = fullEntitiesList().toMarkdownV2Texts()
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toMarkdownV2Explanations(): List<String> = createMarkdownV2Text(
|
internal fun TextSourcesList.toMarkdownV2Explanations(): List<String> = createMarkdownV2Text(
|
||||||
this,
|
this,
|
||||||
explanationLimit.last
|
explanationLimit.last
|
||||||
)
|
)
|
||||||
@ -90,17 +90,17 @@ internal fun ExplainedInput.toMarkdownV2Explanations(): List<String> = fullEntit
|
|||||||
|
|
||||||
|
|
||||||
internal fun createHtmlText(
|
internal fun createHtmlText(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last
|
partLength: Int = textLength.last
|
||||||
): List<String> = createFormattedText(entities, partLength, HTMLParseMode)
|
): List<String> = createFormattedText(entities, partLength, HTMLParseMode)
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toHtmlCaptions(): List<String> = createHtmlText(
|
internal fun TextSourcesList.toHtmlCaptions(): List<String> = createHtmlText(
|
||||||
this,
|
this,
|
||||||
captionLength.last
|
captionLength.last
|
||||||
)
|
)
|
||||||
internal fun CaptionedInput.toHtmlCaptions(): List<String> = fullEntitiesList().toHtmlCaptions()
|
internal fun CaptionedInput.toHtmlCaptions(): List<String> = fullEntitiesList().toHtmlCaptions()
|
||||||
|
|
||||||
internal fun FullTextSourcesList.toHtmlTexts(): List<String> = createHtmlText(
|
internal fun TextSourcesList.toHtmlTexts(): List<String> = createHtmlText(
|
||||||
this,
|
this,
|
||||||
textLength.last
|
textLength.last
|
||||||
)
|
)
|
||||||
|
@ -98,6 +98,16 @@ internal fun MultilevelTextSource.linkHTML(
|
|||||||
) = "<a href=\"${link.toHtml()}\">${textSources.joinSubSourcesHtml()}</a>"
|
) = "<a href=\"${link.toHtml()}\">${textSources.joinSubSourcesHtml()}</a>"
|
||||||
|
|
||||||
|
|
||||||
|
internal fun MultilevelTextSource.optionalPrefix(
|
||||||
|
mustStartsWith: String,
|
||||||
|
controlWord: String = mustStartsWith
|
||||||
|
) = if (source.startsWith(mustStartsWith)) {
|
||||||
|
""
|
||||||
|
} else {
|
||||||
|
controlWord
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
internal fun MultilevelTextSource.emailMarkdownV2(address: String): String = linkMarkdownV2("mailto://$address")
|
internal fun MultilevelTextSource.emailMarkdownV2(address: String): String = linkMarkdownV2("mailto://$address")
|
||||||
internal fun MultilevelTextSource.emailHTML(address: String): String = linkHTML("mailto://$address}")
|
internal fun MultilevelTextSource.emailHTML(address: String): String = linkHTML("mailto://$address}")
|
||||||
|
|
||||||
@ -125,18 +135,21 @@ internal fun MultilevelTextSource.underlineHTML(): String = htmlDefault(htmlUnde
|
|||||||
internal fun MultilevelTextSource.textMentionMarkdownV2(userId: UserId): String = linkMarkdownV2(userId.link)
|
internal fun MultilevelTextSource.textMentionMarkdownV2(userId: UserId): String = linkMarkdownV2(userId.link)
|
||||||
internal fun MultilevelTextSource.textMentionHTML(userId: UserId): String = linkHTML(userId.link)
|
internal fun MultilevelTextSource.textMentionHTML(userId: UserId): String = linkHTML(userId.link)
|
||||||
|
|
||||||
internal fun MultilevelTextSource.mentionMarkdownV2(): String = "@${textSources.joinSubSourcesMarkdownV2()}"
|
internal fun MultilevelTextSource.mentionMarkdownV2(): String = optionalPrefix("@") + textSources.joinSubSourcesMarkdownV2()
|
||||||
internal fun MultilevelTextSource.mentionHTML(): String = "@${textSources.joinSubSourcesHtml()}"
|
internal fun MultilevelTextSource.mentionHTML(): String = optionalPrefix("@") + textSources.joinSubSourcesHtml()
|
||||||
|
|
||||||
|
|
||||||
internal fun MultilevelTextSource.hashTagMarkdownV2(): String = "\\#${textSources.joinSubSourcesMarkdownV2()}"
|
internal fun MultilevelTextSource.hashTagMarkdownV2(): String = when {
|
||||||
internal fun MultilevelTextSource.hashTagHTML(): String = "#${textSources.joinSubSourcesHtml()}"
|
source.startsWith("\\#") || source.startsWith("#") -> ""
|
||||||
|
else -> "\\#"
|
||||||
|
} + textSources.joinSubSourcesMarkdownV2()
|
||||||
|
internal fun MultilevelTextSource.hashTagHTML(): String = optionalPrefix("#") + textSources.joinSubSourcesHtml()
|
||||||
|
|
||||||
|
|
||||||
internal fun MultilevelTextSource.phoneMarkdownV2(): String = textSources.joinSubSourcesMarkdownV2()
|
internal fun MultilevelTextSource.phoneMarkdownV2(): String = textSources.joinSubSourcesMarkdownV2()
|
||||||
internal fun MultilevelTextSource.phoneHTML(): String = textSources.joinSubSourcesHtml()
|
internal fun MultilevelTextSource.phoneHTML(): String = textSources.joinSubSourcesHtml()
|
||||||
|
|
||||||
|
|
||||||
internal fun MultilevelTextSource.commandMarkdownV2(): String = "/${textSources.joinSubSourcesMarkdownV2()}"
|
internal fun MultilevelTextSource.commandMarkdownV2(): String = optionalPrefix("/") + textSources.joinSubSourcesMarkdownV2()
|
||||||
internal fun MultilevelTextSource.commandHTML(): String = "/${textSources.joinSubSourcesHtml()}"
|
internal fun MultilevelTextSource.commandHTML(): String = optionalPrefix("/") + textSources.joinSubSourcesHtml()
|
||||||
|
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
package dev.inmo.tgbotapi.types.MessageEntity
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.CommonAbstracts.TextPart
|
||||||
|
import dev.inmo.tgbotapi.types.MessageEntity.textsources.*
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
const val testText = "It is simple hello world with #tag and @mention"
|
||||||
|
const val formattedV2Text = "It *_is_ ~__simple__~* hello world with \\#tag and @mention"
|
||||||
|
const val formattedHtmlText = "It <b><i>is</i> <s><u>simple</u></s></b> hello world with #tag and @mention"
|
||||||
|
internal val testTextEntities = listOf(
|
||||||
|
RawMessageEntity(
|
||||||
|
"bold",
|
||||||
|
3,
|
||||||
|
9
|
||||||
|
),
|
||||||
|
RawMessageEntity(
|
||||||
|
"italic",
|
||||||
|
3,
|
||||||
|
2
|
||||||
|
),
|
||||||
|
RawMessageEntity(
|
||||||
|
"strikethrough",
|
||||||
|
6,
|
||||||
|
6
|
||||||
|
),
|
||||||
|
RawMessageEntity(
|
||||||
|
"underline",
|
||||||
|
6,
|
||||||
|
6
|
||||||
|
),
|
||||||
|
RawMessageEntity(
|
||||||
|
"hashtag",
|
||||||
|
30,
|
||||||
|
4
|
||||||
|
),
|
||||||
|
RawMessageEntity(
|
||||||
|
"mention",
|
||||||
|
39,
|
||||||
|
6
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
fun List<TextPart>.testTextParts() {
|
||||||
|
assertTrue (first().source is RegularTextSource)
|
||||||
|
assertTrue (get(1).source is BoldTextSource)
|
||||||
|
assertTrue (get(2).source is RegularTextSource)
|
||||||
|
assertTrue (get(3).source is HashTagTextSource)
|
||||||
|
assertTrue (get(4).source is RegularTextSource)
|
||||||
|
assertTrue (get(5).source is MentionTextSource)
|
||||||
|
|
||||||
|
val boldSource = get(1).source as BoldTextSource
|
||||||
|
assertTrue (boldSource.textSources.first() is ItalicTextSource)
|
||||||
|
assertTrue (boldSource.textSources[1] is RegularTextSource)
|
||||||
|
assertTrue (boldSource.textSources[2] is StrikethroughTextSource)
|
||||||
|
assertTrue ((boldSource.textSources[2] as StrikethroughTextSource).textSources.first() is UnderlineTextSource)
|
||||||
|
}
|
@ -1,5 +1,9 @@
|
|||||||
package dev.inmo.tgbotapi.utils
|
package dev.inmo.tgbotapi.types.MessageEntity
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.CommonAbstracts.TextSource
|
||||||
|
import dev.inmo.tgbotapi.types.MessageEntity.textsources.*
|
||||||
|
import dev.inmo.tgbotapi.CommonAbstracts.plus
|
||||||
|
import dev.inmo.tgbotapi.utils.*
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
@ -33,4 +37,20 @@ class StringFormattingTests {
|
|||||||
originalHelloWorld.preMarkdown()
|
originalHelloWorld.preMarkdown()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testThatCreatingOfStringWithSimpleDSLWorksCorrectly() {
|
||||||
|
val sources: List<TextSource> = regular("It ") +
|
||||||
|
bold(italic("is") +
|
||||||
|
" " +
|
||||||
|
strikethrough(underline("simple"))) +
|
||||||
|
" hello world with " +
|
||||||
|
hashtag("tag") +
|
||||||
|
" and " +
|
||||||
|
mention("mention")
|
||||||
|
sources.toTextParts().testTextParts()
|
||||||
|
|
||||||
|
assertEquals(formattedV2Text, sources.toMarkdownV2Texts().first())
|
||||||
|
assertEquals(formattedHtmlText, sources.toHtmlTexts().first())
|
||||||
|
}
|
||||||
}
|
}
|
@ -8,42 +8,8 @@ import kotlin.test.*
|
|||||||
class TextPartsCreatingTests {
|
class TextPartsCreatingTests {
|
||||||
@Test
|
@Test
|
||||||
fun testThatTextWithMultilevelPartsCorrectlyCreating() {
|
fun testThatTextWithMultilevelPartsCorrectlyCreating() {
|
||||||
val text = "It is simple hello world"
|
val textParts = testTextEntities.asTextParts(testText)
|
||||||
val formattedV2Text = "It *_is_ ~__simple__~* hello world"
|
textParts.testTextParts()
|
||||||
val entities = listOf(
|
|
||||||
RawMessageEntity(
|
|
||||||
"bold",
|
|
||||||
3,
|
|
||||||
9
|
|
||||||
),
|
|
||||||
RawMessageEntity(
|
|
||||||
"italic",
|
|
||||||
3,
|
|
||||||
2
|
|
||||||
),
|
|
||||||
RawMessageEntity(
|
|
||||||
"strikethrough",
|
|
||||||
6,
|
|
||||||
6
|
|
||||||
),
|
|
||||||
RawMessageEntity(
|
|
||||||
"underline",
|
|
||||||
6,
|
|
||||||
6
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val textParts = entities.asTextParts(text)
|
|
||||||
|
|
||||||
assertTrue (textParts.first().source is RegularTextSource)
|
|
||||||
assertTrue (textParts[1].source is BoldTextSource)
|
|
||||||
assertTrue (textParts[2].source is RegularTextSource)
|
|
||||||
|
|
||||||
val boldSource = textParts[1].source as BoldTextSource
|
|
||||||
assertTrue (boldSource.textSources.first() is ItalicTextSource)
|
|
||||||
assertTrue (boldSource.textSources[1] is RegularTextSource)
|
|
||||||
assertTrue (boldSource.textSources[2] is StrikethroughTextSource)
|
|
||||||
assertTrue ((boldSource.textSources[2] as StrikethroughTextSource).textSources.first() is UnderlineTextSource)
|
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
formattedV2Text,
|
formattedV2Text,
|
||||||
@ -53,42 +19,8 @@ class TextPartsCreatingTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testThatTextWithMultilevelPartsCorrectlyCreatingInHtml() {
|
fun testThatTextWithMultilevelPartsCorrectlyCreatingInHtml() {
|
||||||
val text = "It is simple hello world"
|
val textParts = testTextEntities.asTextParts(testText)
|
||||||
val formattedHtmlText = "It <b><i>is</i> <s><u>simple</u></s></b> hello world"
|
textParts.testTextParts()
|
||||||
val entities = listOf(
|
|
||||||
RawMessageEntity(
|
|
||||||
"bold",
|
|
||||||
3,
|
|
||||||
9
|
|
||||||
),
|
|
||||||
RawMessageEntity(
|
|
||||||
"italic",
|
|
||||||
3,
|
|
||||||
2
|
|
||||||
),
|
|
||||||
RawMessageEntity(
|
|
||||||
"strikethrough",
|
|
||||||
6,
|
|
||||||
6
|
|
||||||
),
|
|
||||||
RawMessageEntity(
|
|
||||||
"underline",
|
|
||||||
6,
|
|
||||||
6
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val textParts = entities.asTextParts(text)
|
|
||||||
|
|
||||||
assertTrue (textParts.first().source is RegularTextSource)
|
|
||||||
assertTrue (textParts[1].source is BoldTextSource)
|
|
||||||
assertTrue (textParts[2].source is RegularTextSource)
|
|
||||||
|
|
||||||
val boldSource = textParts[1].source as BoldTextSource
|
|
||||||
assertTrue (boldSource.textSources.first() is ItalicTextSource)
|
|
||||||
assertTrue (boldSource.textSources[1] is RegularTextSource)
|
|
||||||
assertTrue (boldSource.textSources[2] is StrikethroughTextSource)
|
|
||||||
assertTrue ((boldSource.textSources[2] as StrikethroughTextSource).textSources.first() is UnderlineTextSource)
|
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
formattedHtmlText,
|
formattedHtmlText,
|
||||||
|
@ -8,12 +8,22 @@ import io.ktor.client.HttpClient
|
|||||||
import io.ktor.client.HttpClientConfig
|
import io.ktor.client.HttpClientConfig
|
||||||
import io.ktor.client.engine.*
|
import io.ktor.client.engine.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows to create bot using bot [urlsKeeper]
|
||||||
|
*/
|
||||||
|
fun telegramBot(
|
||||||
|
urlsKeeper: TelegramAPIUrlsKeeper
|
||||||
|
): TelegramBot = KtorRequestsExecutor(
|
||||||
|
urlsKeeper,
|
||||||
|
HttpClient()
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows to create bot using bot [urlsKeeper] and already prepared [client]
|
* Allows to create bot using bot [urlsKeeper] and already prepared [client]
|
||||||
*/
|
*/
|
||||||
fun telegramBot(
|
fun telegramBot(
|
||||||
urlsKeeper: TelegramAPIUrlsKeeper,
|
urlsKeeper: TelegramAPIUrlsKeeper,
|
||||||
client: HttpClient = HttpClient()
|
client: HttpClient
|
||||||
): TelegramBot = KtorRequestsExecutor(
|
): TelegramBot = KtorRequestsExecutor(
|
||||||
urlsKeeper,
|
urlsKeeper,
|
||||||
client
|
client
|
||||||
@ -60,6 +70,15 @@ inline fun telegramBot(
|
|||||||
HttpClient(clientConfig)
|
HttpClient(clientConfig)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows to create bot using bot [token], [apiUrl] (for custom api servers) and already prepared [client]
|
||||||
|
*/
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun telegramBot(
|
||||||
|
token: String,
|
||||||
|
apiUrl: String = telegramBotAPIDefaultUrl
|
||||||
|
): TelegramBot = telegramBot(TelegramAPIUrlsKeeper(token, apiUrl))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows to create bot using bot [token], [apiUrl] (for custom api servers) and already prepared [client]
|
* Allows to create bot using bot [token], [apiUrl] (for custom api servers) and already prepared [client]
|
||||||
*/
|
*/
|
||||||
@ -67,7 +86,7 @@ inline fun telegramBot(
|
|||||||
inline fun telegramBot(
|
inline fun telegramBot(
|
||||||
token: String,
|
token: String,
|
||||||
apiUrl: String = telegramBotAPIDefaultUrl,
|
apiUrl: String = telegramBotAPIDefaultUrl,
|
||||||
client: HttpClient = HttpClient()
|
client: HttpClient
|
||||||
): TelegramBot = telegramBot(TelegramAPIUrlsKeeper(token, apiUrl), client)
|
): TelegramBot = telegramBot(TelegramAPIUrlsKeeper(token, apiUrl), client)
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
@ -106,7 +125,7 @@ inline fun telegramBot(
|
|||||||
inline fun telegramBot(
|
inline fun telegramBot(
|
||||||
token: String,
|
token: String,
|
||||||
apiUrl: String = telegramBotAPIDefaultUrl,
|
apiUrl: String = telegramBotAPIDefaultUrl,
|
||||||
noinline clientConfig: HttpClientConfig<*>.() -> Unit = {}
|
noinline clientConfig: HttpClientConfig<*>.() -> Unit
|
||||||
) = telegramBot(
|
) = telegramBot(
|
||||||
TelegramAPIUrlsKeeper(token, apiUrl),
|
TelegramAPIUrlsKeeper(token, apiUrl),
|
||||||
clientConfig
|
clientConfig
|
||||||
|
@ -7,7 +7,7 @@ import dev.inmo.tgbotapi.types.message.content.TextContent
|
|||||||
import dev.inmo.tgbotapi.types.message.content.fullEntitiesList
|
import dev.inmo.tgbotapi.types.message.content.fullEntitiesList
|
||||||
|
|
||||||
fun createFormattedText(
|
fun createFormattedText(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last,
|
partLength: Int = textLength.last,
|
||||||
mode: ParseMode = MarkdownParseMode
|
mode: ParseMode = MarkdownParseMode
|
||||||
): List<String> {
|
): List<String> {
|
||||||
@ -48,23 +48,23 @@ fun createFormattedText(
|
|||||||
|
|
||||||
|
|
||||||
fun createMarkdownText(
|
fun createMarkdownText(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last
|
partLength: Int = textLength.last
|
||||||
): List<String> = createFormattedText(entities, partLength, MarkdownParseMode)
|
): List<String> = createFormattedText(entities, partLength, MarkdownParseMode)
|
||||||
|
|
||||||
fun FullTextSourcesList.toMarkdownCaptions(): List<String> = createMarkdownText(
|
fun TextSourcesList.toMarkdownCaptions(): List<String> = createMarkdownText(
|
||||||
this,
|
this,
|
||||||
captionLength.last
|
captionLength.last
|
||||||
)
|
)
|
||||||
fun CaptionedInput.toMarkdownCaptions(): List<String> = fullEntitiesList().toMarkdownCaptions()
|
fun CaptionedInput.toMarkdownCaptions(): List<String> = fullEntitiesList().toMarkdownCaptions()
|
||||||
|
|
||||||
fun FullTextSourcesList.toMarkdownTexts(): List<String> = createMarkdownText(
|
fun TextSourcesList.toMarkdownTexts(): List<String> = createMarkdownText(
|
||||||
this,
|
this,
|
||||||
textLength.last
|
textLength.last
|
||||||
)
|
)
|
||||||
fun TextContent.toMarkdownTexts(): List<String> = fullEntitiesList().toMarkdownTexts()
|
fun TextContent.toMarkdownTexts(): List<String> = fullEntitiesList().toMarkdownTexts()
|
||||||
|
|
||||||
fun FullTextSourcesList.toMarkdownExplanations(): List<String> = createMarkdownText(
|
fun TextSourcesList.toMarkdownExplanations(): List<String> = createMarkdownText(
|
||||||
this,
|
this,
|
||||||
explanationLimit.last
|
explanationLimit.last
|
||||||
)
|
)
|
||||||
@ -72,23 +72,23 @@ fun ExplainedInput.toMarkdownExplanations(): List<String> = fullEntitiesList().t
|
|||||||
|
|
||||||
|
|
||||||
fun createMarkdownV2Text(
|
fun createMarkdownV2Text(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last
|
partLength: Int = textLength.last
|
||||||
): List<String> = createFormattedText(entities, partLength, MarkdownV2ParseMode)
|
): List<String> = createFormattedText(entities, partLength, MarkdownV2ParseMode)
|
||||||
|
|
||||||
fun FullTextSourcesList.toMarkdownV2Captions(): List<String> = createMarkdownV2Text(
|
fun TextSourcesList.toMarkdownV2Captions(): List<String> = createMarkdownV2Text(
|
||||||
this,
|
this,
|
||||||
captionLength.last
|
captionLength.last
|
||||||
)
|
)
|
||||||
fun CaptionedInput.toMarkdownV2Captions(): List<String> = fullEntitiesList().toMarkdownV2Captions()
|
fun CaptionedInput.toMarkdownV2Captions(): List<String> = fullEntitiesList().toMarkdownV2Captions()
|
||||||
|
|
||||||
fun FullTextSourcesList.toMarkdownV2Texts(): List<String> = createMarkdownV2Text(
|
fun TextSourcesList.toMarkdownV2Texts(): List<String> = createMarkdownV2Text(
|
||||||
this,
|
this,
|
||||||
textLength.last
|
textLength.last
|
||||||
)
|
)
|
||||||
fun TextContent.toMarkdownV2Texts(): List<String> = fullEntitiesList().toMarkdownV2Texts()
|
fun TextContent.toMarkdownV2Texts(): List<String> = fullEntitiesList().toMarkdownV2Texts()
|
||||||
|
|
||||||
fun FullTextSourcesList.toMarkdownV2Explanations(): List<String> = createMarkdownV2Text(
|
fun TextSourcesList.toMarkdownV2Explanations(): List<String> = createMarkdownV2Text(
|
||||||
this,
|
this,
|
||||||
explanationLimit.last
|
explanationLimit.last
|
||||||
)
|
)
|
||||||
@ -96,23 +96,23 @@ fun ExplainedInput.toMarkdownV2Explanations(): List<String> = fullEntitiesList()
|
|||||||
|
|
||||||
|
|
||||||
fun createHtmlText(
|
fun createHtmlText(
|
||||||
entities: FullTextSourcesList,
|
entities: TextSourcesList,
|
||||||
partLength: Int = textLength.last
|
partLength: Int = textLength.last
|
||||||
): List<String> = createFormattedText(entities, partLength, HTMLParseMode)
|
): List<String> = createFormattedText(entities, partLength, HTMLParseMode)
|
||||||
|
|
||||||
fun FullTextSourcesList.toHtmlCaptions(): List<String> = createHtmlText(
|
fun TextSourcesList.toHtmlCaptions(): List<String> = createHtmlText(
|
||||||
this,
|
this,
|
||||||
captionLength.last
|
captionLength.last
|
||||||
)
|
)
|
||||||
fun CaptionedInput.toHtmlCaptions(): List<String> = fullEntitiesList().toHtmlCaptions()
|
fun CaptionedInput.toHtmlCaptions(): List<String> = fullEntitiesList().toHtmlCaptions()
|
||||||
|
|
||||||
fun FullTextSourcesList.toHtmlTexts(): List<String> = createHtmlText(
|
fun TextSourcesList.toHtmlTexts(): List<String> = createHtmlText(
|
||||||
this,
|
this,
|
||||||
textLength.last
|
textLength.last
|
||||||
)
|
)
|
||||||
fun TextContent.toHtmlTexts(): List<String> = fullEntitiesList().toHtmlTexts()
|
fun TextContent.toHtmlTexts(): List<String> = fullEntitiesList().toHtmlTexts()
|
||||||
|
|
||||||
fun FullTextSourcesList.toHtmlExplanations(): List<String> = createHtmlText(
|
fun TextSourcesList.toHtmlExplanations(): List<String> = createHtmlText(
|
||||||
this,
|
this,
|
||||||
explanationLimit.last
|
explanationLimit.last
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user