| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| Package template implements data-driven templates for generating textual |
| output such as HTML. |
| |
| Templates are executed by applying them to a data structure. |
| Annotations in the template refer to elements of the data |
| structure (typically a field of a struct or a key in a map) |
| to control execution and derive values to be displayed. |
| The template walks the structure as it executes and the |
| "cursor" @ represents the value at the current location |
| in the structure. |
| |
| Data items may be values or pointers; the interface hides the |
| indirection. |
| |
| In the following, 'Field' is one of several things, according to the data. |
| |
| - The name of a field of a struct (result = data.Field), |
| - The value stored in a map under that key (result = data["Field"]), or |
| - The result of invoking a niladic single-valued method with that name |
| (result = data.Field()) |
| |
| If Field is a struct field or method name, it must be an exported |
| (capitalized) name. |
| |
| Major constructs ({} are the default delimiters for template actions; |
| [] are the notation in this comment for optional elements): |
| |
| {# comment } |
| |
| A one-line comment. |
| |
| {.section field} XXX [ {.or} YYY ] {.end} |
| |
| Set @ to the value of the field. It may be an explicit @ |
| to stay at the same point in the data. If the field is nil |
| or empty, execute YYY; otherwise execute XXX. |
| |
| {.repeated section field} XXX [ {.alternates with} ZZZ ] [ {.or} YYY ] {.end} |
| |
| Like .section, but field must be an array or slice. XXX |
| is executed for each element. If the array is nil or empty, |
| YYY is executed instead. If the {.alternates with} marker |
| is present, ZZZ is executed between iterations of XXX. |
| |
| {field} |
| {field1 field2 ...} |
| {field|formatter} |
| {field1 field2...|formatter} |
| {field|formatter1|formatter2} |
| |
| Insert the value of the fields into the output. Each field is |
| first looked for in the cursor, as in .section and .repeated. |
| If it is not found, the search continues in outer sections |
| until the top level is reached. |
| |
| If the field value is a pointer, leading asterisks indicate |
| that the value to be inserted should be evaluated through the |
| pointer. For example, if x.p is of type *int, {x.p} will |
| insert the value of the pointer but {*x.p} will insert the |
| value of the underlying integer. If the value is nil or not a |
| pointer, asterisks have no effect. |
| |
| If a formatter is specified, it must be named in the formatter |
| map passed to the template set up routines or in the default |
| set ("html","str","") and is used to process the data for |
| output. The formatter function has signature |
| func(wr io.Writer, formatter string, data ...interface{}) |
| where wr is the destination for output, data holds the field |
| values at the instantiation, and formatter is its name at |
| the invocation site. The default formatter just concatenates |
| the string representations of the fields. |
| |
| Multiple formatters separated by the pipeline character | are |
| executed sequentially, with each formatter receiving the bytes |
| emitted by the one to its left. |
| |
| As well as field names, one may use literals with Go syntax. |
| Integer, floating-point, and string literals are supported. |
| Raw strings may not span newlines. |
| |
| The delimiter strings get their default value, "{" and "}", from |
| JSON-template. They may be set to any non-empty, space-free |
| string using the SetDelims method. Their value can be printed |
| in the output using {.meta-left} and {.meta-right}. |
| */ |
| package template |