1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-12-11 20:39:40 +01:00
gojekyll/utils/html.go
2017-07-15 21:25:35 -04:00

46 lines
833 B
Go

package utils
import (
"bytes"
"io"
"golang.org/x/net/html"
)
// ApplyToHTMLText applies a filter only to the text within an HTML document.
func ApplyToHTMLText(doc []byte, fn func(string) string) []byte {
z := html.NewTokenizer(bytes.NewReader(doc))
buf := new(bytes.Buffer)
body := false
outer:
for {
tt := z.Next()
switch tt {
case html.ErrorToken:
if z.Err() == io.EOF {
break outer
}
panic(z.Err())
case html.StartTagToken, html.EndTagToken:
tn, _ := z.TagName()
if string(tn) == "body" {
body = tt == html.StartTagToken
}
case html.TextToken:
if body {
s := string(z.Text())
_, err := buf.WriteString(fn(s))
if err != nil {
panic(err)
}
continue outer
}
}
_, err := buf.Write(z.Raw())
if err != nil {
panic(err)
}
}
return buf.Bytes()
}