Fix RenderString vs render hooks
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 24 May 2020 11:03:32 +0000 (13:03 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 24 May 2020 11:20:57 +0000 (13:20 +0200)
Fixes #7265

hugolib/content_render_hooks_test.go
hugolib/page.go
hugolib/page__output.go
hugolib/page__per_output.go

index ef7373ea75313c52f0c1ef053a4c29bfc7d69b85..f161a46a268e987c7cd28a52bb86f5629f12d9b4 100644 (file)
@@ -364,9 +364,10 @@ func TestRenderString(t *testing.T) {
 RSTART:{{ "**Bold Markdown**" | $p.RenderString }}:REND
 RSTART:{{  "**Bold Block Markdown**" | $p.RenderString  $optBlock }}:REND
 RSTART:{{  "/italic org mode/" | $p.RenderString  $optOrg }}:REND
+RSTART:{{ "## Header2" | $p.RenderString }}:REND
 
 
-`)
+`, "_default/_markup/render-heading.html", "Hook Heading: {{ .Level }}")
 
        b.WithContent("p1.md", `---
 title: "p1"
@@ -380,6 +381,7 @@ title: "p1"
 RSTART:<strong>Bold Markdown</strong>:REND
 RSTART:<p><strong>Bold Block Markdown</strong></p>
 RSTART:<em>italic org mode</em>:REND
+RSTART:Hook Heading: 2:REND
 `)
 
 }
index dbcc31236981e30eae0005ffb09561657baa5fc4..083e702ed7cdfeff0c2a51442711b193c5682222 100644 (file)
@@ -604,6 +604,10 @@ func (p *pageState) RenderString(args ...interface{}) (template.HTML, error) {
                return "", err
        }
 
+       if err = p.pageOutput.initRenderHooks(); err != nil {
+               return "", err
+       }
+
        conv := p.getContentConverter()
        if opts.Markup != "" && opts.Markup != p.m.markup {
                var err error
index 7d5b78aae55916f1584d9e28c098ccc91a90bfe9..1792e8d6acaa944ef578b33fcc707ea5369a68f0 100644 (file)
@@ -96,24 +96,28 @@ func (o *pageOutput) initRenderHooks() error {
                return nil
        }
 
-       ps := o.cp.p
+       var initErr error
 
-       c := ps.getContentConverter()
-       if c == nil || !c.Supports(converter.FeatureRenderHooks) {
-               return nil
-       }
+       o.cp.renderHooks.init.Do(func() {
+               ps := o.cp.p
 
-       h, err := ps.createRenderHooks(o.f)
-       if err != nil {
-               return err
-       }
-       if h == nil {
-               return nil
-       }
+               c := ps.getContentConverter()
+               if c == nil || !c.Supports(converter.FeatureRenderHooks) {
+                       return
+               }
+
+               h, err := ps.createRenderHooks(o.f)
+               if err != nil {
+                       initErr = err
+               }
+               if h == nil {
+                       return
+               }
 
-       o.cp.renderHooks = h
+               o.cp.renderHooks.hooks = h
+       })
 
-       return nil
+       return initErr
 
 }
 
index 77a01801d667333f891729c84b5f334ff26deffb..9a2d0b5f96f902696caac8989d1c732235dabed4 100644 (file)
@@ -77,6 +77,7 @@ func newPageContentOutput(p *pageState, po *pageOutput) (*pageContentOutput, err
                dependencyTracker: dependencyTracker,
                p:                 p,
                f:                 po.f,
+               renderHooks:       &renderHooks{},
        }
 
        initContent := func() (err error) {
@@ -227,6 +228,11 @@ func newPageContentOutput(p *pageState, po *pageOutput) (*pageContentOutput, err
 
 }
 
+type renderHooks struct {
+       hooks *hooks.Renderers
+       init  sync.Once
+}
+
 // pageContentOutput represents the Page content for a given output format.
 type pageContentOutput struct {
        f output.Format
@@ -244,8 +250,8 @@ type pageContentOutput struct {
        placeholdersEnabled     bool
        placeholdersEnabledInit sync.Once
 
-       // May be nil.
-       renderHooks *hooks.Renderers
+       renderHooks *renderHooks
+
        // Set if there are more than one output format variant
        renderHooksHaveVariants bool // TODO(bep) reimplement this in another way, consolidate with shortcodes
 
@@ -285,6 +291,7 @@ func (p *pageContentOutput) Reset() {
        }
        p.initMain.Reset()
        p.initPlain.Reset()
+       p.renderHooks = &renderHooks{}
 }
 
 func (p *pageContentOutput) Content() (interface{}, error) {
@@ -377,7 +384,7 @@ func (cp *pageContentOutput) renderContentWithConverter(c converter.Converter, c
                converter.RenderContext{
                        Src:         content,
                        RenderTOC:   renderTOC,
-                       RenderHooks: cp.renderHooks,
+                       RenderHooks: cp.renderHooks.hooks,
                })
 
        if err == nil {