diff --git a/tpl/strings/strings.go b/tpl/strings/strings.go index a49451483..6c6e9b9d3 100644 --- a/tpl/strings/strings.go +++ b/tpl/strings/strings.go @@ -20,6 +20,7 @@ import ( "html/template" "regexp" "strings" + "unicode" "unicode/utf8" "github.com/gohugoio/hugo/common/text" @@ -160,6 +161,19 @@ func (ns *Namespace) ContainsAny(s, chars any) (bool, error) { return strings.ContainsAny(ss, sc), nil } +// ContainsNonSpace reports whether s contains any non-space characters as defined +// by Unicode's White Space property, +func (ns *Namespace) ContainsNonSpace(s any) bool { + ss := cast.ToString(s) + + for _, r := range ss { + if !unicode.IsSpace(r) { + return true + } + } + return false +} + // HasPrefix tests whether the input s begins with prefix. func (ns *Namespace) HasPrefix(s, prefix any) (bool, error) { ss, err := cast.ToStringE(s) diff --git a/tpl/strings/strings_test.go b/tpl/strings/strings_test.go index 7e3960934..a230d4a48 100644 --- a/tpl/strings/strings_test.go +++ b/tpl/strings/strings_test.go @@ -145,6 +145,27 @@ func TestContainsAny(t *testing.T) { } } +func TestContainsNonSpace(t *testing.T) { + t.Parallel() + c := qt.New(t) + + for _, test := range []struct { + s any + expect bool + }{ + {"", false}, + {" ", false}, + {" ", false}, + {"\t", false}, + {"\r", false}, + {"a", true}, + {" a", true}, + {"a\n", true}, + } { + c.Assert(ns.ContainsNonSpace(test.s), qt.Equals, test.expect) + } +} + func TestCountRunes(t *testing.T) { t.Parallel() c := qt.New(t)