URI: 
       Fix RenderString for pages without content - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit 19e12caf8c90516e3b803ae8a40b907bd89dc96c
   DIR parent 20f2211fce55e1811629245f9e5e4a2ac754d788
  HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Tue, 18 Feb 2020 14:00:58 +0100
       
       Fix RenderString for pages without content
       
       Fixes #6882
       
       Diffstat:
         M hugolib/content_render_hooks_test.… |      27 +++++++++++++++++++++++++++
         M hugolib/page.go                     |      14 ++++++++++++++
         M hugolib/page__meta.go               |      20 +++++++-------------
         M markup/converter/converter.go       |      14 ++++++++++++++
       
       4 files changed, 62 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/hugolib/content_render_hooks_test.go b/hugolib/content_render_hooks_test.go
       @@ -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>`)
       +        }
       +
       +}
   DIR diff --git 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
        }
        
   DIR diff --git 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
   DIR diff --git 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 {