diff options
| author | Dave Henderson <dhenderson@gmail.com> | 2022-02-13 20:18:02 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-14 01:18:02 +0000 |
| commit | d8f35a0aff0021682ef81a1fbb548f9c5c56a8a9 (patch) | |
| tree | 9200e9083b2709175e08d25b9547065ac367b6d9 /funcs | |
| parent | fa4af05263d274a4c901ad734e7e214c0671b704 (diff) | |
strings.Title - fix ability to handle unicode punctuation (#1310)
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'funcs')
| -rw-r--r-- | funcs/strings.go | 20 | ||||
| -rw-r--r-- | funcs/strings_test.go | 20 |
2 files changed, 33 insertions, 7 deletions
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, "")) |
