ref: 1bc93021e3dca6405628f6fdd2dc32cff9c9836c
parent: 7eba37ae9b8653be4fc21a0dbbc6f35ca5b9280e
author: Cameron Moore <moorereason@gmail.com>
date: Sat Mar 21 06:15:12 EDT 2020
tpl: Extend Jsonify to support optional indent parameter Fixes #5040
--- a/tpl/encoding/encoding.go
+++ b/tpl/encoding/encoding.go
@@ -17,6 +17,7 @@
import (
"encoding/base64"
"encoding/json"
+ "errors"
"html/template"
"github.com/spf13/cast"
@@ -51,9 +52,32 @@
return base64.StdEncoding.EncodeToString([]byte(conv)), nil
}
-// Jsonify encodes a given object to JSON.
-func (ns *Namespace) Jsonify(v interface{}) (template.HTML, error) {
- b, err := json.Marshal(v)
+// Jsonify encodes a given object to JSON. To pretty print the JSON, pass an
+// optional first argument of the indent string, such as " ".
+func (ns *Namespace) Jsonify(args ...interface{}) (template.HTML, error) {
+ var (
+ b []byte
+ err error
+ )
+
+ switch len(args) {
+ case 0:
+ return "", nil
+ case 1:
+ b, err = json.Marshal(args[0])
+ case 2:
+ var indent string
+
+ indent, err = cast.ToStringE(args[0])
+ if err != nil {
+ break
+ }
+
+ b, err = json.MarshalIndent(args[1], "", indent)
+ default:
+ err = errors.New("too many arguments to jsonify")
+ }
+
if err != nil {
return "", err
}
--- a/tpl/encoding/encoding_test.go
+++ b/tpl/encoding/encoding_test.go
@@ -83,17 +83,22 @@
ns := New()
for _, test := range []struct {
+ indent []interface{}
v interface{}
expect interface{}
}{
- {[]string{"a", "b"}, template.HTML(`["a","b"]`)},
- {tstNoStringer{}, template.HTML("{}")},
- {nil, template.HTML("null")},
+ {nil, []string{"a", "b"}, template.HTML(`["a","b"]`)},
+ {[]interface{}{" "}, []string{"a", "b"}, template.HTML("[\n \"a\",\n \"b\"\n]")},
+ {nil, tstNoStringer{}, template.HTML("{}")},
+ {nil, nil, template.HTML("null")},
// errors
- {math.NaN(), false},
+ {nil, math.NaN(), false},
+ {[]interface{}{tstNoStringer{}}, []string{"a", "b"}, false},
} {
- result, err := ns.Jsonify(test.v)
+ args := append(test.indent, test.v)
+
+ result, err := ns.Jsonify(args...)
if b, ok := test.expect.(bool); ok && !b {
c.Assert(err, qt.Not(qt.IsNil))
--- a/tpl/encoding/init.go
+++ b/tpl/encoding/init.go
@@ -48,11 +48,11 @@
[]string{"jsonify"},
[][2]string{
{`{{ (slice "A" "B" "C") | jsonify }}`, `["A","B","C"]`},
+ {`{{ (slice "A" "B" "C") | jsonify " "}}`, "[\n \"A\",\n \"B\",\n \"C\"\n]"},
},
)
return ns
-
}
internal.AddTemplateFuncsNamespace(f)