// Copyright 2024 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package goldmark_test import ( "strings" "testing" "github.com/gohugoio/hugo/hugolib" ) func TestTableOfContents(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- disableKinds = ['home','rss','section','sitemap','taxonomy','term'] enableEmoji = false [markup.tableOfContents] startLevel = 2 endLevel = 4 ordered = false [markup.goldmark.extensions] strikethrough = false [markup.goldmark.extensions.typographer] disable = true [markup.goldmark.parser] autoHeadingID = false autoHeadingIDType = 'github' [markup.goldmark.renderer] unsafe = false xhtml = false -- layouts/_default/single.html -- {{ .TableOfContents }} -- content/p1.md -- --- title: p1 (basic) --- # Title ## Section 1 ### Section 1.1 ### Section 1.2 #### Section 1.2.1 ##### Section 1.2.1.1 -- content/p2.md -- --- title: p2 (markdown) --- ## Some *emphasized* text ## Some ` + "`" + `inline` + "`" + ` code ## Something to escape A < B && C > B --- -- content/p3.md -- --- title: p3 (image) --- ## An image ![kitten](a.jpg) -- content/p4.md -- --- title: p4 (raw html) --- ## Some raw HTML -- content/p5.md -- --- title: p5 (typographer) --- ## Some "typographer" markup -- content/p6.md -- --- title: p6 (strikethrough) --- ## Some ~~deleted~~ text -- content/p7.md -- --- title: p7 (emoji) --- ## A :snake: emoji -- content/p8.md -- --- title: p8 (link) --- ## A [link](https://example.org) ` b := hugolib.Test(t, files) // basic b.AssertFileContentExact("public/p1/index.html", ``) // markdown b.AssertFileContent("public/p2/index.html", `
  • Some emphasized text
  • `, `
  • Some inline code
  • `, `
  • Something to escape A < B && C > B
  • `, ) // image b.AssertFileContent("public/p3/index.html", `
  • An image kitten
  • `, ) // raw html b.AssertFileContent("public/p4/index.html", `
  • Some raw HTML
  • `, ) // typographer b.AssertFileContent("public/p5/index.html", `
  • Some "typographer" markup
  • `, ) // strikethrough b.AssertFileContent("public/p6/index.html", `
  • Some ~~deleted~~ text
  • `, ) // emoji b.AssertFileContent("public/p7/index.html", `
  • A :snake: emoji
  • `, ) // link b.AssertFileContent("public/p8/index.html", `
  • A link
  • `, ) } func TestTableOfContentsAdvanced(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- disableKinds = ['home','rss','section','sitemap','taxonomy','term'] enableEmoji = true [markup.tableOfContents] startLevel = 2 endLevel = 3 ordered = true [markup.goldmark.extensions] strikethrough = true [markup.goldmark.extensions.typographer] disable = false [markup.goldmark.parser] autoHeadingID = true autoHeadingIDType = 'github' [markup.goldmark.renderer] unsafe = true xhtml = true -- layouts/_default/single.html -- {{ .TableOfContents }} -- content/p1.md -- --- title: p1 (basic) --- # Title ## Section 1 ### Section 1.1 ### Section 1.2 #### Section 1.2.1 ##### Section 1.2.1.1 -- content/p2.md -- --- title: p2 (markdown) --- ## Some *emphasized* text ## Some ` + "`" + `inline` + "`" + ` code ## Something to escape A < B && C > B --- -- content/p3.md -- --- title: p3 (image) --- ## An image ![kitten](a.jpg) -- content/p4.md -- --- title: p4 (raw html) --- ## Some raw HTML -- content/p5.md -- --- title: p5 (typographer) --- ## Some "typographer" markup -- content/p6.md -- --- title: p6 (strikethrough) --- ## Some ~~deleted~~ text -- content/p7.md -- --- title: p7 (emoji) --- ## A :snake: emoji -- content/p8.md -- --- title: p8 (link) --- ## A [link](https://example.org) ` b := hugolib.Test(t, files) // basic b.AssertFileContentExact("public/p1/index.html", ``) // markdown b.AssertFileContent("public/p2/index.html", `
  • Some emphasized text
  • `, `
  • Some inline code
  • `, `
  • Something to escape A < B && C > B
  • `, ) // image b.AssertFileContent("public/p3/index.html", `
  • An image kitten
  • `, ) // raw html b.AssertFileContent("public/p4/index.html", `
  • Some raw HTML
  • `, ) // typographer b.AssertFileContent("public/p5/index.html", `
  • Some “typographer” markup
  • `, ) // strikethrough b.AssertFileContent("public/p6/index.html", `
  • Some deleted text
  • `, ) // emoji b.AssertFileContent("public/p7/index.html", `
  • A 🐍 emoji
  • `, ) // link b.AssertFileContent("public/p8/index.html", `
  • A link
  • `, ) } func TestIssue13416(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] -- layouts/index.html -- Content:{{ .Content }}| -- layouts/_default/_markup/render-heading.html -- -- content/_index.md -- --- title: home --- # ` b := hugolib.Test(t, files) b.AssertFileExists("public/index.html", true) } // Issue 12605 func TestTableOfContentsWithGoldmarkExtras(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] [markup.goldmark.extensions] strikethrough = false [markup.goldmark.extensions.extras.delete] enable = true [markup.goldmark.extensions.extras.insert] enable = true [markup.goldmark.extensions.extras.mark] enable = true [markup.goldmark.extensions.extras.subscript] enable = true [markup.goldmark.extensions.extras.superscript] enable = true -- content/_index.md -- --- title: home --- ## ~~deleted~~ ## ++inserted++ ## ==marked== ## H~2~O ## 1^st^ -- layouts/home.html -- {{ .TableOfContents }} ` b := hugolib.Test(t, files) b.AssertFileContent("public/index.html", `
  • deleted
  • `, `
  • inserted
  • `, `
  • marked
  • `, `
  • H2O
  • `, `
  • 1st
  • `, ) files = strings.ReplaceAll(files, "enable = true", "enable = false") b = hugolib.Test(t, files) b.AssertFileContent("public/index.html", `
  • ~~deleted~~
  • `, `
  • ++inserted++
  • `, `
  • ==marked==
  • `, `
  • H~2~O
  • `, `
  • 1^st^
  • `, ) }