| import drawTable from './drawTable'; |
| import calculateCellWidthIndex from './calculateCellWidthIndex'; |
| import makeConfig from './makeConfig'; |
| import calculateRowHeightIndex from './calculateRowHeightIndex'; |
| import mapDataUsingRowHeightIndex from './mapDataUsingRowHeightIndex'; |
| import alignTableData from './alignTableData'; |
| import padTableData from './padTableData'; |
| import validateTableData from './validateTableData'; |
| import stringifyTableData from './stringifyTableData'; |
| import truncateTableData from './truncateTableData'; |
| |
| /** |
| * @typedef {string} table~cell |
| */ |
| |
| /** |
| * @typedef {table~cell[]} table~row |
| */ |
| |
| /** |
| * @typedef {Object} table~columns |
| * @property {string} alignment Cell content alignment (enum: left, center, right) (default: left). |
| * @property {number} width Column width (default: auto). |
| * @property {number} truncate Number of characters are which the content will be truncated (default: Infinity). |
| * @property {boolean} wrapWord When true the text is broken at the nearest space or one of the special characters |
| * @property {number} paddingLeft Cell content padding width left (default: 1). |
| * @property {number} paddingRight Cell content padding width right (default: 1). |
| */ |
| |
| /** |
| * @typedef {Object} table~border |
| * @property {string} topBody |
| * @property {string} topJoin |
| * @property {string} topLeft |
| * @property {string} topRight |
| * @property {string} bottomBody |
| * @property {string} bottomJoin |
| * @property {string} bottomLeft |
| * @property {string} bottomRight |
| * @property {string} bodyLeft |
| * @property {string} bodyRight |
| * @property {string} bodyJoin |
| * @property {string} joinBody |
| * @property {string} joinLeft |
| * @property {string} joinRight |
| * @property {string} joinJoin |
| */ |
| |
| /** |
| * Used to tell whether to draw a horizontal line. |
| * This callback is called for each non-content line of the table. |
| * The default behavior is to always return true. |
| * |
| * @typedef {Function} drawHorizontalLine |
| * @param {number} index |
| * @param {number} size |
| * @returns {boolean} |
| */ |
| |
| /** |
| * @typedef {Object} table~config |
| * @property {table~border} border |
| * @property {table~columns[]} columns Column specific configuration. |
| * @property {table~columns} columnDefault Default values for all columns. Column specific settings overwrite the default values. |
| * @property {table~drawHorizontalLine} drawHorizontalLine |
| * @property {table~singleLine} singleLine Horizontal lines inside the table are not drawn. |
| */ |
| |
| /** |
| * Generates a text table. |
| * |
| * @param {table~row[]} data |
| * @param {table~config} userConfig |
| * @returns {string} |
| */ |
| export default (data, userConfig = {}) => { |
| let rows; |
| |
| validateTableData(data); |
| |
| rows = stringifyTableData(data); |
| |
| const config = makeConfig(rows, userConfig); |
| |
| rows = truncateTableData(data, config); |
| |
| const rowHeightIndex = calculateRowHeightIndex(rows, config); |
| |
| rows = mapDataUsingRowHeightIndex(rows, rowHeightIndex, config); |
| rows = alignTableData(rows, config); |
| rows = padTableData(rows, config); |
| |
| const cellWidthIndex = calculateCellWidthIndex(rows[0]); |
| |
| return drawTable(rows, config.border, cellWidthIndex, rowHeightIndex, config.drawHorizontalLine, config.singleLine); |
| }; |