summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-03-05 09:51:14 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-03-05 12:51:57 +0100
commitdf5608f8a0706c6519f50b5497e36c21b8e790be (patch)
treea5bd23a5f67ac1d9e9a7915bf94aead301d1c503
parentf56ce01ae1a3e5b399410ea8876ebc7321204edd (diff)
Allow page.TableOfContents on self in shortcode
Fixes #10791
-rw-r--r--hugolib/page.go12
-rw-r--r--hugolib/page__output.go15
-rw-r--r--resources/page/page_lazy_contentprovider.go5
-rw-r--r--tpl/page/integration_test.go32
4 files changed, 46 insertions, 18 deletions
diff --git a/hugolib/page.go b/hugolib/page.go
index 40972d7c5..aa107c63e 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 4ef78b612..ae2fdb778 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 d944b66d3..400b9e4f0 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 30a4885e0..74788377d 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", "<nav id=\"TableOfContents\"></nav> \n<h1 id=\"heading-1\">Heading 1</h1>")
+
+}