aboutsummaryrefslogtreecommitdiff
path: root/src/html/template/template.go
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2015-08-28 15:31:51 +1000
committerAndrew Gerrand <adg@golang.org>2015-09-28 06:01:30 +0000
commit12dfc3bee482f16263ce4673a0cce399127e2a0d (patch)
treeef8f60a50da69a5dfb3c8ab16082b385a59cfbec /src/html/template/template.go
parent09c6d13ac248eefd1d47e20457125ab5ac8b3246 (diff)
downloadgo-12dfc3bee482f16263ce4673a0cce399127e2a0d.tar.xz
text/template, html/template: add block keyword and permit template redefinition
This change adds a new "block" keyword that permits the definition of templates inline inside existing templates, and loosens the restriction on template redefinition. Templates may now be redefined, but in the html/template package they may only be redefined before the template is executed (and therefore escaped). The intention is that such inline templates can be redefined by subsequent template definitions, permitting a kind of template "inheritance" or "overlay". (See the example for details.) Fixes #3812 Change-Id: I733cb5332c1c201c235f759cc64333462e70dc27 Reviewed-on: https://go-review.googlesource.com/14005 Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/html/template/template.go')
-rw-r--r--src/html/template/template.go4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/html/template/template.go b/src/html/template/template.go
index f9e6e43588..4c38f36e67 100644
--- a/src/html/template/template.go
+++ b/src/html/template/template.go
@@ -18,7 +18,7 @@ import (
// Template is a specialized Template from "text/template" that produces a safe
// HTML document fragment.
type Template struct {
- // Sticky error if escaping fails.
+ // Sticky error if escaping fails, or escapeOK if succeeded.
escapeErr error
// We could embed the text/template field, but it's safer not to because
// we need to keep our version of the name space and the underlying
@@ -170,6 +170,8 @@ func (t *Template) Parse(src string) (*Template, error) {
tmpl := t.set[name]
if tmpl == nil {
tmpl = t.new(name)
+ } else if tmpl.escapeErr != nil {
+ return nil, fmt.Errorf("html/template: cannot redefine %q after it has executed", name)
}
// Restore our record of this text/template to its unescaped original state.
tmpl.escapeErr = nil