includes/clientside/static/template-compiler.js
author Dan Fuhry <dan@enanocms.org>
Wed, 29 Dec 2010 13:25:32 -0500
changeset 1332 12286b3ee214
parent 1311 a228f7e8fb15
permissions -rw-r--r--
Added some more hooks to the page editing pipeline. It should now be possible to add controls to the page editor, send the data from them out to the server, and process them on the server side.

// An implementation of Enano's template compiler in Javascript. Same exact API
// as the PHP version - constructor accepts text, then the assign_vars, assign_bool, and run methods.

window.templateParser = function(text)
{
	this.tpl_code    = text;
	this.tpl_strings = {};
	this.tpl_bool    = {};
	this.assign_vars = __tpAssignVars;
	this.assign_bool = __tpAssignBool;
	this.fetch_hook  = __tpFetchHook;
	this.run         = __tpRun;
}

window.__tpAssignVars = function(vars)
{
	for(var i in vars)
	{
		this.tpl_strings[i] = vars[i];
	}
}

window.__tpAssignBool = function(vars)
{
	for(var i in vars)
	{
		this.tpl_bool[i] = ( vars[i] ) ? true : false; 
	}
}

window.__tpRun = function()
{
	if(typeof(this.tpl_code) == 'string')
	{
		tpl_code = __tpCompileTemplate(this.tpl_code);
		try {
			compiled = eval(tpl_code);
		}
		catch(e)
		{
			alert(e);
			load_component('acl');
			aclDebug(tpl_code);
		}
		return compiled;
	}
	return false;
}

window.__tpCompileTemplate = function(code)
{
	// Compile plaintext/template code to javascript code
	code = code.replace(/\\/g, "\\\\");
	code = code.replace(/\'/g,  "\\'");
	code = code.replace(/\"/g,  '\\"');
	code = code.replace(new RegExp(unescape('%0A'), 'g'), '\\n');
	code = "'" + code + "'";
	code = code.replace(/\{([A-z0-9_-]+)\}/ig, "' + this.tpl_strings['$1'] + '");
	code = code.replace(/\{lang:([a-z0-9_]+)\}/g, "' + $lang.get('$1') + '");
	code = code.replace(/\<!-- IFSET ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- BEGINELSE \1 --\>([\s\S]*?)\<!-- END \1 --\>/ig, "' + ( ( typeof(this.tpl_strings['$1']) == 'string' ) ? '$2' : '$3' ) + '");
	code = code.replace(/\<!-- IFSET ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- END \1 --\>/ig, "' + ( ( typeof(this.tpl_strings['$1']) == 'string' ) ? '$2' : '' ) + '");
	code = code.replace(/\<!-- BEGIN ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- BEGINELSE \1 --\>([\s\S]*?)\<!-- END \1 --\>/ig, "' + ( ( this.tpl_bool['$1'] == true ) ? '$2' : '$3' ) + '");
	code = code.replace(/\<!-- BEGIN ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- END \1 --\>/ig, "' + ( ( Boolean(this.tpl_bool['$1']) == true ) ? '$2' : '' ) + '");
	code = code.replace(/\<!-- BEGINNOT ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- END \1 --\>/ig, "' + ( ( Boolean(this.tpl_bool['$1']) == false ) ? '$2' : '' ) + '");
	code = code.replace(/\<!-- HOOK ([A-z0-9_-]+) --\>/ig, "' + this.fetch_hook('$1') + '");
	return code;
}

window.__tpExtractVars = function(code)
{
	code = code.replace('\\', "\\\\");
	code = code.replace("'",  "\\'");
	code = code.replace('"',  '\\"');
	code = code.replace(new RegExp(unescape('%0A'), 'g'), "\\n");
	code = code.match(/\<!-- VAR ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- ENDVAR \1 -->/g);
	code2 = '';
	for(var i in code)
		if(typeof(code[i]) == 'string')
			code2 = code2 + code[i];
	code = code2.replace(/\<!-- VAR ([A-z0-9_-]+) --\>([\s\S]*?)\<!-- ENDVAR \1 -->/g, "'$1' : \"$2\",");
	code = '( { ' + code + ' "________null________" : false } )';
	vars = eval(code);
	return vars;
}

window.__tpFetchHook = function(hookid)
{
	var _ob = '';
	window.Template = this;
	window.Echo = function(h)
	{
		_ob += h;
	}
	eval(setHook('thook_' + hookid));
	window.Echo = window.Template = false;
	return _ob;
}