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)
--
⑨