/*! * fprint - lib/fprint.js * Copyright(c) 2012 dead_horse */ /** * print [['helloworld', '你好'], ['hello', 'world']] => * helloworld 你好 * hello world * @param {Array} lines source array * @param {String|Number} string border or length of space border * @param {Number} max each word max length * @return {String} */ exports.print = function(lines, border, max) { border = border || 3; var eachMax = max ? [] : _getMax(lines); var result = []; if (typeof border === 'number') { border = _wrapSpace('', border); } for (var i = 0, ls = lines.length; i < ls; i++) { var line = lines[i]; var words = new Array(line.length); for (var j = 0, l = line.length; j < l; j++) { words[j] = _wrapSpace(line[j], eachMax[j] || max); } result.push(words.join(border)); } return result.join('\n'); } /** * make words have a length of max. * example: * ``` * _wrapSpace('hello', 7); // 'hello ' * _wrapSpace('hello', 3); // 'hel' * ``` * @param {String} word input word * @param {Number} max max length * @return {String} ouput word */ var _wrapSpace = function(word, max) { if (typeof word !== 'string') { word = JSON.stringify(word); } var length = _getLength(word); if (length < max) { for (var i = length; i < max; i++) { word += ' '; } return word; } else { return _slice(word, 0, max); } } /** * slice word, make chinese symblos have length of 2 * example: * ``` * slice('abcd', 0, 3); // 'abc' * slice('中国', 0, 3); // '中 ' * ``` * @param {String} str * @param {Number} start * @param {Number} max * @return {String} */ function _slice(str, start, max) { var length = max; var tmp = str.slice(start, length); var realLength = _getLength(tmp); while(realLength > max) { tmp = str.slice(start, --length); realLength = _getLength(tmp); } if (realLength < max) { tmp += ' '; } return tmp; } /** * get each column's max length * example: * ``` * _getMax([['hello', 'world'], ['for', 'bar']]); // [4, 4] * ``` * @param {Array} lines * @return {Array} */ var _getMax = function(lines) { var eachMax = []; for (var i = 0, ls = lines.length; i < ls; i++) { var line = lines[i]; for (var j = 0, l = line.length; j < l; j++) { var word = line[j]; var wordLength = typeof word === 'string' ? word.length : JSON.stringify(word).length; if (eachMax[j] === undefined || wordLength > eachMax[j]) { eachMax[j] = wordLength; } } } return eachMax; } /** * get display length of string * @param {String} str input string * @return {String} output string */ function _getLength(str) { return Math.round(str.replace(/[^\x00-\xff]/g, 'qq').length); }