Index: lib/src/table.dart |
diff --git a/lib/src/table.dart b/lib/src/table.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..85abcd3faf788c5c56092a09ba4c2f311d025409 |
--- /dev/null |
+++ b/lib/src/table.dart |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library dart2js_info.src.table; |
Siggi Cherem (dart-lang)
2015/10/02 17:16:17
I seem to have forgotten to include this in the fi
|
+ |
+import 'dart:math' show max; |
+ |
+/// Helper class to present data on the command-line in a table form. |
+class Table { |
+ int _totalColumns = 0; |
+ int get totalColumns => _totalColumns; |
+ |
+ /// Abbreviations, used to make headers shorter. |
+ Map<String, String> abbreviations = {}; |
+ |
+ /// Width of each column. |
+ List<int> widths = <int>[]; |
+ |
+ /// The header for each column (`header.length == totalColumns`). |
+ List header = []; |
+ |
+ /// The color for each column (`color.length == totalColumns`). |
+ List colors = []; |
+ |
+ /// Each row on the table. Note that all rows have the same size |
+ /// (`rows[*].length == totalColumns`). |
+ List<List> rows = []; |
+ |
+ /// Columns to skip, for example, if they are all zero entries. |
+ List<bool> _skipped = <bool>[]; |
+ |
+ /// Whether we started adding entries. Indicates that no more columns can be |
+ /// added. |
+ bool _sealed = false; |
+ |
+ /// Current row being built by [addEntry]. |
+ List _currentRow; |
+ |
+ /// Add a column with the given [name]. |
+ void declareColumn(String name, |
+ {bool abbreviate: false, String color: _NO_COLOR}) { |
+ assert(!_sealed); |
+ var headerName = name; |
+ if (abbreviate) { |
+ // abbreviate the header by using only the initials of each word |
+ headerName = |
+ name.split(' ').map((s) => s.substring(0, 1).toUpperCase()).join(''); |
+ while (abbreviations[headerName] != null) headerName = "$headerName'"; |
+ abbreviations[headerName] = name; |
+ } |
+ widths.add(max(5, headerName.length + 1)); |
+ header.add(headerName); |
+ colors.add(color); |
+ _skipped.add(_totalColumns > 0); |
+ _totalColumns++; |
+ } |
+ |
+ /// Add an entry in the table, creating a new row each time [totalColumns] |
+ /// entries are added. |
+ void addEntry(entry) { |
+ if (_currentRow == null) { |
+ _sealed = true; |
+ _currentRow = []; |
+ } |
+ int pos = _currentRow.length; |
+ assert(pos < _totalColumns); |
+ |
+ widths[pos] = max(widths[pos], '$entry'.length + 1); |
+ _currentRow.add('$entry'); |
+ if (entry is int && entry != 0) { |
+ _skipped[pos] = false; |
+ } |
+ |
+ if (pos + 1 == _totalColumns) { |
+ rows.add(_currentRow); |
+ _currentRow = []; |
+ } |
+ } |
+ |
+ /// Add an empty row to divide sections of the table. |
+ void addEmptyRow() { |
+ var emptyRow = []; |
+ for (int i = 0; i < _totalColumns; i++) { |
+ emptyRow.add('-' * widths[i]); |
+ } |
+ rows.add(emptyRow); |
+ } |
+ |
+ /// Enter the header titles. OK to do so more than once in long tables. |
+ void addHeader() { |
+ rows.add(header); |
+ } |
+ |
+ /// Generates a string representation of the table to print on a terminal. |
+ // TODO(sigmund): add also a .csv format |
+ String toString() { |
+ var sb = new StringBuffer(); |
+ sb.write('\n'); |
+ for (var row in rows) { |
+ var lastColor = _NO_COLOR; |
+ for (int i = 0; i < _totalColumns; i++) { |
+ if (_skipped[i]) continue; |
+ var entry = row[i]; |
+ var color = colors[i]; |
+ if (lastColor != color) { |
+ sb.write(color); |
+ lastColor = color; |
+ } |
+ // Align first column to the left, everything else to the right. |
+ sb.write( |
+ i == 0 ? entry.padRight(widths[i]) : entry.padLeft(widths[i] + 1)); |
+ } |
+ if (lastColor != _NO_COLOR) sb.write(_NO_COLOR); |
+ sb.write('\n'); |
+ } |
+ sb.write('\nWhere:\n'); |
+ for (var id in abbreviations.keys) { |
+ sb.write(' $id:'.padRight(7)); |
+ sb.write(' ${abbreviations[id]}\n'); |
+ } |
+ return sb.toString(); |
+ } |
+} |
+ |
+const _NO_COLOR = "\x1b[0m"; |