Last active
March 23, 2017 16:06
-
-
Save homam/d9b985c0b0b98eea1c1f4101daac9b1a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
TextTable = 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment