Fix language handling in ExecuteAsTemplate
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 26 Nov 2019 08:44:31 +0000 (09:44 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 26 Nov 2019 11:55:00 +0000 (12:55 +0100)
Fixes #6331

hugolib/hugo_sites_build_test.go
hugolib/resource_chain_test.go
tpl/template.go
tpl/tplimpl/template.go
tpl/tplimpl/templateProvider.go

index 03853bff6cc95773af4cc658e2e40eadbb8dfe6c..e022cb2d3111ff1e4246072a7cd5d683fbae56c2 100644 (file)
@@ -1445,5 +1445,17 @@ weight: 2002
 PNG Data
 `)
 
+       i18nContent := func(id, value string) string {
+               return fmt.Sprintf(`
+[%s]
+other = %q
+`, id, value)
+       }
+
+       b.WithSourceFile("i18n/en.toml", i18nContent("hello", "Hello"))
+       b.WithSourceFile("i18n/fr.toml", i18nContent("hello", "Bonjour"))
+       b.WithSourceFile("i18n/nb.toml", i18nContent("hello", "Hallo"))
+       b.WithSourceFile("i18n/nn.toml", i18nContent("hello", "Hallo"))
+
        return &multiSiteTestBuilder{sitesBuilder: b, configFormat: configFormat, config: config, configData: configData}
 }
index 10539d1bb26db2df69e16689403612e9b47a2af1..9d869ba4191100197f68ca7ff1404c0385d09cba 100644 (file)
@@ -418,8 +418,7 @@ Fingerprinted: {{ $fingerprinted.RelPermalink }}
 
                }},
                {"execute-as-template", func() bool {
-                       // TODO(bep) eventually remove
-                       return isGo111()
+                       return true
                }, func(b *sitesBuilder) {
                        b.WithTemplates("home.html", `
 {{ $var := "Hugo Page" }}
@@ -668,3 +667,30 @@ JSON: {{ $json.RelPermalink }}: {{ $json.Content }}
                "JSON: /jsons/data1.json: json1 content",
                "JSONS: 2", "/jsons/data1.json: json1 content")
 }
+
+func TestExecuteAsTemplateWithLanguage(t *testing.T) {
+       b := newMultiSiteTestDefaultBuilder(t)
+       indexContent := `
+Lang: {{ site.Language.Lang }}
+{{ $templ := "{{T \"hello\"}}" | resources.FromString "f1.html" }}
+{{ $helloResource := $templ | resources.ExecuteAsTemplate (print "f%s.html" .Lang) . }}
+Hello1: {{T "hello"}}
+Hello2: {{ $helloResource.Content }}
+LangURL: {{ relLangURL "foo" }}
+`
+       b.WithTemplatesAdded("index.html", indexContent)
+       b.WithTemplatesAdded("index.fr.html", indexContent)
+
+       b.Build(BuildCfg{})
+
+       b.AssertFileContent("public/en/index.html", `
+Hello1: Hello
+Hello2: Hello
+`)
+
+       b.AssertFileContent("public/fr/index.html", `
+Hello1: Bonjour
+Hello2: Bonjour
+`)
+
+}
index cd00d8061bc0c02951c216e44e47b6a312301618..0d7598fde96a8597968a732fab92a4c65a5f89ae 100644 (file)
@@ -50,8 +50,6 @@ type TemplateHandler interface {
        AddLateTemplate(name, tpl string) error
        LoadTemplates(prefix string) error
 
-       NewTextTemplate() TemplateParseFinder
-
        MarkReady() error
        RebuildClone()
 }
index 35407722a0cf06ad49f40df79d34dc55779391cf..6027775243d18dd9212978bb70f6a4d9d27c7f55 100644 (file)
@@ -98,8 +98,6 @@ type templateHandler struct {
        text *textTemplates
        html *htmlTemplates
 
-       extTextTemplates []*textTemplate
-
        amberFuncMap template.FuncMap
 
        errors []*templateErr
@@ -153,15 +151,7 @@ func (t *templateHandler) addShortcodeVariant(name string, info tpl.Info, templ
        }
 }
 
