...
1 package list
2
3 import (
4 "html"
5 "strconv"
6 "strings"
7 )
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 func (l *List) RenderHTML() string {
28 l.initForRender()
29
30 var out strings.Builder
31 if len(l.items) > 0 {
32 l.htmlRenderRecursively(&out, 0, l.items[0])
33 }
34 return l.render(&out)
35 }
36
37 func (l *List) htmlRenderRecursively(out *strings.Builder, idx int, item *listItem) int {
38 linePrefix := strings.Repeat(" ", item.Level)
39
40 out.WriteString(linePrefix)
41 out.WriteString("<ul class=\"")
42 out.WriteString(l.htmlCSSClass)
43 if item.Level > 0 {
44 out.WriteRune('-')
45 out.WriteString(strconv.Itoa(item.Level))
46 }
47 out.WriteString("\">\n")
48 var numItemsRendered int
49 for itemIdx := idx; itemIdx < len(l.items); itemIdx++ {
50 if l.items[itemIdx].Level == item.Level {
51 out.WriteString(linePrefix)
52 out.WriteString(" <li>")
53 out.WriteString(strings.Replace(html.EscapeString(l.items[itemIdx].Text), "\n", "<br/>", -1))
54 out.WriteString("</li>\n")
55 numItemsRendered++
56 } else if l.items[itemIdx].Level > item.Level {
57 numItemsRenderedRecursively := l.htmlRenderRecursively(out, itemIdx, l.items[itemIdx])
58 numItemsRendered += numItemsRenderedRecursively
59 itemIdx += numItemsRenderedRecursively - 1
60 if numItemsRendered > 0 {
61 out.WriteRune('\n')
62 }
63 } else {
64 break
65 }
66 }
67 out.WriteString(linePrefix)
68 out.WriteString("</ul>")
69 return numItemsRendered
70 }
71
View as plain text