hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 56550d1e449f45ebee398ac8a9e3b9818b3ee60e
parent 7881b0965f8b83d03379e9ed102cd0c3bce297e2
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Mon, 15 Apr 2019 15:17:46 +0200

hugolib: Fix shortcode namespace issue

Fixes #5863

Diffstat:
Mhugolib/shortcode_test.go | 29+++++++++++++++++++++++++++++
Mtpl/tplimpl/shortcodes.go | 4++--
Mtpl/tplimpl/shortcodes_test.go | 6+++++-
Mtpl/tplimpl/template.go | 24+++++++++++++++++++++---
4 files changed, 57 insertions(+), 6 deletions(-)
diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go
@@ -1126,3 +1126,32 @@ CONTENT:{{ .Content }}
 
 	}
 }
+
+// https://github.com/gohugoio/hugo/issues/5863
+func TestShortcodeNamespaced(t *testing.T) {
+	t.Parallel()
+	assert := require.New(t)
+
+	builder := newTestSitesBuilder(t).WithSimpleConfigFile()
+
+	builder.WithContent("page.md", `---
+title: "Hugo Rocks!"
+---
+
+# doc
+
+   hello: {{< hello >}}
+   test/hello: {{< test/hello >}}
+
+`).WithTemplatesAdded(
+		"layouts/shortcodes/hello.html", `hello`,
+		"layouts/shortcodes/test/hello.html", `test/hello`).CreateSites().Build(BuildCfg{})
+
+	s := builder.H.Sites[0]
+	assert.Equal(1, len(s.RegularPages()))
+
+	builder.AssertFileContent("public/page/index.html",
+		"hello: hello",
+		"test/hello: test/hello",
+	)
+}
diff --git a/tpl/tplimpl/shortcodes.go b/tpl/tplimpl/shortcodes.go
@@ -152,9 +152,9 @@ func resolveTemplateType(name string) templateType {
 }
 
 func isShortcode(name string) bool {
-	return strings.Contains(name, "shortcodes/")
+	return strings.Contains(name, shortcodesPathPrefix)
 }
 
 func isInternal(name string) bool {
-	return strings.HasPrefix(name, "_internal/")
+	return strings.HasPrefix(name, internalPathPrefix)
 }
diff --git a/tpl/tplimpl/shortcodes_test.go b/tpl/tplimpl/shortcodes_test.go
@@ -85,9 +85,13 @@ func TestShortcodesTemplate(t *testing.T) {
 
 	})
 
-	t.Run("Template", func(t *testing.T) {
+	t.Run("Name", func(t *testing.T) {
 		assert := require.New(t)
 
+		assert.Equal("foo.html", templateBaseName(templateShortcode, "shortcodes/foo.html"))
+		assert.Equal("foo.html", templateBaseName(templateShortcode, "_internal/shortcodes/foo.html"))
+		assert.Equal("test/foo.html", templateBaseName(templateShortcode, "shortcodes/test/foo.html"))
+
 		assert.True(true)
 
 	})
diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go
@@ -16,7 +16,6 @@ package tplimpl
 import (
 	"fmt"
 	"html/template"
-	"path"
 	"strings"
 	texttemplate "text/template"
 
@@ -112,8 +111,27 @@ type templateHandler struct {
 	*deps.Deps
 }
 
+const (
+	shortcodesPathPrefix = "shortcodes/"
+	internalPathPrefix   = "_internal/"
+)
+
+// resolves _internal/shortcodes/param.html => param.html etc.
+func templateBaseName(typ templateType, name string) string {
+	name = strings.TrimPrefix(name, internalPathPrefix)
+	switch typ {
+	case templateShortcode:
+		return strings.TrimPrefix(name, shortcodesPathPrefix)
+	default:
+		panic("not implemented")
+	}
+
+}
+
 func (t *templateHandler) addShortcodeVariant(name string, info tpl.Info, templ tpl.Template) {
-	shortcodename, variants := templateNameAndVariants(path.Base(name))
+	base := templateBaseName(templateShortcode, name)
+
+	shortcodename, variants := templateNameAndVariants(base)
 
 	templs, found := t.shortcodes[shortcodename]
 	if !found {
@@ -204,7 +222,7 @@ func (t *templateHandler) applyTemplateInfo(templ tpl.Template, found bool) (tpl
 // This currently only applies to shortcodes and what we get here is the
 // shortcode name.
 func (t *templateHandler) LookupVariant(name string, variants tpl.TemplateVariants) (tpl.Template, bool, bool) {
-	name = path.Base(name)
+	name = templateBaseName(templateShortcode, name)
 	s, found := t.shortcodes[name]
 	if !found {
 		return nil, false, false