mirror of
https://github.com/apache/cordova-android.git
synced 2025-01-19 15:12:51 +08:00
87 lines
2.3 KiB
JavaScript
87 lines
2.3 KiB
JavaScript
|
/*
|
||
|
* Copyright 2011 Rackspace
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
var cache = {};
|
||
|
|
||
|
|
||
|
// Do any others need escaping?
|
||
|
var TO_ESCAPE = {
|
||
|
'\'': '\\\'',
|
||
|
'\n': '\\n'
|
||
|
};
|
||
|
|
||
|
|
||
|
function populate(formatter) {
|
||
|
var i, type,
|
||
|
key = formatter,
|
||
|
prev = 0,
|
||
|
arg = 1,
|
||
|
builder = 'return \'';
|
||
|
|
||
|
for (i = 0; i < formatter.length; i++) {
|
||
|
if (formatter[i] === '%') {
|
||
|
type = formatter[i + 1];
|
||
|
|
||
|
switch (type) {
|
||
|
case 's':
|
||
|
builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \'';
|
||
|
prev = i + 2;
|
||
|
arg++;
|
||
|
break;
|
||
|
case 'j':
|
||
|
builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \'';
|
||
|
prev = i + 2;
|
||
|
arg++;
|
||
|
break;
|
||
|
case '%':
|
||
|
builder += formatter.slice(prev, i + 1);
|
||
|
prev = i + 2;
|
||
|
i++;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
} else if (TO_ESCAPE[formatter[i]]) {
|
||
|
builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]];
|
||
|
prev = i + 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
builder += formatter.slice(prev) + '\';';
|
||
|
cache[key] = new Function(builder);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* A fast version of sprintf(), which currently only supports the %s and %j.
|
||
|
* This caches a formatting function for each format string that is used, so
|
||
|
* you should only use this sprintf() will be called many times with a single
|
||
|
* format string and a limited number of format strings will ever be used (in
|
||
|
* general this means that format strings should be string literals).
|
||
|
*
|
||
|
* @param {String} formatter A format string.
|
||
|
* @param {...String} var_args Values that will be formatted by %s and %j.
|
||
|
* @return {String} The formatted output.
|
||
|
*/
|
||
|
exports.sprintf = function(formatter, var_args) {
|
||
|
if (!cache[formatter]) {
|
||
|
populate(formatter);
|
||
|
}
|
||
|
|
||
|
return cache[formatter].apply(null, arguments);
|
||
|
};
|