# It prints centered table in console, does not count color changing sequences as characters. class Array def to_table(header: true) column_sizes = self.reduce([]) do |lengths, row| row.each_with_index.map{|iterand, index| [lengths[index] || 0, iterand.to_s.gsub(/\e[^m]*m/,'').length].max} end head = '+' + column_sizes.map{|column_size| '-' * (column_size + 2) }.join('+') + '+' puts head to_print = self.clone if (header == true) header = to_print.shift print_table_data_row(column_sizes, header) puts head end to_print.each{ |row| print_table_data_row(column_sizes, row) } puts head end private def print_table_data_row(column_sizes, row) row = row.fill(nil, row.size..(column_sizes.size - 1)) row = row.each_with_index.map{|v, i| v = v.to_s + ' ' * (column_sizes[i] - v.to_s.gsub(/\e[^m]*m/,'').length)} puts '| ' + row.join(' | ') + ' |' end end C_NC="\e[0m" # No Color C_BLACK="\e[0;30m";C_GRAY="\e[1;30m";C_RED="\e[0;31m";C_LIGHT_RED="\e[1;31m";C_GREEN="\e[0;32m";C_LIGHT_GREEN="\e[1;32m";C_BROWN="\e[0;33m";C_YELLOW="\e[1;33m";C_BLUE="\e[0;34m";C_LIGHT_BLUE="\e[1;34m";C_PURPLE="\e[0;35m";C_LIGHT_PURPLE="\e[1;35m";C_CYAN="\e[0;36m";C_LIGHT_CYAN="\e[1;36m";C_LIGHT_GRAY="\e[0;37m";C_WHITE="\e[1;37m"