1
0
mirror of https://github.com/golang/go synced 2024-11-12 08:10:21 -07:00

text/template: address a couple of issues for html/template

- allow Lookup to work on uninitialized templates
- fix bug in add: can't error after parser is stopped
- add Add method for html/template

R=adg, rogpeppe, r, rsc
CC=golang-dev
https://golang.org/cl/5436080
This commit is contained in:
Rob Pike 2011-11-28 10:42:57 -08:00
parent 356b8ee26f
commit 5f6027e9ad
2 changed files with 21 additions and 1 deletions

View File

@ -170,8 +170,8 @@ func (t *Tree) Parse(s, leftDelim, rightDelim string, treeSet map[string]*Tree,
defer t.recover(&err) defer t.recover(&err)
t.startParse(funcs, lex(t.Name, s, leftDelim, rightDelim)) t.startParse(funcs, lex(t.Name, s, leftDelim, rightDelim))
t.parse(treeSet) t.parse(treeSet)
t.stopParse()
t.add(treeSet) t.add(treeSet)
t.stopParse()
return t, nil return t, nil
} }

View File

@ -103,6 +103,23 @@ func (t *Template) copy(c *common) *Template {
return nt return nt
} }
// Add associates the argument template, arg, with t, and vice versa,
// so they may invoke each other. To do this, it also removes any
// prior associations arg may have. Except for losing the link to
// arg, templates associated with arg are otherwise unaffected. It
// is an error if the argument template's name is already associated
// with t. Add is here to support html/template and is not intended
// for other uses.
// TODO: make this take a parse.Tree argument instead of a template.
func (t *Template) Add(arg *Template) error {
if t.tmpl[arg.name] != nil {
return fmt.Errorf("template: redefinition of template %q", arg.name)
}
arg.common = t.common
t.tmpl[arg.name] = arg
return nil
}
// Templates returns a slice of the templates associated with t, including t // Templates returns a slice of the templates associated with t, including t
// itself. // itself.
func (t *Template) Templates() []*Template { func (t *Template) Templates() []*Template {
@ -139,6 +156,9 @@ func (t *Template) Funcs(funcMap FuncMap) *Template {
// Lookup returns the template with the given name that is associated with t, // Lookup returns the template with the given name that is associated with t,
// or nil if there is no such template. // or nil if there is no such template.
func (t *Template) Lookup(name string) *Template { func (t *Template) Lookup(name string) *Template {
if t.common == nil {
return nil
}
return t.tmpl[name] return t.tmpl[name]
} }