added a type to preserve the state of the conversion processes where necessary
This commit is contained in:
parent
a1f5651b4c
commit
d681404c78
1 changed files with 19 additions and 14 deletions
|
@ -14,11 +14,18 @@ const (
|
|||
htmlUnorderedList
|
||||
)
|
||||
|
||||
type htmlConvertState struct {
|
||||
htmlListType int
|
||||
orderedListNumber int
|
||||
}
|
||||
|
||||
func ConvertHTMLToText(text string) string {
|
||||
var builder strings.Builder
|
||||
|
||||
htmlList := htmlNoList
|
||||
orderedListNumber := 1
|
||||
state := htmlConvertState{
|
||||
htmlListType: htmlNoList,
|
||||
orderedListNumber: 1,
|
||||
}
|
||||
|
||||
token := html.NewTokenizer(strings.NewReader(text))
|
||||
|
||||
|
@ -32,35 +39,33 @@ func ConvertHTMLToText(text string) string {
|
|||
builder.WriteString(text)
|
||||
case html.StartTagToken, html.EndTagToken:
|
||||
tag := token.Token().String()
|
||||
htmlList, orderedListNumber = processTagToken(&builder, tag, htmlList, orderedListNumber)
|
||||
processTagToken(&state, &builder, tag)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func processTagToken(writer io.StringWriter, tag string, htmlList, orderedListNumber int) (int, int) {
|
||||
func processTagToken(state *htmlConvertState, writer io.StringWriter, tag string) {
|
||||
switch tag {
|
||||
case "<br>", "<p>", "</p>", "</li>":
|
||||
_, _ = writer.WriteString("\n")
|
||||
case "<ul>":
|
||||
htmlList = htmlUnorderedList
|
||||
state.htmlListType = htmlUnorderedList
|
||||
_, _ = writer.WriteString("\n")
|
||||
case "<ol>":
|
||||
htmlList = htmlOrderedList
|
||||
state.htmlListType = htmlOrderedList
|
||||
_, _ = writer.WriteString("\n")
|
||||
case "</ul>":
|
||||
htmlList = htmlNoList
|
||||
state.htmlListType = htmlNoList
|
||||
case "</ol>":
|
||||
htmlList = htmlNoList
|
||||
orderedListNumber = 1
|
||||
state.htmlListType = htmlNoList
|
||||
state.orderedListNumber = 1
|
||||
case "<li>":
|
||||
switch htmlList {
|
||||
switch state.htmlListType {
|
||||
case htmlUnorderedList:
|
||||
_, _ = writer.WriteString("• ")
|
||||
case htmlOrderedList:
|
||||
_, _ = writer.WriteString(strconv.Itoa(orderedListNumber) + ". ")
|
||||
orderedListNumber++
|
||||
_, _ = writer.WriteString(strconv.Itoa(state.orderedListNumber) + ". ")
|
||||
state.orderedListNumber++
|
||||
}
|
||||
}
|
||||
|
||||
return htmlList, orderedListNumber
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue