Skip to content

Instantly share code, notes, and snippets.

@vincenting
Last active December 25, 2015 11:28
Show Gist options
  • Save vincenting/6968752 to your computer and use it in GitHub Desktop.
Save vincenting/6968752 to your computer and use it in GitHub Desktop.
(function() {
console.time('test');
var noop = function() {
};
var strParse = function(str, cur_statements, cur_vars) {
cur_vars = cur_vars || [];
cur_statements = cur_statements || [];
try {
eval('(function(){' + cur_statements.join(';') + '; var result = ' + str + ';})()');
return cur_vars;
} catch (err) {
var msg = err.message,
var_name,
nm = err.name;
if (nm === 'ReferenceError') {
var_name = msg.substr(0, msg.indexOf(' is not defined'));
if (var_name === '') {
throw new Error(msg + ' when parse template "' + str + '"');
}
cur_vars.push(var_name);
cur_statements.push('var ' + var_name + ' = {}');
return strParse(str, cur_statements, cur_vars);
}
if (nm === 'TypeError') {
var this_method = msg,
_index = msg.indexOf('has no method \'');
if (_index === -1) {
throw new Error(msg + ' when parse template "' + str + '"');
}
var mt = msg.substring(_index + 15, msg.length - 1);
var_name = cur_vars[cur_vars.length - 1];
cur_statements.push(var_name + '.' + mt + ' = noop');
return strParse(str, cur_statements, cur_vars);
}
throw new Error(nm + ':' + msg + ' when parse template "' + str + '"');
}
};
console.log(strParse('task_name.toLowerCase() + task_id + task_data'));
console.timeEnd('test');
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment