2024-05-29 18:33:16 +01:00
|
|
|
package utilities
|
|
|
|
|
|
|
|
import (
|
2024-06-01 01:08:43 +01:00
|
|
|
"io"
|
2024-05-29 18:33:16 +01:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"golang.org/x/net/html"
|
|
|
|
)
|
|
|
|
|
2024-06-01 01:08:43 +01:00
|
|
|
func ConvertHTMLToText(text string) string {
|
2024-05-29 18:33:16 +01:00
|
|
|
var builder strings.Builder
|
|
|
|
|
2024-06-01 01:08:43 +01:00
|
|
|
var unorderedList bool
|
|
|
|
|
|
|
|
token := html.NewTokenizer(strings.NewReader(text))
|
|
|
|
|
2024-05-29 18:33:16 +01:00
|
|
|
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 01:08:43 +01:00
|
|
|
unorderedList = processTag(&builder, tag, unorderedList)
|
2024-05-29 18:33:16 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-01 01:08:43 +01:00
|
|
|
func processTag(writer io.StringWriter, tag string, unorderedList bool) bool {
|
2024-05-29 18:33:16 +01:00
|
|
|
switch tag {
|
2024-06-01 01:08:43 +01:00
|
|
|
case "<br>", "<p>", "</p>", "</li>":
|
|
|
|
_, _ = writer.WriteString("\n")
|
|
|
|
case "<ul>":
|
|
|
|
unorderedList = true
|
|
|
|
case "</ul>":
|
|
|
|
unorderedList = false
|
|
|
|
case "<li>":
|
|
|
|
if unorderedList {
|
|
|
|
_, _ = writer.WriteString("• ")
|
|
|
|
}
|
2024-05-29 18:33:16 +01:00
|
|
|
}
|
|
|
|
|
2024-06-01 01:08:43 +01:00
|
|
|
return unorderedList
|
2024-05-29 18:33:16 +01:00
|
|
|
}
|