1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * 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);
- };
|