Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tpl/urls
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-07-17 22:44:08 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-07-18 01:07:20 +0300
commitd741064bebe2f4663a7ba12556dccc3dffe08629 (patch)
tree56d651776e06dac70928af84718d52e1af38cb7b /tpl/urls
parent3eb313fef495a39731dafa6bddbf77760090230d (diff)
Add optional lang as argument to rel/relref
Fixes #4956
Diffstat (limited to 'tpl/urls')
-rw-r--r--tpl/urls/urls.go58
1 files changed, 52 insertions, 6 deletions
diff --git a/tpl/urls/urls.go b/tpl/urls/urls.go
index b93c7cada..54c94ec17 100644
--- a/tpl/urls/urls.go
+++ b/tpl/urls/urls.go
@@ -91,30 +91,76 @@ func (ns *Namespace) Anchorize(a interface{}) (string, error) {
}
type reflinker interface {
- Ref(refs ...string) (string, error)
- RelRef(refs ...string) (string, error)
+ Ref(args map[string]interface{}) (string, error)
+ RelRef(args map[string]interface{}) (string, error)
}
// Ref returns the absolute URL path to a given content item.
-func (ns *Namespace) Ref(in interface{}, refs ...string) (template.HTML, error) {
+func (ns *Namespace) Ref(in interface{}, args interface{}) (template.HTML, error) {
p, ok := in.(reflinker)
if !ok {
return "", errors.New("invalid Page received in Ref")
}
- s, err := p.Ref(refs...)
+ argsm, err := ns.refArgsToMap(args)
+ if err != nil {
+ return "", err
+ }
+ s, err := p.Ref(argsm)
return template.HTML(s), err
}
// RelRef returns the relative URL path to a given content item.
-func (ns *Namespace) RelRef(in interface{}, refs ...string) (template.HTML, error) {
+func (ns *Namespace) RelRef(in interface{}, args interface{}) (template.HTML, error) {
p, ok := in.(reflinker)
if !ok {
return "", errors.New("invalid Page received in RelRef")
}
- s, err := p.RelRef(refs...)
+ argsm, err := ns.refArgsToMap(args)
+ if err != nil {
+ return "", err
+ }
+
+ s, err := p.RelRef(argsm)
return template.HTML(s), err
}
+func (ns *Namespace) refArgsToMap(args interface{}) (map[string]interface{}, error) {
+ var (
+ s string
+ of string
+ )
+ switch v := args.(type) {
+ case map[string]interface{}:
+ return v, nil
+ case map[string]string:
+ m := make(map[string]interface{})
+ for k, v := range v {
+ m[k] = v
+ }
+ return m, nil
+ case []string:
+ if len(v) == 0 || len(v) > 2 {
+ return nil, fmt.Errorf("invalid numer of arguments to ref")
+ }
+ // These where the options before we introduced the map type:
+ s = v[0]
+ if len(v) == 2 {
+ of = v[1]
+ }
+ default:
+ var err error
+ s, err = cast.ToStringE(args)
+ if err != nil {
+ return nil, err
+ }
+
+ }
+ return map[string]interface{}{
+ "path": s,
+ "outputFormat": of,
+ }, nil
+}
+
// RelLangURL takes a given string and prepends the relative path according to a
// page's position in the project directory structure and the current language.
func (ns *Namespace) RelLangURL(a interface{}) (template.HTML, error) {