Liferay has been using Soy templates (aka. Google Closure templates) extensively in production.
So we decided to create a collection of cool hidden and not so hidden features, to be used as a quick reference so that you turn coffee into code much faster :)
{namespace foo} /** * */ {template .hello} Hello world {/template} /** * @param name */ {template .hello} Hello {$name} {/template} {call .hello} {param name: 'Ray' /} {/call} {call .hello} {param name: $name /} {param lastName: $lastName} {/call} {call .hello data="all" /} {let $name: 'Ray' /} {let $name} Ray {/let} {if $name} Hello {$name} {/if} {if $name and $lastName} Hello {$name} {$lastName} {/if} {if not $name} Hello there {/if} {if $name} Hello {$name} {else} Hello there {/if} {if $gender == 'Male'} Hello Sir {elseif $name == 'Female'} Hello Madam {/if} {switch $gender} {case 'Male'} Hello Sir {case 'Female'} Hello Madam {default} Hello Human {/switch} {$name ?: 'Hello {$name}'} {$name ? 'Hello {$name}' : 'Hello there'} {foreach $name in $names} Hello {$name} {/foreach} {foreach $name in $names} Hello {$name} {ifempty} Hello there {/foreach} {literal} <pre> function() { console.log('Hello'); } </pre> {/literal} {sp} // space {nil} // empty string {\n} // newline {\r} // carriage return {\t} // tab {lb} // left brace {rb} // right brace {augmentMap(map1, map2)} {ceiling(number)} {floor(number)} {isNonnull(value)} {keys(map)} {length(list)} {max(number, number)} {min(number, number)} {randomInt(number)} {round(number)} {strContains(string, subString)}