summaryrefslogtreecommitdiff
path: root/funcs
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2022-02-13 20:18:02 -0500
committerGitHub <noreply@github.com>2022-02-14 01:18:02 +0000
commitd8f35a0aff0021682ef81a1fbb548f9c5c56a8a9 (patch)
tree9200e9083b2709175e08d25b9547065ac367b6d9 /funcs
parentfa4af05263d274a4c901ad734e7e214c0671b704 (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.go20
-rw-r--r--funcs/strings_test.go20
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, ""))