mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-30 22:39:58 +02:00
@@ -1893,3 +1893,52 @@ func TestRenderWithoutArgument(t *testing.T) {
|
||||
|
||||
b.Assert(err, qt.IsNotNil)
|
||||
}
|
||||
|
||||
// Issue #13021
|
||||
func TestAllStores(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
files := `
|
||||
-- hugo.toml --
|
||||
disableKinds = ["taxonomy", "term", "page", "section"]
|
||||
disableLiveReload = true
|
||||
-- content/_index.md --
|
||||
---
|
||||
title: "Home"
|
||||
---
|
||||
{{< s >}}
|
||||
-- layouts/shortcodes/s.html --
|
||||
{{ if not (.Store.Get "Shortcode") }}{{ .Store.Set "Shortcode" (printf "sh-%s" $.Page.Title) }}{{ end }}
|
||||
Shortcode: {{ .Store.Get "Shortcode" }}|
|
||||
-- layouts/index.html --
|
||||
{{ .Content }}
|
||||
{{ if not (.Store.Get "Page") }}{{ .Store.Set "Page" (printf "p-%s" $.Title) }}{{ end }}
|
||||
{{ if not (hugo.Store.Get "Hugo") }}{{ hugo.Store.Set "Hugo" (printf "h-%s" $.Title) }}{{ end }}
|
||||
{{ if not (site.Store.Get "Site") }}{{ site.Store.Set "Site" (printf "s-%s" $.Title) }}{{ end }}
|
||||
Page: {{ .Store.Get "Page" }}|
|
||||
Hugo: {{ hugo.Store.Get "Hugo" }}|
|
||||
Site: {{ site.Store.Get "Site" }}|
|
||||
`
|
||||
|
||||
b := TestRunning(t, files)
|
||||
|
||||
b.AssertFileContent("public/index.html",
|
||||
`
|
||||
Shortcode: sh-Home|
|
||||
Page: p-Home|
|
||||
Site: s-Home|
|
||||
Hugo: h-Home|
|
||||
`,
|
||||
)
|
||||
|
||||
b.EditFileReplaceAll("content/_index.md", "Home", "Homer").Build()
|
||||
|
||||
b.AssertFileContent("public/index.html",
|
||||
`
|
||||
Shortcode: sh-Homer|
|
||||
Page: p-Homer|
|
||||
Site: s-Home|
|
||||
Hugo: h-Home|
|
||||
`,
|
||||
)
|
||||
}
|
||||
|
@@ -43,9 +43,10 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
_ urls.RefLinker = (*ShortcodeWithPage)(nil)
|
||||
_ types.Unwrapper = (*ShortcodeWithPage)(nil)
|
||||
_ text.Positioner = (*ShortcodeWithPage)(nil)
|
||||
_ urls.RefLinker = (*ShortcodeWithPage)(nil)
|
||||
_ types.Unwrapper = (*ShortcodeWithPage)(nil)
|
||||
_ text.Positioner = (*ShortcodeWithPage)(nil)
|
||||
_ maps.StoreProvider = (*ShortcodeWithPage)(nil)
|
||||
)
|
||||
|
||||
// ShortcodeWithPage is the "." context in a shortcode template.
|
||||
@@ -72,7 +73,7 @@ type ShortcodeWithPage struct {
|
||||
posOffset int
|
||||
pos text.Position
|
||||
|
||||
scratch *maps.Scratch
|
||||
store *maps.Scratch
|
||||
}
|
||||
|
||||
// InnerDeindent returns the (potentially de-indented) inner content of the shortcode.
|
||||
@@ -124,13 +125,19 @@ func (scp *ShortcodeWithPage) RelRef(args map[string]any) (string, error) {
|
||||
return scp.Page.RelRefFrom(args, scp)
|
||||
}
|
||||
|
||||
// Store returns this shortcode's Store.
|
||||
func (scp *ShortcodeWithPage) Store() *maps.Scratch {
|
||||
if scp.store == nil {
|
||||
scp.store = maps.NewScratch()
|
||||
}
|
||||
return scp.store
|
||||
}
|
||||
|
||||
// Scratch returns a scratch-pad scoped for this shortcode. This can be used
|
||||
// as a temporary storage for variables, counters etc.
|
||||
// Deprecated: Use Store instead. Note that from the templates this should be considered a "soft deprecation".
|
||||
func (scp *ShortcodeWithPage) Scratch() *maps.Scratch {
|
||||
if scp.scratch == nil {
|
||||
scp.scratch = maps.NewScratch()
|
||||
}
|
||||
return scp.scratch
|
||||
return scp.Store()
|
||||
}
|
||||
|
||||
// Get is a convenience method to look up shortcode parameters by its key.
|
||||
@@ -399,7 +406,16 @@ func doRenderShortcode(
|
||||
hasVariants = hasVariants || more
|
||||
}
|
||||
|
||||
data := &ShortcodeWithPage{Ordinal: sc.ordinal, posOffset: sc.pos, indentation: sc.indentation, Params: sc.params, Page: newPageForShortcode(p), Parent: parent, Name: sc.name}
|
||||
data := &ShortcodeWithPage{
|
||||
Ordinal: sc.ordinal,
|
||||
posOffset: sc.pos,
|
||||
indentation: sc.indentation,
|
||||
Params: sc.params,
|
||||
Page: newPageForShortcode(p),
|
||||
Parent: parent,
|
||||
Name: sc.name,
|
||||
}
|
||||
|
||||
if sc.params != nil {
|
||||
data.IsNamedParams = reflect.TypeOf(sc.params).Kind() == reflect.Map
|
||||
}
|
||||
|
@@ -95,6 +95,7 @@ type Site struct {
|
||||
language *langs.Language
|
||||
languagei int
|
||||
pageMap *pageMap
|
||||
store *maps.Scratch
|
||||
|
||||
// The owning container.
|
||||
h *HugoSites
|
||||
@@ -248,6 +249,7 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
|
||||
language: language,
|
||||
languagei: i,
|
||||
frontmatterHandler: frontmatterHandler,
|
||||
store: maps.NewScratch(),
|
||||
}
|
||||
|
||||
if i == 0 {
|
||||
@@ -614,6 +616,10 @@ func (s *Site) AllRegularPages() page.Pages {
|
||||
return s.h.RegularPages()
|
||||
}
|
||||
|
||||
func (s *Site) Store() *maps.Scratch {
|
||||
return s.store
|
||||
}
|
||||
|
||||
func (s *Site) CheckReady() {
|
||||
if s.state != siteStateReady {
|
||||
panic("this method cannot be called before the site is fully initialized")
|
||||
|
Reference in New Issue
Block a user