renderTable function

String renderTable(
  1. List<List<String>> rows
)

Renders rows as an aligned ASCII table (first row = header).

Implementation

String renderTable(List<List<String>> rows) {
  if (rows.isEmpty) {
    return '';
  }
  final columnCount = rows.first.length;
  final widths = List<int>.filled(columnCount, 0);
  for (final row in rows) {
    for (var i = 0; i < columnCount; i++) {
      final cell = i < row.length ? row[i] : '';
      if (cell.length > widths[i]) {
        widths[i] = cell.length;
      }
    }
  }
  final buffer = StringBuffer();
  final separator = '+${widths.map((w) => '-' * (w + 2)).join('+')}+';
  buffer.writeln(separator);
  for (var r = 0; r < rows.length; r++) {
    final row = rows[r];
    final cells = <String>[
      for (var i = 0; i < columnCount; i++)
        ' ${(i < row.length ? row[i] : '').padRight(widths[i])} ',
    ];
    buffer.writeln('|${cells.join('|')}|');
    if (r == 0) {
      buffer.writeln(separator);
    }
  }
  buffer.writeln(separator);
  return buffer.toString();
}