diff options
Diffstat (limited to 'node_modules/locutus/php/strings/sprintf.js')
-rw-r--r-- | node_modules/locutus/php/strings/sprintf.js | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/node_modules/locutus/php/strings/sprintf.js b/node_modules/locutus/php/strings/sprintf.js new file mode 100644 index 0000000..103b8e3 --- /dev/null +++ b/node_modules/locutus/php/strings/sprintf.js @@ -0,0 +1,193 @@ +'use strict'; + +module.exports = function sprintf() { + // discuss at: http://locutus.io/php/sprintf/ + // original by: Ash Searle (http://hexmen.com/blog/) + // improved by: Michael White (http://getsprink.com) + // improved by: Jack + // improved by: Kevin van Zonneveld (http://kvz.io) + // improved by: Kevin van Zonneveld (http://kvz.io) + // improved by: Kevin van Zonneveld (http://kvz.io) + // improved by: Dj + // improved by: Allidylls + // input by: Paulo Freitas + // input by: Brett Zamir (http://brett-zamir.me) + // improved by: RafaĆ Kukawski (http://kukawski.pl) + // example 1: sprintf("%01.2f", 123.1) + // returns 1: '123.10' + // example 2: sprintf("[%10s]", 'monkey') + // returns 2: '[ monkey]' + // example 3: sprintf("[%'#10s]", 'monkey') + // returns 3: '[####monkey]' + // example 4: sprintf("%d", 123456789012345) + // returns 4: '123456789012345' + // example 5: sprintf('%-03s', 'E') + // returns 5: 'E00' + // example 6: sprintf('%+010d', 9) + // returns 6: '+000000009' + // example 7: sprintf('%+0\'@10d', 9) + // returns 7: '@@@@@@@@+9' + // example 8: sprintf('%.f', 3.14) + // returns 8: '3.140000' + // example 9: sprintf('%% %2$d', 1, 2) + // returns 9: '% 2' + + var regex = /%%|%(?:(\d+)\$)?((?:[-+#0 ]|'[\s\S])*)(\d+)?(?:\.(\d*))?([\s\S])/g; + var args = arguments; + var i = 0; + var format = args[i++]; + + var _pad = function _pad(str, len, chr, leftJustify) { + if (!chr) { + chr = ' '; + } + var padding = str.length >= len ? '' : new Array(1 + len - str.length >>> 0).join(chr); + return leftJustify ? str + padding : padding + str; + }; + + var justify = function justify(value, prefix, leftJustify, minWidth, padChar) { + var diff = minWidth - value.length; + if (diff > 0) { + // when padding with zeros + // on the left side + // keep sign (+ or -) in front + if (!leftJustify && padChar === '0') { + value = [value.slice(0, prefix.length), _pad('', diff, '0', true), value.slice(prefix.length)].join(''); + } else { + value = _pad(value, minWidth, padChar, leftJustify); + } + } + return value; + }; + + var _formatBaseX = function _formatBaseX(value, base, leftJustify, minWidth, precision, padChar) { + // Note: casts negative numbers to positive ones + var number = value >>> 0; + value = _pad(number.toString(base), precision || 0, '0', false); + return justify(value, '', leftJustify, minWidth, padChar); + }; + + // _formatString() + var _formatString = function _formatString(value, leftJustify, minWidth, precision, customPadChar) { + if (precision !== null && precision !== undefined) { + value = value.slice(0, precision); + } + return justify(value, '', leftJustify, minWidth, customPadChar); + }; + + // doFormat() + var doFormat = function doFormat(substring, argIndex, modifiers, minWidth, precision, specifier) { + var number, prefix, method, textTransform, value; + + if (substring === '%%') { + return '%'; + } + + // parse modifiers + var padChar = ' '; // pad with spaces by default + var leftJustify = false; + var positiveNumberPrefix = ''; + var j, l; + + for (j = 0, l = modifiers.length; j < l; j++) { + switch (modifiers.charAt(j)) { + case ' ': + case '0': + padChar = modifiers.charAt(j); + break; + case '+': + positiveNumberPrefix = '+'; + break; + case '-': + leftJustify = true; + break; + case "'": + if (j + 1 < l) { + padChar = modifiers.charAt(j + 1); + j++; + } + break; + } + } + + if (!minWidth) { + minWidth = 0; + } else { + minWidth = +minWidth; + } + + if (!isFinite(minWidth)) { + throw new Error('Width must be finite'); + } + + if (!precision) { + precision = specifier === 'd' ? 0 : 'fFeE'.indexOf(specifier) > -1 ? 6 : undefined; + } else { + precision = +precision; + } + + if (argIndex && +argIndex === 0) { + throw new Error('Argument number must be greater than zero'); + } + + if (argIndex && +argIndex >= args.length) { + throw new Error('Too few arguments'); + } + + value = argIndex ? args[+argIndex] : args[i++]; + + switch (specifier) { + case '%': + return '%'; + case 's': + return _formatString(value + '', leftJustify, minWidth, precision, padChar); + case 'c': + return _formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, padChar); + case 'b': + return _formatBaseX(value, 2, leftJustify, minWidth, precision, padChar); + case 'o': + return _formatBaseX(value, 8, leftJustify, minWidth, precision, padChar); + case 'x': + return _formatBaseX(value, 16, leftJustify, minWidth, precision, padChar); + case 'X': + return _formatBaseX(value, 16, leftJustify, minWidth, precision, padChar).toUpperCase(); + case 'u': + return _formatBaseX(value, 10, leftJustify, minWidth, precision, padChar); + case 'i': + case 'd': + number = +value || 0; + // Plain Math.round doesn't just truncate + number = Math.round(number - number % 1); + prefix = number < 0 ? '-' : positiveNumberPrefix; + value = prefix + _pad(String(Math.abs(number)), precision, '0', false); + + if (leftJustify && padChar === '0') { + // can't right-pad 0s on integers + padChar = ' '; + } + return justify(value, prefix, leftJustify, minWidth, padChar); + case 'e': + case 'E': + case 'f': // @todo: Should handle locales (as per setlocale) + case 'F': + case 'g': + case 'G': + number = +value; + prefix = number < 0 ? '-' : positiveNumberPrefix; + method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(specifier.toLowerCase())]; + textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(specifier) % 2]; + value = prefix + Math.abs(number)[method](precision); + return justify(value, prefix, leftJustify, minWidth, padChar)[textTransform](); + default: + // unknown specifier, consume that char and return empty + return ''; + } + }; + + try { + return format.replace(regex, doFormat); + } catch (err) { + return false; + } +}; +//# sourceMappingURL=sprintf.js.map
\ No newline at end of file |