If you (like me) only need the limited subset of python's format function for simple string replacement, and performance is not critical, a very simple 29-line pure-Javascript function may suffice.
Javascript call: format(str, data)
Analogous python call: str.format(**data)
, with the caveat that this javascript function, unlike Python's, does not throw an error if the string contains a varname that is not found in the provided data.
/*
* format(str, data): analogous to Python's str.format(**data)
*
* Example:
* let data = {
* user: {
* name: { first: 'Jane', last: 'Doe' }
* },
* email: 'jane@doe.com',
* groups: ["one","two"]
* };
*
* let str = 'Hi {user.name.first} {user.name.last}, your email address is {email}, and your second group is {groups[1]}'
*
* format(str, data)
* => returns "Hi Jane Doe, your email address is jane@doe.com, and your second group is two"
*/
function format(str, data) {
var varnames = {};
function array_path(path, i) {
var this_k = '[' + i + ']';
if (!path.length)
return [this_k];
path = path.slice();
path[path.length - 1] += this_k;
return path;
}
function add_varnames(this_data, path) {
if (this_data.constructor == Array) {
for (var i = 0; i < this_data.length; i++)
add_varnames(this_data[i], array_path(path, i));
}
else if (this_data.constructor == Object) {
for (var k in this_data)
add_varnames(this_data[k], path.concat(k));
}
else {
var varname = '{' + path.join('.') + '}';
varnames[varname] = String(this_data);
}
}
add_varnames(data, []);
for (var varname in varnames)
str = str.replace(varname, varnames[varname]);
return str;
}