|
const debug = require('./debug'); |
|
const utils = require('./utils'); |
|
const tableLayout = require('./layout-manager'); |
|
|
|
class Table extends Array { |
|
constructor(opts) { |
|
super(); |
|
|
|
const options = utils.mergeOptions(opts); |
|
Object.defineProperty(this, 'options', { |
|
value: options, |
|
enumerable: options.debug, |
|
}); |
|
|
|
if (options.debug) { |
|
switch (typeof options.debug) { |
|
case 'boolean': |
|
debug.setDebugLevel(debug.WARN); |
|
break; |
|
case 'number': |
|
debug.setDebugLevel(options.debug); |
|
break; |
|
case 'string': |
|
debug.setDebugLevel(parseInt(options.debug, 10)); |
|
break; |
|
default: |
|
debug.setDebugLevel(debug.WARN); |
|
debug.warn(`Debug option is expected to be boolean, number, or string. Received a ${typeof options.debug}`); |
|
} |
|
Object.defineProperty(this, 'messages', { |
|
get() { |
|
return debug.debugMessages(); |
|
}, |
|
}); |
|
} |
|
} |
|
|
|
toString() { |
|
let array = this; |
|
let headersPresent = this.options.head && this.options.head.length; |
|
if (headersPresent) { |
|
array = [this.options.head]; |
|
if (this.length) { |
|
array.push.apply(array, this); |
|
} |
|
} else { |
|
this.options.style.head = []; |
|
} |
|
|
|
let cells = tableLayout.makeTableLayout(array); |
|
|
|
cells.forEach(function (row) { |
|
row.forEach(function (cell) { |
|
cell.mergeTableOptions(this.options, cells); |
|
}, this); |
|
}, this); |
|
|
|
tableLayout.computeWidths(this.options.colWidths, cells); |
|
tableLayout.computeHeights(this.options.rowHeights, cells); |
|
|
|
cells.forEach(function (row) { |
|
row.forEach(function (cell) { |
|
cell.init(this.options); |
|
}, this); |
|
}, this); |
|
|
|
let result = []; |
|
|
|
for (let rowIndex = 0; rowIndex < cells.length; rowIndex++) { |
|
let row = cells[rowIndex]; |
|
let heightOfRow = this.options.rowHeights[rowIndex]; |
|
|
|
if (rowIndex === 0 || !this.options.style.compact || (rowIndex == 1 && headersPresent)) { |
|
doDraw(row, 'top', result); |
|
} |
|
|
|
for (let lineNum = 0; lineNum < heightOfRow; lineNum++) { |
|
doDraw(row, lineNum, result); |
|
} |
|
|
|
if (rowIndex + 1 == cells.length) { |
|
doDraw(row, 'bottom', result); |
|
} |
|
} |
|
|
|
return result.join('\n'); |
|
} |
|
|
|
get width() { |
|
let str = this.toString().split('\n'); |
|
return str[0].length; |
|
} |
|
} |
|
|
|
Table.reset = () => debug.reset(); |
|
|
|
function doDraw(row, lineNum, result) { |
|
let line = []; |
|
row.forEach(function (cell) { |
|
line.push(cell.draw(lineNum)); |
|
}); |
|
let str = line.join(''); |
|
if (str.length) result.push(str); |
|
} |
|
|
|
module.exports = Table; |
|
|