definition: An evoque template is either
(a) a textual file or
(b) a string in memory or
(c) a begin/end delineated block in a textual file or a string,
each optionally containing additional evoque-specific markup.
Entire template syntax at a glance
$$ -> escape, replaced with $
${expr} -> substitution, like %(expr)s
${expr!format} -> substitution, like %(expr)format
directives
$if{expr} … $elif{expr} … $else … $fi
$for{item in items} … $else … $rof
$begin{label} … $end{label}
$prefer{raw=False, data=None, quoting=None, filters=None}
$test{**kw}
$evoque{name, src=None, collection=None, raw=False,
quoting=None, input_encoding=None, filters=None, **kw}
$overlay{name, src=None, collection=None, space=”positive”}
comments
#[ template comment: single-line, multi-line, nested ]#
${ expr # python single-line comment }
delimeters
either “{” and “}” or “{%” and “%}”, liberally interchangeable
whitespace
“\” at end-of-line consumes the following newline
built-in callables
${evoque(name, **kw)}
${inspect()}
Explanations
Expressions
Expressions have the form ${expr !format} where the “!format”
is optional, and defaults to “!s”, i.e. default string rendering. The possible
values for format are whatever is allowed by the
python’s
string formating operations.
The expr itself may be any valid python expression, that will be evaluated
within the passed context (that may optionally be restricted). For example, the
trivial template:
<p>${amount} ${amount!.2f}</p>
will produce the following output when rendered with
amount=1.0/3
:
<p>0.333333333333 0.33</p>
Directives
Directives have the form $directive{expr}.
Syntactically they are same as an expression but have an additional
qualifying keyword
inserted between the $
and the opening {
.
See dedicated discussion on directives in general and for each
directive in the directives section.
Literals: “$”, “{“, “}”, “!”, “\”
A literal “$” must always be escaped.
A single “$” always signals the beginning of a substitution or a directive,
e.g $expr
has no specific meaning for Evoque and will
give a SyntaxError
(the “$” used to delineate any expanded svn keywords are exempted from this).
Should always use either $$expr
or ${expr}
instead,
depending on what is desired.
A literal “\” at end of a line slurps the newline character but
a literal “\” followed by white space (only) until the first newline
character is put out as is but without the white space, i.e.
"\ \n"
outputs
"\\n"
.
All other literals within the text are never escaped.
Within an expression it is sometimes necessary to use literal braces
e.g. to specify a dict value in place, such as key={"a":1}
,
or a literal piece of CSS such as "tag.class{display:inline}"
.
The alternative “{%” and “%}” expression delimeters are provided
to comfortably allow for this.
Whitespace
A “\” at end-of-line consumes the following newline, providing a basic
whitespace control. In addition to this, the
slurpy_directives=True
on domain
or on
each collection
will
consume all (non-newline) leading and trailing whitespace
on the same line plus — only on the left side — the initial newline.
In addition, all leading or trailing whitespace
within expressions, i.e. between the curly braces,
even if multi-line, is always ignored.
Comments
Single or multi line comments are delineated with
#[
and ]#
,
respectively. For the convenience of easily commenting out
a template section (even if that section itself already
contains comments) comments may be nested. This however
necessitates a minimum syntax to be respected, namely that
comment openings and closing are balanced.
Built-in callables
Any callable set on the evaluation context, either with
domain.set_on_globals()
or by setting it on a
locals
dict that is then passed as a parameter to
template.evoque(locals)
,
may be called as an expression, e.g.
${my_callable(params)}
.
Evoque provides the following built-in callables.
inspect(output=True)
Pretty prints an overview of the evaluation namespace,
namely the context’s globals/locals and the template’s
expressions needing evaluation.
When output is set to False, the output is written
to domain.log.info()
instead of rendered as
part of the template output.
The output of inspect()
is of course escaped as per the
quoting setting of the template. However, templates should normally also
wrap this call into an appropriate markup container
e.g. wrap in a <div class="code">
element
if calling from an HTML context.
evoque(name, **kw)
This is perfectly equivalent to the directive form of
$evoque{name, **kw}
.
The difference is that in the callable variation
it is possible to intercept the output and
process it further via any other callable —
but note that it is recommended that such
processing be specified via the filters
template parameter.