formatTable function

String formatTable({
  1. required List<String> headers,
  2. required List<List<String>> rows,
  3. List<TableAlignment>? alignments,
})

Format data as a markdown table.

Implementation

String formatTable({
  required List<String> headers,
  required List<List<String>> rows,
  List<TableAlignment>? alignments,
}) {
  // Calculate column widths
  final colCount = headers.length;
  final widths = List<int>.filled(colCount, 0);

  for (var i = 0; i < colCount; i++) {
    widths[i] = headers[i].length;
    for (final row in rows) {
      if (i < row.length) {
        widths[i] = max(widths[i], row[i].length);
      }
    }
    widths[i] = max(widths[i], 3); // Minimum 3 for separator
  }

  final buffer = StringBuffer();

  // Header row
  buffer.write('| ');
  for (var i = 0; i < colCount; i++) {
    buffer.write(headers[i].padRight(widths[i]));
    if (i < colCount - 1) buffer.write(' | ');
  }
  buffer.writeln(' |');

  // Separator row
  buffer.write('| ');
  for (var i = 0; i < colCount; i++) {
    final align = alignments != null && i < alignments.length
        ? alignments[i]
        : TableAlignment.left;
    switch (align) {
      case TableAlignment.left:
        buffer.write(':${'-' * (widths[i] - 1)}');
        break;
      case TableAlignment.center:
        buffer.write(':${'-' * (widths[i] - 2)}:');
        break;
      case TableAlignment.right:
        buffer.write('${'-' * (widths[i] - 1)}:');
        break;
    }
    if (i < colCount - 1) buffer.write(' | ');
  }
  buffer.writeln(' |');

  // Data rows
  for (final row in rows) {
    buffer.write('| ');
    for (var i = 0; i < colCount; i++) {
      final cell = i < row.length ? row[i] : '';
      buffer.write(cell.padRight(widths[i]));
      if (i < colCount - 1) buffer.write(' | ');
    }
    buffer.writeln(' |');
  }

  return buffer.toString();
}