diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go
index f1ab37ee0..c86f4cf1e 100644
--- a/tpl/tplimpl/template.go
+++ b/tpl/tplimpl/template.go
@@ -97,23 +97,21 @@ func (t *templateHandler) PrintErrors() {
// Lookup tries to find a template with the given name in both template
// collections: First HTML, then the plain text template collection.
func (t *templateHandler) Lookup(name string) *tpl.TemplateAdapter {
- var te *tpl.TemplateAdapter
- isTextTemplate := strings.HasPrefix(name, textTmplNamePrefix)
-
- if isTextTemplate {
+ if strings.HasPrefix(name, textTmplNamePrefix) {
+ // The caller has explicitly asked for a text template, so only look
+ // in the text template collection.
// The templates are stored without the prefix identificator.
name = strings.TrimPrefix(name, textTmplNamePrefix)
- te = t.text.Lookup(name)
- } else {
- te = t.html.Lookup(name)
+ return t.text.Lookup(name)
}
- if te == nil {
- return nil
+ // Look in both
+ if te := t.html.Lookup(name); te != nil {
+ return te
}
- return te
+ return t.text.Lookup(name)
}
func (t *templateHandler) clone(d *deps.Deps) *templateHandler {
@@ -459,9 +457,10 @@ func (t *templateHandler) loadTemplates(absPath string, prefix string) {
func (t *templateHandler) initFuncs() {
- // The template funcs need separation between text and html templates.
+ // Both template types will get their own funcster instance, which
+ // in the current case contains the same set of funcs.
for _, funcsterHolder := range []templateFuncsterTemplater{t.html, t.text} {
- funcster := newTemplateFuncster(t.Deps, funcsterHolder)
+ funcster := newTemplateFuncster(t.Deps)
// The URL funcs in the funcMap is somewhat language dependent,
// so we need to wait until the language and site config is loaded.
diff --git a/tpl/tplimpl/templateFuncster.go b/tpl/tplimpl/templateFuncster.go
index ddcafedfd..52e968fdc 100644
--- a/tpl/tplimpl/templateFuncster.go
+++ b/tpl/tplimpl/templateFuncster.go
@@ -17,6 +17,7 @@ import (
"fmt"
"html/template"
"strings"
+ texttemplate "text/template"
bp "github.com/spf13/hugo/bufferpool"
@@ -31,17 +32,12 @@ type templateFuncster struct {
cachedPartials partialCache
image *imageHandler
- // Make sure each funcster gets its own TemplateFinder to get
- // proper text and HTML template separation.
- Tmpl templateFuncsterTemplater
-
*deps.Deps
}
-func newTemplateFuncster(deps *deps.Deps, t templateFuncsterTemplater) *templateFuncster {
+func newTemplateFuncster(deps *deps.Deps) *templateFuncster {
return &templateFuncster{
Deps: deps,
- Tmpl: t,
cachedPartials: partialCache{p: make(map[string]interface{})},
image: &imageHandler{fs: deps.Fs, imageConfigCache: map[string]image.Config{}},
}
@@ -75,14 +71,12 @@ func (t *templateFuncster) partial(name string, contextList ...interface{}) (int
return "", err
}
- switch t.Tmpl.(type) {
- case *htmlTemplates:
- return template.HTML(b.String()), nil
- case *textTemplates:
+ if _, ok := templ.Template.(*texttemplate.Template); ok {
return b.String(), nil
- default:
- panic("Unknown type")
}
+
+ return template.HTML(b.String()), nil
+
}
}
diff --git a/tpl/tplimpl/template_funcs.go b/tpl/tplimpl/template_funcs.go
index 273753388..54cff81c6 100644
--- a/tpl/tplimpl/template_funcs.go
+++ b/tpl/tplimpl/template_funcs.go
@@ -2221,5 +2221,5 @@ func (t *templateFuncster) initFuncMap() {
}
t.funcMap = funcMap
- t.Tmpl.setFuncs(funcMap)
+ t.Tmpl.(*templateHandler).setFuncs(funcMap)
}
diff --git a/tpl/tplimpl/template_funcs_test.go b/tpl/tplimpl/template_funcs_test.go
index 075581c66..70a0ad5e5 100644
--- a/tpl/tplimpl/template_funcs_test.go
+++ b/tpl/tplimpl/template_funcs_test.go
@@ -2869,20 +2869,27 @@ func TestPartialHTMLAndText(t *testing.T) {
}
config.WithTemplate = func(templ tpl.TemplateHandler) error {
- if err := templ.AddTemplate("htmlTemplate.html", `HTML Test Partial: {{ partial "test.foo" . -}}`); err != nil {
+ if err := templ.AddTemplate("htmlTemplate.html", `HTML Test|HTML:{{ partial "test.html" . -}}|Text:{{ partial "test.txt" . }}
+CSS plain:
+CSS safe:
+`); err != nil {
return err
}
- if err := templ.AddTemplate("_text/textTemplate.txt", `Text Test Partial: {{ partial "test.foo" . -}}`); err != nil {
+ if err := templ.AddTemplate("_text/textTemplate.txt", `Text Test|HTML:{{ partial "test.html" . -}}|Text:{{ partial "test.txt" . }}
+CSS plain: `); err != nil {
return err
}
- // Use "foo" here to say that the extension doesn't really matter in this scenario.
- // It will look for templates in "partials/test.foo" and "partials/test.foo.html".
- if err := templ.AddTemplate("partials/test.foo", "HTML Name: {{ .Name }}"); err != nil {
+ if err := templ.AddTemplate("partials/test.html", "HTML Name: {{ .Name }}"); err != nil {
return err
}
- if err := templ.AddTemplate("_text/partials/test.foo", "Text Name: {{ .Name }}"); err != nil {
+ if err := templ.AddTemplate("_text/partials/test.txt", "Text Name: {{ .Name }}"); err != nil {
+ return err
+ }
+ if err := templ.AddTemplate("_text/partials/mystyles.css",
+ `body { background-color: blue; }
+`); err != nil {
return err
}
@@ -2903,8 +2910,12 @@ func TestPartialHTMLAndText(t *testing.T) {
resultText, err := templ.ExecuteToString(data)
require.NoError(t, err)
- require.Contains(t, resultHTML, "HTML Test Partial: HTML Name: a+b+c")
- require.Contains(t, resultText, "Text Test Partial: Text Name: a+b+c")
+ require.Contains(t, resultHTML, "HTML Test|HTML:HTML Name: a+b+c|Text:Text Name: a+b+c")
+ require.Contains(t, resultHTML, `CSS plain: `)
+ require.Contains(t, resultHTML, `CSS safe: