Stencil

Advanced template engine for Java

View project onGitHub

Outputs

The Stencil language uses the single character '$' to demarcate dynamic outputs and closes them with the ';' character. All outputs take the form

$<command>;
Each dynamic output command is detailed below.

expression

Output the value of an expression

$user.name;
$2+2;
	
John Doe
5
	

if/else

Conditionally output a block of text

$if value {
	value is true
}
	
value is true
	

An else block can be provided in case the value is false

$if value {
	value is true
}
else {
	value is false
};
	
value is false
	

foreach/else

Loop through a collection and output a block for each value

$foreach item in items {
	Color: $item.color;
}
	
Color: Orange
Color: Blue
Color: Black
	

An else block can be provided to output in case the collection is empty

$foreach item in items {
	$item.name;
}
else {
	No Items
};
	
No Items
	

An iteration variable can be specified to get common useful information on the iteration being processed. The iteration variable has these properties:

  • index - iteration # starting from 0
  • count - iteration # starting from 1
  • even - true if it is an even numbered iteration
  • odd - true if it is an odd numbered iteration
  • hasNext - true if this is not the last iteration
$foreach item,it in items {
	$it.count: $item.color;
}
	
1: Orange
2: Blue
3: Black
	

while

Loop while an expression is true

$white value < 5 {
	Index: $value;
	$assign value=value+1;
}
	
Index: 0
Index: 1
Index: 2
Index: 3
Index: 4
	

switch/case/default

Select one of several blocks based on a value

$switch value
	case 0 {
		Number: 0
	}
	case 1 {
		Number: 1
	}
	case 'test' {
		Text: test
	};
	
Text: test
	

A default block can be provided in case the value matches none of the cases

$switch value
	case 0 {
		Number: 0
	}
	case 1 {
		Number: 1
	}
	default {
		No Match
	};
	
No Match
	

with

Add properties of one or more expressions to the current scope

$with stock,group {
	Group: $title	<< for group.title
	Name: $name;	<< for stock.name
	Symbol: $symbol;<< for stock.symbol
	Price: $price;	<< for stock.price
};
	
Group: Technology
Name: Apple Inc.
Symbol: AAPL
Price: 489.56
	

Any expression can be provided

$with [1,2,3] {
	Items: $size	<< for [].size
};
	
Items: 3
	

declare variable

Declare variables in the current scope.

$var x=5, y=10;
$x; $y;
	
5 10
	

assign variable

Assign values to variables in the current scope. The variable must already be declared.

$assign x=10, y=20;
$x; $y;
	
10 20
	

break

Breaks out of the nearest loop

$while x < 10 {
	$if x == 3 {
		$break;
	};
	Value: $x;
};
	
Value: 0
Value: 1
Value: 2
Value: 3
	

continue

Continues on to the next iteration of the nearest loop

$while x < 3 {
	Value: $x;
	$continue;
	This wont get printed
};
	
Value: 0
Value: 1
Value: 2
	

include

Include another template using a file path relative to the currently processing template.

$include 'layout';
	
Included Text
	

Parameters can be passed to the included template

$include 'layout' (title='Top 100');
	
Title: Top 100
	

Blocks can be passed to the included template as well

$include 'layout' (title='Top 100')
	header {
		## HEADER ##
	}
	content {
		## CONTENT ##
	}
	footer {
		## FOOTER ##
	};
	
Title: Top 100
## HEADER ##
## CONTENT ##
## FOOTER ##