)
}
+ if cfg.Extensions.Passthrough.Enable {
+ tocRendererOptions = append(tocRendererOptions,
+ renderer.WithNodeRenderers(util.Prioritized(&tocPassthroughRenderer{}, 90)),
+ )
+ }
+
var (
extensions = []goldmark.Extender{
hugocontext.New(pcfg.Logger),
emojiAst "github.com/yuin/goldmark-emoji/ast"
"github.com/gohugoio/hugo-goldmark-extensions/extras"
+ "github.com/gohugoio/hugo-goldmark-extensions/passthrough"
"github.com/gohugoio/hugo/markup/tableofcontents"
"github.com/yuin/goldmark"
ast.KindAutoLink,
ast.KindRawHTML,
ast.KindText,
- ast.KindString:
+ ast.KindString,
+ passthrough.KindPassthroughInline,
+ passthrough.KindPassthroughBlock:
err := t.r.Render(&headingText, reader.Source(), n)
if err != nil {
return s, err
return p
}
+// tocPassthroughRenderer renders passthrough nodes as raw text for the TOC.
+type tocPassthroughRenderer struct{}
+
+func (r *tocPassthroughRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
+ reg.Register(passthrough.KindPassthroughInline, r.render)
+ reg.Register(passthrough.KindPassthroughBlock, r.render)
+}
+
+func (r *tocPassthroughRenderer) render(w util.BufWriter, src []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
+ if !entering {
+ return ast.WalkContinue, nil
+ }
+ switch nn := node.(type) {
+ case *passthrough.PassthroughInline:
+ w.Write(nn.Segment.Value(src))
+ case *passthrough.PassthroughBlock:
+ for i := range nn.Lines().Len() {
+ line := nn.Lines().At(i)
+ w.Write(line.Value(src))
+ }
+ }
+ return ast.WalkSkipChildren, nil
+}
+
var whiteSpaceRe = regexp.MustCompile(`\s+`)
// sanitizeTOCHeadingTitle sanitizes s for use as a TOC heading title.
`<li><a href="#1st">1^st^</a></li>`,
)
}
+
+// Issue 14677
+func TestTableOfContentsWithPassthrough(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+disableKinds = ['page','rss','section','sitemap','taxonomy','term']
+[markup.goldmark.extensions.passthrough]
+ enable = true
+[markup.goldmark.extensions.passthrough.delimiters]
+ inline = [['$', '$']]
+-- content/_index.md --
+---
+title: home
+---
+## Heading with **$a$**
+
+## Heading with $b$
+
+## Heading with *$x + y$*
+
+-- layouts/home.html --
+{{ .TableOfContents }}
+`
+
+ b := hugolib.Test(t, files)
+
+ b.AssertFileContent("public/index.html",
+ `<li><a href="#heading-with">Heading with <strong>$a$</strong></a></li>`,
+ `<li><a href="#heading-with-1">Heading with $b$</a></li>`,
+ `<li><a href="#heading-with-2">Heading with <em>$x + y$</em></a></li>`,
+ )
+}