ref: 634938908ec8f393b9a05d26b4cfe19ca7abb0d0
parent: c63db7f1f6774a2d661af1d8197c6fe377e3ad25
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Tue Oct 6 07:19:31 EDT 2020
pagemeta: Make BuildConfig.Render an enum Allowing links on pages without rendering them. Fixes #7783
--- a/docs/content/en/content-management/build-options.md
+++ b/docs/content/en/content-management/build-options.md
@@ -20,13 +20,24 @@
```yaml
_build:
- render: true
+ render: always
list: always
publishResources: true
```
#### render
-If true, the page will be treated as a published page, holding its dedicated output files (`index.html`, etc...) and permalink.
+If `always`, the page will be treated as a published page, holding its dedicated output files (`index.html`, etc...) and permalink.
+
+{{< new-in "0.76.0" >}} We extended this property from a boolean to an enum in Hugo 0.76.0. Valid values are:
+
+never
+: The page will not be included in any page collection.
+
+always (default)
+: The page will be rendered to disk and get a `RelPermalink` etc.
+
+link
+: The page will be not be rendered to disk, but will get a `RelPermalink`.
#### list
--- a/hugolib/disableKinds_test.go
+++ b/hugolib/disableKinds_test.go
@@ -54,8 +54,16 @@
_build:
render: false
---
-`, "sect/no-publishresources/index.md", `
+`,
+ "sect/no-render-link.md", `
---
+title: No Render Link
+_build:
+ render: link
+---
+`,
+ "sect/no-publishresources/index.md", `
+---
title: No Publish Resources
_build:
publishResources: false
@@ -297,6 +305,20 @@
p := getPage(b, ref)
b.Assert(p, qt.Not(qt.IsNil))
b.Assert(p.RelPermalink(), qt.Equals, "")
+ b.Assert(p.OutputFormats(), qt.HasLen, 0)
+ b.Assert(getPageInSitePages(b, ref), qt.Not(qt.IsNil))
+ sect := getPage(b, "/sect")
+ b.Assert(getPageInPagePages(sect, ref), qt.Not(qt.IsNil))
+ })
+
+ c.Run("Build config, no render link", func(c *qt.C) {
+ b := newSitesBuilder(c, disableKind)
+ b.Build(BuildCfg{})
+ ref := "/sect/no-render-link.md"
+ b.Assert(b.CheckExists("public/sect/no-render/index.html"), qt.Equals, false)
+ p := getPage(b, ref)
+ b.Assert(p, qt.Not(qt.IsNil))
+ b.Assert(p.RelPermalink(), qt.Equals, "/blog/sect/no-render-link/")
b.Assert(p.OutputFormats(), qt.HasLen, 0)
b.Assert(getPageInSitePages(b, ref), qt.Not(qt.IsNil))
sect := getPage(b, "/sect")
--- a/hugolib/page__meta.go
+++ b/hugolib/page__meta.go
@@ -506,7 +506,7 @@
pm.params[loki] = isHeadless
if p.File().TranslationBaseName() == "index" && isHeadless {
pm.buildConfig.List = pagemeta.Never
- pm.buildConfig.Render = false
+ pm.buildConfig.Render = pagemeta.Never
}
case "outputs":
o := cast.ToStringSlice(v)
@@ -683,7 +683,11 @@
}
func (p *pageMeta) noRender() bool {
- return !p.buildConfig.Render
+ return p.buildConfig.Render != pagemeta.Always
+}
+
+func (p *pageMeta) noLink() bool {
+ return p.buildConfig.Render == pagemeta.Never
}
func (p *pageMeta) applyDefaultValues(n *contentNode) error {
--- a/hugolib/page__paths.go
+++ b/hugolib/page__paths.go
@@ -51,9 +51,11 @@
var relPermalink, permalink string
- // If a page is headless or marked as "no render", or bundled in another,
+ // If a page is headless or bundled in another,
// it will not get published on its own and it will have no links.
- if !pm.noRender() && !pm.bundled {
+ // We also check the build options if it's set to not render or have
+ // a link.
+ if !pm.noLink() && !pm.bundled {
relPermalink = paths.RelPermalink(s.PathSpec)
permalink = paths.PermalinkForOutputFormat(s.PathSpec, f)
}
--- a/resources/page/pagemeta/pagemeta.go
+++ b/resources/page/pagemeta/pagemeta.go
@@ -28,11 +28,12 @@
Never = "never"
Always = "always"
ListLocally = "local"
+ Link = "link"
)
var defaultBuildConfig = BuildConfig{
List: Always,
- Render: true,
+ Render: Always,
PublishResources: true,
set: true,
}
@@ -49,7 +50,10 @@
List string
// Whether to render it.
- Render bool
+ // Valid values: never, always, link.
+ // The value link means it will not be rendered, but it will get a RelPermalink/Permalink.
+ // Note that before 0.76.0 this was a bool, so we accept those too.
+ Render string
// Whether to publish its resources. These will still be published on demand,
// but enabling this can be useful if the originals (e.g. images) are
@@ -62,7 +66,7 @@
// Disable sets all options to their off value.
func (b *BuildConfig) Disable() {
b.List = Never
- b.Render = false
+ b.Render = Never
b.PublishResources = false
b.set = true
}
@@ -89,6 +93,17 @@
case Always, Never, ListLocally:
default:
b.List = Always
+ }
+
+ // In 0.76.0 we changed the Render from bool to a string.
+ switch b.Render {
+ case "0":
+ b.Render = Never
+ case "1":
+ b.Render = Always
+ case Always, Never, Link:
+ default:
+ b.Render = Always
}
return b, err
--- a/resources/page/pagemeta/pagemeta_test.go
+++ b/resources/page/pagemeta/pagemeta_test.go
@@ -31,21 +31,54 @@
configTempl := `
[_build]
-render = true
+render = %s
list = %s
publishResources = true`
for _, test := range []struct {
- list interface{}
- expect string
+ args []interface{}
+ expect BuildConfig
}{
- {"true", Always},
- {"false", Never},
- {`"always"`, Always},
- {`"local"`, ListLocally},
- {`"asdfadf"`, Always},
+ {
+ []interface{}{"true", "true"},
+ BuildConfig{
+ Render: Always,
+ List: Always,
+ PublishResources: true,
+ set: true,
+ }},
+ {[]interface{}{"true", "false"}, BuildConfig{
+ Render: Always,
+ List: Never,
+ PublishResources: true,
+ set: true,
+ }},
+ {[]interface{}{`"always"`, `"always"`}, BuildConfig{
+ Render: Always,
+ List: Always,
+ PublishResources: true,
+ set: true,
+ }},
+ {[]interface{}{`"never"`, `"never"`}, BuildConfig{
+ Render: Never,
+ List: Never,
+ PublishResources: true,
+ set: true,
+ }},
+ {[]interface{}{`"link"`, `"local"`}, BuildConfig{
+ Render: Link,
+ List: ListLocally,
+ PublishResources: true,
+ set: true,
+ }},
+ {[]interface{}{`"always"`, `"asdfadf"`}, BuildConfig{
+ Render: Always,
+ List: Always,
+ PublishResources: true,
+ set: true,
+ }},
} {
- cfg, err := config.FromConfigString(fmt.Sprintf(configTempl, test.list), "toml")
+ cfg, err := config.FromConfigString(fmt.Sprintf(configTempl, test.args...), "toml")
c.Assert(err, qt.IsNil)
bcfg, err := DecodeBuildConfig(cfg.Get("_build"))
c.Assert(err, qt.IsNil)
@@ -52,12 +85,7 @@
eq := qt.CmpEquals(hqt.DeepAllowUnexported(BuildConfig{}))
- c.Assert(bcfg, eq, BuildConfig{
- Render: true,
- List: test.expect,
- PublishResources: true,
- set: true,
- })
+ c.Assert(bcfg, eq, test.expect)
}