86 lines
2 KiB
JavaScript
86 lines
2 KiB
JavaScript
/**
|
|
* Repeats a string.
|
|
*
|
|
* @param {String} char(s)
|
|
* @param {Number} number of times
|
|
* @return {String} repeated string
|
|
*/
|
|
|
|
exports.repeat = function (str, times){
|
|
return Array(times + 1).join(str);
|
|
};
|
|
|
|
/**
|
|
* Pads a string
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
exports.pad = function (str, len, pad, dir) {
|
|
if (len + 1 >= str.length)
|
|
switch (dir){
|
|
case 'left':
|
|
str = Array(len + 1 - str.length).join(pad) + str;
|
|
break;
|
|
|
|
case 'both':
|
|
var right = Math.ceil((padlen = len - str.length) / 2);
|
|
var left = padlen - right;
|
|
str = Array(left + 1).join(pad) + str + Array(right + 1).join(pad);
|
|
break;
|
|
|
|
default:
|
|
str = str + Array(len + 1 - str.length).join(pad);
|
|
};
|
|
|
|
return str;
|
|
};
|
|
|
|
/**
|
|
* Truncates a string
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
exports.truncate = function (str, length, chr){
|
|
chr = chr || '…';
|
|
return str.length >= length ? str.substr(0, length - chr.length) + chr : str;
|
|
};
|
|
|
|
/**
|
|
* Copies and merges options with defaults.
|
|
*
|
|
* @param {Object} defaults
|
|
* @param {Object} supplied options
|
|
* @return {Object} new (merged) object
|
|
*/
|
|
|
|
function options(defaults, opts) {
|
|
for (var p in opts) {
|
|
if (p === '__proto__' || p === 'constructor' || p === 'prototype') {
|
|
continue;
|
|
}
|
|
if (opts[p] && opts[p].constructor && opts[p].constructor === Object) {
|
|
defaults[p] = defaults[p] || {};
|
|
options(defaults[p], opts[p]);
|
|
} else {
|
|
defaults[p] = opts[p];
|
|
}
|
|
}
|
|
return defaults;
|
|
};
|
|
exports.options = options;
|
|
|
|
//
|
|
// For consideration of terminal "color" programs like colors.js,
|
|
// which can add ANSI escape color codes to strings,
|
|
// we destyle the ANSI color escape codes for padding calculations.
|
|
//
|
|
// see: http://en.wikipedia.org/wiki/ANSI_escape_code
|
|
//
|
|
exports.strlen = function(str){
|
|
var code = /\u001b\[(?:\d*;){0,5}\d*m/g;
|
|
var stripped = ("" + str).replace(code,'');
|
|
var split = stripped.split("\n");
|
|
return split.reduce(function (memo, s) { return (s.length > memo) ? s.length : memo }, 0);
|
|
}
|