diff options
author | Gavin D. Howard <[email protected]> | 2019-12-11 23:48:40 -0700 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2019-12-12 07:48:40 +0100 |
commit | 4c804319f6db0b8459cc9b5df4a904fd2c55dedd (patch) | |
tree | e1972bfdf52dbc48e2d4f6df01a859c4cbb523c8 /markup | |
parent | 186a5ebfca29bffc413c5d968b3f4a69066a867c (diff) | |
download | hugo-4c804319f6db0b8459cc9b5df4a904fd2c55dedd.tar.gz hugo-4c804319f6db0b8459cc9b5df4a904fd2c55dedd.zip |
markup/tableofcontents: Add config option for ordered list
Diffstat (limited to 'markup')
-rw-r--r-- | markup/goldmark/toc_test.go | 2 | ||||
-rw-r--r-- | markup/tableofcontents/tableofcontents.go | 20 | ||||
-rw-r--r-- | markup/tableofcontents/tableofcontents_test.go | 49 |
3 files changed, 61 insertions, 10 deletions
diff --git a/markup/goldmark/toc_test.go b/markup/goldmark/toc_test.go index d3a1613cf..19928dd8e 100644 --- a/markup/goldmark/toc_test.go +++ b/markup/goldmark/toc_test.go @@ -58,7 +58,7 @@ And then some. c.Assert(err, qt.IsNil) b, err := conv.Convert(converter.RenderContext{Src: []byte(content), RenderTOC: true}) c.Assert(err, qt.IsNil) - got := b.(converter.TableOfContentsProvider).TableOfContents().ToHTML(2, 3) + got := b.(converter.TableOfContentsProvider).TableOfContents().ToHTML(2, 3, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li><a href="#first-h2---now-with-typography">First h2—now with typography!</a> diff --git a/markup/tableofcontents/tableofcontents.go b/markup/tableofcontents/tableofcontents.go index 65fe3f0b9..780310083 100644 --- a/markup/tableofcontents/tableofcontents.go +++ b/markup/tableofcontents/tableofcontents.go @@ -62,12 +62,13 @@ func (toc *Root) AddAt(h Header, y, x int) { } // ToHTML renders the ToC as HTML. -func (toc Root) ToHTML(startLevel, stopLevel int) string { +func (toc Root) ToHTML(startLevel, stopLevel int, ordered bool) string { b := &tocBuilder{ s: strings.Builder{}, h: toc.Headers, startLevel: startLevel, stopLevel: stopLevel, + ordered: ordered, } b.Build() return b.s.String() @@ -79,6 +80,7 @@ type tocBuilder struct { startLevel int stopLevel int + ordered bool } func (b *tocBuilder) Build() { @@ -108,7 +110,11 @@ func (b *tocBuilder) writeHeaders(level, indent int, h Headers) { if hasChildren { b.s.WriteString("\n") b.indent(indent + 1) - b.s.WriteString("<ul>\n") + if b.ordered { + b.s.WriteString("<ol>\n") + } else { + b.s.WriteString("<ul>\n") + } } for _, h := range h { @@ -117,7 +123,11 @@ func (b *tocBuilder) writeHeaders(level, indent int, h Headers) { if hasChildren { b.indent(indent + 1) - b.s.WriteString("</ul>") + if b.ordered { + b.s.WriteString("</ol>") + } else { + b.s.WriteString("</ul>") + } b.s.WriteString("\n") b.indent(indent) } @@ -143,6 +153,7 @@ func (b *tocBuilder) indent(n int) { var DefaultConfig = Config{ StartLevel: 2, EndLevel: 3, + Ordered: false, } type Config struct { @@ -153,4 +164,7 @@ type Config struct { // Heading end level, inclusive, to include in the table of contents. // Default is 3, a value of -1 will include everything. EndLevel int + + // Whether to produce a ordered list or not. + Ordered bool } diff --git a/markup/tableofcontents/tableofcontents_test.go b/markup/tableofcontents/tableofcontents_test.go index 1ea96c82f..8e5a47c52 100644 --- a/markup/tableofcontents/tableofcontents_test.go +++ b/markup/tableofcontents/tableofcontents_test.go @@ -30,7 +30,7 @@ func TestToc(t *testing.T) { toc.AddAt(Header{Text: "1-H3-1", ID: "1-h2-2"}, 0, 2) toc.AddAt(Header{Text: "Header 2", ID: "h1-2"}, 1, 0) - got := toc.ToHTML(1, -1) + got := toc.ToHTML(1, -1, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li><a href="#h1-1">Header 1</a> @@ -47,7 +47,7 @@ func TestToc(t *testing.T) { </ul> </nav>`, qt.Commentf(got)) - got = toc.ToHTML(1, 1) + got = toc.ToHTML(1, 1, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li><a href="#h1-1">Header 1</a></li> @@ -55,7 +55,7 @@ func TestToc(t *testing.T) { </ul> </nav>`, qt.Commentf(got)) - got = toc.ToHTML(1, 2) + got = toc.ToHTML(1, 2, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li><a href="#h1-1">Header 1</a> @@ -68,7 +68,7 @@ func TestToc(t *testing.T) { </ul> </nav>`, qt.Commentf(got)) - got = toc.ToHTML(2, 2) + got = toc.ToHTML(2, 2, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li><a href="#1-h2-1">1-H2-1</a></li> @@ -76,6 +76,22 @@ func TestToc(t *testing.T) { </ul> </nav>`, qt.Commentf(got)) + got = toc.ToHTML(1, -1, true) + c.Assert(got, qt.Equals, `<nav id="TableOfContents"> + <ol> + <li><a href="#h1-1">Header 1</a> + <ol> + <li><a href="#1-h2-1">1-H2-1</a></li> + <li><a href="#1-h2-2">1-H2-2</a> + <ol> + <li><a href="#1-h2-2">1-H3-1</a></li> + </ol> + </li> + </ol> + </li> + <li><a href="#h1-2">Header 2</a></li> + </ol> +</nav>`, qt.Commentf(got)) } func TestTocMissingParent(t *testing.T) { @@ -87,7 +103,7 @@ func TestTocMissingParent(t *testing.T) { toc.AddAt(Header{Text: "H3", ID: "h3"}, 1, 2) toc.AddAt(Header{Text: "H3", ID: "h3"}, 1, 2) - got := toc.ToHTML(1, -1) + got := toc.ToHTML(1, -1, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li> @@ -108,7 +124,7 @@ func TestTocMissingParent(t *testing.T) { </ul> </nav>`, qt.Commentf(got)) - got = toc.ToHTML(3, 3) + got = toc.ToHTML(3, 3, false) c.Assert(got, qt.Equals, `<nav id="TableOfContents"> <ul> <li><a href="#h3">H3</a></li> @@ -116,4 +132,25 @@ func TestTocMissingParent(t *testing.T) { </ul> </nav>`, qt.Commentf(got)) + got = toc.ToHTML(1, -1, true) + c.Assert(got, qt.Equals, `<nav id="TableOfContents"> + <ol> + <li> + <ol> + <li><a href="#h2">H2</a></li> + </ol> + </li> + <li> + <ol> + <li> + <ol> + <li><a href="#h3">H3</a></li> + <li><a href="#h3">H3</a></li> + </ol> + </li> + </ol> + </li> + </ol> +</nav>`, qt.Commentf(got)) + } |