diff --git a/CHANGELOG.md b/CHANGELOG.md index d8fcda1579..4b27f49068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,8 @@ media for present out) * `MessageContent` which using captions or text now have default parse mode `HTMLParseMode` due to issue with escaping of `]` in links titles * Added `Markdown` and `HTML` type aliases which actually means `MarkdownParseMode` and `HTMLParseMode` +* `ChatId` now have extension `link` which will automatically create link like `tg://user?id=` +* Created a few of methods for all supported formats of text like bold, italic, links and others ## 0.11.0 diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt index 959cc61e02..dfaa6eb2c2 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt @@ -13,6 +13,10 @@ data class ChatId( val chatId: Identifier ) : ChatIdentifier() + +val ChatId.link: String + get() = "tg://user?id=$chatId" + typealias UserId = ChatId fun Identifier.toChatId(): ChatId = ChatId(this) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt new file mode 100644 index 0000000000..8809af3459 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt @@ -0,0 +1,133 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toHtml +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown + +const val markdownBoldControl = "*" +const val markdownItalicControl = "_" +const val markdownCodeControl = "`" +const val markdownPreControl = "```" + +const val htmlBoldControl = "b" +const val htmlItalicControl = "i" +const val htmlCodeControl = "code" +const val htmlPreControl = "pre" + +private infix fun String.markdownDefault(controlSymbol: String) = "$controlSymbol$this$controlSymbol" +private infix fun String.htmlDefault(controlSymbol: String) = "<$controlSymbol>$this" + +infix fun String.linkMarkdown(link: String): String = "[$this]($link)" +infix fun String.linkHTML(link: String): String = "$this" + + +fun String.boldMarkdown(): String = markdownDefault(markdownBoldControl) +fun String.boldHTML(): String = htmlDefault(htmlBoldControl) + + +fun String.italicMarkdown(): String = markdownDefault(markdownItalicControl) +fun String.italicHTML(): String =htmlDefault(htmlItalicControl) + + +fun String.codeMarkdown(): String = markdownDefault(markdownCodeControl) +fun String.codeHTML(): String = htmlDefault(htmlCodeControl) + + +fun String.preMarkdown(): String = markdownDefault(markdownPreControl) +fun String.preHTML(): String = htmlDefault(htmlPreControl) + + +fun String.emailMarkdown(): String = linkMarkdown("mailto://$this") +fun String.emailHTML(): String = linkHTML("mailto://$this") + + +private inline infix fun String.mention(adapt: String.() -> String): String = if (startsWith("@")) { + this +} else { + "@${adapt()}" +} + + +private inline infix fun String.hashTag(adapt: String.() -> String): String = if (startsWith("#")) { + this +} else { + "#${adapt()}" +} + + +infix fun String.mentionMarkdown(userId: UserId): String = linkMarkdown(userId.link) +infix fun String.mentionHTML(userId: UserId): String = linkHTML(userId.link) + + +fun String.mentionMarkdown(): String = mention(String::toMarkdown) +fun String.mentionHTML(): String = mention(String::toHtml) + + +fun String.hashTagMarkdown(): String = hashTag(String::toMarkdown) +fun String.hashTagHTML(): String = hashTag(String::toHtml) + + +fun String.phoneMarkdown(): String = toMarkdown() +fun String.phoneHTML(): String = toHtml() + + +fun String.command(): String = if (startsWith("/")) { + this +} else { + "/$this" +} + + +infix fun String.bold(parseMode: ParseMode): String = when (parseMode) { + is HTML -> boldHTML() + is Markdown -> boldMarkdown() +} + + +infix fun String.italic(parseMode: ParseMode): String = when (parseMode) { + is HTML -> italicHTML() + is Markdown -> italicMarkdown() +} + +infix fun String.hashTag(parseMode: ParseMode): String = when (parseMode) { + is HTML -> hashTagHTML() + is Markdown -> hashTagMarkdown() +} + +infix fun String.code(parseMode: ParseMode): String = when (parseMode) { + is HTML -> codeHTML() + is Markdown -> codeMarkdown() +} + +infix fun String.pre(parseMode: ParseMode): String = when (parseMode) { + is HTML -> preHTML() + is Markdown -> preMarkdown() +} + +infix fun String.email(parseMode: ParseMode): String = when (parseMode) { + is HTML -> emailHTML() + is Markdown -> emailMarkdown() +} + +infix fun Pair.link(parseMode: ParseMode): String = when (parseMode) { + is HTML -> first.linkHTML(second) + is Markdown -> first.linkMarkdown(second) +} + +infix fun String.mention(parseMode: ParseMode): String = when (parseMode) { + is HTML -> mentionHTML() + is Markdown -> mentionMarkdown() +} + +infix fun Pair.mention(parseMode: ParseMode): String = when (parseMode) { + is HTML -> first.mentionHTML(second) + is Markdown -> first.mentionMarkdown(second) +} + +infix fun String.phone(parseMode: ParseMode): String = when (parseMode) { + is HTML -> phoneHTML() + is Markdown -> phoneMarkdown() +} + +infix fun String.command(parseMode: ParseMode): String = command()