/**
* Contemplate
* Light-weight Templating Engine for PHP, Python, Node and client-side JavaScript
*
* https://github.com/foo123/Contemplate
*
* @inspired by : Simple JavaScript Templating, John Resig - http://ejohn.org/ - MIT Licensed
* http://ejohn.org/blog/javascript-micro-templating/
*
* Test
*
**/
// run as: node test.js
var http = require('http'), httpPort = 8002,
url = require('url'),
path = require('path'), fs = require('fs'),
Exists = fs.exists, //path.exists,
Read = fs.readFile,
echo = console.log,
Contemplate = require(path.join(__dirname, '../../src/js/Contemplate.js'))
;
Contemplate.addPlugin('plg_test', function(v) {
if (v) return 'Plugin Test value: ' + v;
return 'Plugin Test no value given';
});
Contemplate.addPlugin('plg_print', function(v) {
return '<pre>' + JSON.stringify(v, null, 4) + '</pre>';
});
global.bracket = function(v)
{
return '[[' + v + ']]';
}
Contemplate.addPlugin('inlinedBracket', Contemplate.inline('bracket($0)',{'$0':0},false));
// make sure it exists
Contemplate.setCacheDir(path.join(__dirname, '/_tplcache'));
// dynamically update the cached template if original template has changed
Contemplate.setCacheMode(Contemplate.CACHE_TO_DISK_AUTOUPDATE);
// add templates
var TPLS = {
'main' : path.join(__dirname, '/_tpls/main.tpl.html'),
'base' : path.join(__dirname, '/_tpls/base.tpl.html'),
'demo' : path.join(__dirname, '/_tpls/demo.tpl.html'),
'sub' : path.join(__dirname, '/_tpls/sub.tpl.html'),
'date' : path.join(__dirname, '/_tpls/date.tpl.html'),
// add an inline template
'inlinetpl' : ['<% super("block") %><% for($list as $l=>$item) %> <% $l %> <% $item %><br /><% endfor %>']
};
/*Contemplate.add(TPLS);*/
Contemplate.setTemplateFinder(function(tpl, cb) {
// can be sync or async operation depending if callback cb is provided
// handle accordingly
if (Object.prototype.hasOwnProperty.call(TPLS, tpl))
{
if ('function' === typeof cb) return cb(TPLS[tpl]);
else return TPLS[tpl];
}
else
{
if ('function' === typeof cb) return cb(null);
else return null;
}
});
/*console.log(Contemplate.parseTpl( '<% %for($list as $l=>$item) %> <% $l %> <% $item %><br /><% %endfor() %>' ));*/
// the data to be used by the templates
var
$listdata = { 'list' : ['item1', 'item2', 'item3'] },
$data = {
'users' : [
[
{'name':'u1', 'text':'text1', 'id':'id1'},
{'name':'u2', 'text':'text2', 'id':'id2', 'key1':'key1'},
{'name':'u3', 'text':'text3', 'id':'id3'}
],
[
{'name':'u4', 'text':'text4', 'id':'id4'},
{'name':'u5', 'text':'text5', 'id':'id5'},
{'name':'u6', 'text':'text6', 'id':'id6', 'key':{'key1':'key1'}}
]
],
'table_data' : {
'column1' : [1,2,3],
'column2' : [4,5,6],
'column3' : [7,8,9]
},
'table_options' : {'header':true},
'select_data' : {
'group1' : {1:'label 1',2:'label 2',3:'label 3'},
'group2' : {4:'label 4',5:'label 5',6:'label 6'},
'group3' : {7:'label 7',8:'label 8',9:'label 9'}
},
'select_options' : {
'optgroups' : ['group1', 'group2', 'group3'],
'selected' : 3,
'multiple' : false,
'style' : 'width:200px;'
}
},
$main_template_data={
'templates' : {
'base' : Contemplate.getTemplateContents('base'),
'demo' : Contemplate.getTemplateContents('demo'),
'sub' : Contemplate.getTemplateContents('sub'),
'date' : Contemplate.getTemplateContents('date')
},
'contemplate_version': Contemplate.VERSION,
//'sepleft' : $sepleft,
//'sepright' : $sepright,
'data_client' : JSON.stringify($data),
'render_server' : Contemplate.tpl('demo', $data),
'render_inline' : Contemplate.tpl('inlinetpl', $listdata, {separators:'<% %>'})
}
;
// create a node http server to serve the rendered templates
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname, filename = '';
// return the main page
if ('/'==uri || ''==uri) {
// async operation promise-based
Contemplate.tplPromise('main', $main_template_data).then(function(content) {
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(content);
}).catch(function(err){
response.writeHead(500, {'Content-Type': 'text/plain'});
response.end(err.toString());
});
return;
}
// handle css/js/other file requests
filename = path.join(process.cwd(), uri);
fs.stat(filename, function(err, stat) {
if(err || !stat) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
return;
}
if (stat.isDirectory()) filename += '/index.html';
Read(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err.toString() + "\n");
response.end();
return;
}
response.writeHead(200);
response.write(file, "binary");
response.end();
});
});
}).listen(httpPort);
echo('Application Started on http://localhost:' + httpPort + '/');
echo('Contemplate VERSION is: ' + Contemplate.VERSION);
|