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.
96 lines
3.1 KiB
96 lines
3.1 KiB
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); |
|
};
|
|
|