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 }
// Parse defines the template by parsing the text. 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() t.muFuncs.RLock() trees, err := parse.Parse(t.name, text, t.leftDelim, t.rightDelim, t.parseFuncs, builtins) t.muFuncs.RUnlock() 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 _, err := t.AddParseTree(name, tree); err != nil { return nil, err } } return t, nil }
func TestAddParseTree(t *testing.T) { root := Must(New("root").Parse(`{{define "a"}} {{.}} {{template "b"}} {{.}} "></a>{{end}}`)) tree, err := parse.Parse("t", `{{define "b"}}<a href="{{end}}`, "", "", nil, nil) if err != nil { t.Fatal(err) } added := Must(root.AddParseTree("b", tree["b"])) b := new(bytes.Buffer) err = added.ExecuteTemplate(b, "a", "1>0") if err != nil { t.Fatal(err) } if got, want := b.String(), ` 1>0 <a href=" 1%3e0 "></a>`; got != want { t.Errorf("got %q want %q", got, want) } }