Slippers vs String Template

Slippers is a strict templating language for ruby, based on string template's philosophy and using it's syntax. But just how similar are the two? This page should highlight the similarities as well as distinguish the differences. Not all string template features are supported in slippers, and these have been listed at the bottom of the page.

Creating Templates with Code

String Template
StringTemplate query = new StringTemplate("SELECT $column$ FROM $table$;");
query.setAttribute("column", "name");
query.setAttribute("table", "User");
query.toString() === "SELECT name FROM User;"
			
Slippers
template = Slippers::Engine.new("SELECT $column$ FROM $table$;")
template.render(:column => "name", :table => "User") === "SELECT name FROM User;"
			

Loading Templates from a file

String Template
StringTemplateGroup group = new StringTemplateGroup("myGroup", "/tmp");
StringTemplate query = group.getInstanceOf("theQuery");
query.setAttribute("column", "name");
query.setAttribute("column", "email");
query.setAttribute("table", "User");
query.toString()				
			
Slippers
template_group = Slippers::TemplateGroupDirectory.new(['tmp'])
query = template_group.find('theQuery')
st = Slippers::Engine.new(template_group)
st.render(:column => ["name", "email"], :table => "User")
			

Template Group Files

String Template
String templates = "group simple; vardef(type,name) ...";
StringTemplateGroup group = new StringTemplateGroup(new StringReader(templates));
StringTemplate t = group.getInstanceOf("vardef");
t.setAttribute("type", "int");
t.setAttribute("name", "foo");
				
Slippers
templates = {:vardef => "...", :method => "..."}
group = Slippers::TemplateGroup.new(:templates => templates)
t = group.find(:vardef)
t.render(:type => "int", :name => "foo")
			

Template Group inheritance

String Template
StringTemplateGroup supergroup = new StringTemplateGroup("super");
StringTemplateGroup subgroup = new StringTemplateGroup("sub");
supergroup.defineTemplate("bold", "$it$");
subgroup.setSuperGroup(supergroup);
StringTemplate st = new StringTemplate(subgroup, "$name:bold()$");
st.setAttribute("name", "Terence");
st.toString() === "Terence";	
			
Slippers
supergroup = Slippers::TemplateGroup.new(:templates => {:bold => "$it$"})
subgroup = Slippers::TemplateGroup.new(:templates => {}, :super_group => supergroup)
st = Slippers::Engine.new("$name:bold()$", :template_group => template_group)
st.render(:name => "Sarah") === Sarah				
			

Object Rendering

String Template
 public class DateRenderer implements AttributeRenderer {
 	public String toString(Object o) {
 		SimpleDateFormat f = new SimpleDateFormat("yyyy.MM.dd");
 		return f.format(((Calendar)o).getTime());
 	}
 }
 ...
 StringTemplate st =new StringTemplate("date: $created$");
 st.setAttribute("created", new GregorianCalendar(2005, 07-1, 05));
 st.registerRenderer(GregorianCalendar.class, new DateRenderer());
 String expecting = "date: 2005.07.05";
 String result = st.toString();			
			
Slippers
class DateRenderer
	def render(date)
		date.year + "." + date.month + "." + date.day
	end
end
...
template_group = Slippers::TemplateGroup.new(:templates => {Date => DateRenderer.new})
engine = Slippers::Engine.new("date: $created$", :template_group => template_group)
engine.render(:created => Date.new(2005,7,5)).should eql("date: 2005.07.05")

ALSO
template_group = Slippers::TemplateGroup.new(:templates => {:date => DateRenderer.new})
engine = Slippers::Engine.new("date: $created:date()$", :template_group => template_group)
engine.render(:created => Date.new(2005,7,5)).should eql("date: 2005.07.05")
			

Expression Options

String Template
$values; null="-1", separator=", "$
			
Slippers
 template = 'This is a list of values $values; null="-1", seperator=", "$'
 engine = Slippers::Engine.new(template)
 engine.render(:values => [1,2,3,nil]) === "This is a list of values 1, 2, 3, -1"
			

Conditionally included subtemplates

String Template
$if(member)$
$gutter/top_gutter_logged_in()$
$else$
$gutter/top_gutter_logged_out()$
$endif$
			
Slippers
$if(member)$
$gutter/top_gutter_logged_in()$
$else$
$gutter/top_gutter_logged_out()$
$endif$
			

Not Supported Functions