From df5608f8a0706c6519f50b5497e36c21b8e790be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 5 Mar 2023 09:51:14 +0100 Subject: [PATCH] Allow page.TableOfContents on self in shortcode Fixes #10791 --- hugolib/page.go | 12 +++++--- hugolib/page__output.go | 15 ++++------ resources/page/page_lazy_contentprovider.go | 5 ---- tpl/page/integration_test.go | 32 +++++++++++++++++++++ 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/hugolib/page.go b/hugolib/page.go index 40972d7c57d..aa107c63eb8 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -17,6 +17,7 @@ import ( "bytes" "context" "fmt" + "html/template" "path" "path/filepath" "sort" @@ -62,9 +63,8 @@ var ( var ( pageTypesProvider = resource.NewResourceTypesProvider(media.OctetType, pageResourceType) nopPageOutput = &pageOutput{ - pagePerOutputProviders: nopPagePerOutput, - ContentProvider: page.NopPage, - TableOfContentsProvider: page.NopPage, + pagePerOutputProviders: nopPagePerOutput, + ContentProvider: page.NopPage, } ) @@ -159,6 +159,11 @@ func (p *pageState) Fragments(ctx context.Context) *tableofcontents.Fragments { return p.pageOutput.cp.tableOfContents } +func (p *pageState) TableOfContents(ctx context.Context) template.HTML { + p.s.initInit(ctx, p.cp.initToC, p) + return p.pageOutput.cp.tableOfContentsHTML +} + func (p *pageState) HeadingsFiltered(context.Context) tableofcontents.Headings { return nil } @@ -951,7 +956,6 @@ func (p *pageState) shiftToOutputFormat(isRenderingSite bool, idx int) error { }) 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 4ef78b61262..ae2fdb77866 100644 --- a/hugolib/page__output.go +++ b/hugolib/page__output.go @@ -54,13 +54,12 @@ func newPageOutput( } po := &pageOutput{ - f: f, - pagePerOutputProviders: providers, - ContentProvider: page.NopPage, - TableOfContentsProvider: page.NopPage, - PageRenderProvider: page.NopPage, - render: render, - paginator: pag, + f: f, + pagePerOutputProviders: providers, + ContentProvider: page.NopPage, + PageRenderProvider: page.NopPage, + render: render, + paginator: pag, } return po @@ -84,7 +83,6 @@ type pageOutput struct { contentRenderer page.ContentRenderer pagePerOutputProviders page.ContentProvider - page.TableOfContentsProvider page.PageRenderProvider // May be nil. @@ -97,7 +95,6 @@ func (p *pageOutput) initContentProvider(cp *pageContentOutput) { } p.contentRenderer = cp p.ContentProvider = cp - p.TableOfContentsProvider = cp p.PageRenderProvider = cp p.cp = cp diff --git a/resources/page/page_lazy_contentprovider.go b/resources/page/page_lazy_contentprovider.go index d944b66d34c..400b9e4f075 100644 --- a/resources/page/page_lazy_contentprovider.go +++ b/resources/page/page_lazy_contentprovider.go @@ -128,11 +128,6 @@ func (lcp *LazyContentProvider) RenderString(ctx context.Context, args ...any) ( return lcp.cp.RenderString(ctx, args...) } -func (lcp *LazyContentProvider) TableOfContents(ctx context.Context) template.HTML { - lcp.init.Do(ctx) - return lcp.cp.TableOfContents(ctx) -} - func (lcp *LazyContentProvider) ParseAndRenderContent(ctx context.Context, content []byte, renderTOC bool) (converter.ResultRender, error) { lcp.init.Do(ctx) return lcp.cp.ParseAndRenderContent(ctx, content, renderTOC) diff --git a/tpl/page/integration_test.go b/tpl/page/integration_test.go index 30a4885e0cd..74788377d77 100644 --- a/tpl/page/integration_test.go +++ b/tpl/page/integration_test.go @@ -177,3 +177,35 @@ Shortcode in bundled page OK. } } + +// Issue 10791. +func TestPageTableOfContentsInShortcode(t *testing.T) { + t.Parallel() + + files := ` +-- config.toml -- +baseURL = 'http://example.com/' +disableKinds = ["taxonomy", "term"] +-- content/p1.md -- +--- +title: "P1" +--- +{{< toc >}} + +# Heading 1 +-- layouts/shortcodes/toc.html -- +{{ page.TableOfContents }} +-- layouts/_default/single.html -- +{{ .Content }} +` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + }, + ).Build() + + b.AssertFileContent("public/p1/index.html", " \n

Heading 1

") + +}