You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							86 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							86 lines
						
					
					
						
							2.4 KiB
						
					
					
				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 String(s).length; } | 
						|
    ; | 
						|
     | 
						|
    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 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).replace(/\s+$/, ''); | 
						|
    }).join('\n'); | 
						|
}; | 
						|
 | 
						|
function dotindex (c) { | 
						|
    var m = /\.[^.]*$/.exec(c); | 
						|
    return m ? m.index + 1 : c.length; | 
						|
} | 
						|
 | 
						|
function reduce (xs, f, init) { | 
						|
    if (xs.reduce) return xs.reduce(f, init); | 
						|
    var i = 0; | 
						|
    var acc = arguments.length >= 3 ? init : xs[i++]; | 
						|
    for (; i < xs.length; i++) { | 
						|
        f(acc, xs[i], i); | 
						|
    } | 
						|
    return acc; | 
						|
} | 
						|
 | 
						|
function forEach (xs, f) { | 
						|
    if (xs.forEach) return xs.forEach(f); | 
						|
    for (var i = 0; i < xs.length; 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 < xs.length; i++) { | 
						|
        res.push(f.call(xs, xs[i], i)); | 
						|
    } | 
						|
    return res; | 
						|
}
 | 
						|
 |