Conditionally included subtemplates
There are many situations when you want to conditionally include some text or another template. StringTemplate
provides simple IF-statements to let you specify conditional includes. For example, in a dynamic web page you usually want a slightly different look depending on whether or not the viewer is "logged in" or not. Without a conditional include, you would need two templates: page_logged_in
and page_logged_out
. You can use a single page
definition with if(
expr)
attribute actions instead:
<html> ... <body> $if(member)$ $gutter/top_gutter_logged_in()$ $else$ $gutter/top_gutter_logged_out()$ $endif$ ... </body> </html>
where template top_gutter_logged_in
is located in the gutter
subdirectory of my StringTemplateGroup
.
IF actions test the presence or absence of an attribute unless the object is a Boolean
/bool
, in which case it tests the attribute for true
/false
. The only operator allowed is "not" and means either "not present" or "not true". For example, "$if(!member)$...$endif$
".
You can also use elseif
to make a chain of tests:
$if(x)$ ... $elseif(y)$ ... $elseif(z)$ ... $else$ ... $endif$
The first true expression "wins".
Whitespace in conditionals issue
There is a simple, but not perfect rule: kill a single newline after <if>
, <<
, <else>
, and <endif>
(but for <endif>
only if it's on a line by itself) . Kill newlines before <else>
and <endif>
and >>
. For example,
a <if(foo)>big<else>small<endif> dog
is identical to:
a <if(foo)> big <else> small <endif> dog
It is very difficult to get the newline rule to work "properly" because sometimes you want newlines and sometimes you don't. I
decided to chew up as many as is reasonable and then let you explicitly say <\n>
when you need to.