SkunkyArt/util/parsetags.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())
}
}
}