73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package util
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
|
|
"golang.org/x/net/html"
|
|
)
|
|
|
|
func Parse(n string) string {
|
|
var buf bytes.Buffer
|
|
tt := html.NewTokenizer(strings.NewReader(n))
|
|
for {
|
|
t := tt.Next()
|
|
switch t {
|
|
case html.ErrorToken:
|
|
return buf.String()
|
|
case html.StartTagToken, html.EndTagToken, html.SelfClosingTagToken:
|
|
token := tt.Token()
|
|
switch token.Data {
|
|
case "a":
|
|
for _, a := range token.Attr {
|
|
if a.Key == "href" {
|
|
url := strings.ReplaceAll(a.Val, "https://www.deviantart.com/users/outgoing?", "")
|
|
if strings.Contains(url, "deviantart") {
|
|
url = strings.ReplaceAll(url, "https://www.deviantart.com/", "")
|
|
url = strings.ReplaceAll(url, url[0:strings.Index(url, "/")+1], "")
|
|
}
|
|
buf.WriteString("<a target=\"_blank\" href=\"" + url + "\">" + tagval(tt) + "</a> ")
|
|
}
|
|
}
|
|
case "img":
|
|
var (
|
|
uri, title string
|
|
)
|
|
for b, a := range token.Attr {
|
|
switch a.Key {
|
|
case "src":
|
|
if a.Val[8:9] == "e" {
|
|
uri = Conf.Base_uri + "emoji/" + a.Val[37:len(a.Val)-4]
|
|
}
|
|
case "title":
|
|
title = a.Val
|
|
}
|
|
if title != "" {
|
|
for x := -1; x < b; x++ {
|
|
buf.WriteString("<img src=\"" + uri + "\" title=\"" + title + "\">")
|
|
}
|
|
}
|
|
}
|
|
case "br", "li", "ul", "p", "b":
|
|
buf.WriteString(token.String())
|
|
case "div":
|
|
buf.WriteString("<p> ")
|
|
}
|
|
case html.TextToken:
|
|
buf.Write(tt.Text())
|
|
}
|
|
}
|
|
}
|
|
|
|
func tagval(t *html.Tokenizer) string {
|
|
for {
|
|
tt := t.Next()
|
|
switch tt {
|
|
case html.ErrorToken:
|
|
return ""
|
|
case html.TextToken:
|
|
return string(t.Text())
|
|
}
|
|
}
|
|
}
|