package list
import (
"html"
"strconv"
"strings"
)
// RenderHTML renders the List in the HTML format. Example:
//
// - Game Of Thrones
//
// - Winter
// - Is
// - Coming
//
// - This
// - Is
// - Known
//
//
// - The Dark Tower
//
//
func (l *List) RenderHTML() string {
l.initForRender()
var out strings.Builder
if len(l.items) > 0 {
l.htmlRenderRecursively(&out, 0, l.items[0])
}
return l.render(&out)
}
func (l *List) htmlRenderRecursively(out *strings.Builder, idx int, item *listItem) int {
linePrefix := strings.Repeat(" ", item.Level)
out.WriteString(linePrefix)
out.WriteString(" 0 {
out.WriteRune('-')
out.WriteString(strconv.Itoa(item.Level))
}
out.WriteString("\">\n")
var numItemsRendered int
for itemIdx := idx; itemIdx < len(l.items); itemIdx++ {
if l.items[itemIdx].Level == item.Level {
out.WriteString(linePrefix)
out.WriteString(" - ")
out.WriteString(strings.Replace(html.EscapeString(l.items[itemIdx].Text), "\n", "
", -1))
out.WriteString(" \n")
numItemsRendered++
} else if l.items[itemIdx].Level > item.Level { // indent
numItemsRenderedRecursively := l.htmlRenderRecursively(out, itemIdx, l.items[itemIdx])
numItemsRendered += numItemsRenderedRecursively
itemIdx += numItemsRenderedRecursively - 1
if numItemsRendered > 0 {
out.WriteRune('\n')
}
} else { // un-indent
break
}
}
out.WriteString(linePrefix)
out.WriteString("
")
return numItemsRendered
}