github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/text/template/doc.go (about) 1 // Copyright 2011 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 /* 6 Package template implements data-driven templates for generating textual output. 7 8 To generate HTML output, see package html/template, which has the same interface 9 as this package but automatically secures HTML output against certain attacks. 10 11 Templates are executed by applying them to a data structure. Annotations in the 12 template refer to elements of the data structure (typically a field of a struct 13 or a key in a map) to control execution and derive values to be displayed. 14 Execution of the template walks the structure and sets the cursor, represented 15 by a period '.' and called "dot", to the value at the current location in the 16 structure as execution proceeds. 17 18 The input text for a template is UTF-8-encoded text in any format. 19 "Actions"--data evaluations or control structures--are delimited by 20 "{{" and "}}"; all text outside actions is copied to the output unchanged. 21 Except for raw strings, actions may not span newlines, although comments can. 22 23 Once parsed, a template may be executed safely in parallel. 24 25 Here is a trivial example that prints "17 items are made of wool". 26 27 type Inventory struct { 28 Material string 29 Count uint 30 } 31 sweaters := Inventory{"wool", 17} 32 tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}") 33 if err != nil { panic(err) } 34 err = tmpl.Execute(os.Stdout, sweaters) 35 if err != nil { panic(err) } 36 37 More intricate examples appear below. 38 39 Text and spaces 40 41 By default, all text between actions is copied verbatim when the template is 42 executed. For example, the string " items are made of " in the example above appears 43 on standard output when the program is run. 44 45 However, to aid in formatting template source code, if an action's left delimiter 46 (by default "{{") is followed immediately by a minus sign and ASCII space character 47 ("{{- "), all trailing white space is trimmed from the immediately preceding text. 48 Similarly, if the right delimiter ("}}") is preceded by a space and minus sign 49 (" -}}"), all leading white space is trimmed from the immediately following text. 50 In these trim markers, the ASCII space must be present; "{{-3}}" parses as an 51 action containing the number -3. 52 53 For instance, when executing the template whose source is 54 55 "{{23 -}} < {{- 45}}" 56 57 the generated output would be 58 59 "23<45" 60 61 For this trimming, the definition of white space characters is the same as in Go: 62 space, horizontal tab, carriage return, and newline. 63 64 Actions 65 66 Here is the list of actions. "Arguments" and "pipelines" are evaluations of 67 data, defined in detail in the corresponding sections that follow. 68 69 */ 70 // {{/* a comment */}} 71 // A comment; discarded. May contain newlines. 72 // Comments do not nest and must start and end at the 73 // delimiters, as shown here. 74 /* 75 76 {{pipeline}} 77 The default textual representation (the same as would be 78 printed by fmt.Print) of the value of the pipeline is copied 79 to the output. 80 81 {{if pipeline}} T1 {{end}} 82 If the value of the pipeline is empty, no output is generated; 83 otherwise, T1 is executed. The empty values are false, 0, any 84 nil pointer or interface value, and any array, slice, map, or 85 string of length zero. 86 Dot is unaffected. 87 88 {{if pipeline}} T1 {{else}} T0 {{end}} 89 If the value of the pipeline is empty, T0 is executed; 90 otherwise, T1 is executed. Dot is unaffected. 91 92 {{if pipeline}} T1 {{else if pipeline}} T0 {{end}} 93 To simplify the appearance of if-else chains, the else action 94 of an if may include another if directly; the effect is exactly 95 the same as writing 96 {{if pipeline}} T1 {{else}}{{if pipeline}} T0 {{end}}{{end}} 97 98 {{range pipeline}} T1 {{end}} 99 The value of the pipeline must be an array, slice, map, or channel. 100 If the value of the pipeline has length zero, nothing is output; 101 otherwise, dot is set to the successive elements of the array, 102 slice, or map and T1 is executed. If the value is a map and the 103 keys are of basic type with a defined order ("comparable"), the 104 elements will be visited in sorted key order. 105 106 {{range pipeline}} T1 {{else}} T0 {{end}} 107 The value of the pipeline must be an array, slice, map, or channel. 108 If the value of the pipeline has length zero, dot is unaffected and 109 T0 is executed; otherwise, dot is set to the successive elements 110 of the array, slice, or map and T1 is executed. 111 112 {{template "name"}} 113 The template with the specified name is executed with nil data. 114 115 {{template "name" pipeline}} 116 The template with the specified name is executed with dot set 117 to the value of the pipeline. 118 119 {{block "name" pipeline}} T1 {{end}} 120 A block is shorthand for defining a template 121 {{define "name"}} T1 {{end}} 122 and then executing it in place 123 {{template "name" .}} 124 The typical use is to define a set of root templates that are 125 then customized by redefining the block templates within. 126 127 {{with pipeline}} T1 {{end}} 128 If the value of the pipeline is empty, no output is generated; 129 otherwise, dot is set to the value of the pipeline and T1 is 130 executed. 131 132 {{with pipeline}} T1 {{else}} T0 {{end}} 133 If the value of the pipeline is empty, dot is unaffected and T0 134 is executed; otherwise, dot is set to the value of the pipeline 135 and T1 is executed. 136 137 Arguments 138 139 An argument is a simple value, denoted by one of the following. 140 141 - A boolean, string, character, integer, floating-point, imaginary 142 or complex constant in Go syntax. These behave like Go's untyped 143 constants. 144 - The keyword nil, representing an untyped Go nil. 145 - The character '.' (period): 146 . 147 The result is the value of dot. 148 - A variable name, which is a (possibly empty) alphanumeric string 149 preceded by a dollar sign, such as 150 $piOver2 151 or 152 $ 153 The result is the value of the variable. 154 Variables are described below. 155 - The name of a field of the data, which must be a struct, preceded 156 by a period, such as 157 .Field 158 The result is the value of the field. Field invocations may be 159 chained: 160 .Field1.Field2 161 Fields can also be evaluated on variables, including chaining: 162 $x.Field1.Field2 163 - The name of a key of the data, which must be a map, preceded 164 by a period, such as 165 .Key 166 The result is the map element value indexed by the key. 167 Key invocations may be chained and combined with fields to any 168 depth: 169 .Field1.Key1.Field2.Key2 170 Although the key must be an alphanumeric identifier, unlike with 171 field names they do not need to start with an upper case letter. 172 Keys can also be evaluated on variables, including chaining: 173 $x.key1.key2 174 - The name of a niladic method of the data, preceded by a period, 175 such as 176 .Method 177 The result is the value of invoking the method with dot as the 178 receiver, dot.Method(). Such a method must have one return value (of 179 any type) or two return values, the second of which is an error. 180 If it has two and the returned error is non-nil, execution terminates 181 and an error is returned to the caller as the value of Execute. 182 Method invocations may be chained and combined with fields and keys 183 to any depth: 184 .Field1.Key1.Method1.Field2.Key2.Method2 185 Methods can also be evaluated on variables, including chaining: 186 $x.Method1.Field 187 - The name of a niladic function, such as 188 fun 189 The result is the value of invoking the function, fun(). The return 190 types and values behave as in methods. Functions and function 191 names are described below. 192 - A parenthesized instance of one the above, for grouping. The result 193 may be accessed by a field or map key invocation. 194 print (.F1 arg1) (.F2 arg2) 195 (.StructValuedMethod "arg").Field 196 197 Arguments may evaluate to any type; if they are pointers the implementation 198 automatically indirects to the base type when required. 199 If an evaluation yields a function value, such as a function-valued 200 field of a struct, the function is not invoked automatically, but it 201 can be used as a truth value for an if action and the like. To invoke 202 it, use the call function, defined below. 203 204 Pipelines 205 206 A pipeline is a possibly chained sequence of "commands". A command is a simple 207 value (argument) or a function or method call, possibly with multiple arguments: 208 209 Argument 210 The result is the value of evaluating the argument. 211 .Method [Argument...] 212 The method can be alone or the last element of a chain but, 213 unlike methods in the middle of a chain, it can take arguments. 214 The result is the value of calling the method with the 215 arguments: 216 dot.Method(Argument1, etc.) 217 functionName [Argument...] 218 The result is the value of calling the function associated 219 with the name: 220 function(Argument1, etc.) 221 Functions and function names are described below. 222 223 A pipeline may be "chained" by separating a sequence of commands with pipeline 224 characters '|'. In a chained pipeline, the result of each command is 225 passed as the last argument of the following command. The output of the final 226 command in the pipeline is the value of the pipeline. 227 228 The output of a command will be either one value or two values, the second of 229 which has type error. If that second value is present and evaluates to 230 non-nil, execution terminates and the error is returned to the caller of 231 Execute. 232 233 Variables 234 235 A pipeline inside an action may initialize a variable to capture the result. 236 The initialization has syntax 237 238 $variable := pipeline 239 240 where $variable is the name of the variable. An action that declares a 241 variable produces no output. 242 243 If a "range" action initializes a variable, the variable is set to the 244 successive elements of the iteration. Also, a "range" may declare two 245 variables, separated by a comma: 246 247 range $index, $element := pipeline 248 249 in which case $index and $element are set to the successive values of the 250 array/slice index or map key and element, respectively. Note that if there is 251 only one variable, it is assigned the element; this is opposite to the 252 convention in Go range clauses. 253 254 A variable's scope extends to the "end" action of the control structure ("if", 255 "with", or "range") in which it is declared, or to the end of the template if 256 there is no such control structure. A template invocation does not inherit 257 variables from the point of its invocation. 258 259 When execution begins, $ is set to the data argument passed to Execute, that is, 260 to the starting value of dot. 261 262 Examples 263 264 Here are some example one-line templates demonstrating pipelines and variables. 265 All produce the quoted word "output": 266 267 {{"\"output\""}} 268 A string constant. 269 {{`"output"`}} 270 A raw string constant. 271 {{printf "%q" "output"}} 272 A function call. 273 {{"output" | printf "%q"}} 274 A function call whose final argument comes from the previous 275 command. 276 {{printf "%q" (print "out" "put")}} 277 A parenthesized argument. 278 {{"put" | printf "%s%s" "out" | printf "%q"}} 279 A more elaborate call. 280 {{"output" | printf "%s" | printf "%q"}} 281 A longer chain. 282 {{with "output"}}{{printf "%q" .}}{{end}} 283 A with action using dot. 284 {{with $x := "output" | printf "%q"}}{{$x}}{{end}} 285 A with action that creates and uses a variable. 286 {{with $x := "output"}}{{printf "%q" $x}}{{end}} 287 A with action that uses the variable in another action. 288 {{with $x := "output"}}{{$x | printf "%q"}}{{end}} 289 The same, but pipelined. 290 291 Functions 292 293 During execution functions are found in two function maps: first in the 294 template, then in the global function map. By default, no functions are defined 295 in the template but the Funcs method can be used to add them. 296 297 Predefined global functions are named as follows. 298 299 and 300 Returns the boolean AND of its arguments by returning the 301 first empty argument or the last argument, that is, 302 "and x y" behaves as "if x then y else x". All the 303 arguments are evaluated. 304 call 305 Returns the result of calling the first argument, which 306 must be a function, with the remaining arguments as parameters. 307 Thus "call .X.Y 1 2" is, in Go notation, dot.X.Y(1, 2) where 308 Y is a func-valued field, map entry, or the like. 309 The first argument must be the result of an evaluation 310 that yields a value of function type (as distinct from 311 a predefined function such as print). The function must 312 return either one or two result values, the second of which 313 is of type error. If the arguments don't match the function 314 or the returned error value is non-nil, execution stops. 315 html 316 Returns the escaped HTML equivalent of the textual 317 representation of its arguments. 318 index 319 Returns the result of indexing its first argument by the 320 following arguments. Thus "index x 1 2 3" is, in Go syntax, 321 x[1][2][3]. Each indexed item must be a map, slice, or array. 322 js 323 Returns the escaped JavaScript equivalent of the textual 324 representation of its arguments. 325 len 326 Returns the integer length of its argument. 327 not 328 Returns the boolean negation of its single argument. 329 or 330 Returns the boolean OR of its arguments by returning the 331 first non-empty argument or the last argument, that is, 332 "or x y" behaves as "if x then x else y". All the 333 arguments are evaluated. 334 print 335 An alias for fmt.Sprint 336 printf 337 An alias for fmt.Sprintf 338 println 339 An alias for fmt.Sprintln 340 urlquery 341 Returns the escaped value of the textual representation of 342 its arguments in a form suitable for embedding in a URL query. 343 344 The boolean functions take any zero value to be false and a non-zero 345 value to be true. 346 347 There is also a set of binary comparison operators defined as 348 functions: 349 350 eq 351 Returns the boolean truth of arg1 == arg2 352 ne 353 Returns the boolean truth of arg1 != arg2 354 lt 355 Returns the boolean truth of arg1 < arg2 356 le 357 Returns the boolean truth of arg1 <= arg2 358 gt 359 Returns the boolean truth of arg1 > arg2 360 ge 361 Returns the boolean truth of arg1 >= arg2 362 363 For simpler multi-way equality tests, eq (only) accepts two or more 364 arguments and compares the second and subsequent to the first, 365 returning in effect 366 367 arg1==arg2 || arg1==arg3 || arg1==arg4 ... 368 369 (Unlike with || in Go, however, eq is a function call and all the 370 arguments will be evaluated.) 371 372 The comparison functions work on basic types only (or named basic 373 types, such as "type Celsius float32"). They implement the Go rules 374 for comparison of values, except that size and exact type are 375 ignored, so any integer value, signed or unsigned, may be compared 376 with any other integer value. (The arithmetic value is compared, 377 not the bit pattern, so all negative integers are less than all 378 unsigned integers.) However, as usual, one may not compare an int 379 with a float32 and so on. 380 381 Associated templates 382 383 Each template is named by a string specified when it is created. Also, each 384 template is associated with zero or more other templates that it may invoke by 385 name; such associations are transitive and form a name space of templates. 386 387 A template may use a template invocation to instantiate another associated 388 template; see the explanation of the "template" action above. The name must be 389 that of a template associated with the template that contains the invocation. 390 391 Nested template definitions 392 393 When parsing a template, another template may be defined and associated with the 394 template being parsed. Template definitions must appear at the top level of the 395 template, much like global variables in a Go program. 396 397 The syntax of such definitions is to surround each template declaration with a 398 "define" and "end" action. 399 400 The define action names the template being created by providing a string 401 constant. Here is a simple example: 402 403 `{{define "T1"}}ONE{{end}} 404 {{define "T2"}}TWO{{end}} 405 {{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}} 406 {{template "T3"}}` 407 408 This defines two templates, T1 and T2, and a third T3 that invokes the other two 409 when it is executed. Finally it invokes T3. If executed this template will 410 produce the text 411 412 ONE TWO 413 414 By construction, a template may reside in only one association. If it's 415 necessary to have a template addressable from multiple associations, the 416 template definition must be parsed multiple times to create distinct *Template 417 values, or must be copied with the Clone or AddParseTree method. 418 419 Parse may be called multiple times to assemble the various associated templates; 420 see the ParseFiles and ParseGlob functions and methods for simple ways to parse 421 related templates stored in files. 422 423 A template may be executed directly or through ExecuteTemplate, which executes 424 an associated template identified by name. To invoke our example above, we 425 might write, 426 427 err := tmpl.Execute(os.Stdout, "no data needed") 428 if err != nil { 429 log.Fatalf("execution failed: %s", err) 430 } 431 432 or to invoke a particular template explicitly by name, 433 434 err := tmpl.ExecuteTemplate(os.Stdout, "T2", "no data needed") 435 if err != nil { 436 log.Fatalf("execution failed: %s", err) 437 } 438 439 */ 440 package template