123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /*!
- * fprint - lib/fprint.js
- * Copyright(c) 2012 dead_horse<dead_horse@qq.com>
- */
- /**
- * 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);
- }
|