exp/template/html: do not escape the RHS of assignments
In
{{$x := . | foo}}
{{$x}}
the first action is a variable assignment that contributes
nothing to the output while the first is a use that needs
to be escaped.
This CL fixes escapeAction to distinguish assignments from
interpolations and to only modify interpolations.
R=nigeltao, r
CC=golang-dev
https://golang.org/cl/5143048
diff --git a/src/pkg/exp/template/html/escape.go b/src/pkg/exp/template/html/escape.go
index 5ea819f..bb286c8 100644
--- a/src/pkg/exp/template/html/escape.go
+++ b/src/pkg/exp/template/html/escape.go
@@ -153,6 +153,10 @@
// escapeAction escapes an action template node.
func (e *escaper) escapeAction(c context, n *parse.ActionNode) context {
+ if len(n.Pipe.Decl) != 0 {
+ // A local variable assignment, not an interpolation.
+ return c
+ }
c = nudge(c)
s := make([]string, 0, 3)
switch c.state {
diff --git a/src/pkg/exp/template/html/escape_test.go b/src/pkg/exp/template/html/escape_test.go
index d251cdb..c464459 100644
--- a/src/pkg/exp/template/html/escape_test.go
+++ b/src/pkg/exp/template/html/escape_test.go
@@ -68,11 +68,21 @@
"<Goodbye>!",
},
{
- "overescaping",
+ "overescaping1",
"Hello, {{.C | html}}!",
"Hello, <Cincinatti>!",
},
{
+ "overescaping2",
+ "Hello, {{html .C}}!",
+ "Hello, <Cincinatti>!",
+ },
+ {
+ "overescaping3",
+ "{{with .C}}{{$msg := .}}Hello, {{$msg}}!{{end}}",
+ "Hello, <Cincinatti>!",
+ },
+ {
"assignment",
"{{if $x := .H}}{{$x}}{{end}}",
"<Hello>",