Major revamps to the template parser. Fixed a few security holes that could allow PHP to be injected in untimely places in TPL code. Improved Ux for XSS attempt in tplWikiFormat. Documented many functions. Backported much cleaner parser from 2.0 branch. Beautified a lot of code in the depths of the template class. Pretty much a small-scale Extreme Makeover.
// 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.
function templateParser(text)
{
this.tpl_code = text;
this.tpl_strings = new Object();
this.tpl_bool = new Object();
this.assign_vars = __tpAssignVars;
this.assign_bool = __tpAssignBool;
this.run = __tpRun;
}
function __tpAssignVars(vars)
{
for(var i in vars)
{
this.tpl_strings[i] = vars[i];
}
}
function __tpAssignBool(vars)
{
for(var i in vars)
{
this.tpl_bool[i] = ( vars[i] ) ? true : false;
}
}
function __tpRun()
{
if(typeof(this.tpl_code) == 'string')
{
tpl_code = __tpCompileTemplate(this.tpl_code);
try {
compiled = eval(tpl_code);
}
catch(e)
{
alert(e);
aclDebug(tpl_code);
}
return compiled;
}
return false;
}
function __tpCompileTemplate(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(/\<!-- 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, "' + ( ( this.tpl_bool['$1'] == true ) ? '$2' : '' ) + '");
return code;
}
function __tpExtractVars(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;
}