blob: 91b55883db431b27ea9b141100166669519ca385 [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* Namespace for utility functions...
*/
var util = new Object();
/**
* Returns a version of str with variable references replaced.
*
* Variables should be of the form %(name) or %FLAG(name).
*
* At the moment the only supported FLAG is 'uri', which uri encodes the value
* before placing it in the string. For example, if the value of
* vars['percent'] is '%', then %uri(percent) would become '%25'.
*
* This function throws an error if an unknown variable is referenced or
* an unknown FLAG is used.
*
* @param {string} str A string containing zero or more variable references.
* @param {Object|function(string):string} vars An object containing the
* variables, or a function that returns a variable value given a name.
*/
util.replaceVars =
function replaceVars(str, vars) {
function uriall_replace (ch) {
// Replace EVERY character with a percent sign, followed by the character's
// value in hex. It's like an extreme uri encoding, and some CSR servers
// seem to require it.
rv = ch.charCodeAt(0).toString(16);
return "%" + (rv.length > 1 ? rv : ("0" + rv));
}
function cb(m, flag, name) {
if (typeof vars == 'function')
value = vars(name);
else
value = vars[name];
if (typeof value == 'undefined')
throw new Error('replaceVars: Unknown variable name: ' + name);
if (!flag)
return value;
switch (flag) {
case 'uri': return encodeURI(value);
case 'uriall':
return value.replace(/.|\n/g, uriall_replace);
default:
throw new Error('replaceVars: Unknown flag: ' + flag +
', while replacing variable: ' + name);
}
}
return str.replace(/%([a-z]*)\(([^\)]+)\)/g, cb);
};