diff --git a/hugolib/content_render_hooks_test.go b/hugolib/content_render_hooks_test.go index 1db232d05..fb9b6b83c 100644 --- a/hugolib/content_render_hooks_test.go +++ b/hugolib/content_render_hooks_test.go @@ -372,3 +372,30 @@ RSTART:italic org mode:REND `) } + +// https://github.com/gohugoio/hugo/issues/6882 +func TestRenderStringOnListPage(t *testing.T) { + renderStringTempl := ` +{{ .RenderString "**Hello**" }} +` + b := newTestSitesBuilder(t) + b.WithContent("mysection/p1.md", `FOO`) + b.WithTemplates( + "index.html", renderStringTempl, + "_default/list.html", renderStringTempl, + "_default/single.html", renderStringTempl, + ) + + b.Build(BuildCfg{}) + + for _, filename := range []string{ + "index.html", + "mysection/index.html", + "categories/index.html", + "tags/index.html", + "mysection/p1/index.html", + } { + b.AssertFileContent("public/"+filename, `Hello`) + } + +} diff --git a/hugolib/page.go b/hugolib/page.go index 4ffcb6264..fa6c84d87 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -631,6 +631,20 @@ func (p *pageState) wrapError(err error) error { } func (p *pageState) getContentConverter() converter.Converter { + var err error + p.m.contentConverterInit.Do(func() { + markup := p.m.markup + if markup == "html" { + // Only used for shortcode inner content. + markup = "markdown" + } + p.m.contentConverter, err = p.m.newContentConverter(p, markup, p.m.renderingConfigOverrides) + + }) + + if err != nil { + p.s.Log.ERROR.Println("Failed to create content converter:", err) + } return p.m.contentConverter } diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 8ecffbda3..7eb7cbfe1 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -19,6 +19,7 @@ import ( "path/filepath" "regexp" "strings" + "sync" "time" "github.com/gohugoio/hugo/markup/converter" @@ -118,7 +119,9 @@ type pageMeta struct { s *Site - contentConverter converter.Converter + renderingConfigOverrides map[string]interface{} + contentConverterInit sync.Once + contentConverter converter.Converter } func (p *pageMeta) Aliases() []string { @@ -686,17 +689,8 @@ func (p *pageMeta) applyDefaultValues(n *contentNode) error { renderingConfigOverrides = maps.ToStringMap(bfParam) } - markup := p.markup - if markup == "html" { - // Only used for shortcode inner content. - markup = "markdown" - } + p.renderingConfigOverrides = renderingConfigOverrides - cp, err := p.newContentConverter(n.p, markup, renderingConfigOverrides) - if err != nil { - return err - } - p.contentConverter = cp } return nil @@ -709,7 +703,7 @@ func (p *pageMeta) newContentConverter(ps *pageState, markup string, renderingCo } cp := p.s.ContentSpec.Converters.Get(markup) if cp == nil { - return nil, errors.Errorf("no content renderer found for markup %q", p.markup) + return converter.NopConverter, errors.Errorf("no content renderer found for markup %q", p.markup) } cpp, err := cp.New( @@ -722,7 +716,7 @@ func (p *pageMeta) newContentConverter(ps *pageState, markup string, renderingCo ) if err != nil { - return nil, err + return converter.NopConverter, err } return cpp, nil diff --git a/markup/converter/converter.go b/markup/converter/converter.go index b8a5c92c1..353775826 100644 --- a/markup/converter/converter.go +++ b/markup/converter/converter.go @@ -14,6 +14,8 @@ package converter import ( + "bytes" + "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/identity" @@ -65,6 +67,18 @@ func (n newConverter) Name() string { return n.name } +var NopConverter = new(nopConverter) + +type nopConverter int + +func (nopConverter) Convert(ctx RenderContext) (Result, error) { + return &bytes.Buffer{}, nil +} + +func (nopConverter) Supports(feature identity.Identity) bool { + return false +} + // Converter wraps the Convert method that converts some markup into // another format, e.g. Markdown to HTML. type Converter interface {