Files
lambda/gtk-xmpp-markup.go
T

76 lines
1.8 KiB
Go

package main
import (
"fmt"
"html"
"regexp"
"strings"
"github.com/diamondburned/gotk4/pkg/gtk/v4"
)
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
}
func GenerateRetraction(lab *gtk.Label, retraction Retraction) {
if retraction.Moderated.OccupantID.ID != "" {
lab.AddCSSClass("moderated")
lab.SetTooltipMarkup(fmt.Sprintf("<span weight='bold'>This message was <span foreground='magenta'>retracted</span> by a moderator.</span>\nReason: '%s'", html.EscapeString(retraction.Reason)))
} else {
lab.AddCSSClass("retracted")
lab.SetTooltipMarkup(fmt.Sprintf("<span weight='bold'>This message was retracted.</span>\nReason: '%s'", html.EscapeString(retraction.Reason)))
}
}