Consolidate the Param methods

Maps in Viper, Hugo's config backing store, is now properly lower-cased not just on top level, the current situation.

While this is mostly a good thing, as you don't need to know the original casing to look up a value, it will be breaking for people doing direct lookups in the ´Site.Params` map.

We will try to find a solution to this "breakage", but the recommended method to get params values is via the `.Param` methods.

This method is now implemented on `Node`, `Page` and `Site` and is case-insensitive:

* Use `.Param "someKey" ` if you want page param with fall back to site param if not found on page.
* Use `.Site.Param "someKey"` to get a site param

See #2590
This commit is contained in:
Bjørn Erik Pedersen 2016-10-17 19:30:21 +02:00
parent faa64abdc2
commit 58f31d2769
3 changed files with 17 additions and 9 deletions

View file

@ -24,8 +24,6 @@ import (
jww "github.com/spf13/jwalterweatherman" jww "github.com/spf13/jwalterweatherman"
"github.com/spf13/hugo/helpers" "github.com/spf13/hugo/helpers"
"github.com/spf13/cast"
) )
type Node struct { type Node struct {
@ -124,13 +122,9 @@ func (n *Node) IsMenuCurrent(menuID string, inme *MenuEntry) bool {
// Param is a convenience method to do lookups in Site's Params map. // Param is a convenience method to do lookups in Site's Params map.
// //
// This method is also implemented on Page. // This method is also implemented on Page and SiteInfo.
func (n *Node) Param(key interface{}) (interface{}, error) { func (n *Node) Param(key interface{}) (interface{}, error) {
keyStr, err := cast.ToStringE(key) return n.Site.Param(key)
if err != nil {
return nil, err
}
return n.Site.Params[keyStr], err
} }
func (n *Node) Hugo() *HugoInfo { func (n *Node) Hugo() *HugoInfo {

View file

@ -194,12 +194,13 @@ func (p *Page) IsPage() bool {
// Param is a convenience method to do lookups in Page's and Site's Params map, // Param is a convenience method to do lookups in Page's and Site's Params map,
// in that order. // in that order.
// //
// This method is also implemented on Node. // This method is also implemented on Node and SiteInfo.
func (p *Page) Param(key interface{}) (interface{}, error) { func (p *Page) Param(key interface{}) (interface{}, error) {
keyStr, err := cast.ToStringE(key) keyStr, err := cast.ToStringE(key)
if err != nil { if err != nil {
return nil, err return nil, err
} }
keyStr = strings.ToLower(keyStr)
if val, ok := p.Params[keyStr]; ok { if val, ok := p.Params[keyStr]; ok {
return val, nil return val, nil
} }

View file

@ -223,8 +223,21 @@ func newSiteInfoDefaultLanguage(baseURL string, pages ...*Page) *SiteInfo {
// linkedin // linkedin
type SiteSocial map[string]string type SiteSocial map[string]string
// Param is a convenience method to do lookups in Site's Params map.
//
// This method is also implemented on Page and Node.
func (s *SiteInfo) Param(key interface{}) (interface{}, error) {
keyStr, err := cast.ToStringE(key)
if err != nil {
return nil, err
}
keyStr = strings.ToLower(keyStr)
return s.Params[keyStr], nil
}
// GetParam gets a site parameter value if found, nil if not. // GetParam gets a site parameter value if found, nil if not.
func (s *SiteInfo) GetParam(key string) interface{} { func (s *SiteInfo) GetParam(key string) interface{} {
helpers.Deprecated("SiteInfo", ".GetParam", ".Param")
v := s.Params[strings.ToLower(key)] v := s.Params[strings.ToLower(key)]
if v == nil { if v == nil {