| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- var each = require('./each');
- var strWidth = require('./strWidth');
- var map = require('./map');
- var repeat = require('./repeat');
- var cloneDeep = require('./cloneDeep');
- exports = function(rows) {
- rows = cloneDeep(rows);
- var options = {
- border: defBorder
- };
- options.columns = getColumns(rows);
- padData(rows, options);
- return render(rows, options);
- };
- function padData(rows, options) {
- var columnCount = options.columns.length;
- for (var i = 0, len = rows.length; i < len; i++) {
- while (rows[i].length < columnCount) {
- rows[i].push('');
- }
- }
- return loopData(rows, function(data, row, column) {
- var _options$columns$colu = options.columns[column],
- paddingLeft = _options$columns$colu.paddingLeft,
- width = _options$columns$colu.width,
- paddingRight = _options$columns$colu.paddingRight;
- return (
- repeat(' ', paddingLeft) +
- data +
- repeat(' ', width - strWidth(data) - paddingRight)
- );
- });
- }
- function loopData(rows, handler) {
- for (var i = 0, len = rows.length; i < len; i++) {
- var row = rows[i];
- for (var j = 0, _len = row.length; j < _len; j++) {
- var data = handler(row[j], i, j);
- if (data) {
- row[j] = data;
- }
- }
- }
- }
- function getColumns(rows) {
- var columns = [];
- var paddingLeft = 1;
- var paddingRight = 1;
- loopData(rows, function(data, row, column) {
- columns[column] = columns[column] || {
- width: paddingLeft + paddingRight,
- paddingLeft: paddingLeft,
- paddingRight: paddingRight
- };
- var width = strWidth(data) + paddingLeft + paddingRight;
- if (width > columns[column].width) {
- columns[column].width = width;
- }
- });
- return columns;
- }
- function render(rows, options) {
- var ret = '';
- ret += renderBorder('top', options);
- each(rows, function(row, idx) {
- ret += renderRow(row, options);
- if (idx === rows.length - 1) {
- ret += renderBorder('bottom', options);
- } else {
- ret += renderBorder('join', options);
- }
- });
- return ret;
- }
- function renderRow(columns, options) {
- var border = options.border;
- return (
- border.bodyLeft +
- columns.join(border.bodyJoin) +
- border.bodyRight +
- '\n'
- );
- }
- function renderBorder(type, options) {
- var border = options.border,
- columns = options.columns;
- var left = border[type + 'Left'];
- var right = border[type + 'Right'];
- var body = border[type + 'Body'];
- var join = border[type + 'Join'];
- var ret = map(columns, function(column) {
- return repeat(body, column.width);
- }).join(join);
- ret = left + ret + right;
- if (type !== 'bottom') {
- ret += '\n';
- }
- return ret;
- }
- var defBorder = {
- topBody: '─',
- topJoin: '┬',
- topLeft: '┌',
- topRight: '┐',
- bottomBody: '─',
- bottomJoin: '┴',
- bottomLeft: '└',
- bottomRight: '┘',
- bodyLeft: '│',
- bodyRight: '│',
- bodyJoin: '│',
- joinBody: '─',
- joinLeft: '├',
- joinRight: '┤',
- joinJoin: '┼'
- };
- module.exports = exports;
|