Skip to content

Commit

Permalink
feat: add drawVerticalLine (#145)
Browse files Browse the repository at this point in the history
* Add drawVerticalLine

* Refactor

* Add more test

* Fix JsDoc

* Add tests for drawBorder funcs

Co-authored-by: Nam Hoang Le <nam.hoang.le@mgm-tp.com>
  • Loading branch information
nam-hle and Nam Hoang Le committed Apr 14, 2021
1 parent 6dd91e3 commit 7c047ed
Show file tree
Hide file tree
Showing 17 changed files with 514 additions and 164 deletions.
1 change: 1 addition & 0 deletions .README/README.md
Expand Up @@ -27,6 +27,7 @@ Produces a string that represents array data in a text table.
{"gitdown": "include", "file": "./usage/cell_content_alignment.md"}
{"gitdown": "include", "file": "./usage/column_width.md"}
{"gitdown": "include", "file": "./usage/custom_border.md"}
{"gitdown": "include", "file": "./usage/draw_vertical_line.md"}
{"gitdown": "include", "file": "./usage/draw_horizontal_line.md"}
{"gitdown": "include", "file": "./usage/single_line_mode.md"}
{"gitdown": "include", "file": "./usage/padding_cell_content.md"}
Expand Down
52 changes: 52 additions & 0 deletions README.md
Expand Up @@ -14,6 +14,7 @@
* [Cell Content Alignment](#table-usage-cell-content-alignment)
* [Column Width](#table-usage-column-width)
* [Custom Border](#table-usage-custom-border)
* [Draw Vertical Line](#table-usage-draw-vertical-line)
* [Draw Horizontal Line](#table-usage-draw-horizontal-line)
* [Single Line Mode](#table-usage-single-line-mode)
* [Padding Cell Content](#table-usage-padding-cell-content)
Expand Down Expand Up @@ -292,6 +293,57 @@ console.log(output);
└────┴────┴────┘
```

<a name="table-usage-draw-vertical-line"></a>
### Draw Vertical Line

`{function} config.drawVerticalLine` property is a function that is called for every non-content column in the table. The result of the function `{boolean}` determines whether a border is drawn.

```js
let data,
output,
options;

data = [
['0A', '0B', '0C'],
['1A', '1B', '1C'],
['2A', '2B', '2C'],
['3A', '3B', '3C'],
['4A', '4B', '4C']
];

options = {
/**
* @typedef {function} drawVerticalLine
* @param {number} index
* @param {number} size
* @return {boolean}
*/
drawVerticalLine: (index, size) => {
return index === 0 || index === size;
}
};

output = table(data, options);

console.log(output);

```

```
╔════════════╗
║ 0A 0B 0C ║
╟────────────╢
║ 1A 1B 1C ║
╟────────────╢
║ 2A 2B 2C ║
╟────────────╢
║ 3A 3B 3C ║
╟────────────╢
║ 4A 4B 4C ║
╚════════════╝
```

<a name="table-usage-draw-horizontal-line"></a>
### Draw Horizontal Line

Expand Down
18 changes: 9 additions & 9 deletions src/createStream.js
Expand Up @@ -14,7 +14,7 @@ import truncateTableData from './truncateTableData';

/**
* @param {Array} data
* @param {object} config
* @param {streamConfig} config
* @returns {Array}
*/
const prepareData = (data, config) => {
Expand All @@ -36,23 +36,23 @@ const prepareData = (data, config) => {
/**
* @param {string[]} row
* @param {number[]} columnWidthIndex
* @param {object} config
* @param {streamConfig} config
* @returns {undefined}
*/
const create = (row, columnWidthIndex, config) => {
const rows = prepareData([row], config);

const body = rows.map((literalRow) => {
return drawRow(literalRow, config.border);
return drawRow(literalRow, config);
}).join('');

let output;

output = '';

output += drawBorderTop(columnWidthIndex, config.border);
output += drawBorderTop(columnWidthIndex, config);
output += body;
output += drawBorderBottom(columnWidthIndex, config.border);
output += drawBorderBottom(columnWidthIndex, config);

output = output.trimEnd();

Expand All @@ -62,24 +62,24 @@ const create = (row, columnWidthIndex, config) => {
/**
* @param {string[]} row
* @param {number[]} columnWidthIndex
* @param {object} config
* @param {streamConfig} config
* @returns {undefined}
*/
const append = (row, columnWidthIndex, config) => {
const rows = prepareData([row], config);

const body = rows.map((literalRow) => {
return drawRow(literalRow, config.border);
return drawRow(literalRow, config);
}).join('');

let output = '';
const bottom = drawBorderBottom(columnWidthIndex, config.border);
const bottom = drawBorderBottom(columnWidthIndex, config);

if (bottom !== '\n') {
output = '\r\u001B[K';
}

output += drawBorderJoin(columnWidthIndex, config.border);
output += drawBorderJoin(columnWidthIndex, config);
output += body;
output += bottom;

Expand Down
98 changes: 43 additions & 55 deletions src/drawBorder.js
@@ -1,5 +1,7 @@
import drawHorizontalContent from './drawHorizontalContent';

/**
* @typedef drawBorder~parts
* @typedef drawBorder~border
* @property {string} left
* @property {string} right
* @property {string} body
Expand All @@ -8,88 +10,74 @@

/**
* @param {number[]} columnSizeIndex
* @param {drawBorder~parts} parts
* @param {object} config
* @param {drawBorder~border} config.border
* @param {Function} config.drawVerticalLine
* @returns {string}
*/
const drawBorder = (columnSizeIndex, parts) => {
const columns = columnSizeIndex
.map((size) => {
return parts.body.repeat(size);
})
.join(parts.join);
const drawBorder = (columnSizeIndex, {border, drawVerticalLine}) => {
const columns = columnSizeIndex.map((size) => {
return border.body.repeat(size);
});

return parts.left + columns + parts.right + '\n';
return drawHorizontalContent(columns, {
drawVerticalLine,
separator: border,
});
};

/**
* @typedef drawBorderTop~parts
* @property {string} topLeft
* @property {string} topRight
* @property {string} topBody
* @property {string} topJoin
*/

/**
* @param {number[]} columnSizeIndex
* @param {drawBorderTop~parts} parts
* @param {table~config} config
* @returns {string}
*/
const drawBorderTop = (columnSizeIndex, parts) => {
const border = drawBorder(columnSizeIndex, {
body: parts.topBody,
join: parts.topJoin,
left: parts.topLeft,
right: parts.topRight,
});
const drawBorderTop = (columnSizeIndex, {border, drawVerticalLine}) => {
const result = drawBorder(columnSizeIndex, {border: {
body: border.topBody,
join: border.topJoin,
left: border.topLeft,
right: border.topRight,
},
drawVerticalLine});

if (border === '\n') {
if (result === '\n') {
return '';
}

return border;
return result;
};

/**
* @typedef drawBorderJoin~parts
* @property {string} joinLeft
* @property {string} joinRight
* @property {string} joinBody
* @property {string} joinJoin
*/

/**
* @param {number[]} columnSizeIndex
* @param {drawBorderJoin~parts} parts
* @param {table~config} config
* @returns {string}
*/
const drawBorderJoin = (columnSizeIndex, parts) => {
const drawBorderJoin = (columnSizeIndex, {border, drawVerticalLine}) => {
return drawBorder(columnSizeIndex, {
body: parts.joinBody,
join: parts.joinJoin,
left: parts.joinLeft,
right: parts.joinRight,
border: {
body: border.joinBody,
join: border.joinJoin,
left: border.joinLeft,
right: border.joinRight,
},
drawVerticalLine,
});
};

/**
* @typedef drawBorderBottom~parts
* @property {string} topLeft
* @property {string} topRight
* @property {string} topBody
* @property {string} topJoin
*/

/**
* @param {number[]} columnSizeIndex
* @param {drawBorderBottom~parts} parts
* @param {table~config} config
* @returns {string}
*/
const drawBorderBottom = (columnSizeIndex, parts) => {
const drawBorderBottom = (columnSizeIndex, {border, drawVerticalLine}) => {
return drawBorder(columnSizeIndex, {
body: parts.bottomBody,
join: parts.bottomJoin,
left: parts.bottomLeft,
right: parts.bottomRight,
border: {
body: border.bottomBody,
join: border.bottomJoin,
left: border.bottomLeft,
right: border.bottomRight,
},
drawVerticalLine,
});
};

Expand Down
31 changes: 31 additions & 0 deletions src/drawHorizontalContent.js
@@ -0,0 +1,31 @@
/**
* @typedef {object} drawHorizontalContent~separator
* @property {string} left
* @property {string} right
* @property {string} join
*/

/**
* @param {string[]} columns
* @param {object} config
* @param {drawHorizontalContent~separator} config.separator
* @param {Function} config.drawVerticalLine
* @returns {string}
*/
export default (columns, {separator, drawVerticalLine}) => {
const columnCount = columns.length;
const result = [];

result.push(drawVerticalLine(0, columnCount) ? separator.left : '');

columns.forEach((column, index) => {
result.push(column);

if (index + 1 < columnCount) {
result.push(drawVerticalLine(index + 1, columnCount) ? separator.join : '');
}
});
result.push(drawVerticalLine(columnCount, columnCount) ? separator.right : '');

return result.join('') + '\n';
};
20 changes: 17 additions & 3 deletions src/drawRow.js
@@ -1,3 +1,5 @@
import drawHorizontalContent from './drawHorizontalContent';

/**
* @typedef {object} drawRow~border
* @property {string} bodyLeft
Expand All @@ -7,9 +9,21 @@

/**
* @param {string[]} columns
* @param {drawRow~border} border
* @param {object} config
* @param {border} config.border
* @param {Function} config.drawVerticalLine
* @returns {string}
*/
export default (columns, border) => {
return border.bodyLeft + columns.join(border.bodyJoin) + border.bodyRight + '\n';
export default (columns, {
border,
drawVerticalLine,
}) => {
return drawHorizontalContent(columns, {
drawVerticalLine,
separator: {
join: border.bodyJoin,
left: border.bodyLeft,
right: border.bodyRight,
},
});
};

0 comments on commit 7c047ed

Please sign in to comment.