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