begin/end blocks: sub-templates
Nested templates are the def, the macro, the callable block, the sub-template of Evoque.
The $begin{label} and the
$end{label} pair of directives
define a sub-template, that is a template nested within a
template (file or string).
The label may be considered
just as a named anchor, a destination inside the
file to which one can point to directly--a sub-template is
addressed via the label, using a syntax
similar to fragment identifiers of a URL, i.e. #label.
When being addressed locally, i.e. from within the body of the
same parent (sub-)template,
a sub-template may be addressed with just #label.
Outer sub-templates (i.e. sub-templates at the top level) are addressable from any other template;
Inner sub-templates (i.e. sub-templates within sub-templates) are private to their direct parent sub-template i.e. their scope is local to their parent sub-template.
Parameters
There is really only one parameter, and that is the label that is what is used to address the template.
Execution
To be executed, they are evoque'd:
This will evaluate the nested template using a copy
of the caller's context.
Note that a nested template is a full-fledged template in its own right,
and may therefore specify its own $prefer{} and $overlay{}
directives i.e. it may specify its own preferences e.g. its own default data
to use should the caller's context not specify a needed variable,
or whether it is itself an overlay over another template.
Nested template principles
- A label (for a
begin/endblock) that defines a nested template is unique within the parent template's scope. - All
begin/endblocks contained in a template must be properly nested such that they do not overlap (same well-formedness principle as in XML). -
Inner sub-templates may only be addessed locally
i.e via
#labelfrom within the code body of the sub-template in which they are defined. Note, in case of the parent sub-template being an overly, and it does not locally define a#labelsub, the inner sub-template is of course looked up from the overlaid template. -
Outer sub-templates may be addessed both locally,
as for inner sub-templates, as well as externally from within
other templates--in which case the information to identify the top-level
template must also be specified
i.e
name#labelfor an explicitly named template, or by something liketemplate.html#labelfor a template implicitly named by its file name. - Within overlay templates it is possible to explicitly specify what level the lookup for a locally addressed nested template should start from i.e. if the name starts with a single "#" then start lookup from current level, if with "##" then from one level down, if with "###" then from two levels down, etc.
- If only one of the
beginorenddirectives is present, then the other is implied by, respectively, the beginning or the end of the string. -
An outer nested template has all the
characteristics of a standalone file or string template.
The only apparent difference is in how it is
addressed--as sub-templates are addressed with
#label, one can consider that a standalone template is the special-case sub-template having the empty string as the label (and with both thebeginandenddirectives being omitted and thus being simply just implied by the beginning and end of the template string). - A nested template is not automatically rendered when the template that defines it is rendered; it must be explicitly evoque'd.
- Everything already established about directives applies, e.g.
both
beginandendmay all be on same line, or each may span many lines; any of the two allowed delimeter pairs may be used; any whitespace around the label is ignored, etc.