// New allocates a new HTML template with the given name. func New(name string) *Template { tmpl := &Template{ nil, template.New(name), nil, &nameSpace{ set: make(map[string]*Template), }, } tmpl.set[name] = tmpl return tmpl }
// escapeTree escapes the named template starting in the given context as // necessary and returns its output context. func (e *escaper) escapeTree(c context, node parse.Node, name string, line int) (context, string) { // Mangle the template name with the input context to produce a reliable // identifier. dname := c.mangle(name) e.called[dname] = true if out, ok := e.output[dname]; ok { // Already escaped. return out, dname } t := e.template(name) if t == nil { // Two cases: The template exists but is empty, or has never been mentioned at // all. Distinguish the cases in the error messages. if e.tmpl.set[name] != nil { return context{ state: stateError, err: errorf(ErrNoSuchTemplate, node, line, "%q is an incomplete or empty template", name), }, dname } return context{ state: stateError, err: errorf(ErrNoSuchTemplate, node, line, "no such template %q", name), }, dname } if dname != name { // Use any template derived during an earlier call to escapeTemplate // with different top level templates, or clone if necessary. dt := e.template(dname) if dt == nil { dt = template.New(dname) dt.Tree = &parse.Tree{Name: dname, Root: t.Root.CopyList()} e.derived[dname] = dt } t = dt } return e.computeOutCtx(c, t), dname }