Last active
December 25, 2015 11:28
-
-
Save vincenting/6968752 to your computer and use it in GitHub Desktop.
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
(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