Files
lambda/gtk-xmpp-markup.go
T
2026-08-16 20:07:53 +01:00

65 lines
1.3 KiB
Go

package main
import (
"fmt"
"html"
"regexp"
"strings"
)
var (
urlRE = regexp.MustCompile(`https?://[^\s]+`)
boldRE = regexp.MustCompile(`\*([^*]+)\*`)
italicRE = regexp.MustCompile(`_([^_]+)_`)
strikeRE = regexp.MustCompile(`~([^~]+)~`)
codeRE = regexp.MustCompile("`([^`]+)`")
)
func XEPToPango(text string, correction bool) string {
formatInline := func(s string) string {
s = html.EscapeString(s)
s = boldRE.ReplaceAllString(s, "<b>$1</b>")
s = italicRE.ReplaceAllString(s, "<i>$1</i>")
s = strikeRE.ReplaceAllString(s, "<s>$1</s>")
s = codeRE.ReplaceAllString(s, `<tt>$1</tt>`)
return s
}
format := func(s string) string {
lines := strings.Split(s, "\n")
for i, line := range lines {
lines[i] = formatInline(line)
}
return strings.Join(lines, "\n")
}
var b strings.Builder
last := 0
for _, m := range urlRE.FindAllStringIndex(text, -1) {
start, end := m[0], m[1]
b.WriteString(format(text[last:start]))
url := html.EscapeString(text[start:end])
b.WriteString(`<a href="`)
b.WriteString(url)
b.WriteString(`">`)
b.WriteString(url)
b.WriteString(`</a>`)
last = end
}
b.WriteString(format(text[last:]))
str := b.String()
if correction {
str = fmt.Sprintf("%s %s", str, loadedLocale["correction"])
}
return str
}