perf: pre-compile regexes at package level

This commit is contained in:
Yasuhiro Matsumoto 2026-02-23 23:18:29 +09:00
parent 0961f71b9c
commit 3bad51d9a7
No known key found for this signature in database
GPG key ID: F2EA90DF2C146D1E

View file

@ -23,6 +23,19 @@ import (
"github.com/sipeed/picoclaw/pkg/voice" "github.com/sipeed/picoclaw/pkg/voice"
) )
var (
reHeading = regexp.MustCompile(`^#{1,6}\s+(.+)$`)
reBlockquote = regexp.MustCompile(`^>\s*(.*)$`)
reLink = regexp.MustCompile(`\[([^\]]+)\]\(([^)]+)\)`)
reBoldStar = regexp.MustCompile(`\*\*(.+?)\*\*`)
reBoldUnder = regexp.MustCompile(`__(.+?)__`)
reItalic = regexp.MustCompile(`_([^_]+)_`)
reStrike = regexp.MustCompile(`~~(.+?)~~`)
reListItem = regexp.MustCompile(`^[-*]\s+`)
reCodeBlock = regexp.MustCompile("```[\\w]*\\n?([\\s\\S]*?)```")
reInlineCode = regexp.MustCompile("`([^`]+)`")
)
type TelegramChannel struct { type TelegramChannel struct {
*BaseChannel *BaseChannel
bot *telego.Bot bot *telego.Bot
@ -431,19 +444,18 @@ func markdownToTelegramHTML(text string) string {
inlineCodes := extractInlineCodes(text) inlineCodes := extractInlineCodes(text)
text = inlineCodes.text text = inlineCodes.text
text = regexp.MustCompile(`^#{1,6}\s+(.+)$`).ReplaceAllString(text, "$1") text = reHeading.ReplaceAllString(text, "$1")
text = regexp.MustCompile(`^>\s*(.*)$`).ReplaceAllString(text, "$1") text = reBlockquote.ReplaceAllString(text, "$1")
text = escapeHTML(text) text = escapeHTML(text)
text = regexp.MustCompile(`\[([^\]]+)\]\(([^)]+)\)`).ReplaceAllString(text, `<a href="$2">$1</a>`) text = reLink.ReplaceAllString(text, `<a href="$2">$1</a>`)
text = regexp.MustCompile(`\*\*(.+?)\*\*`).ReplaceAllString(text, "<b>$1</b>") text = reBoldStar.ReplaceAllString(text, "<b>$1</b>")
text = regexp.MustCompile(`__(.+?)__`).ReplaceAllString(text, "<b>$1</b>") text = reBoldUnder.ReplaceAllString(text, "<b>$1</b>")
reItalic := regexp.MustCompile(`_([^_]+)_`)
text = reItalic.ReplaceAllStringFunc(text, func(s string) string { text = reItalic.ReplaceAllStringFunc(text, func(s string) string {
match := reItalic.FindStringSubmatch(s) match := reItalic.FindStringSubmatch(s)
if len(match) < 2 { if len(match) < 2 {
@ -452,9 +464,9 @@ func markdownToTelegramHTML(text string) string {
return "<i>" + match[1] + "</i>" return "<i>" + match[1] + "</i>"
}) })
text = regexp.MustCompile(`~~(.+?)~~`).ReplaceAllString(text, "<s>$1</s>") text = reStrike.ReplaceAllString(text, "<s>$1</s>")
text = regexp.MustCompile(`^[-*]\s+`).ReplaceAllString(text, "• ") text = reListItem.ReplaceAllString(text, "• ")
for i, code := range inlineCodes.codes { for i, code := range inlineCodes.codes {
escaped := escapeHTML(code) escaped := escapeHTML(code)
@ -479,8 +491,7 @@ type codeBlockMatch struct {
} }
func extractCodeBlocks(text string) codeBlockMatch { func extractCodeBlocks(text string) codeBlockMatch {
re := regexp.MustCompile("```[\\w]*\\n?([\\s\\S]*?)```") matches := reCodeBlock.FindAllStringSubmatch(text, -1)
matches := re.FindAllStringSubmatch(text, -1)
codes := make([]string, 0, len(matches)) codes := make([]string, 0, len(matches))
for _, match := range matches { for _, match := range matches {
@ -488,7 +499,7 @@ func extractCodeBlocks(text string) codeBlockMatch {
} }
i := 0 i := 0
text = re.ReplaceAllStringFunc(text, func(m string) string { text = reCodeBlock.ReplaceAllStringFunc(text, func(m string) string {
placeholder := fmt.Sprintf("\x00CB%d\x00", i) placeholder := fmt.Sprintf("\x00CB%d\x00", i)
i++ i++
return placeholder return placeholder
@ -503,8 +514,7 @@ type inlineCodeMatch struct {
} }
func extractInlineCodes(text string) inlineCodeMatch { func extractInlineCodes(text string) inlineCodeMatch {
re := regexp.MustCompile("`([^`]+)`") matches := reInlineCode.FindAllStringSubmatch(text, -1)
matches := re.FindAllStringSubmatch(text, -1)
codes := make([]string, 0, len(matches)) codes := make([]string, 0, len(matches))
for _, match := range matches { for _, match := range matches {
@ -512,7 +522,7 @@ func extractInlineCodes(text string) inlineCodeMatch {
} }
i := 0 i := 0
text = re.ReplaceAllStringFunc(text, func(m string) string { text = reInlineCode.ReplaceAllStringFunc(text, func(m string) string {
placeholder := fmt.Sprintf("\x00IC%d\x00", i) placeholder := fmt.Sprintf("\x00IC%d\x00", i)
i++ i++
return placeholder return placeholder