[6a3a178] | 1 | module.exports = function (rows_, opts) {
|
---|
| 2 | if (!opts) opts = {};
|
---|
| 3 | var hsep = opts.hsep === undefined ? ' ' : opts.hsep;
|
---|
| 4 | var align = opts.align || [];
|
---|
| 5 | var stringLength = opts.stringLength
|
---|
| 6 | || function (s) { return String(s).length; }
|
---|
| 7 | ;
|
---|
| 8 |
|
---|
| 9 | var dotsizes = reduce(rows_, function (acc, row) {
|
---|
| 10 | forEach(row, function (c, ix) {
|
---|
| 11 | var n = dotindex(c);
|
---|
| 12 | if (!acc[ix] || n > acc[ix]) acc[ix] = n;
|
---|
| 13 | });
|
---|
| 14 | return acc;
|
---|
| 15 | }, []);
|
---|
| 16 |
|
---|
| 17 | var rows = map(rows_, function (row) {
|
---|
| 18 | return map(row, function (c_, ix) {
|
---|
| 19 | var c = String(c_);
|
---|
| 20 | if (align[ix] === '.') {
|
---|
| 21 | var index = dotindex(c);
|
---|
| 22 | var size = dotsizes[ix] + (/\./.test(c) ? 1 : 2)
|
---|
| 23 | - (stringLength(c) - index)
|
---|
| 24 | ;
|
---|
| 25 | return c + Array(size).join(' ');
|
---|
| 26 | }
|
---|
| 27 | else return c;
|
---|
| 28 | });
|
---|
| 29 | });
|
---|
| 30 |
|
---|
| 31 | var sizes = reduce(rows, function (acc, row) {
|
---|
| 32 | forEach(row, function (c, ix) {
|
---|
| 33 | var n = stringLength(c);
|
---|
| 34 | if (!acc[ix] || n > acc[ix]) acc[ix] = n;
|
---|
| 35 | });
|
---|
| 36 | return acc;
|
---|
| 37 | }, []);
|
---|
| 38 |
|
---|
| 39 | return map(rows, function (row) {
|
---|
| 40 | return map(row, function (c, ix) {
|
---|
| 41 | var n = (sizes[ix] - stringLength(c)) || 0;
|
---|
| 42 | var s = Array(Math.max(n + 1, 1)).join(' ');
|
---|
| 43 | if (align[ix] === 'r' || align[ix] === '.') {
|
---|
| 44 | return s + c;
|
---|
| 45 | }
|
---|
| 46 | if (align[ix] === 'c') {
|
---|
| 47 | return Array(Math.ceil(n / 2 + 1)).join(' ')
|
---|
| 48 | + c + Array(Math.floor(n / 2 + 1)).join(' ')
|
---|
| 49 | ;
|
---|
| 50 | }
|
---|
| 51 |
|
---|
| 52 | return c + s;
|
---|
| 53 | }).join(hsep).replace(/\s+$/, '');
|
---|
| 54 | }).join('\n');
|
---|
| 55 | };
|
---|
| 56 |
|
---|
| 57 | function dotindex (c) {
|
---|
| 58 | var m = /\.[^.]*$/.exec(c);
|
---|
| 59 | return m ? m.index + 1 : c.length;
|
---|
| 60 | }
|
---|
| 61 |
|
---|
| 62 | function reduce (xs, f, init) {
|
---|
| 63 | if (xs.reduce) return xs.reduce(f, init);
|
---|
| 64 | var i = 0;
|
---|
| 65 | var acc = arguments.length >= 3 ? init : xs[i++];
|
---|
| 66 | for (; i < xs.length; i++) {
|
---|
| 67 | f(acc, xs[i], i);
|
---|
| 68 | }
|
---|
| 69 | return acc;
|
---|
| 70 | }
|
---|
| 71 |
|
---|
| 72 | function forEach (xs, f) {
|
---|
| 73 | if (xs.forEach) return xs.forEach(f);
|
---|
| 74 | for (var i = 0; i < xs.length; i++) {
|
---|
| 75 | f.call(xs, xs[i], i);
|
---|
| 76 | }
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | function map (xs, f) {
|
---|
| 80 | if (xs.map) return xs.map(f);
|
---|
| 81 | var res = [];
|
---|
| 82 | for (var i = 0; i < xs.length; i++) {
|
---|
| 83 | res.push(f.call(xs, xs[i], i));
|
---|
| 84 | }
|
---|
| 85 | return res;
|
---|
| 86 | }
|
---|