From 9698b0dab11f52d52145e85ff71311d2f103cb4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 24 May 2020 13:03:32 +0200 Subject: [PATCH] Fix RenderString vs render hooks Fixes #7265 --- hugolib/content_render_hooks_test.go | 4 +++- hugolib/page.go | 4 ++++ hugolib/page__output.go | 32 ++++++++++++++++------------ hugolib/page__per_output.go | 13 ++++++++--- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/hugolib/content_render_hooks_test.go b/hugolib/content_render_hooks_test.go index ef7373ea7..f161a46a2 100644 --- a/hugolib/content_render_hooks_test.go +++ b/hugolib/content_render_hooks_test.go @@ -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:Bold Markdown:REND RSTART:

Bold Block Markdown

RSTART:italic org mode:REND +RSTART:Hook Heading: 2:REND `) } diff --git a/hugolib/page.go b/hugolib/page.go index dbcc31236..083e702ed 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -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 diff --git a/hugolib/page__output.go b/hugolib/page__output.go index 7d5b78aae..1792e8d6a 100644 --- a/hugolib/page__output.go +++ b/hugolib/page__output.go @@ -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 + } - o.cp.renderHooks = h + h, err := ps.createRenderHooks(o.f) + if err != nil { + initErr = err + } + if h == nil { + return + } - return nil + o.cp.renderHooks.hooks = h + }) + + return initErr } diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go index 77a01801d..9a2d0b5f9 100644 --- a/hugolib/page__per_output.go +++ b/hugolib/page__per_output.go @@ -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 {