diff options
Diffstat (limited to 'tpl/urls/urls.go')
-rw-r--r-- | tpl/urls/urls.go | 58 |
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) { |