UNPKG

proglib

Version:

Многофункциональная библиотека

290 lines (232 loc) 10.1 kB
'use struct'; let events = require('events'); const StringBuilder = require('../text/stringBuilder'); const DataColumnCollection = require('./dataColumnCollection'); const DataColumn = require('./dataColumn'); const DataRowCollection = require('./dataRowCollection'); const DataRow = require('./dataRow'); function ColumnLength(Table) { let lengths = []; for (let j = 0; j < Table.Columns.Count; j++) { temp = [ Table.Columns.Data[j].length ]; for (let i = 0; i < Table.Rows.Count; i++) { let value = Table.Rows.Data[i][j]; temp.push((value) ? value.length : 0); } lengths.push(Math.max(...temp)); } return lengths; } function toDefault(Table) { let builder = new StringBuilder(); let columnLengths = ColumnLength(Table); let del = "-"; for (let i = 0; i < columnLengths.length; i++) del += "-".repeat(columnLengths[i] + 2) + "-"; builder.AppendLine(del); for (let i = 0; i < columnLengths.length; i++) { builder.AppendFormat(`| {0,-${columnLengths[i]}} `, Table.Columns.Data[i]); } builder.AppendLine("|"); builder.AppendLine(del); for (let i = 0; i < Table.Rows.Count; i++) { for (let j = 0; j < Table.Columns.Data.length; j++) { let value = Table.Rows.Data[i][j]; builder.AppendFormat(`| {0,-${columnLengths[j]}} `, (value || value != null) ? value : ""); } builder.AppendLine("|"); builder.AppendLine(del); } return builder.toString(); } function toAlternative(Table) { let builder = new StringBuilder(); let columnLengths = ColumnLength(Table); let del = "+"; for (let i = 0; i < columnLengths.length; i++) del += "-".repeat(columnLengths[i] + 2) + "+"; builder.AppendLine(del); for (let i = 0; i < columnLengths.length; i++) { builder.AppendFormat(`| {0,-${columnLengths[i]}} `, Table.Columns.Data[i]); } builder.AppendLine("|"); builder.AppendLine(del); for (let i = 0; i < Table.Rows.Count; i++) { for (let j = 0; j < Table.Columns.Data.length; j++) { let value = Table.Rows.Data[i][j]; builder.AppendFormat(`| {0,-${columnLengths[j]}} `, (value || value != null) ? value : ""); } builder.AppendLine("|"); builder.AppendLine(del); } return builder.toString(); } function toMarkDown(Table) { let builder = new StringBuilder(); let columnLengths = ColumnLength(Table); let del = "|"; for (let i = 0; i < columnLengths.length; i++) del += "-".repeat(columnLengths[i] + 2) + "|"; for (let i = 0; i < columnLengths.length; i++) { builder.AppendFormat(`| {0,-${columnLengths[i]}} `, Table.Columns.Data[i]); } builder.AppendLine("|"); builder.AppendLine(del); for (let i = 0; i < Table.Rows.Count; i++) { for (let j = 0; j < Table.Columns.Data.length; j++) { let value = Table.Rows.Data[i][j]; builder.AppendFormat(`| {0,-${columnLengths[j]}} `, (value || value != null) ? value : ""); } builder.AppendLine("|"); } return builder.toString(); } function toMinimal(Table) { let builder = new StringBuilder(); let columnLengths = ColumnLength(Table); let sum = 0; for (let i = 0; i < columnLengths.length; i++) sum += columnLengths[i]; let del = ("-".repeat(sum) + "--".repeat(columnLengths.length)).replace("--", ""); for (let i = 0; i < columnLengths.length; i++) { if (i != 0) builder.Append(" "); builder.AppendFormat(`{0,-${columnLengths[i]}}`, Table.Columns.Data[i]); } builder.AppendLine(); builder.AppendLine(del); for (let i = 0; i < Table.Rows.Count; i++) { for (let j = 0; j < Table.Columns.Data.length; j++) { if (j != 0) builder.Append(" "); let value = Table.Rows.Data[i][j]; builder.AppendFormat(`{0,-${columnLengths[j]}}`, (value || value != null) ? value : ""); } builder.AppendLine(); } return builder.toString(); } /** * Представляет таблицу с данными. */ class DataTable { /** * Инициализирует новый экземпляр класса `DataTable` с указанным именем таблицы. * @param {String} Name */ constructor(Name) { this.name = Name; this.columnCollection = new DataColumnCollection(); this.rowCollection = new DataRowCollection(); this.caseSensitive = true; this.Event = new events.EventEmitter(); this.rowCollection.on('NewRow', (e) => { if (e.Row.Data.length > this.columnCollection.Data.length) throw new Error("Длина входного массива больше числа столбцов в этой таблице."); this.Event.emit('tablenewrow', { Row: e.Row, Index: e.Index }); }); this.rowCollection.on('RowDeleting', (e) => { this.Event.emit('tablerowdeleting', { Row: e.Row, Index: e.Index }); }); this.rowCollection.on('RowDeleted', () => { this.Event.emit('tablerowdeleted'); }); this.rowCollection.on('RowCollectionClearing', (e) => { this.Event.emit('tableclearing', { Rows: e.Rows }); }); this.rowCollection.on('RowCollectionCleared', () => { this.Event.emit('tablecleared'); }); this.columnCollection.on('NewColumns', (e) => { this.Event.emit('tablenewcolumns', { Columns: e.Columns, Index: e.Index }); }); this.columnCollection.on('ColumnDeleting', (e) => { this.rowCollection.RemoveColumn(e.Index); this.Event.emit('tablecolumndeleting', { Columns: e.Columns, Index: e.Index }); }); this.columnCollection.on('ColumnDeleted', () => { this.Event.emit('tablecolumndeleted'); }); this.columnCollection.on('ColumnCollectionClearing', (e) => { this.rowCollection.Clear(); this.Event.emit('tablecolumncollectionclearing', { Columns: e.Columns }); }); } /** * Возвращает или задает имя `DataTable`. */ get Name() { return this.name; } set Name(Value) { this.name = Value; } /** * Получает коллекцию столбцов, принадлежащих данной таблице. */ get Columns() { return this.columnCollection; } /** * Получает коллекцию строк, принадлежащих данной таблице. */ get Rows() { return this.rowCollection; } /** * Показывает, учитывается ли регистр при сравнении строк в таблице. */ get CaseSensitive() { return this.caseSensitive; } set CaseSensitive(Value) { this.caseSensitive = Value; } /** * Очищает `DataTable` от всех данных. */ Clear() { this.rowCollection.Clear(); } /** * * @param {String} Event Имя события * `TableNewRow` - Происходит, когда вставляется новая строка `DataRow`. * `RowDeleting` - Происходит перед удалением строки таблицы. * `RowDeleted` - Происходит после удаления строки таблицы. * `TableClearing` - Происходит, когда очищается таблица `DataTable`. * `TableCleared` - Происходит после очистки `DataTable`. * `TableNewColumns` - Происходит, когда вставляется новый столбец `DataColumn`. * `TableColumnDeleting` - Происходит перед удалением столбца. * `TableColumnDeleted` - Происходит после удаления столбца * `TableColumnCollectionClearing` - Происходит когда очищается список столбцов. * @param {Function} Handler Обработчик события. */ on(Event, Handler) { this.Event.on(Event.toLowerCase(), Handler); } /** * Преобразует данные таблицы в строчное представление. * @param {String} Format Формат отображения таблицы (`Default`, `MarkDown`, `Alternative`, `Minimal`). */ toString(Format = 'Default') { Format = (isNaN(Format)) ? Format.toLowerCase() : Format; if (this.Columns.Count != 0) { switch (Format) { case 'name': return this.Name; case 'default': case 1: return toDefault(this); case 'markdown': case 2: return toMarkDown(this); case 'alternative': case 3: return toAlternative(this); case 'minimal': case 4: return toMinimal(this); default: return this.toString('default'); } } else { return this.Name; } } /** * Возвращает тип для текущего экземпляра. */ GetType() { return 'dataTable'; } } module.exports = DataTable;