(new): v1.2 release
Golang lint / lint (push) Successful in 11m32s

This commit is contained in:
2026-08-19 14:58:25 +03:00
parent f03a081ed6
commit 29b208eeec
79 changed files with 7301 additions and 2060 deletions
+42 -5
View File
@@ -41,7 +41,7 @@ func (s MarkdownV2) Mention(userID uint64) MarkdownV2 {
// Emoji returns s as a Telegram MarkdownV2 custom emoji.
func (s MarkdownV2) Emoji(emojiID string) MarkdownV2 {
return "[" + s + "](tg://emoji?id=" + escapeMarkdownV2LinkDestination(emojiID) + ")"
return "![" + s + "](tg://emoji?id=" + escapeMarkdownV2LinkDestination(emojiID) + ")"
}
// Time returns s as a Telegram MarkdownV2 localized timestamp.
@@ -56,14 +56,19 @@ func (s MarkdownV2) TimeFormat(unix uint64, format string) MarkdownV2 {
}
// InlineCode returns s wrapped as inline code Telegram MarkdownV2 text.
func (s MarkdownV2) InlineCode() MarkdownV2 { return "`" + s + "`" }
func (s MarkdownV2) InlineCode() MarkdownV2 {
return "`" + escapeMarkdownV2Code(unescapeMarkdownV2Fragment(s)) + "`"
}
// BlockCode returns s wrapped as a Telegram MarkdownV2 code block.
func (s MarkdownV2) BlockCode() MarkdownV2 { return "```\n" + s + "\n```" }
func (s MarkdownV2) BlockCode() MarkdownV2 {
return "```\n" + escapeMarkdownV2Code(unescapeMarkdownV2Fragment(s)) + "\n```"
}
// BlockCodeLanguage returns s wrapped as a Telegram MarkdownV2 code block with language.
func (s MarkdownV2) BlockCodeLanguage(lang string) MarkdownV2 {
return "```" + MarkdownV2(lang) + "\n" + s + "\n```"
return "```" + MarkdownV2(sanitizeMarkdownV2CodeLanguage(lang)) + "\n" +
escapeMarkdownV2Code(unescapeMarkdownV2Fragment(s)) + "\n```"
}
// Quote returns s as a Telegram MarkdownV2 blockquote.
@@ -72,7 +77,39 @@ func (s MarkdownV2) Quote() MarkdownV2 {
}
// QuoteExpandable returns s as a Telegram MarkdownV2 expandable blockquote.
func (s MarkdownV2) QuoteExpandable() MarkdownV2 { return "**>" + s }
func (s MarkdownV2) QuoteExpandable() MarkdownV2 {
return MarkdownV2("**>" + strings.ReplaceAll(string(s), "\n", "\n>") + "||")
}
func unescapeMarkdownV2Fragment(s MarkdownV2) string {
fragment := string(s)
var result strings.Builder
result.Grow(len(fragment))
for i := 0; i < len(fragment); i++ {
if fragment[i] == '\\' && i+1 < len(fragment) && fragment[i+1] >= 1 && fragment[i+1] <= 126 {
i++
}
result.WriteByte(fragment[i])
}
return result.String()
}
func escapeMarkdownV2Code(s string) MarkdownV2 {
s = strings.ReplaceAll(s, "\\", "\\\\")
s = strings.ReplaceAll(s, "`", "\\`")
return MarkdownV2(s)
}
func sanitizeMarkdownV2CodeLanguage(lang string) string {
return strings.Map(func(r rune) rune {
switch r {
case '`', '\\', '\r', '\n':
return -1
default:
return r
}
}, lang)
}
func escapeMarkdownV2LinkDestination(s string) MarkdownV2 {
s = strings.ReplaceAll(s, "\\", "\\\\")
+4 -2
View File
@@ -35,7 +35,9 @@ func TestMarkdownV2FormattingMethods(t *testing.T) {
{name: "block code", got: EscapeMarkdownV2("text").BlockCode(), want: "```\ntext\n```"},
{name: "block code language", got: EscapeMarkdownV2("text").BlockCodeLanguage("go"), want: "```go\ntext\n```"},
{name: "quote", got: EscapeMarkdownV2("a\nb").Quote(), want: ">a\n>b"},
{name: "expandable quote", got: EscapeMarkdownV2("text").QuoteExpandable(), want: "**>text"},
{name: "expandable quote", got: EscapeMarkdownV2("a\nb").QuoteExpandable(), want: "**>a\n>b||"},
{name: "inline code escaping", got: EscapeMarkdownV2("a-b`c\\d").InlineCode(), want: "`a-b\\`c\\\\d`"},
{name: "block code language sanitizing", got: EscapeMarkdownV2("text").BlockCodeLanguage("go`\nboom"), want: "```goboom\ntext\n```"},
}
for _, tt := range tests {
@@ -63,7 +65,7 @@ func TestMarkdownV2SpecialLinks(t *testing.T) {
want MarkdownV2
}{
{name: "mention", got: EscapeMarkdownV2("User").Mention(123), want: "[User](tg://user?id=123)"},
{name: "emoji", got: EscapeMarkdownV2("emoji").Emoji(`12)3`), want: `[emoji](tg://emoji?id=12\)3)`},
{name: "emoji", got: EscapeMarkdownV2("👍").Emoji(`12)3`), want: `![👍](tg://emoji?id=12\)3)`},
{name: "time", got: EscapeMarkdownV2("date").Time(1772323200), want: "![date](tg://time?unix=1772323200)"},
{name: "time format", got: EscapeMarkdownV2("date").TimeFormat(1772323200, `MMM ) yyyy`), want: `![date](tg://time?unix=1772323200&format=MMM \) yyyy)`},
}