Skip to content

Commit

Permalink
Fix base template handling with preceding comments
Browse files Browse the repository at this point in the history
Fixes #6816
  • Loading branch information
bep committed Jan 30, 2020
1 parent 49ef647 commit f45cb31
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 9 deletions.
21 changes: 21 additions & 0 deletions hugolib/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,27 @@ title: The Page

}

// https://github.com/gohugoio/hugo/issues/6816
func TestTemplateBaseWithComment(t *testing.T) {
t.Parallel()
b := newTestSitesBuilder(t).WithSimpleConfigFile()
b.WithTemplatesAdded(
"baseof.html", `Base: {{ block "main" . }}{{ end }}`,
"index.html", `
{{/* A comment */}}
{{ define "main" }}
Bonjour
{{ end }}
`)

b.Build(BuildCfg{})
b.AssertFileContent("public/index.html", `Base:
Bonjour`)

}

func TestTemplateLookupSite(t *testing.T) {
t.Run("basic", func(t *testing.T) {
t.Parallel()
Expand Down
41 changes: 35 additions & 6 deletions tpl/tplimpl/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import (
"strings"
"sync"
"time"
"unicode"
"unicode/utf8"

"github.com/gohugoio/hugo/common/types"

Expand Down Expand Up @@ -72,13 +74,40 @@ var (
_ tpl.Info = (*templateState)(nil)
)

// A template needing a base template is a template with only define sections,
// but we check only for the start.
// If a base template does not exist, we will handle that when it's used.
var baseTemplateDefineRe = regexp.MustCompile(`^\s*{{-?\s*define`)
var baseTemplateDefineRe = regexp.MustCompile(`^{{-?\s*define`)

// needsBaseTemplate returns true if the first non-comment template block is a
// define block.
// If a base template does not exist, we will handle that when it's used.
func needsBaseTemplate(templ string) bool {
return baseTemplateDefineRe.MatchString(templ)
idx := -1
inComment := false
for i := 0; i < len(templ); {
if !inComment && strings.HasPrefix(templ[i:], "{{/*") {
inComment = true
i += 4
} else if inComment && strings.HasPrefix(templ[i:], "*/}}") {
inComment = false
i += 4
} else {
r, size := utf8.DecodeRuneInString(templ[i:])
if !inComment {
if strings.HasPrefix(templ[i:], "{{") {
idx = i
break
} else if !unicode.IsSpace(r) {
break
}
}
i += size
}
}

if idx == -1 {
return false
}

return baseTemplateDefineRe.MatchString(templ[idx:])
}

func newIdentity(name string) identity.Manager {
Expand Down Expand Up @@ -549,7 +578,7 @@ func (t *templateHandler) addTemplateFile(name, path string) error {
return nil
}

needsBaseof := !t.noBaseNeeded(name) && baseTemplateDefineRe.MatchString(tinfo.template)
needsBaseof := !t.noBaseNeeded(name) && needsBaseTemplate(tinfo.template)
if needsBaseof {
t.needsBaseof[name] = tinfo
return nil
Expand Down
13 changes: 10 additions & 3 deletions tpl/tplimpl/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,16 @@ func TestNeedsBaseTemplate(t *testing.T) {
c.Assert(needsBaseTemplate(`{{define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(`{{- define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(`{{-define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(`
{{-define "main" }}
`), qt.Equals, true)
c.Assert(needsBaseTemplate(` {{ define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(`
{{ define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(`
{{ define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(` A {{ define "main" }}`), qt.Equals, false)

c.Assert(needsBaseTemplate(` {{ printf "foo" }}`), qt.Equals, false)
c.Assert(needsBaseTemplate(`{{/* comment */}} {{ define "main" }}`), qt.Equals, true)
c.Assert(needsBaseTemplate(` {{/* comment */}} A {{ define "main" }}`), qt.Equals, false)
}

0 comments on commit f45cb31

Please sign in to comment.