github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/tpl/internal/go_templates/htmltemplate/example_test.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build go1.13
     6  // +build go1.13
     7  
     8  package template_test
     9  
    10  import (
    11  	"fmt"
    12  	"log"
    13  	"os"
    14  	"strings"
    15  
    16  	template "github.com/gohugoio/hugo/tpl/internal/go_templates/htmltemplate"
    17  )
    18  
    19  func Example() {
    20  	const tpl = `
    21  <!DOCTYPE html>
    22  <html>
    23  	<head>
    24  		<meta charset="UTF-8">
    25  		<title>{{.Title}}</title>
    26  	</head>
    27  	<body>
    28  		{{range .Items}}<div>{{ . }}</div>{{else}}<div><strong>no rows</strong></div>{{end}}
    29  	</body>
    30  </html>`
    31  
    32  	check := func(err error) {
    33  		if err != nil {
    34  			log.Fatal(err)
    35  		}
    36  	}
    37  	t, err := template.New("webpage").Parse(tpl)
    38  	check(err)
    39  
    40  	data := struct {
    41  		Title string
    42  		Items []string
    43  	}{
    44  		Title: "My page",
    45  		Items: []string{
    46  			"My photos",
    47  			"My blog",
    48  		},
    49  	}
    50  
    51  	err = t.Execute(os.Stdout, data)
    52  	check(err)
    53  
    54  	noItems := struct {
    55  		Title string
    56  		Items []string
    57  	}{
    58  		Title: "My another page",
    59  		Items: []string{},
    60  	}
    61  
    62  	err = t.Execute(os.Stdout, noItems)
    63  	check(err)
    64  
    65  	// Output:
    66  	// <!DOCTYPE html>
    67  	// <html>
    68  	// 	<head>
    69  	// 		<meta charset="UTF-8">
    70  	// 		<title>My page</title>
    71  	// 	</head>
    72  	// 	<body>
    73  	// 		<div>My photos</div><div>My blog</div>
    74  	// 	</body>
    75  	// </html>
    76  	// <!DOCTYPE html>
    77  	// <html>
    78  	// 	<head>
    79  	// 		<meta charset="UTF-8">
    80  	// 		<title>My another page</title>
    81  	// 	</head>
    82  	// 	<body>
    83  	// 		<div><strong>no rows</strong></div>
    84  	// 	</body>
    85  	// </html>
    86  
    87  }
    88  
    89  func Example_autoescaping() {
    90  	check := func(err error) {
    91  		if err != nil {
    92  			log.Fatal(err)
    93  		}
    94  	}
    95  	t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
    96  	check(err)
    97  	err = t.ExecuteTemplate(os.Stdout, "T", "<script>alert('you have been pwned')</script>")
    98  	check(err)
    99  	// Output:
   100  	// Hello, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!
   101  }
   102  
   103  func Example_escape() {
   104  	const s = `"Fran & Freddie's Diner" <tasty@example.com>`
   105  	v := []any{`"Fran & Freddie's Diner"`, ' ', `<tasty@example.com>`}
   106  
   107  	fmt.Println(template.HTMLEscapeString(s))
   108  	template.HTMLEscape(os.Stdout, []byte(s))
   109  	fmt.Fprintln(os.Stdout, "")
   110  	fmt.Println(template.HTMLEscaper(v...))
   111  
   112  	fmt.Println(template.JSEscapeString(s))
   113  	template.JSEscape(os.Stdout, []byte(s))
   114  	fmt.Fprintln(os.Stdout, "")
   115  	fmt.Println(template.JSEscaper(v...))
   116  
   117  	fmt.Println(template.URLQueryEscaper(v...))
   118  
   119  	// Output:
   120  	// &#34;Fran &amp; Freddie&#39;s Diner&#34; &lt;tasty@example.com&gt;
   121  	// &#34;Fran &amp; Freddie&#39;s Diner&#34; &lt;tasty@example.com&gt;
   122  	// &#34;Fran &amp; Freddie&#39;s Diner&#34;32&lt;tasty@example.com&gt;
   123  	// \"Fran \u0026 Freddie\'s Diner\" \u003Ctasty@example.com\u003E
   124  	// \"Fran \u0026 Freddie\'s Diner\" \u003Ctasty@example.com\u003E
   125  	// \"Fran \u0026 Freddie\'s Diner\"32\u003Ctasty@example.com\u003E
   126  	// %22Fran+%26+Freddie%27s+Diner%2232%3Ctasty%40example.com%3E
   127  
   128  }
   129  
   130  func ExampleTemplate_Delims() {
   131  	const text = "<<.Greeting>> {{.Name}}"
   132  
   133  	data := struct {
   134  		Greeting string
   135  		Name     string
   136  	}{
   137  		Greeting: "Hello",
   138  		Name:     "Joe",
   139  	}
   140  
   141  	t := template.Must(template.New("tpl").Delims("<<", ">>").Parse(text))
   142  
   143  	err := t.Execute(os.Stdout, data)
   144  	if err != nil {
   145  		log.Fatal(err)
   146  	}
   147  
   148  	// Output:
   149  	// Hello {{.Name}}
   150  }
   151  
   152  // The following example is duplicated in text/template; keep them in sync.
   153  
   154  func ExampleTemplate_block() {
   155  	const (
   156  		master  = `Names:{{block "list" .}}{{"\n"}}{{range .}}{{println "-" .}}{{end}}{{end}}`
   157  		overlay = `{{define "list"}} {{join . ", "}}{{end}} `
   158  	)
   159  	var (
   160  		funcs     = template.FuncMap{"join": strings.Join}
   161  		guardians = []string{"Gamora", "Groot", "Nebula", "Rocket", "Star-Lord"}
   162  	)
   163  	masterTmpl, err := template.New("master").Funcs(funcs).Parse(master)
   164  	if err != nil {
   165  		log.Fatal(err)
   166  	}
   167  	overlayTmpl, err := template.Must(masterTmpl.Clone()).Parse(overlay)
   168  	if err != nil {
   169  		log.Fatal(err)
   170  	}
   171  	if err := masterTmpl.Execute(os.Stdout, guardians); err != nil {
   172  		log.Fatal(err)
   173  	}
   174  	if err := overlayTmpl.Execute(os.Stdout, guardians); err != nil {
   175  		log.Fatal(err)
   176  	}
   177  	// Output:
   178  	// Names:
   179  	// - Gamora
   180  	// - Groot
   181  	// - Nebula
   182  	// - Rocket
   183  	// - Star-Lord
   184  	// Names: Gamora, Groot, Nebula, Rocket, Star-Lord
   185  }