46 lines
1 KiB
Go
46 lines
1 KiB
Go
|
package gumbleutil
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/xml"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/layeh/gumble/gumble"
|
||
|
)
|
||
|
|
||
|
// PlainText returns the Message string without HTML tags or entities.
|
||
|
func PlainText(tm *gumble.TextMessage) string {
|
||
|
d := xml.NewDecoder(strings.NewReader(tm.Message))
|
||
|
d.Strict = false
|
||
|
d.AutoClose = xml.HTMLAutoClose
|
||
|
d.Entity = xml.HTMLEntity
|
||
|
|
||
|
var b bytes.Buffer
|
||
|
newline := false
|
||
|
for {
|
||
|
t, _ := d.Token()
|
||
|
if t == nil {
|
||
|
break
|
||
|
}
|
||
|
switch node := t.(type) {
|
||
|
case xml.CharData:
|
||
|
if len(node) > 0 {
|
||
|
b.Write(node)
|
||
|
newline = false
|
||
|
}
|
||
|
case xml.StartElement:
|
||
|
switch node.Name.Local {
|
||
|
case "address", "article", "aside", "audio", "blockquote", "canvas", "dd", "div", "dl", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hgroup", "hr", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video":
|
||
|
if !newline {
|
||
|
b.WriteByte('\n')
|
||
|
newline = true
|
||
|
}
|
||
|
case "br":
|
||
|
b.WriteByte('\n')
|
||
|
newline = true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return b.String()
|
||
|
}
|