<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.x5dev.com/chunk/wiki/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.x5dev.com/chunk/wiki/index.php?feed=atom&amp;target=69.236.172.237&amp;title=Special%3AContributions%2F69.236.172.237</id>
		<title>Chunk Java Template Engine - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://www.x5dev.com/chunk/wiki/index.php?feed=atom&amp;target=69.236.172.237&amp;title=Special%3AContributions%2F69.236.172.237"/>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Special:Contributions/69.236.172.237"/>
		<updated>2026-05-09T09:17:49Z</updated>
		<subtitle>From Chunk Java Template Engine</subtitle>
		<generator>MediaWiki 1.16.0</generator>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-04T02:58:29Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
Chunk is a Template Engine for Java, similar to Apache Velocity or FreeMarker.  Chunk has been field-tested in many applications.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
&lt;br /&gt;
* Macros, Includes and Conditional Includes.&lt;br /&gt;
* Flexible null-handling; template designer may specify default tag values.&lt;br /&gt;
* Library of powerful predefined in-tag filters, including regex (regular expressions), sprintf.&lt;br /&gt;
* Expose a subset of obj methods to template with a single line of code.&lt;br /&gt;
* Define multiple snippets per template file.&lt;br /&gt;
* Support for theme layers.&lt;br /&gt;
* Highly optimized codebase.&lt;br /&gt;
* Hooks for extending.&lt;br /&gt;
* Eclipse Template Editor plugin available with syntax highlighting &amp;amp;amp; more.&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
Q: Who are you?&lt;br /&gt;
&lt;br /&gt;
A: X5 Software is Tom McClure, [http://www.fishysudoku.com/ Sudoku shark], web developer, [http://www.myspace.com/TommySasso musician] and dad.  My day job is maintaining e-commerce solutions for [http://www.kswiss.com/ K-Swiss].  Read my [http://www.dagblastit.com/ blog at dagblastit.com].&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that button HTML over and over (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-03T21:07:21Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
Chunk is a Template Engine for Java, similar to Apache Velocity or FreeMarker.  Chunk has been field-tested in many applications.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
&lt;br /&gt;
* Macros, Includes and Conditional Includes.&lt;br /&gt;
* Flexible null-handling; template designer may specify default tag values.&lt;br /&gt;
* Library of powerful predefined in-tag filters, including regex (regular expressions), sprintf.&lt;br /&gt;
* Expose a subset of obj methods to template with a single line of code.&lt;br /&gt;
* Define multiple snippets per template file.&lt;br /&gt;
* Support for theme layers.&lt;br /&gt;
* Highly optimized codebase.&lt;br /&gt;
* Hooks for extending.&lt;br /&gt;
* Eclipse Template Editor plugin available with syntax highlighting &amp;amp;amp; more.&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
Q: Who are you?&lt;br /&gt;
&lt;br /&gt;
A: X5 Software is Tom McClure, [http://www.fishysudoku.com/ Sudoku shark], web developer, [http://www.myspace.com/TommySasso musician] and dad.  My day job is maintaining e-commerce solutions for [http://www.kswiss.com/ K-Swiss].  Read my [http://www.dagblastit.com/ blog at dagblastit.com].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that button HTML over and over (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-03T19:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
Q: Who are you?&lt;br /&gt;
&lt;br /&gt;
A: X5 Software is Tom McClure, [http://www.fishysudoku.com/ Sudoku shark], web developer, [http://www.myspace.com/TommySasso musician] and dad.  My day job is maintaining e-commerce solutions for [http://www.kswiss.com/ K-Swiss].  Read my [http://www.dagblastit.com/ blog at dagblastit.com].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that button HTML over and over (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-03T19:24:18Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
Q: Who are you?&lt;br /&gt;
&lt;br /&gt;
A: X5 Software is Tom McClure, [http://www.fishysudoku.com/ Sudoku shark], web developer, [http://www.myspace.com/TommySasso musician] and dad.  My day job is maintaining e-commerce solutions for [http://www.kswiss.com/ K-Swiss].  Read my [http://www.dagblasitit.com/ blog at dagblastit.com].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that button HTML over and over (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-03T19:23:16Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
Q: Who are you?&lt;br /&gt;
&lt;br /&gt;
A: X5 Software is Tom McClure, [http://www.fishysudoku.com/ Sudoku shark], web developer, [http://www.myspace.com/TommySasso musician] and dad.  My day job is maintaining e-commerce solutions for [http://www.kswiss.com/ K-Swiss].  [http://www.dagblasitit.com/ Read my blog at dagblastit.com].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that button HTML over and over (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-03T17:14:40Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Chunk {* MACROS *} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that button HTML over and over (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-03T17:13:57Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Chunk {* MACROS *} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Template macros are pretty cool.  Macros calls let you define tag values right in your template when including another template snippet.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are the way to go for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion can be assigned directly in the template.  Any tag values that you&lt;br /&gt;
don't define in the macro call can still be defined in the java code.&lt;br /&gt;
&lt;br /&gt;
For example, I have a CSS sliding button template with some fairly ugly HTML that I use over and over, just changing the label or adding a css class when I need some unusual layout.  With macros, I don't have to copy and paste that HTML (and I don't have to look at it and remember what an awful hack it is every time I need a pretty button).&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:39:00Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Getting Started: Serving HTML with Chunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Getting Started: Serving HTML with Chunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme();          // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() );        // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&amp;quot;&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:37:41Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Getting Started: Serving HTML with Chunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // see examples/javadoc for how to init a theme&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:28:41Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:27:32Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
Q: Where can I get my hands on it?&lt;br /&gt;
&lt;br /&gt;
A: [http://code.google.com/p/chunk-templates/downloads/list|Download Chunk] from Google Code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:24:20Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Conditional Includes with {^includeIf(...).[...]} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_Filters:_Powerful_.7B.7Etag.7Ctransformations.7D|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:23:38Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Chunk Tag |filters: Powerful Tag Transforms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_.7CFilters:_Powerful_Tag_Transforms|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag Filters: Powerful &amp;lt;code&amp;gt;{~tag|transformations}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:22:49Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Chunk Tag |Filters: Powerful Tag Transforms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_.7CFilters:_Powerful_Tag_Transforms|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag |filters: Powerful Tag Transforms ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:21:42Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Conditional Includes with {^includeIf(...).[...]} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  [[#Chunk_Tag_.7CFilters:_Powerful_Tag_Transforms|More about filters]] below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag |Filters: Powerful Tag Transforms ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:20:09Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Advanced Usage Note - Nested Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the [[#Chunk_Includes_with_.7B.5Einclude..5B....5D.7D|INCLUDES]]&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  More about filters below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag |Filters: Powerful Tag Transforms ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:18:23Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Advanced Usage Note - Nested Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a template snippet&lt;br /&gt;
to appear in the tag space by default.  Read the INCLUDES&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  More about filters below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag |Filters: Powerful Tag Transforms ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-02T16:17:18Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: /* Getting Started: Serving HTML with Chunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a whole template or&lt;br /&gt;
subtemplate to appear in the tag space by default.  Read the INCLUDES&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  More about filters below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag |Filters: Powerful Tag Transforms ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	<entry>
		<id>https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation</id>
		<title>Chunk Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.x5dev.com/chunk/wiki/index.php?title=Chunk_Documentation"/>
				<updated>2011-01-01T23:12:34Z</updated>
		
		<summary type="html">&lt;p&gt;69.236.172.237: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Chunk Documentation Wiki, a place to document all the cool things you can do with Chunk.&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/chunk-templates/ Visit the Chunk Project Home] on Google Code for downloads and source code.&lt;br /&gt;
&lt;br /&gt;
= THE &amp;quot;CHUNK&amp;quot; TEMPLATING SYSTEM =&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
Philosophy: presentation code (HTML) and source code (Java) are like&lt;br /&gt;
oil and water.  They shouldn't mix, and when they do, it's not pretty.&lt;br /&gt;
&lt;br /&gt;
cf php, jsp, asp, ... or java servlets with giant HTML strings hardcoded into the source.  Blegh.&lt;br /&gt;
&lt;br /&gt;
Fortunately, keeping layout and business logic apart is a breeze with a good templating system.  Chunk aims to be just that.&lt;br /&gt;
&lt;br /&gt;
Q: Does the Java community really need yet another templating engine?&lt;br /&gt;
&lt;br /&gt;
A: Not really, but back when I started Chunk, there wasn't anything else out there like it.  Now that it has matured, I am releasing it into the wild, and if somebody finds it useful, great!&lt;br /&gt;
&lt;br /&gt;
Q: Does it cost anything to use?&lt;br /&gt;
&lt;br /&gt;
A: Chunk will always be 100% free software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getting Started: Serving HTML with Chunk ===&lt;br /&gt;
&lt;br /&gt;
Here's a quick-start guide:&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~...}  {^...}  {+...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*...}&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- ... --}&amp;lt;/span&amp;gt;&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
The engine also supports overriding a base theme with multiple &amp;quot;theme&amp;quot; layers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's take a quick look at what it's like to code with Chunk templates:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- This template is used on the welcome page --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to the site!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#footer}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tags are denoted by &amp;lt;code&amp;gt;{~tag_name}&amp;lt;/code&amp;gt; -- tags function as placeholders for&lt;br /&gt;
dynamic values provided at runtime.&lt;br /&gt;
&lt;br /&gt;
Multiple snippets of html (or xml, or whatever) may be defined in a single file.&lt;br /&gt;
&lt;br /&gt;
For example, the hello.html file above defines three templates:&lt;br /&gt;
 hello&lt;br /&gt;
 hello#welcome&lt;br /&gt;
 hello#footer&lt;br /&gt;
&lt;br /&gt;
The root &amp;quot;hello&amp;quot; template is not used in this example but consists of all&lt;br /&gt;
text in the file, minus the &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#subtemplate}&amp;lt;/span&amp;gt;...&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; snippet definitions&lt;br /&gt;
and &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- comments --}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; which are stripped out.&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // Example template code:&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 Theme theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 c.set(&amp;quot;site_name&amp;quot;, &amp;quot;X5 Software&amp;quot;);&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello Bob!  Welcome to X5 Software!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 c.resetTags();&lt;br /&gt;
 buf.append( c.toString() ); // outputs &amp;quot;Hello there!  Welcome to the site!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 buf.append( theme.getSnippet(&amp;quot;hello#footer&amp;quot;) ); // outputs &amp;quot;&amp;amp;copy; 2011 Tom McClure.  All Rights Reserved.&lt;br /&gt;
 // ...&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Chunk Style Guide ==&lt;br /&gt;
&lt;br /&gt;
Template filenames should be named in lowercase with no periods before&lt;br /&gt;
the extension and no spaces anywhere.  Use underscores in place of&lt;br /&gt;
spaces where needed.&lt;br /&gt;
&lt;br /&gt;
Example template filenames:&lt;br /&gt;
&lt;br /&gt;
  welcome.html&lt;br /&gt;
  message.xml&lt;br /&gt;
  account_settings.html&lt;br /&gt;
&lt;br /&gt;
Tags should follow the same guidelines.  Mixed case is allowed but&lt;br /&gt;
strongly discouraged, and the only legal punctuation is dashes and&lt;br /&gt;
underscores with underscores strongly preferred over dashes.  Spaces&lt;br /&gt;
are not legal inside a tag name.  Numbers are ok.&lt;br /&gt;
&lt;br /&gt;
Example tags:&lt;br /&gt;
&lt;br /&gt;
  {~name}&lt;br /&gt;
  {~home_phone}&lt;br /&gt;
  {~menu_bar}&lt;br /&gt;
  {~left_nav}&lt;br /&gt;
  {~header_1}&lt;br /&gt;
 &lt;br /&gt;
  {~results:Nothing found!}&lt;br /&gt;
  {~address_line_2:}&lt;br /&gt;
 &lt;br /&gt;
  {~price|sprintf($%,.2f)}&lt;br /&gt;
  {~url|s/ /%20/g}&lt;br /&gt;
 &lt;br /&gt;
  {+other_template}&lt;br /&gt;
  {+template_ref#fully_qualified}&lt;br /&gt;
  {+#subtemplate}&lt;br /&gt;
 &lt;br /&gt;
  {^alt_repository.template_name}&lt;br /&gt;
  {^include.template_ref#snippet_xyz}&lt;br /&gt;
  {^includeIf(~secure==yes).#snippet_abc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leave out the extension! ===&lt;br /&gt;
&lt;br /&gt;
Template references never contain the filename extension, so&lt;br /&gt;
for example you'll never see a snippet reference like &amp;lt;code&amp;gt;hello.html#welcome&amp;lt;/code&amp;gt; (BAD!!) -- this&lt;br /&gt;
would make the template engine look for a file named&lt;br /&gt;
hello.html.html -- not to worry, when a template can't be found the&lt;br /&gt;
engine will insert some error text into the output (or to stderr if so&lt;br /&gt;
configured) with a complete report on where it looked for the&lt;br /&gt;
template.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag :Defaults ==&lt;br /&gt;
&lt;br /&gt;
A tag can provide its own default value.  Here's the syntax:&lt;br /&gt;
&lt;br /&gt;
  {~tag:DEFAULT VALUE}&lt;br /&gt;
&lt;br /&gt;
If you want a tag to disappear by default, supply a blank default value.&lt;br /&gt;
The tag will look like this:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:}&lt;br /&gt;
&lt;br /&gt;
Or if you're working with HTML, you could use a non-rendering comment:&lt;br /&gt;
&lt;br /&gt;
  {~error_msg:&amp;amp;lt;!-- no errors --&amp;amp;gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tag Preservation (no value? leave tag alone) ===&lt;br /&gt;
&lt;br /&gt;
Standard behavior when a tag value is null or never defined is for the&lt;br /&gt;
tag to pass through to the final output unchanged.  Tag preservation&lt;br /&gt;
is by design, since the output can then be used as a template or tag&lt;br /&gt;
value for re-processing in a &amp;quot;parent&amp;quot; context, ie later on where the&lt;br /&gt;
presentation code finally has access to an appropriate value for the&lt;br /&gt;
tag.&lt;br /&gt;
&lt;br /&gt;
Tag preservation means less code.  Chunk does all the heavy lifting!&lt;br /&gt;
When you call Chunk's &amp;lt;code&amp;gt;.toString()&amp;lt;/code&amp;gt; method, a tag resolution algorithm&lt;br /&gt;
recursively scans tag values for additional tags and attempts to&lt;br /&gt;
resolve any that it finds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Usage Note - Nested Tags ===&lt;br /&gt;
&lt;br /&gt;
Defaults may contain nested tags.  Nesting braces,&lt;br /&gt;
however, is not allowed, and will result in a parsing error.&lt;br /&gt;
In fact, unescaped braces are not allowed anywhere inside a tag,&lt;br /&gt;
because the final inside brace will be mistaken for the final outer&lt;br /&gt;
brace by the speedy parser.&lt;br /&gt;
&lt;br /&gt;
For example, you could opt to show the username when no data is&lt;br /&gt;
available for the full name:&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 Correct: {~full_name:~username}   THIS IS OK&lt;br /&gt;
 INCORRECT: {~full_name:{~username}} &amp;lt;-- nested braces, WILL NOT WORK&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
 BAD {~name:{^include.#default_name}} THIS WILL NOT WORK&lt;br /&gt;
 GOOD {~name:^include.#default_name} THIS IS OK&lt;br /&gt;
&lt;br /&gt;
As you can see, you can even use the special ^include.template_ref syntax&lt;br /&gt;
(like in the intro_paragraph tag below) to designate a whole template or&lt;br /&gt;
subtemplate to appear in the tag space by default.  Read the INCLUDES&lt;br /&gt;
section to learn more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Null tag values ===&lt;br /&gt;
&lt;br /&gt;
Notice how the ~friends tag below has an empty default value and&lt;br /&gt;
disappears in the final output, but the next tag ~goobers provides no&lt;br /&gt;
default.  The ~goobers tag simply passes through into the final&lt;br /&gt;
output.  This strategy could be leveraged to send the output through&lt;br /&gt;
the processor again later on, when a good value for goobers might&lt;br /&gt;
become available.  If that's not your plan, it's generally better to&lt;br /&gt;
supply a default for all your tags (even if it's something like &amp;quot;ERROR&lt;br /&gt;
NAME UNDEFINED&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name:there}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;! &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~friends:}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~goobers}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;p&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~intro_paragraph:^include.#default_intro}&amp;lt;/span&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#default_intro}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Here at Widgets of America, we specialize in widgets.  Nobody knows&lt;br /&gt;
 widgets better than we do, and you can bet the widget farm that you&lt;br /&gt;
 can't stump our &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~webroot}&amp;lt;/span&amp;gt;/experts&amp;quot;&amp;amp;gt;Widget Experts&amp;amp;lt;/a&amp;amp;gt;.&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 // ...&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 // Normally there would be a bunch of c.set(&amp;quot;tag_name&amp;quot;, tagValue) calls here,&lt;br /&gt;
 // but for this example we want to illustrate null tag behavior.&lt;br /&gt;
 return c.toString(); // returns &amp;quot;Hello there!  Welcome to the site! {~goobers} ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk {* MACROS *} ==&lt;br /&gt;
&lt;br /&gt;
Chunk supports template macros for achieving more complex behavior.&lt;br /&gt;
&lt;br /&gt;
Chunk macros are great for some element that is repeated over and over in&lt;br /&gt;
your project.  The best thing about macros is that the values for the&lt;br /&gt;
macro expansion are assigned directly in the template, not in the code.&lt;br /&gt;
&lt;br /&gt;
Appropriate macro use can eliminate a lot of code, and can make your&lt;br /&gt;
templates easier to read.&lt;br /&gt;
&lt;br /&gt;
Macro syntax:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* TEMPLATE_SNIPPET_NAME *}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param1=}&amp;lt;/span&amp;gt;value1&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param2=}&amp;lt;/span&amp;gt;value2&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param3 = Simple Value}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~param4 = 400}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end parameter markers &amp;quot;{=}&amp;quot; are optional&lt;br /&gt;
but the end macro marker &amp;quot;{*}&amp;quot; is required.&lt;br /&gt;
&lt;br /&gt;
Simple tag values may be provided using the syntax for ~param3 and ~param4&lt;br /&gt;
above, but the value must not contain special characters (including braces&lt;br /&gt;
and the = and # signs) and must not include any template directives or tags.&lt;br /&gt;
&lt;br /&gt;
The syntax used for ~param1 and ~param2 is much more flexible.  The value&lt;br /&gt;
is whatever you sandwich between the start and end tags.  It can be multi-line,&lt;br /&gt;
can include tags, and could even contain another nested macro call.&lt;br /&gt;
&lt;br /&gt;
I strongly recommend naming template files and #snippets in ALL_UPPERCASE if&lt;br /&gt;
they are to be used as macros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example macro invocation:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{~box_content=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- BOX.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!------------------------------------------------&lt;br /&gt;
   -- I hate writing HTML table code, so I just&lt;br /&gt;
   -- use this template over and over as a macro.&lt;br /&gt;
   ------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_width:300}&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_title}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~box_content}&amp;lt;/span&amp;gt;&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------- java&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 return c.toString();&lt;br /&gt;
&lt;br /&gt;
------------------------- output&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;300&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;Welcome to the site!&amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/table&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Includes with &amp;lt;code&amp;gt;{^include.[...]}&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
You don't have to use macros to provide simpler directives from the&lt;br /&gt;
template.  Want to just &amp;quot;include&amp;quot; another template?  It's easy!&lt;br /&gt;
&lt;br /&gt;
The recommended syntax for includes is:&lt;br /&gt;
 {^include.template_name}&lt;br /&gt;
&lt;br /&gt;
To include a subtemplate snippet:&lt;br /&gt;
 {^include.template_name#snippet_name}&lt;br /&gt;
&lt;br /&gt;
When the snippet is defined in the same file, you may omit the template filename:&lt;br /&gt;
 {^include.#snippet_name}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conditional Includes with &amp;lt;code&amp;gt;{^includeIf(...).[...]}&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A conditional include a la &amp;lt;code&amp;gt;{^includeIf([cond]).[template]}&amp;lt;/code&amp;gt; is now available.&lt;br /&gt;
On template expansion, if the [cond] expression is true, the [template] is included.&lt;br /&gt;
&lt;br /&gt;
Unlike standard tags, when the condition is not met, the entire tag&lt;br /&gt;
disappears from the output.&lt;br /&gt;
&lt;br /&gt;
'''In part to keep us from abusing this feature, there is no &amp;quot;else&amp;quot; clause''' (and no &amp;quot;for&amp;quot; and &amp;quot;while&amp;quot; constructs, and a host of other things that don't belong in a presentation templating framework). Remember, the goal of all this templating is to keep business logic and presentation layout separate, so '''try to avoid coding your entire app with chains of &amp;lt;code&amp;gt;{^includeIf(...)...}&amp;lt;/code&amp;gt; tags.'''&lt;br /&gt;
&lt;br /&gt;
Repeating the tag with the opposite condition can achieve the &amp;quot;else&amp;quot;&lt;br /&gt;
effect if you really need it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example includeIf(...) uses:&lt;br /&gt;
&lt;br /&gt;
 {!-- Only these three simple tests are supported --}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 1. if exists, if doesn't exist; ie, null test --}&lt;br /&gt;
 {^includeIf(~username).hello#hello_username}&lt;br /&gt;
 {^includeIf(!username).hello#hello_anon}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 2. if equals, if doesn't equal string/tag-var --}&lt;br /&gt;
 {^includeIf(~username == Bob).hello#hello_bob}&lt;br /&gt;
 {^includeIf(~username != Bob).hello#hello_anon}&lt;br /&gt;
 {^includeIf(~username == ~def_username).hello#login}&lt;br /&gt;
 &lt;br /&gt;
 {!-- 3. if matches regex, if doesn't match regex --}&lt;br /&gt;
 {^includeIf(~username =~ /(jane|john)/i).hello#hello_janejohn}&lt;br /&gt;
 {^includeIf(~username !~ /(jane|john)/i).hello#hello_anon}&lt;br /&gt;
&lt;br /&gt;
Note that these examples are roughly equivalent to the more efficient&lt;br /&gt;
and more powerful (but less readable) &amp;quot;ondefined&amp;quot; and &amp;quot;onmatch&amp;quot; filters:&lt;br /&gt;
 {~username|ondefined(+tpl_a):+tpl_b}&lt;br /&gt;
 {~username|onmatch(/regex/,+tpl_a)nomatch(+tpl_b)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;+&amp;quot; is shorthand for ^include.  More about filters below.&lt;br /&gt;
&lt;br /&gt;
Shorthand include/includeIf syntax:&lt;br /&gt;
 {+my_content}        is the same as  {^include.my_content}&lt;br /&gt;
 {+(cond)my_content}  is the same as  {^includeIf(cond).my_content}&lt;br /&gt;
&lt;br /&gt;
...but this shorthand should be used sparingly.  I prefer to spell out&lt;br /&gt;
the word &amp;quot;include&amp;quot; to promote readability.&lt;br /&gt;
&lt;br /&gt;
Keep in mind, the template engine only wakes up to do its &amp;quot;magic&amp;quot;&lt;br /&gt;
stuff when it sees the following triggers:&lt;br /&gt;
         {#...}  {~...}  {^...}  {+...}  {*...}  {!-- ... --}&lt;br /&gt;
         snippet  tag    special include macro   comment&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-----------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- top_nav.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the sitewide navigation bar here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Combining Chunk Macros with Includes ==&lt;br /&gt;
&lt;br /&gt;
You can combine macro and include syntax.  This can greatly&lt;br /&gt;
increase the readability of your layout code:&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{* BOX *}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_title=}&amp;lt;/span&amp;gt;Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=box_content=}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.hello#box_text}&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{=}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;{*}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 This idea will appear to be outside the box.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!--------------------------------------------------------}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- this snippet is included from the macro call above --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#box_text}&amp;lt;/span&amp;gt;&lt;br /&gt;
 Help!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 I'm trapped in a box!&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting Snippets (You can, but don't) ==&lt;br /&gt;
&lt;br /&gt;
Snippet definitions may be nested, but this practice is strongly&lt;br /&gt;
discouraged since it can lead to confusion.&lt;br /&gt;
&lt;br /&gt;
For the headstrong, here's an example reference to a nested snippet&lt;br /&gt;
definition:&lt;br /&gt;
&lt;br /&gt;
 {^include.filename#snippet#nested_snippet}&lt;br /&gt;
&lt;br /&gt;
Which was defined like so:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#snippet}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#nested_snippet}&amp;lt;/span&amp;gt;foo foo &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.#important_stuff}&amp;lt;/span&amp;gt; foo&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 bla bla bla&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- put the important stuff down here --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#important_stuff}&amp;lt;/span&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In particular, this can be misleading because shorthand snippet&lt;br /&gt;
references are always expanded with just the filename -- so the&lt;br /&gt;
above include is a reference to filename#important_stuff and not&lt;br /&gt;
to either of the following snippets, like you might expect:&lt;br /&gt;
&lt;br /&gt;
 filename#snippet#important_stuff&lt;br /&gt;
 filename#snippet#nested_snippet#important_stuff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other Specials: ^tagStack and ^loop ==&lt;br /&gt;
&lt;br /&gt;
The core library provides a few useful internal special tags.&lt;br /&gt;
&lt;br /&gt;
1. The ^tagStack tag shows all available tagnames with data&lt;br /&gt;
in the current chunk template expansion context.&lt;br /&gt;
&lt;br /&gt;
 {^tagStack} or try {^tagStack(html)} &lt;br /&gt;
&lt;br /&gt;
2. The ^loop and ^grid tags can be quite handy.&lt;br /&gt;
&lt;br /&gt;
 {^loop template=&amp;quot;#repeater&amp;quot; data=&amp;quot;~data_var&amp;quot; no_data=&amp;quot;#empty_list&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
The ~data_var can be an inline table (uses a combination of JSON and&lt;br /&gt;
CSV styles; make sure to escape in-string commas and square brackets&lt;br /&gt;
with backslash) defined in a string like so:&lt;br /&gt;
&lt;br /&gt;
 [[header_a,header_b],&lt;br /&gt;
  [apples,4],&lt;br /&gt;
  [bananas,3],&lt;br /&gt;
  [canteloupe,7]]&lt;br /&gt;
&lt;br /&gt;
Or a string array (a one-column table), or anything that implements&lt;br /&gt;
the com.x5.util.TableData interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Chunk Tag |Filters: Powerful Tag Transforms ==&lt;br /&gt;
&lt;br /&gt;
A limited number of text filters are available via the pipe (|) character.&lt;br /&gt;
&lt;br /&gt;
Filters provide a way to alter/transform the tag value presentation&lt;br /&gt;
on-the-fly, directly in the template.&lt;br /&gt;
&lt;br /&gt;
The following filters are currently supported:&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|qs} escapes a quoted string (don't &amp;quot;flub&amp;quot; -&amp;gt; don\'t \&amp;quot;flub\&amp;quot;)&lt;br /&gt;
 {~any_tag|uc} will transform the text to all uppercase&lt;br /&gt;
 {~any_tag|lc} all lowercase&lt;br /&gt;
 {~any_tag|md5} md5 hash (hex, or try md5base64)&lt;br /&gt;
 {~any_tag|sha} sha-1 hash (hex, or try shabase64)&lt;br /&gt;
 {~any_tag|base64} base64-encode&lt;br /&gt;
 {~any_tag|base64decode} decode base64-encoded string&lt;br /&gt;
 {~any_tag|url} url-encode (safe+for+query+strings)&lt;br /&gt;
 {~any_tag|urldecode} url decode (eg: my%20string -&amp;gt; my string)&lt;br /&gt;
 {~any_tag|html} escapes html (uses &amp;amp;amp;amp; &amp;amp;amp;lt; &amp;amp;amp;gt; &amp;amp;amp;quot; and &amp;amp;amp;apos;)&lt;br /&gt;
 {~any_tag|trim} removes leading and trailing whitespace&lt;br /&gt;
 {~any_tag|s/[0-9]/#/g} perl-style search+replace with regular expressions&lt;br /&gt;
 {~any_tag|sprintf(%05.3f)} applies sprintf formatting&lt;br /&gt;
 {~any_tag|defang} removes HTML tag markers etc. to foil xss script-injection attacks&lt;br /&gt;
&lt;br /&gt;
These pipe modifiers may be chained.  Multiple filters will be applied in&lt;br /&gt;
the order specified:&lt;br /&gt;
 {~any_tag|trim|lc|md5|uc}&lt;br /&gt;
&lt;br /&gt;
In the example above, the tag value will have leading and trailing whitespace removed first, then the string will be converted to lowercase, the lowercase string will get MD5-hashed, and finally, the hex hash output (lowercase by default) will be converted to uppercase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Use sparingly: &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
New filters &amp;lt;code&amp;gt;|onmatch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|ondefined(...)&amp;lt;/code&amp;gt; open the door for xslt-style transforms.  These can be very powerful but remember, '''don't code your entire app's logic in tag filter transforms!'''  Use of these filters should be reserved for presentation/layout logic only.  Extensive use of these filters will result in contorted, hard-to-follow templates.&lt;br /&gt;
&lt;br /&gt;
A. ondefined usage&lt;br /&gt;
&lt;br /&gt;
 ondefined(output)&lt;br /&gt;
* if tag value is null or zero-length: display nothing&lt;br /&gt;
* otherwise, display the specified output.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|ondefined(some text)}&lt;br /&gt;
 {~any_tag|ondefined(~some_tag)}&lt;br /&gt;
 {~any_tag|ondefined(+some_template)}&lt;br /&gt;
 {~any_tag|ondefined(^some_external.content)}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B. onmatch usage&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])&lt;br /&gt;
 onmatch(/RE/,output[,/RE2/,output2[,...]])nomatch(def_output)&lt;br /&gt;
&lt;br /&gt;
* if tag value is null or does not match any RE: display nothing (or def_output)&lt;br /&gt;
* otherwise, display the specified output after the first matching regexp.&lt;br /&gt;
&lt;br /&gt;
------------- Example 1&lt;br /&gt;
 {~any_tag|onmatch(/a/,ABC)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  cat  -&amp;gt; &amp;quot;ABC&amp;quot;  (for exact matches, use /^a$/ syntax)&lt;br /&gt;
&lt;br /&gt;
-------------- Example 2: switch/case style&lt;br /&gt;
 {~any_tag|onmatch(/ca/,Cat,/a/,ABC)nomatch(DEF)}&lt;br /&gt;
&lt;br /&gt;
  null -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  fox  -&amp;gt; &amp;quot;DEF&amp;quot;&lt;br /&gt;
  a    -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
  car  -&amp;gt; &amp;quot;Cat&amp;quot;&lt;br /&gt;
  bar  -&amp;gt; &amp;quot;ABC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note the optional nomatch clause.  For example:&lt;br /&gt;
&lt;br /&gt;
--------------- Example 3: not just static strings&lt;br /&gt;
&lt;br /&gt;
The onmatch and ondefined output arguments allow tag references and template snippet &amp;quot;includes&amp;quot; to be used anywhere that you would place static output text.&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|onmatch(/1/,+template_one,/2/,+template_two)nomatch(~errmsg)}&lt;br /&gt;
&lt;br /&gt;
  1 -&amp;gt; include template &amp;quot;template_one&amp;quot;&lt;br /&gt;
  2 -&amp;gt; include template &amp;quot;template_two&amp;quot;&lt;br /&gt;
  3/null/etc. -&amp;gt; display the value of the {~errmsg} tag&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Future ideas:&lt;br /&gt;
 {~any_tag|usd} formats numbers as U.S. currency eg 30000 -&amp;gt; $30,000.00&lt;br /&gt;
 for now, just use {~amount|sprintf($%,.2f)}&lt;br /&gt;
&lt;br /&gt;
 {~any_tag|num(00.00)} applies DecimalFormat formatting&lt;br /&gt;
 {~any_tag|date(yyyy-MM-dd)} applies SimpleDateFormat formatting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mixing Tag |Filters and Tag :Defaults ===&lt;br /&gt;
&lt;br /&gt;
The pipe modifier may be mixed with the colon modifier.  The colon&lt;br /&gt;
value may be placed before or after the filters (but not inside a&lt;br /&gt;
filter chain).  Use the colon first to have the filter transform&lt;br /&gt;
applied to it, and last to skip the filter transform.&lt;br /&gt;
&lt;br /&gt;
ie:&lt;br /&gt;
 {~any_tag:don't|qs} and {~any_tag|qs:don't} are not equivalent.&lt;br /&gt;
&lt;br /&gt;
When ~any_tag is null:&lt;br /&gt;
    {~any_tag:don't|qs} =&amp;gt; don\'t&lt;br /&gt;
    {~any_tag|qs:don't} =&amp;gt; don't&lt;br /&gt;
&lt;br /&gt;
The filter is applied in both cases if any_tag is non-null, but the&lt;br /&gt;
default value is not filtered in the second case.&lt;br /&gt;
&lt;br /&gt;
I am considering supporting a more legible sgml-inspired syntax, eg:&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;yes&amp;quot;} =&amp;gt; don\'t&lt;br /&gt;
  {~any_tag ifnull=&amp;quot;don't&amp;quot; transform=&amp;quot;qs&amp;quot; transform_when_null=&amp;quot;no&amp;quot;} =&amp;gt; don't&lt;br /&gt;
but don't hold your breath.&lt;br /&gt;
&lt;br /&gt;
== Extending Chunk: External template repositories ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;^include&amp;quot; protocol is available standard, but you can easily whip up&lt;br /&gt;
your own class that provides template content.  It just has to&lt;br /&gt;
implement &amp;lt;code&amp;gt;com.x5.template.ContentSource&amp;lt;/code&amp;gt;, which requires two methods,&lt;br /&gt;
&amp;lt;code&amp;gt;fetch(...)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;getProtocol()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For instance, I have a class that fetches html from a wiki. The client&lt;br /&gt;
was familiar with creating and editing wiki pages and so instead of&lt;br /&gt;
building a content management system for his site content, I just&lt;br /&gt;
installed a wiki.  The wiki tags look like this: &amp;lt;code&amp;gt;{^wiki.External_Page}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example that fetches templates from a database:&lt;br /&gt;
&lt;br /&gt;
------------------------- DBTemplates.java&lt;br /&gt;
&lt;br /&gt;
 import com.x5.template.ContentSource;&lt;br /&gt;
 &lt;br /&gt;
 public class DBTemplates implements ContentSource&lt;br /&gt;
 {&lt;br /&gt;
    // ...&lt;br /&gt;
 &lt;br /&gt;
    public String fetch(String templateName)&lt;br /&gt;
    {&lt;br /&gt;
        return getFromDB(templateName);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public String getProtocol()&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;db&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
------------------------- MyApp.java&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 // To provide your chunk with this new source of templates:&lt;br /&gt;
 &lt;br /&gt;
 TemplateSet theme = getTheme(); // defined by you&lt;br /&gt;
 Chunk c = theme.makeChunk(&amp;quot;hello#welcome&amp;quot;);&lt;br /&gt;
 c.set(&amp;quot;name&amp;quot;, getName() );&lt;br /&gt;
 &lt;br /&gt;
 DBTemplates dbt = new DBTemplates();&lt;br /&gt;
 c.addProtocol(dbt);&lt;br /&gt;
 &lt;br /&gt;
 return c.toString();&lt;br /&gt;
 // ...&lt;br /&gt;
&lt;br /&gt;
------------------------- hello.html&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;{!-- the ^include.top_nav tag will pull from the standard template set --}&lt;br /&gt;
 {!-- the ^db.scores tag will look in the database --}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#welcome}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^include.top_nav}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Hello &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~name}&amp;lt;/span&amp;gt;!  Welcome to &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{~site_name:the site}&amp;lt;/span&amp;gt;!&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Here are today's sports scores:&amp;amp;lt;br/&amp;amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;{^db.scores}&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;{#}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>69.236.172.237</name></author>	</entry>

	</feed>