pagemeta.go (2824B)
1 // Copyright 2019 The Hugo Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 package pagemeta
15
16 import (
17 "github.com/mitchellh/mapstructure"
18 )
19
20 type URLPath struct {
21 URL string
22 Permalink string
23 Slug string
24 Section string
25 }
26
27 const (
28 Never = "never"
29 Always = "always"
30 ListLocally = "local"
31 Link = "link"
32 )
33
34 var defaultBuildConfig = BuildConfig{
35 List: Always,
36 Render: Always,
37 PublishResources: true,
38 set: true,
39 }
40
41 // BuildConfig holds configuration options about how to handle a Page in Hugo's
42 // build process.
43 type BuildConfig struct {
44 // Whether to add it to any of the page collections.
45 // Note that the page can always be found with .Site.GetPage.
46 // Valid values: never, always, local.
47 // Setting it to 'local' means they will be available via the local
48 // page collections, e.g. $section.Pages.
49 // Note: before 0.57.2 this was a bool, so we accept those too.
50 List string
51
52 // Whether to render it.
53 // Valid values: never, always, link.
54 // The value link means it will not be rendered, but it will get a RelPermalink/Permalink.
55 // Note that before 0.76.0 this was a bool, so we accept those too.
56 Render string
57
58 // Whether to publish its resources. These will still be published on demand,
59 // but enabling this can be useful if the originals (e.g. images) are
60 // never used.
61 PublishResources bool
62
63 set bool // BuildCfg is non-zero if this is set to true.
64 }
65
66 // Disable sets all options to their off value.
67 func (b *BuildConfig) Disable() {
68 b.List = Never
69 b.Render = Never
70 b.PublishResources = false
71 b.set = true
72 }
73
74 func (b BuildConfig) IsZero() bool {
75 return !b.set
76 }
77
78 func DecodeBuildConfig(m any) (BuildConfig, error) {
79 b := defaultBuildConfig
80 if m == nil {
81 return b, nil
82 }
83
84 err := mapstructure.WeakDecode(m, &b)
85
86 // In 0.67.1 we changed the list attribute from a bool to a string (enum).
87 // Bool values will become 0 or 1.
88 switch b.List {
89 case "0":
90 b.List = Never
91 case "1":
92 b.List = Always
93 case Always, Never, ListLocally:
94 default:
95 b.List = Always
96 }
97
98 // In 0.76.0 we changed the Render from bool to a string.
99 switch b.Render {
100 case "0":
101 b.Render = Never
102 case "1":
103 b.Render = Always
104 case Always, Never, Link:
105 default:
106 b.Render = Always
107 }
108
109 return b, err
110 }