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: 'Jon' /} {/call} {call .hello} {param name: $name /} {param lastName: $lastName /} {/call} {call .hello data="all" /} {let $name: 'Jon' /} {let $names: [ ['first': 'Jon', 'last': 'Snow'], ['first': 'Arya', 'last': 'Stark'] ] /} {let $name kind="text"} Jon {/let} {let $name kind="html"} <p>Jon</p> {/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 $gender == '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 {isNonnull(value)} {strContains(string, subString)} {ceiling(number)} {floor(number)} {max(number, number)} {min(number, number)} {randomInt(number)} {round(number)} {index($var)} {isFirst($var)} {isLast($var)} {length(list)} {augmentMap(map1, map2)} {keys(map)} 