render method

String render({
  1. bool plainText = false,
})

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();
  }
}