class Columnist::Row

Constants

VALID_OPTIONS

Attributes

border[RW]
columns[RW]

Public Class Methods

new(options = {}) click to toggle source
# File lib/columnist/row.rb, line 8
def initialize(options = {})
    self.validate_options(options, *VALID_OPTIONS)
    self.columns      = []
    self.border       = false
    self.header       = options[:header] || false
    self.color        = options[:color]
    self.border_color = options[:border_color]
    self.bold         = options[:bold] || false
    self.encoding     = options[:encoding] || :unicode
end

Public Instance Methods

add(column) click to toggle source
# File lib/columnist/row.rb, line 19
def add(column)
    if column.color.nil? && self.color
        column.color = self.color
    end

    if self.bold || self.header
        column.bold = true
    end

    self.columns << column
end
output() click to toggle source
# File lib/columnist/row.rb, line 31
def output
    screen_count.times do |sr|
        border_char = use_utf8? ? "\u2503" : '|'
        border_char = colorize(border_char, self.border_color)
        line        = (self.border) ? "#{border_char} " : ''
        self.columns.size.times do |mc|
            col = self.columns[mc]
            # Account for the fact that some columns will have more screen rows than their
            # counterparts in the row.  An example being:
            # c1 = Column.new('x' * 50, :width => 10)
            # c2 = Column.new('x' * 20, :width => 10)
            #
            # c1.screen_rows.size == 5
            # c2.screen_rows.size == 2
            #
            # So when we don't have a screen row for c2 we need to fill the screen with the
            # proper number of blanks so the layout looks like (parenthesis on the right just
            # indicate screen row index)
            #
            # +-------------+------------+
            # | xxxxxxxxxxx | xxxxxxxxxx | (0)
            # | xxxxxxxxxxx | xxxxxxxxxx | (1)
            # | xxxxxxxxxxx |            | (2)
            # | xxxxxxxxxxx |            | (3)
            # | xxxxxxxxxxx |            | (4)
            # +-------------+------------+
            if col.screen_rows[sr].nil?
                line << ' ' * col.width
            else
                line << self.columns[mc].screen_rows[sr]
            end
            line << ' ' + ((self.border) ? "#{border_char} " : '')
        end
        puts line
    end
end

Private Instance Methods

colorize(str, color) click to toggle source
# File lib/columnist/row.rb, line 78
def colorize(str, color)
    case color
        when 'red'
            return "\x1B[38;5;9m#{str}\x1B[38;5;256m"
        when 'green'
            return "\x1B[38;5;10m#{str}\x1B[38;5;256m"
        when 'yellow'
            return "\x1B[38;5;11m#{str}\x1B[38;5;256m"
        when 'blue'
            return "\x1B[38;5;33m#{str}\x1B[38;5;256m"
        when 'magenta'
            return "\x1B[38;5;13m#{str}\x1B[38;5;256m"
        when 'cyan'
            return "\x1B[38;5;14m#{str}\x1B[38;5;256m"
        when 'gray'
            return "\x1B[38;5;240m#{str}\x1B[38;5;256m"
        when 'white'
            return "\x1B[38;5;255m#{str}\x1B[38;5;256m"
        when 'black'
            return "\x1B[38;5;0m#{str}\x1B[38;5;256m"
    end
    if is_number?(color)
        str = "\x1B[38;5;#{color}m#{str}\x1B[38;5;256m"
    end
    str
end
is_number?(str) click to toggle source
# File lib/columnist/row.rb, line 105
def is_number?(str)
    true if Integer(str) rescue false
end
screen_count() click to toggle source
# File lib/columnist/row.rb, line 70
def screen_count
    @sc ||= self.columns.inject(0) { |max, column| column.screen_rows.size > max ? column.screen_rows.size : max }
end
use_utf8?() click to toggle source
# File lib/columnist/row.rb, line 74
def use_utf8?
    self.encoding == :unicode && "\u2501" != "u2501"
end