-// NewTextTemplate provides a text template parser that has all the Hugo
-// template funcs etc. built-in.
-func (t *templateHandler) NewTextTemplate() tpl.TemplateParseFinder {
-       t.mu.Lock()
-       defer t.mu.Unlock()
-
-       tt := &textTemplate{t: texttemplate.New("")}
-       t.extTextTemplates = append(t.extTextTemplates, tt)
-
+func (t *templateHandler) wrapTextTemplate(tt *textTemplate) tpl.TemplateParseFinder {
        return struct {
                tpl.TemplateParser
                tpl.TemplateLookup
@@ -283,8 +273,11 @@ func (t *templateHandler) clone(d *deps.Deps) *templateHandler {
                shortcodes:   make(map[string]*shortcodeTemplates),
                templateInfo: t.templateInfo,
                html:         &htmlTemplates{t: template.Must(t.html.t.Clone()), overlays: make(map[string]*template.Template), templatesCommon: t.html.templatesCommon},
-               text:         &textTemplates{textTemplate: &textTemplate{t: texttemplate.Must(t.text.t.Clone())}, overlays: make(map[string]*texttemplate.Template), templatesCommon: t.text.templatesCommon},
-               errors:       make([]*templateErr, 0),
+               text: &textTemplates{
+                       textTemplate: &textTemplate{t: texttemplate.Must(t.text.t.Clone())},
+                       standalone:   &textTemplate{t: texttemplate.New("")},
+                       overlays:     make(map[string]*texttemplate.Template), templatesCommon: t.text.templatesCommon},
+               errors: make([]*templateErr, 0),
        }
 
        for k, v := range t.shortcodes {
@@ -302,6 +295,7 @@ func (t *templateHandler) clone(d *deps.Deps) *templateHandler {
        }
 
        d.Tmpl = c
+       d.TextTmpl = c.wrapTextTemplate(c.text.standalone)
 
        c.initFuncs()
 
@@ -339,6 +333,7 @@ func newTemplateAdapter(deps *deps.Deps) *templateHandler {
        }
        textT := &textTemplates{
                textTemplate:    &textTemplate{t: texttemplate.New("")},
+               standalone:      &textTemplate{t: texttemplate.New("")},
                overlays:        make(map[string]*texttemplate.Template),
                templatesCommon: common,
        }
@@ -431,6 +426,7 @@ func (t *textTemplates) setTemplateFuncster(f *templateFuncster) {
 type textTemplates struct {
        *templatesCommon
        *textTemplate
+       standalone *textTemplate
        clone      *texttemplate.Template
        cloneClone *texttemplate.Template
 
@@ -468,6 +464,7 @@ func (t *textTemplates) lookup(name string) *texttemplate.Template {
 func (t *templateHandler) setFuncs(funcMap map[string]interface{}) {
        t.html.setFuncs(funcMap)
        t.text.setFuncs(funcMap)
+       t.setFuncMapInTemplate(t.text.standalone.t, funcMap)
 }
 
 // SetFuncs replaces the funcs in the func maps with new definitions.
@@ -781,10 +778,6 @@ func (t *templateHandler) initFuncs() {
                }
        }
 
-       for _, extText := range t.extTextTemplates {
-               extText.t.Funcs(funcMap)
-       }
-
        // Amber is HTML only.
        t.amberFuncMap = template.FuncMap{}
 
index 9322223442aec179533fb117756235695bb0217e..605c47d8797a3b86e8072676e3e1033f3931ebf1 100644 (file)
@@ -26,11 +26,9 @@ var DefaultTemplateProvider *TemplateProvider
 // Update updates the Hugo Template System in the provided Deps
 // with all the additional features, templates & functions.
 func (*TemplateProvider) Update(deps *deps.Deps) error {
-
        newTmpl := newTemplateAdapter(deps)
        deps.Tmpl = newTmpl
-
-       deps.TextTmpl = newTmpl.NewTextTemplate()
+       deps.TextTmpl = newTmpl.wrapTextTemplate(newTmpl.text.standalone)
 
        newTmpl.initFuncs()
 
@@ -56,8 +54,6 @@ func (*TemplateProvider) Clone(d *deps.Deps) error {
        t := d.Tmpl.(*templateHandler)
        clone := t.clone(d)
 
-       d.Tmpl = clone
-
        return clone.MarkReady()
 
 }