97 lines
3.1 KiB
Plaintext
97 lines
3.1 KiB
Plaintext
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);
|
|
};
|