render method
Renders the table as a string, for printing or further manipulation.
Implementation
String render({bool plainText = false}) {
if (_table[0].isEmpty) return '';
final buffer = StringBuffer();
final tableWidth = _calculateTableWidth();
final columnWidths = _calculateColumnWidths();
// Title
if (title != '') {
buffer.writeln([
_setFontStyle(titleStyle),
title.alignText(width: tableWidth, alignment: TextAlignment.center),
_resetFontStyle(),
].join());
}
// Top line of table bounding box
buffer.write(_tablePrologue(tableWidth, columnWidths));
// Print table rows
final startRow = showHeader ? 0 : 1;
for (int row = startRow; row < _table.length; row++) {
final wrappedRow = <String>[];
for (int column = 0; column < columns; column++) {
// Wrap the text if there's a viable width
if (column < _columnWidths.length && _columnWidths[column] > 0) {
wrappedRow.add(
_table[row][column].toString().wrapText(_columnWidths[column]));
} else {
wrappedRow.add(_table[row][column].toString());
}
}
// Count number of lines in each row
final rowHeight = _calculateRowHeight(wrappedRow);
for (int line = 0; line < rowHeight; line++) {
buffer.write(_rowStart());
for (int column = 0; column < columns; column++) {
final lines = wrappedRow[column].toString().split('\n');
final cell = line < lines.length ? lines[line] : '';
final columnAlignment = column < _columnAlignments.length
? _columnAlignments[column]
: TextAlignment.left;
// TODO: Only the text of a header should be underlined
// Write text, with header formatting if appropriate
if (row == 0 && headerStyle != FontStyle.normal) {
buffer.write(_setFontStyle(headerStyle));
}
if (row == 0 && headerColor != null) {
buffer.write(headerColor!.ansiSetForegroundColorSequence);
}
buffer.write(cell.alignText(
width: columnWidths[column], alignment: columnAlignment));
if (row == 0 &&
(headerStyle != FontStyle.normal || headerColor != null)) {
buffer.write(_resetFontStyle());
}
if (column < columns - 1) {
buffer.write(_rowDelimiter());
}
}
buffer.write(_rowEnd());
}
// Print a rule line underneath the header only
if (row == 0) {
buffer.write(_tableRule(tableWidth, columnWidths));
}
// Print a rule line after all internal rows for grid type
else if (borderType == BorderType.grid && row != _table.length - 1) {
buffer.write(_tableRule(tableWidth, columnWidths));
}
}
buffer.write(_tableEpilogue(tableWidth, columnWidths));
if (plainText) {
return buffer.toString().stripEscapeCharacters();
} else {
return buffer.toString();
}
}