I have checked many templates and not found a really stright forwared simple templets script. So i decided to write my own.
The idea is to have a template like php mixed with html.
A template that processed twice:
- 1st time prepeared with static data
- 2nd time - each time a request is made.
The template is compiled at runtime when preloaded in to a simple javascript funciton.
My requirement was a minimal learning curve.
The template is planed for nodejs to be prepeared once and used many times.
I decided on <??>
tags for runtime part of the template.
I decided on <%%>
tags for prepeare part of the template.
hello <? if(myvar) { ?><?=myvar?><? } else { ?> world<? }?>
A complex template example with calling other template and recursion,
A website with satic recusive menu and dynamic content in the center
<html>
<head><title>complex template example</title></head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td dir="rtl" style="padding:10px;text-align:right;direction:rtl">
<?=content?>
</td>
<td dir="rtl" width="225" bgcolor="#ccd5f4" style="padding:10px;text-align:right;direction:rtl">
<%
function print_menu(menu1)
{
var echo; //redefine local echo variable
for(link in menu1)
{
echo+='<?link='+JSON.stringify(link)+'?>';
%>
<ul>
<li><a href="<?=link.href?>"><?=link.name?></a></li>
<%=print_menu(menu1)%>
</ul>
<%
}
return echo;
}
echo+=print_menu(menu); // echo is defined in the begining of the function
// and returned at the end of the function.
%>
</td>
</tr>
</table>
<%=this.templates.footer(vars);
// vars is an argument of the template function, it is extracted at the begining of function.
// it calls for other template , with same variable you have in this function
// for more information see buildtemplate function below.
%>
</body>
</html>
var te = require('doubletemplate'); //load double teplate module
var doubletemplate=te.doubletemplate; // export double template function to global
te.parsedir(__dirname+'/templates',{'app':app});
te.loadfile(__dirname+'/templates/filename.html',{'app':app},__dirname);
te.templates['subdir/filename.html']({'app':app});
the code is in stright forward logic you can read it and understand how it works.
- to add parsing of first ; position for output shortcut tag to allow easyier convertion to non bloking style if needed.
- later I plan to rewrite it to support html paritials with sizzle css selector. like styling html with paritial html.
- later I plan to enhance the api and the module structure. for now what is here is enought for me.
by Shimon Doodkin, helpmepro1@gmail.com http://github.com/shimondoodkin/nodejs-meta-templates