diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-03-06 09:07:49 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-03-06 22:52:38 +0100 |
commit | 02eaddc2fbe92c26e67d9f82dd9aabecbbf2106c (patch) | |
tree | 517220ebb06a75e89d506183a621123d49ee20c6 /tpl/compare/init.go | |
parent | bdf47e8da80f87b7689badf48a6b8672c048d7e4 (diff) |
tpl/tplimpl: Fix template truth logic
Before this commit, due to a bug in Go's `text/template` package, this would print different output for typed nil interface values:
```
{{ if .AuthenticatedUser }}User is authenticated!{{ else }}{{ end }}
{{ if not .AuthenticatedUser }}{{ else }}}User is authenticated!{{ end }}
```
This commit works around this by wrapping every `if` and `with` with a custom `getif` template func with truth logic that matches `not`, `and` and `or`.
Those 3 template funcs from Go's stdlib are now pulled into Hugo's source tree and adjusted to support custom zero values, e.g. types that implement `IsZero`.
This means that you can now do:
```
{{ with .Date }}{{ . }}{{ end }}
```
And it would work as expected.
Fixes #5738
Diffstat (limited to 'tpl/compare/init.go')
-rw-r--r-- | tpl/compare/init.go | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/tpl/compare/init.go b/tpl/compare/init.go index f766ef890..619293203 100644 --- a/tpl/compare/init.go +++ b/tpl/compare/init.go @@ -71,6 +71,27 @@ func init() { [][2]string{}, ) + ns.AddMethodMapping(ctx.And, + []string{"and"}, + [][2]string{}, + ) + + ns.AddMethodMapping(ctx.Or, + []string{"or"}, + [][2]string{}, + ) + + // getif is used internally by Hugo. Do not document. + ns.AddMethodMapping(ctx.getIf, + []string{"getif"}, + [][2]string{}, + ) + + ns.AddMethodMapping(ctx.Not, + []string{"not"}, + [][2]string{}, + ) + ns.AddMethodMapping(ctx.Conditional, []string{"cond"}, [][2]string{ |