hugolib: Fix shortcode namespace issue

Fixes #5863
This commit is contained in:
Bjørn Erik Pedersen 2019-04-15 15:17:46 +02:00
parent 7881b0965f
commit 56550d1e44
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
4 changed files with 57 additions and 6 deletions

View file

@ -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",
)
}

View file

@ -152,9 +152,9 @@ func resolveTemplateType(name string) templateType {
} }
func isShortcode(name string) bool { func isShortcode(name string) bool {
return strings.Contains(name, "shortcodes/") return strings.Contains(name, shortcodesPathPrefix)
} }
func isInternal(name string) bool { func isInternal(name string) bool {
return strings.HasPrefix(name, "_internal/") return strings.HasPrefix(name, internalPathPrefix)
} }

View file

@ -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 := 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) assert.True(true)
}) })

View file

@ -16,7 +16,6 @@ package tplimpl
import ( import (
"fmt" "fmt"
"html/template" "html/template"
"path"
"strings" "strings"
texttemplate "text/template" texttemplate "text/template"
@ -112,8 +111,27 @@ type templateHandler struct {
*deps.Deps *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) { 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] templs, found := t.shortcodes[shortcodename]
if !found { 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 // This currently only applies to shortcodes and what we get here is the
// shortcode name. // shortcode name.
func (t *templateHandler) LookupVariant(name string, variants tpl.TemplateVariants) (tpl.Template, bool, bool) { 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] s, found := t.shortcodes[name]
if !found { if !found {
return nil, false, false return nil, false, false