github.com/kovansky/hugo@v0.92.3-0.20220224232819-63076e4ff19f/resources/page/pagemeta/pagemeta.go (about)

     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 interface{}) (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  }