diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-10-26 10:09:38 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-10-26 13:00:21 +0200 |
commit | 631d768be9dc2d5175eeacb8bf34ed8233e2201a (patch) | |
tree | 670dbabab18d4215f2495dd07fe012ed4e223438 /hugolib | |
parent | e5d2a8f6a3121701eb95712b5540989fafaa0c71 (diff) |
Revise the fix for shortcode vs output format nilpointer
We do lazy initialization and (potentially) reuse of an output format's rendered content. We do this evaluation when we
start a new rendering a new output format. There are, however, situation where these borders gets crossed (e.g.
accessing content from another output format). We have a check for this in place for most cases, but not the content
rendering of inner markdown blocks inside shortcodes. This patch applies that same logic to the newly introduced
RenderContent method (which is not available from the templates).
Fixes #10391
Diffstat (limited to 'hugolib')
-rw-r--r-- | hugolib/page.go | 1 | ||||
-rw-r--r-- | hugolib/page__output.go | 3 | ||||
-rw-r--r-- | hugolib/page__per_output.go | 6 | ||||
-rw-r--r-- | hugolib/shortcode.go | 13 |
4 files changed, 8 insertions, 15 deletions
diff --git a/hugolib/page.go b/hugolib/page.go index 37bf528c7..9f0d08ca3 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -909,6 +909,7 @@ func (p *pageState) shiftToOutputFormat(isRenderingSite bool, idx int) error { } return cp, nil }) + p.pageOutput.contentRenderer = lcp p.pageOutput.ContentProvider = lcp p.pageOutput.TableOfContentsProvider = lcp p.pageOutput.PageRenderProvider = lcp diff --git a/hugolib/page__output.go b/hugolib/page__output.go index 413323477..4ef78b612 100644 --- a/hugolib/page__output.go +++ b/hugolib/page__output.go @@ -81,6 +81,7 @@ type pageOutput struct { // These interface provides the functionality that is specific for this // output format. + contentRenderer page.ContentRenderer pagePerOutputProviders page.ContentProvider page.TableOfContentsProvider @@ -94,10 +95,12 @@ func (p *pageOutput) initContentProvider(cp *pageContentOutput) { if cp == nil { return } + p.contentRenderer = cp p.ContentProvider = cp p.TableOfContentsProvider = cp p.PageRenderProvider = cp p.cp = cp + } func (p *pageOutput) enablePlaceholders() { diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go index de70047c9..e8dc69507 100644 --- a/hugolib/page__per_output.go +++ b/hugolib/page__per_output.go @@ -123,7 +123,7 @@ func newPageContentOutput(p *pageState, po *pageOutput) (*pageContentOutput, err isHTML := cp.p.m.markup == "html" if !isHTML { - r, err := cp.renderContent(cp.workContent, true) + r, err := po.contentRenderer.RenderContent(cp.workContent, true) if err != nil { return err } @@ -183,7 +183,7 @@ func newPageContentOutput(p *pageState, po *pageOutput) (*pageContentOutput, err } } } else if cp.p.m.summary != "" { - b, err := cp.renderContent([]byte(cp.p.m.summary), false) + b, err := po.contentRenderer.RenderContent([]byte(cp.p.m.summary), false) if err != nil { return err } @@ -629,7 +629,7 @@ func (p *pageContentOutput) setAutoSummary() error { return nil } -func (cp *pageContentOutput) renderContent(content []byte, renderTOC bool) (converter.Result, error) { +func (cp *pageContentOutput) RenderContent(content []byte, renderTOC bool) (converter.Result, error) { if err := cp.initRenderHooks(); err != nil { return nil, err } diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index a10afe2bc..2951a1436 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -381,19 +381,8 @@ func renderShortcode( // Pre Hugo 0.55 this was the behaviour even for the outer-most // shortcode. if sc.doMarkup && (level > 0 || sc.configVersion() == 1) { - - cp := p.pageOutput.cp - if cp == nil { - var err error - cp, err = newPageContentOutput(p, p.pageOutput) - if err != nil { - return "", false, err - } - p.pageOutput.initContentProvider(cp) - } - var err error - b, err := p.pageOutput.cp.renderContent([]byte(inner), false) + b, err := p.pageOutput.contentRenderer.RenderContent([]byte(inner), false) if err != nil { return "", false, err } |