From 29caaddce67943d399b2ab811fa9325e23930c26 Mon Sep 17 00:00:00 2001 From: Cameron Moore Date: Thu, 22 Dec 2016 22:01:00 -0600 Subject: [PATCH] tpl: Update title to accept interface{} params Updates #2822 --- tpl/template_funcs.go | 13 ++++++++++++- tpl/template_funcs_test.go | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/tpl/template_funcs.go b/tpl/template_funcs.go index aba536a39..7516b46ad 100644 --- a/tpl/template_funcs.go +++ b/tpl/template_funcs.go @@ -1457,6 +1457,17 @@ func lower(s interface{}) (string, error) { return strings.ToLower(ss), nil } +// title returns a copy of the input s with all Unicode letters that begin words +// mapped to their title case. +func title(s interface{}) (string, error) { + ss, err := cast.ToStringE(s) + if err != nil { + return "", err + } + + return strings.Title(ss), nil +} + // upper returns a copy of the input s with all Unicode letters mapped to their // upper case. func upper(s interface{}) (string, error) { @@ -2158,7 +2169,7 @@ func initFuncMap() { "string": func(v interface{}) (string, error) { return cast.ToStringE(v) }, "sub": func(a, b interface{}) (interface{}, error) { return helpers.DoArithmetic(a, b, '-') }, "substr": substr, - "title": func(a string) string { return strings.Title(a) }, + "title": title, "time": asTime, "trim": trim, "upper": upper, diff --git a/tpl/template_funcs_test.go b/tpl/template_funcs_test.go index 0b583c306..8e167cf81 100644 --- a/tpl/template_funcs_test.go +++ b/tpl/template_funcs_test.go @@ -2022,6 +2022,29 @@ func TestLower(t *testing.T) { } } +func TestTitle(t *testing.T) { + cases := []struct { + s interface{} + want string + isErr bool + }{ + {"test", "Test", false}, + {template.HTML("hypertext"), "Hypertext", false}, + {[]byte("bytes"), "Bytes", false}, + } + + for i, c := range cases { + res, err := title(c.s) + if (err != nil) != c.isErr { + t.Fatalf("[%d] unexpected isErr state: want %v, got %v, err = %v", i, c.want, (err != nil), err) + } + + if res != c.want { + t.Errorf("[%d] title failed: want %v, got %v", i, c.want, res) + } + } +} + func TestUpper(t *testing.T) { cases := []struct { s interface{}