Критическая масса — в диалектической логике минимальное количество мыслей, необходимых для начала самоизливающейся цепной реакции деления с общественностью.
Генерация текстовых таблиц для моноширинных шрифтов
Для текущей задачи понадобилось (для отладки) выводить в текстовое поле массив элементов с разным свойствами.
Удобно было все это показывать в виде таблицы. И на скорую руку накидал простой класс, который эту таблицу создает, с возможностью подсветки строк или заголовка для htmlText (если цвет не задавать, то html теги добавляться не будут), автоопределением ширины столбцов и выравниванием данных столбца по левой или правой стороне.
Пример использования
import ru.inils.utils.textTable.TextTable; var tt:TextTable = new TextTable (['ID', 'Number', 'Name', 'Year'], 0xFFC0CB); /// Добавляем выравнивание по правому края для второй колонки. tt.alignRight = [ , true]; /// Добавляем 4 строки и разделитель. tt.addRow ([1, 100, 'Tom', 1966]); tt.addRow ([2, 2, 'Anna', 1985]); tt.addSeparator (); tt.addRow ([3, 55, 'Serg', 2001]); tt.addRow ([4, 4701, 'Nika', 1991]); /// Результат trace (tt.table);
Код:
<font color="#ffc0cb">+----+--------+------+------+ | ID | Number | Name | Year | +----+--------+------+------+</font> | 1 | 100 | Tom | 1966 | | 2 | 2 | Anna | 1985 | +----+--------+------+------+ | 3 | 55 | Serg | 2001 | | 4 | 4701 | Nika | 1991 | +----+--------+------+------+
Код:
+----+--------+------+------+ | ID | Number | Name | Year | +----+--------+------+------+ | 1 | 100 | Tom | 1966 | | 2 | 2 | Anna | 1985 | +----+--------+------+------+ | 3 | 55 | Serg | 2001 | | 4 | 4701 | Nika | 1991 | +----+--------+------+------+
/// Отчищаем таблицу от данных. tt.clear (); /// Заполняем новыми данными tt.addRow ([5, 46, 'Paul', 1981]); tt.addRow ([6, 4, 'Victoria', 1975], 0x00BFFF); tt.addSeparator (0xFFA500); tt.addRow ([7, , 'Arnold', 1989]); tt.addRow ([8, 956, false, 1998, 'out']); /// Результат trace (tt.table);
Код:
<font color="#ffc0cb">+----+--------+----------+------+ | ID | Number | Name | Year | +----+--------+----------+------+</font> | 5 | 46 | Paul | 1981 | <font color="#bfff">| 6 | 4 | Victoria | 1975 |</font> <font color="#ffa500">+----+--------+----------+------+</font> | 7 | null | Arnold | 1989 | | 8 | 956 | false | 1998 > +----+--------+----------+------+
Код:
+----+--------+----------+------+ | ID | Number | Name | Year | +----+--------+----------+------+ | 5 | 46 | Paul | 1981 | | 6 | 4 | Victoria | 1975 | +----+--------+----------+------+ | 7 | null | Arnold | 1989 | | 8 | 956 | false | 1998 > +----+--------+----------+------+
Используя tableText можно получить строку без html тегов. Также можно получить массив строк таблицы, также без html тегов, для других манипуляций.
Сам класс
package ru.inils.utils.textTable { /** * @author iNils * @version 1.0 * * Класс строит текстовую таблицу данных. * * @example <code> * /// Создае новую таблицу * var tt:TextTable = new TextTable (['ID', 'Number', 'Name', 'Year']); * /// Добавляем выравнивание по правому края для второй колонки. * tt.alignRight = [ , true]; * /// Добавляем 4 строку и разделитель. * tt.addRow ([1, 100, 'Tom', 1966]); * tt.addRow ([2, 2, 'Anna', 1985]); * tt.addSeparator (); * tt.addRow ([3, 55, 'Serg', 2001]); * tt.addRow ([4, 4701, 'Nika', 1991]); * /// Результат * trace (tt.table); * +----+--------+------+------+ * | ID | Number | Name | Year | * +----+--------+------+------+ * | 1 | 100 | Tom | 1966 | * | 2 | 2 | Anna | 1985 | * +----+--------+------+------+ * | 3 | 55 | Serg | 2001 | * | 4 | 4701 | Nika | 1991 | * +----+--------+------+------+ * * /// Отчищаем таблицу от данных. * tt.clear (); * /// Заполняем новыми данными * tt.addRow ([5, 46, 'Paul', 1981]); * tt.addRow ([6, 4, 'Victoria', 1975]); * tt.addSeparator (); * tt.addRow ([7, , 'Arnold', 1989]); * tt.addRow ([8, 956, 'Lena', 1998, 55]); * /// Результат * trace (tt.table); * +----+--------+----------+------+ * | ID | Number | Name | Year | * +----+--------+----------+------+ * | 5 | 46 | Paul | 1981 | * | 6 | 4 | Victoria | 1975 | * +----+--------+----------+------+ * | 7 | null | Arnold | 1989 | * | 8 | 956 | Lena | 1998 > * +----+--------+----------+------+ * </code> * * Изменения: * 1.0 (24.01.2011 22:32) * [+] ... */ public class TextTable { /* - VAR PRIVATE *///{ / private var _alignRight:Array = []; private var _head:Array = []; private var _color/*int*/:Array = []; private var _row:Array = []; private var _size:Array = []; //} /* * CONSTRUCTOR * *///{ / /** * Создает новую текстовую таблицу. * @param head - Массив названий столбцов таблицы. * @param color - Цвет заголовка таблицы (для вывода в htmlText поле). */ public function TextTable (head:Array, color:int = -1) { _head = head; addRow (_head, color); } //} /* + METHOD PUBLIC *///{ / /** * Добавляет строку данных в таблицу. Если число элементов в строке больше числа столбцов, то строка заканчивается символом '>', а не '|'. * @param row - Строка таблицы. * @param color - Цвет строки таблицы (для вывода в htmlText поле). */ public function addRow (row:Array, color:int = -1):void { _row.push (row); _color.push (Math.max (-1, Math.min (color, 0xFFFFFF))); checkSize (); } /** * Добавляет разделитель между строками. * @param color - Цвет разделителя (для вывода в htmlText поле). */ public function addSeparator (color:int = -1):void { _row.push (null); _color.push (Math.max (-1, Math.min (color, 0xFFFFFF))); checkSize (); } /** * Отчищает таблицу от данных, оставляя заголовок таблицы и выравнивание данных. */ public function clear ():void { _row.length = 1; _color.length = 1; _size.length = 0; //addRow (_head, ); checkSize (); } //} /* - METHOD PRIVATE *///{ / /** * Строит текстовую таблицу. * @return Текстовую таблицу в виде массива строк. */ private function buildTable (htmlMode:Boolean = true):Array { var array:Array = []; /// шаблоны строк var line:String = '+'; for (var i:int = 0; i < _head.length; i++) { line += fillChars ('', _size[i], true, '-') + '+'; } /// заполняем данными var row:String = '' var j:int; for (i = 0; i < _row.length; i++) { var isColor:Boolean = _color[i] != -1 && htmlMode; var color:String = '<font color="#' + fillChars (_color[i].toString (16), 6, false, '0') + '">'; /// заголовок if (i == 0) { if (isColor) { row += color; } row += line + '\r' + '|' for (j = 0; j < _head.length; j++) { row += ' ' + fillChars (_row[i][j], _size[j] - 2) + ' |'; } row += '\r' + line; if (isColor) { row += '</font>' } row += '\r'; array.push (row); } else { row = ''; /// строки if (_row[i]) { if (isColor) { row += color; } row += '|' for (j = 0; j < _head.length; j++) { if (j != 0) { row += '|'; } row += ' ' + fillChars (_row[i][j], _size[j] - 2, !_alignRight[j]) + ' '; } if (_head.length < _row[i].length) { row += '>'; } else { row += '|'; } if (isColor) { row += '</font>' } array.push (row + '\r'); } else { if (isColor) { row += color; } row += line; if (isColor) { row += '</font>' } array.push (row + '\r'); } } } array.push (line + '\r'); return array; } /** * Вычисляет наибольшую ширину столбца. */ private function checkSize ():void { var array:Array = _row[_row.length - 1]; if (!array) { return; } for (var i:int = 0; i < _head.length; i++) { var len:int = String (array[i] || '').length; if (len > 0) { len += 2; } _size[i] = Math.max (_size[i] || 0, len); } } /** * Заполняет строку до заданной длины символом слева или справа. * @param data - Искходная строка. * @param len - Длина до которой нужно довести строку. * @param fillRight - Место заполнения символами, справа от строки (true) или слева (false). * @param char - Символ заполнения. * @return */ private function fillChars (data:Object, len:int, fillRight:Boolean = true, char:String = ' '):String { var str:String = String (data); len -= str.length; var out:String = ''; if (fillRight) { out += str; } for (var i:int = 0; i < len; i++) { out += char; } if (!fillRight) { out += str; } return out; } //} /* GETTER / SETTER *///{ / /// Массив выравнивания данных по правой (true) или левой стороне (false). public function get alignRight ():Array { return _alignRight; } public function set alignRight (value:Array):void { if (value == _alignRight) { return; } _alignRight = value; } /// Текстовая таблица в виде строки. public function get table ():String { return buildTable ().join (''); } /// Текстовая таблица в виде массива строк без тегов html. public function get tableArray ():Array { return buildTable (false); } /// Текстовая таблица в виде строки без тегов html. public function get tableText ():String { return buildTable (false).join (''); } //} } }
Всего комментариев 8
Комментарии
25.01.2011 05:50 | |
Прикольно.
В порядке бреда можно было бы добавить в класс что-нибудь вроде этого, могло бы быть полезно: Хотя тут может быть много всяких вариаций... |
25.01.2011 12:07 | |
Клёво, утащу себе =)
|
|
Обновил(-а) iNils 25.01.2011 в 21:13
|
27.01.2011 01:37 | |
Цитата:
Символы псевдографики ( │┤╡╢╖╕╕║╗╝и прочие) - не использованы намеренно?
|
|
Обновил(-а) iNils 27.09.2011 в 05:40
|
27.01.2011 08:30 | |
Чего такие старики-то?
Цитата:
* tt.addRow ([1, 100, 'Tom', 1966]);
* tt.addRow ([2, 2, 'Anna', 1985]); |
27.01.2011 12:03 | |
От балды
|
30.01.2011 13:46 | |
круть!
|
23.04.2012 15:23 | |
Супер! Давно искал!
|
Последние записи от iNils
- Плагин HighlightSelection для FD4 (25.02.2013)
- Условная компиляция: отрицательное условие (07.02.2012)
- Генерация текстовых таблиц для моноширинных шрифтов (25.01.2011)
- Плагин Fold (версия 0.3) для FlashDevelop 3 (26.10.2010)
- Плагин Fold для FlashDevelop 3 (версия 0.2) (27.01.2010)