Repository: gohugoio/hugo (language: go)

Issue:
tpl/strings: Add TrimSpace function
Use <https://pkg.go.dev/strings#TrimSpace> so we can do this:

```text
{{ $v | strings.TrimSpace }}
```

Instead of this:

```text
{{ strings.Trim $v "\n\r " }}
```

In addition to having a standard definition of white space, we can pipe values into `strings.TrimSpace`. We can't pipe values into `strings.Trim`.




Discussion / hints:

Fix patch:
diff --git a/tpl/strings/strings.go b/tpl/strings/strings.go
index 02f9a2b1e4a..eb5aee3cb05 100644
--- a/tpl/strings/strings.go
+++ b/tpl/strings/strings.go
@@ -450,6 +450,17 @@ func (ns *Namespace) Trim(s, cutset any) (string, error) {
 	return strings.Trim(ss, sc), nil
 }
 
+// TrimSpace returns the given string, removing leading and trailing whitespace
+// as defined by Unicode.
+func (ns *Namespace) TrimSpace(s any) (string, error) {
+	ss, err := cast.ToStringE(s)
+	if err != nil {
+		return "", err
+	}
+
+	return strings.TrimSpace(ss), nil
+}
+
 // TrimLeft returns a slice of the string s with all leading characters
 // contained in cutset removed.
 func (ns *Namespace) TrimLeft(cutset, s any) (string, error) {


Test patch:
diff --git a/tpl/strings/strings_test.go b/tpl/strings/strings_test.go
index 4fcd3b59ab1..0e6039ba137 100644
--- a/tpl/strings/strings_test.go
+++ b/tpl/strings/strings_test.go
@@ -854,3 +854,30 @@ func TestDiff(t *testing.T) {
 
 	}
 }
+
+func TestTrimSpace(t *testing.T) {
+	t.Parallel()
+	c := qt.New(t)
+
+	for _, test := range []struct {
+		s      any
+		expect any
+	}{
+		{"\n\r test \n\r", "test"},
+		{template.HTML("\n\r test \n\r"), "test"},
+		{[]byte("\n\r test \n\r"), "test"},
+		// errors
+		{tstNoStringer{}, false},
+	} {
+
+		result, err := ns.TrimSpace(test.s)
+
+		if b, ok := test.expect.(bool); ok && !b {
+			c.Assert(err, qt.Not(qt.IsNil))
+			continue
+		}
+
+		c.Assert(err, qt.IsNil)
+		c.Assert(result, qt.Equals, test.expect)
+	}
+}