mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
tpl/math: Add log function
It might be very useful for building tag clouds.
This commit is contained in:
parent
41805dca9e
commit
34c566773a
4 changed files with 64 additions and 1 deletions
|
@ -432,6 +432,12 @@ favicon.ico: {{.Width}} x {{.Height}}
|
||||||
<td><code>{{div 6 3}}</code> → 2</td>
|
<td><code>{{div 6 3}}</code> → 2</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>math.Log</code></td>
|
||||||
|
<td>Natural logarithm of one float.</td>
|
||||||
|
<td><code>{{math.Log 1.0}}</code> → 0</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>mod</code></td>
|
<td><code>mod</code></td>
|
||||||
<td>Modulus of two integers.</td>
|
<td>Modulus of two integers.</td>
|
||||||
|
@ -714,7 +720,7 @@ e.g.
|
||||||
|
|
||||||
* `{{ "this is a text" | truncate 10 " ..." }}` → `this is a ...`
|
* `{{ "this is a text" | truncate 10 " ..." }}` → `this is a ...`
|
||||||
* `{{ "<em>Keep my HTML</em>" | safeHTML | truncate 10 }}` → `<em>Keep my …</em>`
|
* `{{ "<em>Keep my HTML</em>" | safeHTML | truncate 10 }}` → `<em>Keep my …</em>`
|
||||||
* `{{ "With [Markdown](#markdown) inside." | markdownify | truncate 10 }}` → `With <a href='#markdown'>Markdown …</a>`
|
* `{{ "With [Markdown](#markdown) inside." | markdownify | truncate 10 }}` → `With <a href='#markdown'>Markdown …</a>`
|
||||||
|
|
||||||
### split
|
### split
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,13 @@ func init() {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ns.AddMethodMapping(ctx.Log,
|
||||||
|
nil,
|
||||||
|
[][2]string{
|
||||||
|
{"{{math.Log 1}}", "0"},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
ns.AddMethodMapping(ctx.Mod,
|
ns.AddMethodMapping(ctx.Mod,
|
||||||
[]string{"mod"},
|
[]string{"mod"},
|
||||||
[][2]string{
|
[][2]string{
|
||||||
|
|
|
@ -15,7 +15,10 @@ package math
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
|
"github.com/spf13/cast"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New returns a new instance of the math-namespaced template functions.
|
// New returns a new instance of the math-namespaced template functions.
|
||||||
|
@ -34,6 +37,16 @@ func (ns *Namespace) Div(a, b interface{}) (interface{}, error) {
|
||||||
return DoArithmetic(a, b, '/')
|
return DoArithmetic(a, b, '/')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ns *Namespace) Log(a interface{}) (float64, error) {
|
||||||
|
af, err := cast.ToFloat64E(a)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return 0, errors.New("Log operator can't be used with non integer or float value")
|
||||||
|
}
|
||||||
|
|
||||||
|
return math.Log(af), nil
|
||||||
|
}
|
||||||
|
|
||||||
// Mod returns a % b.
|
// Mod returns a % b.
|
||||||
func (ns *Namespace) Mod(a, b interface{}) (int64, error) {
|
func (ns *Namespace) Mod(a, b interface{}) (int64, error) {
|
||||||
av := reflect.ValueOf(a)
|
av := reflect.ValueOf(a)
|
||||||
|
|
|
@ -15,6 +15,7 @@ package math
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -142,6 +143,42 @@ func TestDoArithmetic(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLog(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
ns := New()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
a interface{}
|
||||||
|
expect interface{}
|
||||||
|
}{
|
||||||
|
{1, float64(0)},
|
||||||
|
{3, float64(1.0986)},
|
||||||
|
{0, float64(math.Inf(-1))},
|
||||||
|
{1.0, float64(0)},
|
||||||
|
{3.1, float64(1.1314)},
|
||||||
|
{"abc", false},
|
||||||
|
} {
|
||||||
|
errMsg := fmt.Sprintf("[%d] %v", i, test)
|
||||||
|
|
||||||
|
result, err := ns.Log(test.a)
|
||||||
|
|
||||||
|
if b, ok := test.expect.(bool); ok && !b {
|
||||||
|
require.Error(t, err, errMsg)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// we compare only 4 digits behind point if its a real float
|
||||||
|
// otherwise we usually get different float values on the last positions
|
||||||
|
if result != math.Inf(-1) {
|
||||||
|
result = float64(int(result*10000)) / 10000
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, err, errMsg)
|
||||||
|
assert.Equal(t, test.expect, result, errMsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMod(t *testing.T) {
|
func TestMod(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue