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>",