| | |
| | |
| | |
| |
|
| | package template_test |
| |
|
| | import ( |
| | "fmt" |
| | "html/template" |
| | "log" |
| | "os" |
| | "strings" |
| | ) |
| |
|
| | func Example() { |
| | const tpl = ` |
| | <!DOCTYPE html> |
| | <html> |
| | <head> |
| | <meta charset="UTF-8"> |
| | <title>{{.Title}}</title> |
| | </head> |
| | <body> |
| | {{range .Items}}<div>{{ . }}</div>{{else}}<div><strong>no rows</strong></div>{{end}} |
| | </body> |
| | </html>` |
| |
|
| | check := func(err error) { |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| | } |
| | t, err := template.New("webpage").Parse(tpl) |
| | check(err) |
| |
|
| | data := struct { |
| | Title string |
| | Items []string |
| | }{ |
| | Title: "My page", |
| | Items: []string{ |
| | "My photos", |
| | "My blog", |
| | }, |
| | } |
| |
|
| | err = t.Execute(os.Stdout, data) |
| | check(err) |
| |
|
| | noItems := struct { |
| | Title string |
| | Items []string |
| | }{ |
| | Title: "My another page", |
| | Items: []string{}, |
| | } |
| |
|
| | err = t.Execute(os.Stdout, noItems) |
| | check(err) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | } |
| |
|
| | func Example_autoescaping() { |
| | check := func(err error) { |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| | } |
| | t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`) |
| | check(err) |
| | err = t.ExecuteTemplate(os.Stdout, "T", "<script>alert('you have been pwned')</script>") |
| | check(err) |
| | |
| | |
| | } |
| |
|
| | func Example_escape() { |
| | const s = `"Fran & Freddie's Diner" <tasty@example.com>` |
| | v := []any{`"Fran & Freddie's Diner"`, ' ', `<tasty@example.com>`} |
| |
|
| | fmt.Println(template.HTMLEscapeString(s)) |
| | template.HTMLEscape(os.Stdout, []byte(s)) |
| | fmt.Fprintln(os.Stdout, "") |
| | fmt.Println(template.HTMLEscaper(v...)) |
| |
|
| | fmt.Println(template.JSEscapeString(s)) |
| | template.JSEscape(os.Stdout, []byte(s)) |
| | fmt.Fprintln(os.Stdout, "") |
| | fmt.Println(template.JSEscaper(v...)) |
| |
|
| | fmt.Println(template.URLQueryEscaper(v...)) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | } |
| |
|
| | func ExampleTemplate_Delims() { |
| | const text = "<<.Greeting>> {{.Name}}" |
| |
|
| | data := struct { |
| | Greeting string |
| | Name string |
| | }{ |
| | Greeting: "Hello", |
| | Name: "Joe", |
| | } |
| |
|
| | t := template.Must(template.New("tpl").Delims("<<", ">>").Parse(text)) |
| |
|
| | err := t.Execute(os.Stdout, data) |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| |
|
| | |
| | |
| | } |
| |
|
| | |
| |
|
| | func ExampleTemplate_block() { |
| | const ( |
| | master = `Names:{{block "list" .}}{{"\n"}}{{range .}}{{println "-" .}}{{end}}{{end}}` |
| | overlay = `{{define "list"}} {{join . ", "}}{{end}} ` |
| | ) |
| | var ( |
| | funcs = template.FuncMap{"join": strings.Join} |
| | guardians = []string{"Gamora", "Groot", "Nebula", "Rocket", "Star-Lord"} |
| | ) |
| | masterTmpl, err := template.New("master").Funcs(funcs).Parse(master) |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| | overlayTmpl, err := template.Must(masterTmpl.Clone()).Parse(overlay) |
| | if err != nil { |
| | log.Fatal(err) |
| | } |
| | if err := masterTmpl.Execute(os.Stdout, guardians); err != nil { |
| | log.Fatal(err) |
| | } |
| | if err := overlayTmpl.Execute(os.Stdout, guardians); err != nil { |
| | log.Fatal(err) |
| | } |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | } |
| |
|