Skip to content

Commit

Permalink
tpl/math: Add log function
Browse files Browse the repository at this point in the history
It might be very useful for building tag clouds.
  • Loading branch information
artem-sidorenko authored and bep committed Jul 2, 2017
1 parent 41805dc commit 34c5667
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 1 deletion.
8 changes: 7 additions & 1 deletion docs/content/templates/functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,12 @@ favicon.ico: {{.Width}} x {{.Height}}
<td><code>{{div 6 3}}</code> → 2</td>
</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>
<td><code>mod</code></td>
<td>Modulus of two integers.</td>
Expand Down Expand Up @@ -714,7 +720,7 @@ e.g.

* `{{ "this is a text" | truncate 10 " ..." }}``this is a ...`
* `{{ "<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

Expand Down
7 changes: 7 additions & 0 deletions tpl/math/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ func init() {
},
)

ns.AddMethodMapping(ctx.Log,
nil,
[][2]string{
{"{{math.Log 1}}", "0"},
},
)

ns.AddMethodMapping(ctx.Mod,
[]string{"mod"},
[][2]string{
Expand Down
13 changes: 13 additions & 0 deletions tpl/math/math.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ package math

import (
"errors"
"math"
"reflect"

"github.com/spf13/cast"
)

// New returns a new instance of the math-namespaced template functions.
Expand All @@ -34,6 +37,16 @@ func (ns *Namespace) Div(a, b interface{}) (interface{}, error) {
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.
func (ns *Namespace) Mod(a, b interface{}) (int64, error) {
av := reflect.ValueOf(a)
Expand Down
37 changes: 37 additions & 0 deletions tpl/math/math_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package math

import (
"fmt"
"math"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -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) {
t.Parallel()

Expand Down

0 comments on commit 34c5667

Please sign in to comment.