diff --git a/internal/model/account.go b/internal/model/account.go
index 083642c..f37642a 100644
--- a/internal/model/account.go
+++ b/internal/model/account.go
@@ -88,7 +88,7 @@ func (a Account) Display(noColor bool) string {
metadata += fmt.Sprintf(
"\n %s: %s",
utilities.FieldFormat(noColor, field.Name),
- utilities.StripHTMLTags(field.Value),
+ utilities.ConvertHTMLToText(field.Value),
)
}
@@ -105,7 +105,7 @@ func (a Account) Display(noColor bool) string {
utilities.FieldFormat(noColor, "Following:"), a.FollowingCount,
utilities.FieldFormat(noColor, "Statuses:"), a.StatusCount,
utilities.HeaderFormat(noColor, "BIOGRAPHY:"),
- utilities.WrapLines(utilities.StripHTMLTags(a.Note), "\n ", 80),
+ utilities.WrapLines(utilities.ConvertHTMLToText(a.Note), "\n ", 80),
utilities.HeaderFormat(noColor, "METADATA:"),
metadata,
utilities.HeaderFormat(noColor, "ACCOUNT URL:"),
diff --git a/internal/model/status.go b/internal/model/status.go
index 3d68744..252e005 100644
--- a/internal/model/status.go
+++ b/internal/model/status.go
@@ -180,7 +180,7 @@ func (s Status) Display(noColor bool) string {
format,
utilities.DisplayNameFormat(noColor, s.Account.DisplayName), s.Account.Username,
utilities.HeaderFormat(noColor, "CONTENT:"),
- utilities.WrapLines(utilities.StripHTMLTags(s.Content), "\n ", 80),
+ utilities.WrapLines(utilities.ConvertHTMLToText(s.Content), "\n ", 80),
utilities.HeaderFormat(noColor, "STATUS ID:"),
s.ID,
utilities.HeaderFormat(noColor, "CREATED AT:"),
diff --git a/internal/model/timeline.go b/internal/model/timeline.go
index 9bc35fc..537e1d2 100644
--- a/internal/model/timeline.go
+++ b/internal/model/timeline.go
@@ -30,7 +30,7 @@ func (t Timeline) Display(noColor bool) string {
createdAt = status.Reblog.CreatedAt
}
- builder.WriteString(utilities.WrapLines(utilities.StripHTMLTags(status.Content), "\n", 80) + "\n\n")
+ builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(status.Content), "\n", 80) + "\n\n")
builder.WriteString(utilities.FieldFormat(noColor, "ID:") + " " + statusID + "\t" + utilities.FieldFormat(noColor, "Created at:") + " " + utilities.FormatTime(createdAt) + "\n")
builder.WriteString(separator + "\n")
}
diff --git a/internal/utilities/html.go b/internal/utilities/html.go
index 928df9d..7a2a794 100644
--- a/internal/utilities/html.go
+++ b/internal/utilities/html.go
@@ -1,16 +1,34 @@
package utilities
import (
+ "io"
+ "strconv"
"strings"
"golang.org/x/net/html"
)
-func StripHTMLTags(text string) string {
- token := html.NewTokenizer(strings.NewReader(text))
+const (
+ htmlNoList int = iota
+ htmlOrderedList
+ htmlUnorderedList
+)
+type htmlConvertState struct {
+ htmlListType int
+ orderedListIndex int
+}
+
+func ConvertHTMLToText(text string) string {
var builder strings.Builder
+ state := htmlConvertState{
+ htmlListType: htmlNoList,
+ orderedListIndex: 1,
+ }
+
+ token := html.NewTokenizer(strings.NewReader(text))
+
for {
tt := token.Next()
switch tt {
@@ -21,18 +39,33 @@ func StripHTMLTags(text string) string {
builder.WriteString(text)
case html.StartTagToken, html.EndTagToken:
tag := token.Token().String()
- builder.WriteString(transformTag(tag))
+ processTagToken(&state, &builder, tag)
}
}
}
-func transformTag(tag string) string {
+func processTagToken(state *htmlConvertState, writer io.StringWriter, tag string) {
switch tag {
- case "
":
- return "\n"
- case "
", "
": - return "\n" + case "", "
", "": + _, _ = writer.WriteString("\n") + case "