diff --git a/js/doc/cli-utils.js b/js/doc/cli-utils.js new file mode 100644 index 0000000..a8c7594 --- /dev/null +++ b/js/doc/cli-utils.js @@ -0,0 +1,84 @@ + +/** + * 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 (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 != null ? str : '')).replace(code,''); + var split = stripped.split("\n"); + return split.reduce(function (memo, s) { return (s.length > memo) ? s.length : memo }, 0); +}