// This example demonstrates a custom function to process template text. // It installs the strings.Title function and uses it to // Make Title Text Look Good In Our Template's Output. func ExampleTemplate_func() { // First we create a FuncMap with which to register the function. funcMap := template.FuncMap{ // The name "title" is what the function will be called in the template text. "title": strings.Title, } // A simple template definition to test our function. // We print the input text several ways: // - the original // - title-cased // - title-cased and then printed with %q // - printed with %q and then title-cased. const templateText = ` Input: {{printf "%q" .}} Output 0: {{title .}} Output 1: {{title . | printf "%q"}} Output 2: {{printf "%q" . | title}} ` // Create a template, add the function map, and parse the text. tmpl, err := template.New("titleTest").Funcs(funcMap).Parse(templateText) if err != nil { log.Fatalf("parsing: %s", err) } // Run the template to verify the output. err = tmpl.Execute(os.Stdout, "the go programming language") if err != nil { log.Fatalf("execution: %s", err) } // Output: // Input: "the go programming language" // Output 0: The Go Programming Language // Output 1: "The Go Programming Language" // Output 2: "The Go Programming Language" }
func TestEnsurePipelineContains(t *testing.T) { tests := []struct { input, output string ids []string }{ { "{{.X}}", ".X", []string{}, }, { "{{.X | html}}", ".X | html", []string{}, }, { "{{.X}}", ".X | html", []string{"html"}, }, { "{{.X | html}}", ".X | html | urlquery", []string{"urlquery"}, }, { "{{.X | html | urlquery}}", ".X | html | urlquery", []string{"urlquery"}, }, { "{{.X | html | urlquery}}", ".X | html | urlquery", []string{"html", "urlquery"}, }, { "{{.X | html | urlquery}}", ".X | html | urlquery", []string{"html"}, }, { "{{.X | urlquery}}", ".X | html | urlquery", []string{"html", "urlquery"}, }, { "{{.X | html | print}}", ".X | urlquery | html | print", []string{"urlquery", "html"}, }, { "{{($).X | html | print}}", "($).X | urlquery | html | print", []string{"urlquery", "html"}, }, { "{{.X | print 2 | .f 3}}", ".X | print 2 | .f 3 | urlquery | html", []string{"urlquery", "html"}, }, { "{{.X | html | print 2 | .f 3}}", ".X | urlquery | html | print 2 | .f 3", []string{"urlquery", "html"}, }, { // covering issue 10801 "{{.X | js.x }}", ".X | js.x | urlquery | html", []string{"urlquery", "html"}, }, { // covering issue 10801 "{{.X | (print 12 | js).x }}", ".X | (print 12 | js).x | urlquery | html", []string{"urlquery", "html"}, }, } for i, test := range tests { tmpl := template.Must(template.New("test").Parse(test.input)) action, ok := (tmpl.Tree.Root.Nodes[0].(*parse.ActionNode)) if !ok { t.Errorf("#%d: First node is not an action: %s", i, test.input) continue } pipe := action.Pipe ensurePipelineContains(pipe, test.ids) got := pipe.String() if got != test.output { t.Errorf("#%d: %s, %v: want\n\t%s\ngot\n\t%s", i, test.input, test.ids, test.output, got) } } }