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, "$1") s = italicRE.ReplaceAllString(s, "$1") s = strikeRE.ReplaceAllString(s, "$1") s = codeRE.ReplaceAllString(s, `$1`) 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(``) b.WriteString(url) b.WriteString(``) 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("This message was retracted by a moderator.\nReason: '%s'", html.EscapeString(retraction.Reason))) } else { lab.AddCSSClass("retracted") lab.SetTooltipMarkup(fmt.Sprintf("This message was retracted.\nReason: '%s'", html.EscapeString(retraction.Reason))) } }