Pages

Wednesday, August 14, 2013

JavaScript - Simple parser for variables embedded on strings

Used for parsing variables embedded on strings. To get local variables defined inside constant strings as a way to put dynamic content like app name and version inside string translations.

Example:

Original string:
${owner} amount is ${currency} ${value}. Sharon has ${currency} ${value}. x.y = ${x.y}

Parsed string:
Sharon amount is US$ 12,345.00. Sharon has US$ 12,345.00. x.y = 5
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> </head> <body> <script type="text/javascript"> function Evaluator() { } Evaluator.prototype.matches = []; Evaluator.prototype.patterVarName = "[a-zA-Z_]+[_a-zA-Z0-9.]*"; Evaluator.prototype.regex = new RegExp("\\${(" + Evaluator.prototype.patterVarName + ")}", "mg"); Evaluator.prototype.reset = function() { for (var item in this.matches) { delete this.matches[item]; } }; Evaluator.prototype.collect = function(str) { this.reset(); var match; while (match = this.regex.exec(str)) { try { this.matches[match[1]] = eval(match[1]); } catch (e) { console.log('Error: ' + e.message); } } }; Evaluator.prototype.parse = function(str) { this.collect(str); for (var item in this.matches) { while (this.regex.test(str)) { str = str.replace('${' + item + '}', this.matches[item]); } } return str; }; // Use var evaluator = new Evaluator(); var owner = 'Sharon'; var currency = 'US$'; var value = '12,345.00'; var x = { y: 5 }; var str = '${owner} amount is ${currency} ${value}. ' + 'Sharon has ${currency} ${value} <br/>x.y = ${x.y}'; document.write('<br/>Original string: <strong>' + str + '</strong><br/>'); // Parse string str = evaluator.parse(str); document.write('Parsed string: <strong>' + str + '</strong><br/>'); // Print variables in cache document.write('<br/>Variables:<br/>'); for (var item in evaluator.matches) { document.write('- ' + item + ' = ' + evaluator.matches[item] + '<br/>'); } </script> </body> </html>

No comments: