toc_test.go (4127B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 // Package goldmark converts Markdown to HTML using Goldmark. 15 package goldmark 16 17 import ( 18 "strings" 19 "testing" 20 21 "github.com/gohugoio/hugo/markup/converter/hooks" 22 "github.com/gohugoio/hugo/markup/markup_config" 23 24 "github.com/gohugoio/hugo/common/loggers" 25 26 "github.com/gohugoio/hugo/markup/converter" 27 28 qt "github.com/frankban/quicktest" 29 ) 30 31 var nopGetRenderer = func(t hooks.RendererType, id any) any { return nil } 32 33 func TestToc(t *testing.T) { 34 c := qt.New(t) 35 36 content := ` 37 # Header 1 38 39 ## First h2---now with typography! 40 41 Some text. 42 43 ### H3 44 45 Some more text. 46 47 ## Second h2 48 49 And then some. 50 51 ### Second H3 52 53 #### First H4 54 55 ` 56 p, err := Provider.New( 57 converter.ProviderConfig{ 58 MarkupConfig: markup_config.Default, 59 Logger: loggers.NewErrorLogger(), 60 }) 61 c.Assert(err, qt.IsNil) 62 conv, err := p.New(converter.DocumentContext{}) 63 c.Assert(err, qt.IsNil) 64 b, err := conv.Convert(converter.RenderContext{Src: []byte(content), RenderTOC: true, GetRenderer: nopGetRenderer}) 65 c.Assert(err, qt.IsNil) 66 got := b.(converter.TableOfContentsProvider).TableOfContents().ToHTML(2, 3, false) 67 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 68 <ul> 69 <li><a href="#first-h2---now-with-typography">First h2—now with typography!</a> 70 <ul> 71 <li><a href="#h3">H3</a></li> 72 </ul> 73 </li> 74 <li><a href="#second-h2">Second h2</a> 75 <ul> 76 <li><a href="#second-h3">Second H3</a></li> 77 </ul> 78 </li> 79 </ul> 80 </nav>`, qt.Commentf(got)) 81 } 82 83 func TestEscapeToc(t *testing.T) { 84 c := qt.New(t) 85 86 defaultConfig := markup_config.Default 87 88 safeConfig := defaultConfig 89 unsafeConfig := defaultConfig 90 91 safeConfig.Goldmark.Renderer.Unsafe = false 92 unsafeConfig.Goldmark.Renderer.Unsafe = true 93 94 safeP, _ := Provider.New( 95 converter.ProviderConfig{ 96 MarkupConfig: safeConfig, 97 Logger: loggers.NewErrorLogger(), 98 }) 99 unsafeP, _ := Provider.New( 100 converter.ProviderConfig{ 101 MarkupConfig: unsafeConfig, 102 Logger: loggers.NewErrorLogger(), 103 }) 104 safeConv, _ := safeP.New(converter.DocumentContext{}) 105 unsafeConv, _ := unsafeP.New(converter.DocumentContext{}) 106 107 content := strings.Join([]string{ 108 "# A < B & C > D", 109 "# A < B & C > D <div>foo</div>", 110 "# *EMPHASIS*", 111 "# `echo codeblock`", 112 }, "\n") 113 // content := "" 114 b, err := safeConv.Convert(converter.RenderContext{Src: []byte(content), RenderTOC: true, GetRenderer: nopGetRenderer}) 115 c.Assert(err, qt.IsNil) 116 got := b.(converter.TableOfContentsProvider).TableOfContents().ToHTML(1, 2, false) 117 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 118 <ul> 119 <li><a href="#a--b--c--d">A < B & C > D</a></li> 120 <li><a href="#a--b--c--d-divfoodiv">A < B & C > D <!-- raw HTML omitted -->foo<!-- raw HTML omitted --></a></li> 121 <li><a href="#emphasis"><em>EMPHASIS</em></a></li> 122 <li><a href="#echo-codeblock"><code>echo codeblock</code></a></li> 123 </ul> 124 </nav>`, qt.Commentf(got)) 125 126 b, err = unsafeConv.Convert(converter.RenderContext{Src: []byte(content), RenderTOC: true, GetRenderer: nopGetRenderer}) 127 c.Assert(err, qt.IsNil) 128 got = b.(converter.TableOfContentsProvider).TableOfContents().ToHTML(1, 2, false) 129 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 130 <ul> 131 <li><a href="#a--b--c--d">A < B & C > D</a></li> 132 <li><a href="#a--b--c--d-divfoodiv">A < B & C > D <div>foo</div></a></li> 133 <li><a href="#emphasis"><em>EMPHASIS</em></a></li> 134 <li><a href="#echo-codeblock"><code>echo codeblock</code></a></li> 135 </ul> 136 </nav>`, qt.Commentf(got)) 137 }