Fix RenderString for pages without content

Fixes #6882
This commit is contained in:
Bjørn Erik Pedersen 2020-02-18 14:00:58 +01:00
parent 20f2211fce
commit 19e12caf8c
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
4 changed files with 62 additions and 13 deletions

View file

@ -372,3 +372,30 @@ RSTART:<em>italic org mode</em>: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, `<strong>Hello</strong>`)
}
}

View file

@ -631,6 +631,20 @@ func (p *pageState) wrapError(err error) error {
} }
func (p *pageState) getContentConverter() converter.Converter { 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 return p.m.contentConverter
} }

View file

@ -19,6 +19,7 @@ import (
"path/filepath" "path/filepath"
"regexp" "regexp"
"strings" "strings"
"sync"
"time" "time"
"github.com/gohugoio/hugo/markup/converter" "github.com/gohugoio/hugo/markup/converter"
@ -118,7 +119,9 @@ type pageMeta struct {
s *Site s *Site
contentConverter converter.Converter renderingConfigOverrides map[string]interface{}
contentConverterInit sync.Once
contentConverter converter.Converter
} }
func (p *pageMeta) Aliases() []string { func (p *pageMeta) Aliases() []string {
@ -686,17 +689,8 @@ func (p *pageMeta) applyDefaultValues(n *contentNode) error {
renderingConfigOverrides = maps.ToStringMap(bfParam) renderingConfigOverrides = maps.ToStringMap(bfParam)
} }
markup := p.markup p.renderingConfigOverrides = renderingConfigOverrides
if markup == "html" {
// Only used for shortcode inner content.
markup = "markdown"
}
cp, err := p.newContentConverter(n.p, markup, renderingConfigOverrides)
if err != nil {
return err
}
p.contentConverter = cp
} }
return nil return nil
@ -709,7 +703,7 @@ func (p *pageMeta) newContentConverter(ps *pageState, markup string, renderingCo
} }
cp := p.s.ContentSpec.Converters.Get(markup) cp := p.s.ContentSpec.Converters.Get(markup)
if cp == nil { 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( cpp, err := cp.New(
@ -722,7 +716,7 @@ func (p *pageMeta) newContentConverter(ps *pageState, markup string, renderingCo
) )
if err != nil { if err != nil {
return nil, err return converter.NopConverter, err
} }
return cpp, nil return cpp, nil

View file

@ -14,6 +14,8 @@
package converter package converter
import ( import (
"bytes"
"github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/loggers"
"github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/identity" "github.com/gohugoio/hugo/identity"
@ -65,6 +67,18 @@ func (n newConverter) Name() string {
return n.name 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 // Converter wraps the Convert method that converts some markup into
// another format, e.g. Markdown to HTML. // another format, e.g. Markdown to HTML.
type Converter interface { type Converter interface {