tpl: Modify tpl.humanize to ordinalize integer input

Add logic to tpl.humanize such that it understands input of int literals
or strings which represent an integer. When tpl.humanize sees this type
of input, it will use inflect.Ordinalize as opposed to the standard
inflect.Humanize.

Fixes #1886
This commit is contained in:
Michael Orr 2016-07-13 14:09:59 -06:00 committed by Bjørn Erik Pedersen
parent 330639d2ae
commit 0a812beb12
3 changed files with 20 additions and 3 deletions

View file

@ -450,12 +450,15 @@ Used in the [highlight shortcode](/extras/highlighting/).
### humanize
Humanize returns the humanized version of a string with the first letter capitalized.
Humanize returns the humanized version of an argument with the first letter capitalized.
If the input is either an int64 value or the string representation of an integer, humanize returns the number with the proper ordinal appended.
e.g.
```
{{humanize "my-first-post"}} → "My first post"
{{humanize "myCamelPost"}} → "My camel post"
{{humanize "52"}} → "52nd"
{{humanize 103}} → "103rd"
```

View file

@ -1696,8 +1696,12 @@ func countRunes(content interface{}) (int, error) {
return counter, nil
}
// humanize returns the humanized form of a single word.
// humanize returns the humanized form of a single parameter.
// If the parameter is either an integer or a string containing an integer
// value, the behavior is to add the appropriate ordinal.
// Example: "my-first-post" -> "My first post"
// Example: "103" -> "103rd"
// Example: 52 -> "52nd"
func humanize(in interface{}) (string, error) {
word, err := cast.ToStringE(in)
if err != nil {
@ -1708,6 +1712,11 @@ func humanize(in interface{}) (string, error) {
return "", nil
}
_, ok := in.(int) // original param was literal int value
_, err = strconv.Atoi(word) // original param was string containing an int value
if ok == true || err == nil {
return inflect.Ordinalize(word), nil
}
return inflect.Humanize(word), nil
}

View file

@ -1801,11 +1801,16 @@ func TestHighlight(t *testing.T) {
func TestInflect(t *testing.T) {
for i, this := range []struct {
inflectFunc func(i interface{}) (string, error)
in string
in interface{}
expected string
}{
{humanize, "MyCamel", "My camel"},
{humanize, "", ""},
{humanize, "103", "103rd"},
{humanize, "41", "41st"},
{humanize, 103, "103rd"},
{humanize, int64(92), "92nd"},
{humanize, "5.5", "5.5"},
{pluralize, "cat", "cats"},
{pluralize, "", ""},
{singularize, "cats", "cat"},