Template code Chunk output
{!-- Supply a default from the template, to output when
  -- tag is not defined.  Everything after the colon :
  -- becomes the tag value (NB: null and undefined are
  -- NOT the same - see example 4 below).
  --}
<p>Hello {$name:there}!  You're our grand prize winner!</p>
Theme theme = new Theme();

// fetch template from themes/example.chtml
Chunk html = theme.makeChunk("example");

// Insert business logic here.
// Normally you write a lot of html.set("this","that") calls here.

StreamWriter out = getStreamWriter();
html.render( out );

///// or, return the rendered template as a string
// return html.toString();
<p>Hello there!  You're our grand prize winner!</p>

Hello there! You're our grand prize winner!

Template code Chunk output
{!-- Default to the empty string, no tag preservation. --}
<div>{$error_message:}</div>
Theme theme = new Theme();

// fetch template from themes/example.chtml
Chunk html = theme.makeChunk("example");

// Insert business logic here.
// Normally you write a lot of html.set("this","that") calls here.

StreamWriter out = getStreamWriter();
html.render( out );

///// or, return the rendered template as a string
// return html.toString();
Template code Chunk output
{!-- The |onempty() filter covers cases where you don't
  -- need to differentiate between undefined and defined-but-empty.
  --
  -- onempty outputs its argument when the tag is:
  --  (A) only whitespace, or
  --  (B) is the empty string, or
  --  (C) is not defined at all.
  --
  -- The pipe character | marks the start of a tag output filter.
  --}
Hello {$name|onempty(there)}!  You're our grand prize winner!
Theme theme = new Theme();

// fetch template from themes/example.chtml
Chunk html = theme.makeChunk("example");

// Insert business logic here.
// Normally you write a lot of html.set("this","that") calls here.

StreamWriter out = getStreamWriter();
html.render( out );

///// or, return the rendered template as a string
// return html.toString();
Hello there!  You're our grand prize winner!

Hello there! You're our grand prize winner!
Template code Chunk output
{!-- IMPORTANT!! The following two calls are equivalent:
  --
  --   c.set("tag", null);
  --   c.set("tag", "");
  --
  -- Chunk.set() does null-trapping -- turns null into the empty string.
  -- Furthermore, the empty string is considered "defined" when
  -- rendering the template.
  --
  -- So, if you *want* a default value to display (eg {$tag:default} ),
  -- don't use null!!  Instead, make sure a tag is undefined like so:
  --
  --   // call setOrDelete with an expression that evaluates to null
  --   x = null;
  --   c.setOrDelete("tag", x); // setOrDelete does no null-trapping
  --   // or...
  --   c.unset("tag");
  --   // or just don't call .set() at all!
  --   // in the example below, "tag" will be undefined except on Wed.
  --   if (isWednesday) {
  --     c.set("tag", "hump day");
  --   }
  --}
<div>{$tag:default}</div>
Theme theme = new Theme();

// fetch template from themes/example.chtml
Chunk html = theme.makeChunk("example");

// Insert business logic here.
// Normally you write a lot of html.set("this","that") calls here.

StreamWriter out = getStreamWriter();
html.render( out );

///// or, return the rendered template as a string
// return html.toString();
<div>default</div>

default