From d8f35a0aff0021682ef81a1fbb548f9c5c56a8a9 Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Sun, 13 Feb 2022 20:18:02 -0500 Subject: strings.Title - fix ability to handle unicode punctuation (#1310) Signed-off-by: Dave Henderson --- funcs/strings.go | 20 +++++++++++++------- funcs/strings_test.go | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) (limited to 'funcs') diff --git a/funcs/strings.go b/funcs/strings.go index 2e0582c2..cbb16c50 100644 --- a/funcs/strings.go +++ b/funcs/strings.go @@ -14,6 +14,8 @@ import ( "github.com/Masterminds/goutils" "github.com/hairyhenderson/gomplate/v3/conv" "github.com/pkg/errors" + "golang.org/x/text/cases" + "golang.org/x/text/language" "strings" @@ -39,7 +41,7 @@ func AddStringFuncs(f map[string]interface{}) { func CreateStringFuncs(ctx context.Context) map[string]interface{} { f := map[string]interface{}{} - ns := &StringFuncs{ctx} + ns := &StringFuncs{ctx, language.Und} f["strings"] = func() interface{} { return ns } f["replaceAll"] = ns.ReplaceAll @@ -66,6 +68,10 @@ func CreateStringFuncs(ctx context.Context) map[string]interface{} { // StringFuncs - type StringFuncs struct { ctx context.Context + + // tag - the selected BCP 47 language tag. Currently gomplate only supports + // Und (undetermined) + tag language.Tag } // Abbrev - @@ -168,18 +174,18 @@ func (StringFuncs) TrimSuffix(cutset string, s interface{}) string { } // Title - -func (StringFuncs) Title(s interface{}) string { - return strings.Title(conv.ToString(s)) +func (f *StringFuncs) Title(s interface{}) string { + return cases.Title(f.tag).String(conv.ToString(s)) } // ToUpper - -func (StringFuncs) ToUpper(s interface{}) string { - return strings.ToUpper(conv.ToString(s)) +func (f *StringFuncs) ToUpper(s interface{}) string { + return cases.Upper(f.tag).String(conv.ToString(s)) } // ToLower - -func (StringFuncs) ToLower(s interface{}) string { - return strings.ToLower(conv.ToString(s)) +func (f *StringFuncs) ToLower(s interface{}) string { + return cases.Lower(f.tag).String(conv.ToString(s)) } // TrimSpace - diff --git a/funcs/strings_test.go b/funcs/strings_test.go index 94b72d60..8df90d69 100644 --- a/funcs/strings_test.go +++ b/funcs/strings_test.go @@ -59,6 +59,26 @@ func TestTrimPrefix(t *testing.T) { sf.TrimPrefix("Foo", "FooBar")) } +func TestTitle(t *testing.T) { + sf := &StringFuncs{} + testdata := []struct { + in interface{} + out string + }{ + {``, ``}, + {`foo`, `Foo`}, + {`foo bar`, `Foo Bar`}, + {`ljoo džar`, `Ljoo Džar`}, + {`foo bar᳇baz`, `Foo Bar᳇Baz`}, // ᳇ should be treated as punctuation + {`foo,bar&baz`, `Foo,Bar&Baz`}, + } + + for _, d := range testdata { + up := sf.Title(d.in) + assert.Equal(t, d.out, up) + } +} + func TestTrunc(t *testing.T) { sf := &StringFuncs{} assert.Equal(t, "", sf.Trunc(5, "")) -- cgit v1.2.3