From 55f951cbba69c29daabca57eeff5661d132fa162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 23 Nov 2019 16:59:43 +0100 Subject: [PATCH] markup/tableofcontents: GoDoc etc. --- markup/tableofcontents/tableofcontents.go | 24 +++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/markup/tableofcontents/tableofcontents.go b/markup/tableofcontents/tableofcontents.go index 6cd84e5ae..65fe3f0b9 100644 --- a/markup/tableofcontents/tableofcontents.go +++ b/markup/tableofcontents/tableofcontents.go @@ -17,8 +17,10 @@ import ( "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 @@ type Header struct { 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 @@ func (toc *Root) AddAt(h Header, y, x int) { 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 @@ type tocBuilder struct { } 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("") } -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 @@ func (b *tocBuilder) buildHeaders(level, indent int, h Headers) { } 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) buildHeaders(level, indent int, h Headers) { } } -func (b *tocBuilder) buildHeader(level, indent int, h Header) { +func (b *tocBuilder) writeHeader(level, indent int, h Header) { b.indent(indent) b.s.WriteString("
  • ") if !h.IsZero() { b.s.WriteString("" + h.Text + "") } - b.buildHeaders(level, indent, h.Headers) + b.writeHeaders(level, indent, h.Headers) b.s.WriteString("
  • \n") } @@ -132,6 +139,7 @@ func (b *tocBuilder) indent(n int) { } } +// DefaultConfig is the default ToC configuration. var DefaultConfig = Config{ StartLevel: 2, EndLevel: 3,