tpl: Add a querify function to generate query strings inside templates
authorJimmy Sawczuk <github@jimmysawczuk.com>
Tue, 5 Jul 2016 01:35:24 +0000 (21:35 -0400)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 5 Jul 2016 17:52:45 +0000 (19:52 +0200)
The query function will take a set of parameters specified like a dict and return a url.Values object which can be .Encode'd into a query string.

Example:

<a href="http://www.google.com?{{ (querify "q" "test" "page" 3).Encode | safeHTML }}">Search</a>

Returns:

<a href="http://www.google.com?page=3&q=test">Search</a>

Closes #2257

tpl/template_funcs.go
tpl/template_funcs_test.go

index db785cbc01907274beb0c60a55cf3f38e794cf03..fc9fc1f6451cf5d4d66084dc157e11095b7d8d79 100644 (file)
@@ -27,6 +27,7 @@ import (
        "html"
        "html/template"
        "math/rand"
+       "net/url"
        "os"
        "reflect"
        "regexp"
@@ -1745,6 +1746,21 @@ func sha1(in interface{}) (string, error) {
        return hex.EncodeToString(hash[:]), nil
 }
 
+// querify converts the given parameters into a url.Values object
+func querify(params ...interface{}) (url.Values, error) {
+       qs := url.Values{}
+       vals, err := dictionary(params...)
+       if err != nil {
+               return url.Values{}, fmt.Errorf("querify keys must be strings")
+       }
+
+       for name, value := range vals {
+               qs.Add(name, url.QueryEscape(fmt.Sprintf("%v", value)))
+       }
+
+       return qs, nil
+}
+
 func init() {
        funcMap = template.FuncMap{
                "absURL":       func(a string) template.HTML { return template.HTML(helpers.AbsURL(a)) },
@@ -1794,6 +1810,7 @@ func init() {
                "partial":      partial,
                "plainify":     plainify,
                "pluralize":    pluralize,
+               "querify":      querify,
                "readDir":      readDirFromWorkingDir,
                "readFile":     readFileFromWorkingDir,
                "ref":          ref,
index 3f7f6cb6481263bbd204f2a5f4bee6ef29a0edcb..bccee4c9ef188442ccb6e3dc6e0b5f7cdf5aacf1 100644 (file)
@@ -103,6 +103,7 @@ modBool: {{modBool 15 3}}
 mul: {{mul 2 3}}
 plainify: {{ plainify  "Hello <strong>world</strong>, gophers!" }}
 pluralize: {{ "cat" | pluralize }}
+querify: {{ (querify "foo" 1 "bar" 2 "baz" "with spaces").Encode | safeHTML }}
 readDir: {{ range (readDir ".") }}{{ .Name }}{{ end }}
 readFile: {{ readFile "README.txt" }}
 relURL 1: {{ "http://gohugo.io/" | relURL }}
@@ -154,6 +155,7 @@ modBool: true
 mul: 6
 plainify: Hello world, gophers!
 pluralize: cats
+querify: bar=2&baz=with%2Bspaces&foo=1
 readDir: README.txt
 readFile: Hugo Rocks!
 relURL 1: http://gohugo.io/