shithub: hugo

Download patch

ref: 503ca6de6ceb0b4af533f9efeff917d6f3871278
parent: b3daa1f4bf1b84bcc5da028257ba609be74e3ecc
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Sat Nov 18 05:18:41 EST 2017

Fix broken shortcodes for Ace and Amber

Fixes #4051

--- a/hugolib/template_engines_test.go
+++ b/hugolib/template_engines_test.go
@@ -32,6 +32,7 @@
 	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 @@
 		{"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 @@
 
 	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 @@
 
 `
 
+	templShortcodeTemplate := `
+p
+	|
+	| Shortcode: {{ .IsNamedParams }}
+`
+
 	templ := templateFixer(templTemplate)
+	shortcodeTempl := templateFixer(templShortcodeTemplate)
 
-	t.Log(templ)
+	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 @@
 		"Page Title: My Title",
 		"My Content",
 		"Hello World",
+		"Shortcode: false",
 	)
 
 }
--- a/tpl/tplimpl/ace.go
+++ b/tpl/tplimpl/ace.go
@@ -14,6 +14,7 @@
 package tplimpl
 
 import (
+	"html/template"
 	"path/filepath"
 
 	"strings"
@@ -24,7 +25,8 @@
 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 @@
 		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
 }
--- a/tpl/tplimpl/template.go
+++ b/tpl/tplimpl/template.go
@@ -622,7 +622,8 @@
 	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 @@
 			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
--