ref: 55f951cbba69c29daabca57eeff5661d132fa162
parent: 20f351ee4cd40b3b53e33805fc6226c837290ed7
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Sat Nov 23 11:59:43 EST 2019
markup/tableofcontents: GoDoc etc.
--- a/markup/tableofcontents/tableofcontents.go
+++ b/markup/tableofcontents/tableofcontents.go
@@ -17,8 +17,10 @@
"strings"
)
+// Headers holds the top level (h1) headers.
type Headers []Header
+// Header holds the data about a header and its children.
type Header struct {ID string
Text string
@@ -26,14 +28,18 @@
Headers Headers
}
+// IsZero is true when no ID or Text is set.
func (h Header) IsZero() bool {return h.ID == "" && h.Text == ""
}
+// Root implements AddAt, which can be used to build the
+// data structure for the ToC.
type Root struct {Headers Headers
}
+// AddAt adds the header into the given location.
func (toc *Root) AddAt(h Header, y, x int) { for i := len(toc.Headers); i <= y; i++ { toc.Headers = append(toc.Headers, Header{})@@ -55,6 +61,7 @@
header.Headers = append(header.Headers, h)
}
+// ToHTML renders the ToC as HTML.
func (toc Root) ToHTML(startLevel, stopLevel int) string { b := &tocBuilder{ s: strings.Builder{},@@ -75,19 +82,19 @@
}
func (b *tocBuilder) Build() {- b.buildHeaders2(b.h)
+ b.writeNav(b.h)
}
-func (b *tocBuilder) buildHeaders2(h Headers) {+func (b *tocBuilder) writeNav(h Headers) { b.s.WriteString("<nav id=\"TableOfContents\">")- b.buildHeaders(1, 0, b.h)
+ b.writeHeaders(1, 0, b.h)
b.s.WriteString("</nav>")}
-func (b *tocBuilder) buildHeaders(level, indent int, h Headers) {+func (b *tocBuilder) writeHeaders(level, indent int, h Headers) { if level < b.startLevel { for _, h := range h {- b.buildHeaders(level+1, indent, h.Headers)
+ b.writeHeaders(level+1, indent, h.Headers)
}
return
}
@@ -105,7 +112,7 @@
}
for _, h := range h {- b.buildHeader(level+1, indent+2, h)
+ b.writeHeader(level+1, indent+2, h)
}
if hasChildren {@@ -116,13 +123,13 @@
}
}
-func (b *tocBuilder) buildHeader(level, indent int, h Header) {+func (b *tocBuilder) writeHeader(level, indent int, h Header) {b.indent(indent)
b.s.WriteString("<li>") if !h.IsZero() { b.s.WriteString("<a href=\"#" + h.ID + "\">" + h.Text + "</a>")}
- b.buildHeaders(level, indent, h.Headers)
+ b.writeHeaders(level, indent, h.Headers)
b.s.WriteString("</li>\n")}
@@ -132,6 +139,7 @@
}
}
+// DefaultConfig is the default ToC configuration.
var DefaultConfig = Config{StartLevel: 2,
EndLevel: 3,
--
⑨