Allow for return partials with falsy arguments (#9298)

Partials with returns values are parsed, then inserted into a
partial return wrapper via wrapInPartialReturnWrapper in order
to assign the return value via *contextWrapper.Set. The
predefined wrapper template for partials inserts a partial's nodes
into a "with" template action in order to set dot to a
*contextWrapper within the partial. However, because "with" is
skipped if its argument is falsy, partials with falsy arguments
were not being evaluated.

This replaces the "with" action in the partial wrapper with a
"range" action that isn't skipped if .Arg is falsy.

Fixes #7528
This commit is contained in:
Paul Gottschling
2021-12-17 02:35:21 -05:00
committed by GitHub
parent 8ee6de6d96
commit 5758c370ea
3 changed files with 34 additions and 21 deletions

View File

@@ -25,7 +25,6 @@ import (
"strings"
"sync"
"github.com/gohugoio/hugo/common/hreflect"
texttemplate "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate"
"github.com/gohugoio/hugo/helpers"
@@ -121,10 +120,6 @@ func (ns *Namespace) Include(name string, contextList ...interface{}) (interface
var w io.Writer
if info.HasReturn {
if !hreflect.IsTruthful(context) {
// TODO(bep) we need to fix this, but it is non-trivial.
return nil, errors.New("partial that returns a value needs a non-zero argument.")
}
// Wrap the context sent to the template to capture the return value.
// Note that the template is rewritten to make sure that the dot (".")
// and the $ variable points to Arg.