mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00:00 
			
		
		
		
	| @@ -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() | ||||
|   | ||||
| @@ -22,6 +22,8 @@ import ( | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"github.com/gohugoio/hugo/common/types" | ||||
|  | ||||
| @@ -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 { | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user