enbas/internal/utilities/html.go

67 lines
1.4 KiB
Go
Raw Normal View History

package utilities
import (
2024-06-01 01:08:43 +01:00
"io"
2024-06-01 02:57:48 +01:00
"strconv"
"strings"
"golang.org/x/net/html"
)
2024-06-01 02:57:48 +01:00
const (
htmlNoList int = iota
htmlOrderedList
htmlUnorderedList
)
2024-06-01 01:08:43 +01:00
func ConvertHTMLToText(text string) string {
var builder strings.Builder
2024-06-01 02:57:48 +01:00
htmlList := htmlNoList
orderedListNumber := 1
2024-06-01 01:08:43 +01:00
token := html.NewTokenizer(strings.NewReader(text))
for {
tt := token.Next()
switch tt {
case html.ErrorToken:
return builder.String()
case html.TextToken:
text := token.Token().Data
builder.WriteString(text)
case html.StartTagToken, html.EndTagToken:
tag := token.Token().String()
2024-06-01 02:57:48 +01:00
htmlList, orderedListNumber = processTagToken(&builder, tag, htmlList, orderedListNumber)
}
}
}
2024-06-01 02:57:48 +01:00
func processTagToken(writer io.StringWriter, tag string, htmlList, orderedListNumber int) (int, int) {
switch tag {
2024-06-01 01:08:43 +01:00
case "<br>", "<p>", "</p>", "</li>":
_, _ = writer.WriteString("\n")
case "<ul>":
2024-06-01 02:57:48 +01:00
htmlList = htmlUnorderedList
_, _ = writer.WriteString("\n")
case "<ol>":
htmlList = htmlOrderedList
_, _ = writer.WriteString("\n")
2024-06-01 01:08:43 +01:00
case "</ul>":
2024-06-01 02:57:48 +01:00
htmlList = htmlNoList
case "</ol>":
htmlList = htmlNoList
orderedListNumber = 1
2024-06-01 01:08:43 +01:00
case "<li>":
2024-06-01 02:57:48 +01:00
switch htmlList {
case htmlUnorderedList:
2024-06-01 01:08:43 +01:00
_, _ = writer.WriteString("• ")
2024-06-01 02:57:48 +01:00
case htmlOrderedList:
_, _ = writer.WriteString(strconv.Itoa(orderedListNumber) + ". ")
orderedListNumber++
2024-06-01 01:08:43 +01:00
}
}
2024-06-01 02:57:48 +01:00
return htmlList, orderedListNumber
}