module.exports = function (rows_, opts){ if (!opts) opts = { } ; var hsep = opts.hsep === undefined? ' ': opts.hsep; var align = opts.align || [] ; var stringLength = opts.stringLength || function (s){ return _AN_Read_length('length', String(s)); } ; var dotsizes = reduce(rows_, function (acc, row){ forEach(row, function (c, ix){ var n = dotindex(c); if (!acc[ix] || n > acc[ix]) acc[ix] = n; } ); return acc; } , [] ); var rows = map(rows_, function (row){ return map(row, function (c_, ix){ var c = String(c_); if (align[ix] === '.') { var index = dotindex(c); var size = dotsizes[ix] + (/\./.test(c)? 1: 2) - (stringLength(c) - index); return c + Array(size).join(' '); } else return c; } ); } ); var sizes = reduce(rows, function (acc, row){ forEach(row, function (c, ix){ var n = stringLength(c); if (!acc[ix] || n > acc[ix]) acc[ix] = n; } ); return acc; } , [] ); return map(rows, function (row){ return _AN_Call_replace('replace', map(row, function (c, ix){ var n = (sizes[ix] - stringLength(c)) || 0; var s = Array(Math.max(n + 1, 1)).join(' '); if (align[ix] === 'r' || align[ix] === '.') { return s + c; } if (align[ix] === 'c') { return Array(Math.ceil(n / 2 + 1)).join(' ') + c + Array(Math.floor(n / 2 + 1)).join(' '); } return c + s; } ).join(hsep), /\s+$/, ''); } ).join('\n'); } ; function dotindex(c){ var m = /\.[^.]*$/.exec(c); return m? m.index + 1: _AN_Read_length('length', c); } function reduce(xs, f, init){ if (xs.reduce) return xs.reduce(f, init); var i = 0; var acc = _AN_Read_length('length', arguments) >= 3? init: xs[i++ ]; for (; i < _AN_Read_length('length', xs); i++ ){ f(acc, xs[i], i); } return acc; } function forEach(xs, f){ if (xs.forEach) return xs.forEach(f); for (var i = 0; i < _AN_Read_length('length', xs); i++ ){ f.call(xs, xs[i], i); } } function map(xs, f){ if (xs.map) return xs.map(f); var res = [] ; for (var i = 0; i < _AN_Read_length('length', xs); i++ ){ res.push(f.call(xs, xs[i], i)); } return res; }