// Parse parses a string into a template. Nested template definitions will be // associated with the top-level template t. Parse may be called multiple times // to parse definitions of templates to associate with t. It is an error if a // resulting template is non-empty (contains content other than template // definitions) and would replace a non-empty template with the same name. // (In multiple calls to Parse with the same receiver template, only one call // can contain text other than space, comments, and template definitions.) func (t *Template) Parse(text string) (*Template, error) { t.init() trees, err := parse.Parse(t.name, text, t.leftDelim, t.rightDelim, t.parseFuncs, builtins) if err != nil { return nil, err } // Add the newly parsed trees, including the one for t, into our common structure. for name, tree := range trees { // If the name we parsed is the name of this template, overwrite this template. // The associate method checks it's not a redefinition. tmpl := t if name != t.name { tmpl = t.New(name) } // Even if t == tmpl, we need to install it in the common.tmpl map. if replace, err := t.associate(tmpl, tree); err != nil { return nil, err } else if replace { tmpl.Tree = tree } tmpl.leftDelim = t.leftDelim tmpl.rightDelim = t.rightDelim } return t, nil }
func TestAddParseTree(t *testing.T) { // Create some templates. root, err := New("root").Parse(cloneText1) if err != nil { t.Fatal(err) } _, err = root.Parse(cloneText2) if err != nil { t.Fatal(err) } // Add a new parse tree. tree, err := parse.Parse("cloneText3", cloneText3, "", "", nil, builtins) if err != nil { t.Fatal(err) } added, err := root.AddParseTree("c", tree["c"]) // Execute. var b bytes.Buffer err = added.ExecuteTemplate(&b, "a", 0) if err != nil { t.Fatal(err) } if b.String() != "broot" { t.Errorf("expected %q got %q", "broot", b.String()) } }
// Issue 7032 func TestAddParseTreeToUnparsedTemplate(t *testing.T) { master := "{{define \"master\"}}{{end}}" tmpl := New("master") tree, err := parse.Parse("master", master, "", "", nil) if err != nil { t.Fatalf("unexpected parse err: %v", err) } masterTree := tree["master"] tmpl.AddParseTree("master", masterTree) // used to panic }