Add page.Store

Fixes #9546
This commit is contained in:
Bjørn Erik Pedersen 2022-02-22 14:42:33 +01:00
parent 7732da9f93
commit e97d3c640f
6 changed files with 69 additions and 1 deletions

View file

@ -60,6 +60,9 @@ type pageCommon struct {
// Lazily initialized dependencies. // Lazily initialized dependencies.
init *lazy.Init init *lazy.Init
// Store holds state that survives server rebuilds.
store *maps.Scratch
// All of these represents the common parts of a page.Page // All of these represents the common parts of a page.Page
maps.Scratcher maps.Scratcher
navigation.PageMenusProvider navigation.PageMenusProvider
@ -134,6 +137,10 @@ type pageCommon struct {
forceRender bool forceRender bool
} }
func (p *pageCommon) Store() *maps.Scratch {
return p.store
}
type pagePages struct { type pagePages struct {
pagesInit sync.Once pagesInit sync.Once
pages page.Pages pages page.Pages

View file

@ -41,6 +41,7 @@ func newPageBase(metaProvider *pageMeta) (*pageState, error) {
FileProvider: metaProvider, FileProvider: metaProvider,
AuthorProvider: metaProvider, AuthorProvider: metaProvider,
Scratcher: maps.NewScratcher(), Scratcher: maps.NewScratcher(),
store: maps.NewScratch(),
Positioner: page.NopPage, Positioner: page.NopPage,
InSectionPositioner: page.NopPage, InSectionPositioner: page.NopPage,
ResourceMetaProvider: metaProvider, ResourceMetaProvider: metaProvider,

View file

@ -1769,7 +1769,7 @@ Summary: In Chinese, 好 means good.
b.AssertFileContent("public/p6/index.html", "WordCount: 7\nFuzzyWordCount: 100\nReadingTime: 1\nLen Plain: 638\nLen PlainWords: 7\nTruncated: false\nLen Summary: 637\nLen Content: 652") b.AssertFileContent("public/p6/index.html", "WordCount: 7\nFuzzyWordCount: 100\nReadingTime: 1\nLen Plain: 638\nLen PlainWords: 7\nTruncated: false\nLen Summary: 637\nLen Content: 652")
} }
func TestScratchSite(t *testing.T) { func TestScratch(t *testing.T) {
t.Parallel() t.Parallel()
b := newTestSitesBuilder(t) b := newTestSitesBuilder(t)
@ -1796,6 +1796,50 @@ title: Scratch Me!
b.AssertFileContent("public/scratchme/index.html", "C: cv") b.AssertFileContent("public/scratchme/index.html", "C: cv")
} }
func TestScratchRebuild(t *testing.T) {
t.Parallel()
files := `
-- config.toml --
-- content/p1.md --
---
title: "p1"
---
{{< scratchme >}}
-- layouts/shortcodes/foo.html --
notused
-- layouts/shortcodes/scratchme.html --
{{ .Page.Scratch.Set "scratch" "foo" }}
{{ .Page.Store.Set "scratch" "bar" }}
-- layouts/_default/single.html --
{{ .Content }}
Scratch: {{ .Scratch.Get "scratch" }}|
Store: {{ .Store.Get "scratch" }}|
`
b := NewIntegrationTestBuilder(
IntegrationTestConfig{
T: t,
TxtarString: files,
Running: true,
},
).Build()
b.AssertFileContent("public/p1/index.html", `
Scratch: foo|
Store: bar|
`)
b.EditFiles("layouts/shortcodes/foo.html", "edit")
b.Build()
b.AssertFileContent("public/p1/index.html", `
Scratch: |
Store: bar|
`)
}
func TestPageParam(t *testing.T) { func TestPageParam(t *testing.T) {
t.Parallel() t.Parallel()

View file

@ -261,7 +261,15 @@ type PageWithoutContent interface {
// Helper methods // Helper methods
ShortcodeInfoProvider ShortcodeInfoProvider
compare.Eqer compare.Eqer
// Scratch returns a Scratch that can be used to store temporary state.
// Note that this Scratch gets reset on server rebuilds. See Store() for a variant that survives.
maps.Scratcher maps.Scratcher
// Store returns a Scratch that can be used to store temporary state.
// In contrast to Scratch(), this Scratch is not reset on server rebuilds.
Store() *maps.Scratch
RelatedKeywordsProvider RelatedKeywordsProvider
// GetTerms gets the terms of a given taxonomy, // GetTerms gets the terms of a given taxonomy,

View file

@ -418,6 +418,10 @@ func (p *nopPage) Scratch() *maps.Scratch {
return nil return nil
} }
func (p *nopPage) Store() *maps.Scratch {
return nil
}
func (p *nopPage) RelatedKeywords(cfg related.IndexConfig) ([]related.Keyword, error) { func (p *nopPage) RelatedKeywords(cfg related.IndexConfig) ([]related.Keyword, error) {
return nil, nil return nil, nil
} }

View file

@ -498,6 +498,10 @@ func (p *testPage) Scratch() *maps.Scratch {
panic("not implemented") panic("not implemented")
} }
func (p *testPage) Store() *maps.Scratch {
panic("not implemented")
}
func (p *testPage) RelatedKeywords(cfg related.IndexConfig) ([]related.Keyword, error) { func (p *testPage) RelatedKeywords(cfg related.IndexConfig) ([]related.Keyword, error) {
v, err := p.Param(cfg.Name) v, err := p.Param(cfg.Name)
if err != nil { if err != nil {