mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
tpl: Add strings.Repeat
This commit is contained in:
parent
07b96d16e8
commit
13435a6f60
5 changed files with 109 additions and 0 deletions
31
docs/content/en/functions/strings.Repeat.md
Normal file
31
docs/content/en/functions/strings.Repeat.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
title: strings.Repeat
|
||||||
|
# linktitle:
|
||||||
|
description: Returns a string consisting of count copies of the string s.
|
||||||
|
godocref:
|
||||||
|
date: 2018-05-31
|
||||||
|
publishdate: 2018-05-31
|
||||||
|
lastmod: 2018-05-31
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
keywords: [strings]
|
||||||
|
signature: ["strings.Repeat INPUT COUNT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
---
|
||||||
|
|
||||||
|
`strings.Repeat` provides the Go [`strings.Repeat`](https://golang.org/pkg/strings/#Repeat) function for Hugo templates. It takes a string and a count, and returns a string with consisting of count copies of the string argument.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ strings.Repeat "yo" 3 }} → "yoyoyo"
|
||||||
|
```
|
||||||
|
|
||||||
|
`strings.Repeat` *requires* the second argument, which tells the function how many times to repeat the first argument; there is no default. However, it can be used as a pipeline:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ "yo" | strings.Repeat 3 }} → "yoyoyo"
|
||||||
|
```
|
|
@ -3410,6 +3410,20 @@
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"Repeat": {
|
||||||
|
"Description": "Repeat returns a new string consisting of count copies of the string s.",
|
||||||
|
"Args": [
|
||||||
|
"s",
|
||||||
|
"n"
|
||||||
|
],
|
||||||
|
"Aliases": null,
|
||||||
|
"Examples": [
|
||||||
|
[
|
||||||
|
"{{ \"yo\" | strings.Repeat 4 }}",
|
||||||
|
"yoyoyoyo"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
"Truncate": {
|
"Truncate": {
|
||||||
"Description": "Truncate truncates a given string to the specified length.",
|
"Description": "Truncate truncates a given string to the specified length.",
|
||||||
"Args": [
|
"Args": [
|
||||||
|
|
|
@ -158,6 +158,13 @@ func init() {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ns.AddMethodMapping(ctx.Repeat,
|
||||||
|
nil,
|
||||||
|
[][2]string{
|
||||||
|
{`{{ "yo" | strings.Repeat 4 }}`, `yoyoyoyo`},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
ns.AddMethodMapping(ctx.ToUpper,
|
ns.AddMethodMapping(ctx.ToUpper,
|
||||||
[]string{"upper"},
|
[]string{"upper"},
|
||||||
[][2]string{
|
[][2]string{
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
"math"
|
||||||
_strings "strings"
|
_strings "strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
|
@ -417,3 +418,23 @@ func (ns *Namespace) TrimSuffix(suffix, s interface{}) (string, error) {
|
||||||
|
|
||||||
return _strings.TrimSuffix(ss, sx), nil
|
return _strings.TrimSuffix(ss, sx), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Repeat returns a new string consisting of count copies of the string s.
|
||||||
|
// The count is limited to an in16 value (up to 32767).
|
||||||
|
func (ns *Namespace) Repeat(n, s interface{}) (string, error) {
|
||||||
|
ss, err := cast.ToStringE(s)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
sn, err := cast.ToIntE(n)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if sn > math.MaxInt16 {
|
||||||
|
return "", fmt.Errorf("Cannot repeat string more than %d times", math.MaxInt16)
|
||||||
|
}
|
||||||
|
|
||||||
|
return _strings.Repeat(ss, sn), nil
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ package strings
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
"math"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/deps"
|
"github.com/gohugoio/hugo/deps"
|
||||||
|
@ -709,3 +710,38 @@ func TestTrimSuffix(t *testing.T) {
|
||||||
assert.Equal(t, test.expect, result, errMsg)
|
assert.Equal(t, test.expect, result, errMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRepeat(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
s interface{}
|
||||||
|
n interface{}
|
||||||
|
expect interface{}
|
||||||
|
}{
|
||||||
|
{"yo", "2", "yoyo"},
|
||||||
|
{"~", "16", "~~~~~~~~~~~~~~~~"},
|
||||||
|
{"<tag>", "0", ""},
|
||||||
|
{"yay", "1", "yay"},
|
||||||
|
{1221, "1", "1221"},
|
||||||
|
{1221, 2, "12211221"},
|
||||||
|
{template.HTML("<tag>"), "2", "<tag><tag>"},
|
||||||
|
{[]byte("<tag>"), 2, "<tag><tag>"},
|
||||||
|
// errors
|
||||||
|
{"", tstNoStringer{}, false},
|
||||||
|
{tstNoStringer{}, "", false},
|
||||||
|
{"hi", math.MaxInt16 + 1, false},
|
||||||
|
} {
|
||||||
|
errMsg := fmt.Sprintf("[%d] %v", i, test)
|
||||||
|
|
||||||
|
result, err := ns.Repeat(test.n, test.s)
|
||||||
|
|
||||||
|
if b, ok := test.expect.(bool); ok && !b {
|
||||||
|
require.Error(t, err, errMsg)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, err, errMsg)
|
||||||
|
assert.Equal(t, test.expect, result, errMsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue