Fix broken shortcodes for Ace and Amber

Fixes #4051
This commit is contained in:
Bjørn Erik Pedersen 2017-11-18 10:18:41 +01:00
parent b3daa1f4bf
commit 503ca6de6c
3 changed files with 57 additions and 15 deletions

View file

@ -32,6 +32,7 @@ func TestAllTemplateEngines(t *testing.T) {
amberFixer := func(s string) string {
fixed := strings.Replace(s, "{{ .Title", "{{ Title", -1)
fixed = strings.Replace(fixed, ".Content", "Content", -1)
fixed = strings.Replace(fixed, ".IsNamedParams", "IsNamedParams", -1)
fixed = strings.Replace(fixed, "{{", "#{", -1)
fixed = strings.Replace(fixed, "}}", "}", -1)
fixed = strings.Replace(fixed, `title "hello world"`, `title("hello world")`, -1)
@ -47,8 +48,10 @@ func TestAllTemplateEngines(t *testing.T) {
{"html", noOp},
{"ace", noOp},
} {
doTestTemplateEngine(t, config.suffix, config.templateFixer)
t.Run(config.suffix,
func(t *testing.T) {
doTestTemplateEngine(t, config.suffix, config.templateFixer)
})
}
}
@ -57,13 +60,6 @@ func doTestTemplateEngine(t *testing.T, suffix string, templateFixer func(s stri
cfg, fs := newTestCfg()
writeSource(t, fs, filepath.Join("content", "p.md"), `
---
title: My Title
---
My Content
`)
t.Log("Testing", suffix)
templTemplate := `
@ -77,11 +73,27 @@ p
`
templ := templateFixer(templTemplate)
templShortcodeTemplate := `
p
|
| Shortcode: {{ .IsNamedParams }}
`
t.Log(templ)
templ := templateFixer(templTemplate)
shortcodeTempl := templateFixer(templShortcodeTemplate)
writeSource(t, fs, filepath.Join("content", "p.md"), `
---
title: My Title
---
My Content
Shortcode: {{< myShort >}}
`)
writeSource(t, fs, filepath.Join("layouts", "_default", fmt.Sprintf("single.%s", suffix)), templ)
writeSource(t, fs, filepath.Join("layouts", "shortcodes", fmt.Sprintf("myShort.%s", suffix)), shortcodeTempl)
s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Cfg: cfg}, BuildCfg{})
th := testHelper{s.Cfg, s.Fs, t}
@ -90,6 +102,7 @@ p
"Page Title: My Title",
"My Content",
"Hello World",
"Shortcode: false",
)
}

View file

@ -14,6 +14,7 @@
package tplimpl
import (
"html/template"
"path/filepath"
"strings"
@ -24,7 +25,8 @@ import (
func (t *templateHandler) addAceTemplate(name, basePath, innerPath string, baseContent, innerContent []byte) error {
t.checkState()
var base, inner *ace.File
name = name[:len(name)-len(filepath.Ext(innerPath))] + ".html"
withoutExt := name[:len(name)-len(filepath.Ext(innerPath))]
name = withoutExt + ".html"
// Fixes issue #1178
basePath = strings.Replace(basePath, "\\", "/", -1)
@ -37,15 +39,29 @@ func (t *templateHandler) addAceTemplate(name, basePath, innerPath string, baseC
base = ace.NewFile(innerPath, innerContent)
inner = ace.NewFile("", []byte{})
}
parsed, err := ace.ParseSource(ace.NewSource(base, inner, []*ace.File{}), nil)
if err != nil {
t.errors = append(t.errors, &templateErr{name: name, err: err})
return err
}
templ, err := ace.CompileResultWithTemplate(t.html.t.New(name), parsed, nil)
if err != nil {
t.errors = append(t.errors, &templateErr{name: name, err: err})
return err
}
return applyTemplateTransformersToHMLTTemplate(templ)
if err := applyTemplateTransformersToHMLTTemplate(templ); err != nil {
return err
}
if strings.Contains(name, "shortcodes") {
// We need to keep track of one ot the output format's shortcode template
// without knowing the rendering context.
clone := template.Must(templ.Clone())
t.html.t.AddParseTree(withoutExt, clone.Tree)
}
return nil
}

View file

@ -622,7 +622,8 @@ func (t *templateHandler) addTemplateFile(name, baseTemplatePath, path string) e
switch ext {
case ".amber":
// Only HTML support for Amber
templateName := strings.TrimSuffix(name, filepath.Ext(name)) + ".html"
withoutExt := strings.TrimSuffix(name, filepath.Ext(name))
templateName := withoutExt + ".html"
b, err := afero.ReadFile(t.Fs.Source, path)
if err != nil {
@ -636,7 +637,19 @@ func (t *templateHandler) addTemplateFile(name, baseTemplatePath, path string) e
return err
}
return applyTemplateTransformersToHMLTTemplate(templ)
if err := applyTemplateTransformersToHMLTTemplate(templ); err != nil {
return err
}
if strings.Contains(templateName, "shortcodes") {
// We need to keep track of one ot the output format's shortcode template
// without knowing the rendering context.
clone := template.Must(templ.Clone())
t.html.t.AddParseTree(withoutExt, clone.Tree)
}
return nil
case ".ace":
// Only HTML support for Ace
var innerContent, baseContent []byte