Created
November 4, 2009 08:50
-
-
Save jed/225903 to your computer and use it in GitHub Desktop.
a template module for node.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// tmpl-node.js: a template module for node.js | |
// Jed Schmidt - http://jedschmidt.com/ | |
// | |
// inspired by John Resig's micro templates | |
// http://ejohn.org/blog/javascript-micro-templating/ | |
var posix = require( "posix" ), | |
concat = Array.prototype.concat; | |
process.mixin( exports, { | |
compile: compile, | |
load: load, | |
defaultContexts: [] | |
}); | |
function compile( str, name ) { | |
var fn = new Function( "o", | |
"var p=[];with(o){p.push('" + | |
str.replace(/[\r\t\n]/g, " ") | |
.replace(/'(?=[^%]*%>)/g,"\t") | |
.split("'").join("\\'") | |
.split("\t").join("'") | |
.replace(/<%=(.+?)%>/g, "',$1,'") | |
.split("<%").join("');") | |
.split("%>").join("p.push('") | |
+ "');}return p.join('');" | |
); | |
function ret() { | |
var args = concat.apply( exports.defaultContexts, arguments ), | |
i = args.length, | |
context = {}, | |
name, | |
cur; | |
if ( i < 2 ) | |
return fn( args[0] || context ); | |
while ( i ) | |
for ( name in ( cur = args[ --i ] ) ) | |
context[ name ] = cur[ name ]; | |
return fn( context ); | |
}; | |
if ( typeof name === "string" ) | |
exports[ name ] = ret; | |
return ret; | |
}; | |
function load( dir, pattern ) { | |
var promise = new process.Promise(); | |
posix.readdir( dir ).addCallback( function( files ) { | |
var count = files.length; | |
files.forEach( function( name ) { | |
if ( pattern && !pattern.test( name ) ) | |
return --count; | |
posix.cat( dir + name ).addCallback( function( contents ) { | |
compile( contents, name ); | |
if ( !--count ) | |
promise.emitSuccess(); | |
}) | |
}); | |
}); | |
return promise; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment