mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
Add template funcs countwords and countrunes
This commit is contained in:
parent
2e92f36890
commit
dfa34afd86
2 changed files with 60 additions and 0 deletions
|
@ -525,6 +525,26 @@ Converts all characters in string to uppercase.
|
||||||
e.g. `{{upper "BatMan"}}` → "BATMAN"
|
e.g. `{{upper "BatMan"}}` → "BATMAN"
|
||||||
|
|
||||||
|
|
||||||
|
### countwords
|
||||||
|
|
||||||
|
`countwords` tries to convert the passed content to a string and counts each word
|
||||||
|
in it. The template functions works similar to [.WordCount]({{< relref "templates/variables.md#page-variables" >}}).
|
||||||
|
|
||||||
|
```html
|
||||||
|
{{ "Hugo is a static site generator." | countwords }}
|
||||||
|
<!-- outputs a content length of 6 words. -->
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### countrunes
|
||||||
|
|
||||||
|
Alternatively to counting all words , `countrunes` determines the number of runes in the content and excludes any whitespace. This can become useful if you have to deal with
|
||||||
|
CJK-like languages.
|
||||||
|
|
||||||
|
```html
|
||||||
|
{{ "Hello, 世界" | countrunes }}
|
||||||
|
<!-- outputs a content length of 8 runes. -->
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## URLs
|
## URLs
|
||||||
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
"bitbucket.org/pkg/inflect"
|
"bitbucket.org/pkg/inflect"
|
||||||
|
|
||||||
|
@ -1385,6 +1386,43 @@ func Base64Encode(content interface{}) (string, error) {
|
||||||
return base64.StdEncoding.EncodeToString([]byte(conv)), nil
|
return base64.StdEncoding.EncodeToString([]byte(conv)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CountWords(content interface{}) (int, error) {
|
||||||
|
conv, err := cast.ToStringE(content)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return 0, errors.New("Failed to convert content to string: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
counter := 0
|
||||||
|
for _, word := range strings.Fields(helpers.StripHTML(conv)) {
|
||||||
|
runeCount := utf8.RuneCountInString(word)
|
||||||
|
if len(word) == runeCount {
|
||||||
|
counter++
|
||||||
|
} else {
|
||||||
|
counter += runeCount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return counter, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CountRunes(content interface{}) (int, error) {
|
||||||
|
conv, err := cast.ToStringE(content)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return 0, errors.New("Failed to convert content to string: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
counter := 0
|
||||||
|
for _, r := range helpers.StripHTML(conv) {
|
||||||
|
if !helpers.IsWhitespace(r) {
|
||||||
|
counter++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return counter, nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
funcMap = template.FuncMap{
|
funcMap = template.FuncMap{
|
||||||
"urlize": helpers.URLize,
|
"urlize": helpers.URLize,
|
||||||
|
@ -1444,6 +1482,8 @@ func init() {
|
||||||
"getenv": func(varName string) string { return os.Getenv(varName) },
|
"getenv": func(varName string) string { return os.Getenv(varName) },
|
||||||
"base64Decode": Base64Decode,
|
"base64Decode": Base64Decode,
|
||||||
"base64Encode": Base64Encode,
|
"base64Encode": Base64Encode,
|
||||||
|
"countwords": CountWords,
|
||||||
|
"countrunes": CountRunes,
|
||||||
"pluralize": func(in interface{}) (string, error) {
|
"pluralize": func(in interface{}) (string, error) {
|
||||||
word, err := cast.ToStringE(in)
|
word, err := cast.ToStringE(in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in a new issue