From 6ce2c8b5fa328f99f008d8c31e14582ed1c69ff9 Mon Sep 17 00:00:00 2001 From: Allen S <56049635+allensuvorov@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:27:56 +0600 Subject: [PATCH] refactor: Function capitalize word (#460) * feat: implement function capitalize_word * test: add test TestCapitalizeWordAction fix: in CapitalizeWord add strings.Join(capWords, " ") to return. * fix: in CapitalizeWord use Fields instead of Split to takecare of dup spaces. * fix: redo function to keep spaces and handle unicode, add tests. * fix: update comment for NewCapitalizeWordAction * refactor: better readability, cleaner code in CapitalizeWord. Add test case. --- .../action/strings/capitalize_word_test.go | 12 +++++++++ .../transform/function/strings_functions.go | 25 ++++++++----------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/internal/primitive/transform/action/strings/capitalize_word_test.go b/internal/primitive/transform/action/strings/capitalize_word_test.go index 6c4ae3621..8108e4d86 100644 --- a/internal/primitive/transform/action/strings/capitalize_word_test.go +++ b/internal/primitive/transform/action/strings/capitalize_word_test.go @@ -86,4 +86,16 @@ func TestCapitalizeWordAction(t *testing.T) { So(err, ShouldBeNil) So(e.Extensions()["test"], ShouldEqual, "A") }) + Convey("test capitalize word: leading symbols", t, func() { + a, err := runtime.NewAction([]interface{}{funcName, "$.test"}) + So(err, ShouldBeNil) + e := cetest.MinEvent() + e.SetExtension("test", "let 'em go") + ceCtx := &context.EventContext{ + Event: &e, + } + err = a.Execute(ceCtx) + So(err, ShouldBeNil) + So(e.Extensions()["test"], ShouldEqual, "Let 'em Go") + }) } diff --git a/internal/primitive/transform/function/strings_functions.go b/internal/primitive/transform/function/strings_functions.go index e087bf959..9cf485169 100644 --- a/internal/primitive/transform/function/strings_functions.go +++ b/internal/primitive/transform/function/strings_functions.go @@ -125,21 +125,18 @@ var CapitalizeWord = function{ fixedArgs: []common.Type{common.String}, fn: func(args []interface{}) (interface{}, error) { value, _ := args[0].(string) - if len(value) == 0 { - return value, nil - } - if len(value) == 1 { - return strings.ToUpper(string(value[0])), nil - } - capWords := make([]rune, 0, len([]rune(value))) - prev := ' ' - for _, v := range value { - if v != ' ' && prev == ' ' { - v = unicode.ToUpper(v) + rs := []rune(value) + inWord := false + for i, r := range rs { + if !unicode.IsSpace(r) { + if !inWord { + rs[i] = unicode.ToTitle(r) + } + inWord = true + } else { + inWord = false } - capWords = append(capWords, v) - prev = v } - return string(capWords), nil + return string(rs), nil }, }