49 lines
996 B
Go
49 lines
996 B
Go
package main
|
|
|
|
import (
|
|
"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) string {
|
|
format := 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
|
|
}
|
|
|
|
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:]))
|
|
|
|
return b.String()
|
|
}
|