markup/tableofcontents: Add config option for ordered list
authorGavin D. Howard <yzena.tech@gmail.com>
Thu, 12 Dec 2019 06:48:40 +0000 (23:48 -0700)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 12 Dec 2019 06:48:40 +0000 (07:48 +0100)
docs/content/en/getting-started/configuration-markup.md
docs/data/docs.json
hugolib/page__per_output.go
markup/goldmark/toc_test.go
markup/tableofcontents/tableofcontents.go
markup/tableofcontents/tableofcontents_test.go

index 2a24fcdd0f5abf910a981c5d1673925713c047a1..ff009502499fbd5b0f720e649e2794654e759dc7 100644 (file)
@@ -70,4 +70,7 @@ startLevel
 : The heading level, values starting at 1 (`h1`), to start render the table of contents.
 
 endLevel
-: The heading level, inclusive, to stop render the table of contents.
\ No newline at end of file
+: The heading level, inclusive, to stop render the table of contents.
+
+ordered
+: Whether or not to generate an ordered list instead of an unordered list.
index 0944ab8811401629193d1a984c57267110a3e9ef..dea7f0bcbc1b27c10e94c4e0e11934e35d94a83d 100644 (file)
       },
       "tableOfContents": {
         "startLevel": 2,
-        "endLevel": 3
+        "endLevel": 3,
+        "ordered": false
       },
       "goldmark": {
         "renderer": {
index bc2a0accc0481b6d82023839e3c2bc88dd19f93c..9697468ff1de9ea1b1f7f54a378cd6da3f86da52 100644 (file)
@@ -292,7 +292,7 @@ func (p *pageContentOutput) TableOfContents() template.HTML {
        p.p.s.initInit(p.initMain, p.p)
        if tocProvider, ok := p.convertedResult.(converter.TableOfContentsProvider); ok {
                cfg := p.p.s.ContentSpec.Converters.GetMarkupConfig()
-               return template.HTML(tocProvider.TableOfContents().ToHTML(cfg.TableOfContents.StartLevel, cfg.TableOfContents.EndLevel))
+               return template.HTML(tocProvider.TableOfContents().ToHTML(cfg.TableOfContents.StartLevel, cfg.TableOfContents.EndLevel, cfg.TableOfContents.Ordered))
        }
        return p.tableOfContents
 }
index d3a1613cf0be6ecd7b8f7a7fac8d02cffbe231f0..19928dd8e35ecb87699e4ab1d650aa80729eb7cf 100644 (file)
@@ -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&mdash;now with typography!</a>
index 65fe3f0b9cf22f6d95aa458f6154621d5fdd8b00..7803100836fb1b30391e175cafc4db0c21189ec0 100644 (file)
@@ -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
 }
index 1ea96c82f91c07812d126da1ff0bda3f7064f735..8e5a47c5243de53f1138d7d9a2cd03f6aeed2c2e 100644 (file)
@@ -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))
+
 }