diff --git a/docs/content/en/content-management/front-matter.md b/docs/content/en/content-management/front-matter.md index 6986f067fa6..cac4ef9525e 100644 --- a/docs/content/en/content-management/front-matter.md +++ b/docs/content/en/content-management/front-matter.md @@ -189,6 +189,9 @@ kind lang : A Glob pattern matching the Page's language, e.g. "{en,sv}". +environment +: A Glob pattern matching the build environment, e.g. "{production,development}" + Any of the above can be omitted. ### Example diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go index c218aa28263..0a7f66e6c1b 100644 --- a/hugolib/cascade_test.go +++ b/hugolib/cascade_test.go @@ -550,6 +550,32 @@ S1|p1:|p2:p2| `) }) + c.Run("slice with environment _target", func(c *qt.C) { + b := newBuilder(c) + + b.WithContent("_index.md", `+++ +title = "Home" +[[cascade]] +p1 = "p1" +[cascade._target] +path="**p1**" +environment="testing" +[[cascade]] +p2 = "p2" +[cascade._target] +kind="section" +environment="production" ++++ +`) + + b.Build(BuildCfg{}) + + b.AssertFileContent("public/index.html", ` +P1|p1:|p2:| +S1|p1:|p2:p2| +`) + }) + c.Run("slice with yaml _target", func(c *qt.C) { b := newBuilder(c) diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go index 15b8ede8989..4626186c5cf 100644 --- a/resources/page/page_matcher.go +++ b/resources/page/page_matcher.go @@ -37,6 +37,9 @@ type PageMatcher struct { // A Glob pattern matching the Page's language, e.g. "{en,sv}". Lang string + + // A Glob pattern matching the Page's Environment, e.g. "{production,development}". + Environment string } // Matches returns whether p matches this matcher. @@ -67,6 +70,13 @@ func (m PageMatcher) Matches(p Page) bool { } } + if m.Environment != "" { + g, err := glob.GetGlob(m.Environment) + if err == nil && !g.Match(p.Site().Hugo().Environment) { + return false + } + } + return true } diff --git a/resources/page/page_matcher_test.go b/resources/page/page_matcher_test.go index 72aec5f2a64..846ab2c0341 100644 --- a/resources/page/page_matcher_test.go +++ b/resources/page/page_matcher_test.go @@ -14,6 +14,7 @@ package page import ( + "github.com/gohugoio/hugo/common/hugo" "path/filepath" "testing" @@ -22,8 +23,13 @@ import ( func TestPageMatcher(t *testing.T) { c := qt.New(t) + developmentTestSite := testSite{h: hugo.NewInfo("development", nil)} + productionTestSite := testSite{h: hugo.NewInfo("production", nil)} - p1, p2, p3 := &testPage{path: "/p1", kind: "section", lang: "en"}, &testPage{path: "p2", kind: "page", lang: "no"}, &testPage{path: "p3", kind: "page", lang: "en"} + p1, p2, p3 := + &testPage{path: "/p1", kind: "section", lang: "en", site: developmentTestSite}, + &testPage{path: "p2", kind: "page", lang: "no", site: productionTestSite}, + &testPage{path: "p3", kind: "page", lang: "en"} c.Run("Matches", func(c *qt.C) { m := PageMatcher{Kind: "section"} @@ -50,6 +56,16 @@ func TestPageMatcher(t *testing.T) { c.Assert(m.Matches(p1), qt.Equals, true) c.Assert(m.Matches(p2), qt.Equals, false) c.Assert(m.Matches(p3), qt.Equals, true) + + m = PageMatcher{Environment: "development"} + c.Assert(m.Matches(p1), qt.Equals, true) + c.Assert(m.Matches(p2), qt.Equals, false) + c.Assert(m.Matches(p3), qt.Equals, false) + + m = PageMatcher{Environment: "production"} + c.Assert(m.Matches(p1), qt.Equals, false) + c.Assert(m.Matches(p2), qt.Equals, true) + c.Assert(m.Matches(p3), qt.Equals, false) }) c.Run("Decode", func(c *qt.C) { diff --git a/resources/page/testhelpers_test.go b/resources/page/testhelpers_test.go index 6758667996e..6acb4cfe46e 100644 --- a/resources/page/testhelpers_test.go +++ b/resources/page/testhelpers_test.go @@ -94,6 +94,7 @@ type testPage struct { linkTitle string lang string section string + site testSite content string @@ -532,7 +533,7 @@ func (p *testPage) SectionsPath() string { } func (p *testPage) Site() Site { - panic("not implemented") + return p.site } func (p *testPage) Sites() Sites {