mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
tpl: Pull in Go 1.18 patch that fixes the "no space in {{ continue }} and {{ break }}" bug
This commit is contained in:
parent
e792d27017
commit
3476b53343
5 changed files with 15 additions and 8 deletions
|
@ -17,7 +17,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// The current is built with Go tag go1.18 4aa1efed4853ea067d665a952eee77c52faac774
|
// The current is built with 41a82aa9c3 text/template/parse: allow space after continue or break
|
||||||
fmt.Println("Forking ...")
|
fmt.Println("Forking ...")
|
||||||
defer fmt.Println("Done ...")
|
defer fmt.Println("Done ...")
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ func escapeTemplate(tmpl *Template, node parse.Node, name string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// evalArgs formats the list of arguments into a string. It is equivalent to
|
// evalArgs formats the list of arguments into a string. It is equivalent to
|
||||||
// fmt.Sprint(args...), except that it deferences all pointers.
|
// fmt.Sprint(args...), except that it dereferences all pointers.
|
||||||
func evalArgs(args ...any) string {
|
func evalArgs(args ...any) string {
|
||||||
// Optimization for simple common case of a single string argument.
|
// Optimization for simple common case of a single string argument.
|
||||||
if len(args) == 1 {
|
if len(args) == 1 {
|
||||||
|
@ -691,7 +691,7 @@ func (e *escaper) escapeTemplateBody(c context, t *template.Template) (context,
|
||||||
return c.eq(c1)
|
return c.eq(c1)
|
||||||
}
|
}
|
||||||
// We need to assume an output context so that recursive template calls
|
// We need to assume an output context so that recursive template calls
|
||||||
// take the fast path out of escapeTree instead of infinitely recursing.
|
// take the fast path out of escapeTree instead of infinitely recurring.
|
||||||
// Naively assuming that the input context is the same as the output
|
// Naively assuming that the input context is the same as the output
|
||||||
// works >90% of the time.
|
// works >90% of the time.
|
||||||
e.output[t.Name()] = c
|
e.output[t.Name()] = c
|
||||||
|
|
|
@ -415,8 +415,8 @@ func (t *Tree) action() (n Node) {
|
||||||
// {{break}}
|
// {{break}}
|
||||||
// Break keyword is past.
|
// Break keyword is past.
|
||||||
func (t *Tree) breakControl(pos Pos, line int) Node {
|
func (t *Tree) breakControl(pos Pos, line int) Node {
|
||||||
if token := t.next(); token.typ != itemRightDelim {
|
if token := t.nextNonSpace(); token.typ != itemRightDelim {
|
||||||
t.unexpected(token, "in {{break}}")
|
t.unexpected(token, "{{break}}")
|
||||||
}
|
}
|
||||||
if t.rangeDepth == 0 {
|
if t.rangeDepth == 0 {
|
||||||
t.errorf("{{break}} outside {{range}}")
|
t.errorf("{{break}} outside {{range}}")
|
||||||
|
@ -428,8 +428,8 @@ func (t *Tree) breakControl(pos Pos, line int) Node {
|
||||||
// {{continue}}
|
// {{continue}}
|
||||||
// Continue keyword is past.
|
// Continue keyword is past.
|
||||||
func (t *Tree) continueControl(pos Pos, line int) Node {
|
func (t *Tree) continueControl(pos Pos, line int) Node {
|
||||||
if token := t.next(); token.typ != itemRightDelim {
|
if token := t.nextNonSpace(); token.typ != itemRightDelim {
|
||||||
t.unexpected(token, "in {{continue}}")
|
t.unexpected(token, "{{continue}}")
|
||||||
}
|
}
|
||||||
if t.rangeDepth == 0 {
|
if t.rangeDepth == 0 {
|
||||||
t.errorf("{{continue}} outside {{range}}")
|
t.errorf("{{continue}} outside {{range}}")
|
||||||
|
|
|
@ -263,6 +263,10 @@ var parseTests = []parseTest{
|
||||||
{"newline in pipeline", "{{\n\"x\"\n|\nprintf\n}}", noError, `{{"x" | printf}}`},
|
{"newline in pipeline", "{{\n\"x\"\n|\nprintf\n}}", noError, `{{"x" | printf}}`},
|
||||||
{"newline in comment", "{{/*\nhello\n*/}}", noError, ""},
|
{"newline in comment", "{{/*\nhello\n*/}}", noError, ""},
|
||||||
{"newline in comment", "{{-\n/*\nhello\n*/\n-}}", noError, ""},
|
{"newline in comment", "{{-\n/*\nhello\n*/\n-}}", noError, ""},
|
||||||
|
{"spaces around continue", "{{range .SI}}{{.}}{{ continue }}{{end}}", noError,
|
||||||
|
`{{range .SI}}{{.}}{{continue}}{{end}}`},
|
||||||
|
{"spaces around break", "{{range .SI}}{{.}}{{ break }}{{end}}", noError,
|
||||||
|
`{{range .SI}}{{.}}{{break}}{{end}}`},
|
||||||
|
|
||||||
// Errors.
|
// Errors.
|
||||||
{"unclosed action", "hello{{range", hasError, ""},
|
{"unclosed action", "hello{{range", hasError, ""},
|
||||||
|
|
|
@ -75,9 +75,10 @@ title: "P1"
|
||||||
-- layouts/partials/counter.html --
|
-- layouts/partials/counter.html --
|
||||||
{{ if .Scratch.Get "counter" }}{{ .Scratch.Add "counter" 1 }}{{ else }}{{ .Scratch.Set "counter" 1 }}{{ end }}{{ return true }}
|
{{ if .Scratch.Get "counter" }}{{ .Scratch.Add "counter" 1 }}{{ else }}{{ .Scratch.Set "counter" 1 }}{{ end }}{{ return true }}
|
||||||
-- layouts/_default/single.html --
|
-- layouts/_default/single.html --
|
||||||
{{/* Note no spaces in {{continue}} or {{break}}, see https://github.com/golang/go/issues/51670 */}}
|
|
||||||
continue:{{ range seq 5 }}{{ if eq . 2 }}{{continue}}{{ end }}{{ . }}{{ end }}:END:
|
continue:{{ range seq 5 }}{{ if eq . 2 }}{{continue}}{{ end }}{{ . }}{{ end }}:END:
|
||||||
break:{{ range seq 5 }}{{ if eq . 2 }}{{break}}{{ end }}{{ . }}{{ end }}:END:
|
break:{{ range seq 5 }}{{ if eq . 2 }}{{break}}{{ end }}{{ . }}{{ end }}:END:
|
||||||
|
continue2:{{ range seq 5 }}{{ if eq . 2 }}{{ continue }}{{ end }}{{ . }}{{ end }}:END:
|
||||||
|
break2:{{ range seq 5 }}{{ if eq . 2 }}{{ break }}{{ end }}{{ . }}{{ end }}:END:
|
||||||
|
|
||||||
counter1: {{ partial "counter.html" . }}/{{ .Scratch.Get "counter" }}
|
counter1: {{ partial "counter.html" . }}/{{ .Scratch.Get "counter" }}
|
||||||
and1: {{ if (and false (partial "counter.html" .)) }}true{{ else }}false{{ end }}
|
and1: {{ if (and false (partial "counter.html" .)) }}true{{ else }}false{{ end }}
|
||||||
|
@ -103,6 +104,8 @@ counter2: {{ .Scratch.Get "counter" }}
|
||||||
b.AssertFileContent("public/p1/index.html", `
|
b.AssertFileContent("public/p1/index.html", `
|
||||||
continue:1345:END:
|
continue:1345:END:
|
||||||
break:1:END:
|
break:1:END:
|
||||||
|
continue2:1345:END:
|
||||||
|
break2:1:END:
|
||||||
counter1: true/1
|
counter1: true/1
|
||||||
and1: false
|
and1: false
|
||||||
or1: true
|
or1: true
|
||||||
|
|
Loading…
Reference in a new issue