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..52aa8e4 100644 --- a/internal/utilities/html.go +++ b/internal/utilities/html.go @@ -1,16 +1,19 @@ package utilities import ( + "io" "strings" "golang.org/x/net/html" ) -func StripHTMLTags(text string) string { - token := html.NewTokenizer(strings.NewReader(text)) - +func ConvertHTMLToText(text string) string { var builder strings.Builder + var unorderedList bool + + token := html.NewTokenizer(strings.NewReader(text)) + for { tt := token.Next() switch tt { @@ -21,18 +24,24 @@ func StripHTMLTags(text string) string { builder.WriteString(text) case html.StartTagToken, html.EndTagToken: tag := token.Token().String() - builder.WriteString(transformTag(tag)) + unorderedList = processTag(&builder, tag, unorderedList) } } } -func transformTag(tag string) string { +func processTag(writer io.StringWriter, tag string, unorderedList bool) bool { switch tag { - case "
": - return "\n" - case "

", "

": - return "\n" + case "
", "

", "

", "": + _, _ = writer.WriteString("\n") + case "": + unorderedList = false + case "
  • ": + if unorderedList { + _, _ = writer.WriteString("• ") + } } - return "" + return unorderedList }