216 lines
3.3 KiB
Ruby
216 lines
3.3 KiB
Ruby
module Rex
|
|
module Ui
|
|
module Text
|
|
|
|
###
|
|
#
|
|
# Table
|
|
# -----
|
|
#
|
|
# Prints text in a tablized format. Pretty lame at the moment, but
|
|
# whatever.
|
|
#
|
|
###
|
|
class Table
|
|
|
|
def initialize(opts = {})
|
|
self.header = opts['Header']
|
|
self.headeri = opts['HeaderIndent'] || 0
|
|
self.columns = opts['Columns'] || []
|
|
self.rows = opts['Rows'] || []
|
|
|
|
self.width = opts['Width'] || 80
|
|
self.indent = opts['Indent'] || 0
|
|
self.cellpad = opts['CellPad'] || 2
|
|
self.prefix = opts['Prefix'] || ''
|
|
self.postfix = opts['Postfix'] || ''
|
|
self.colprops = []
|
|
|
|
# Default column properties
|
|
self.columns.length.times { |idx|
|
|
self.colprops[idx] = {}
|
|
self.colprops[idx]['MaxWidth'] = self.columns[idx].length
|
|
}
|
|
|
|
# Merge in options
|
|
if (opts['ColProps'])
|
|
opts['ColProps'].each_key { |col|
|
|
idx = self.columns.index(col)
|
|
|
|
if (idx)
|
|
self.colprops[idx].merge!(opts['ColProps'][col])
|
|
end
|
|
}
|
|
end
|
|
|
|
end
|
|
|
|
#
|
|
# Converts table contents to a string
|
|
#
|
|
def to_s
|
|
str = prefix
|
|
str += header_to_s || ''
|
|
str += columns_to_s || ''
|
|
str += hr_to_s || ''
|
|
|
|
rows.each { |row|
|
|
if (is_hr(row))
|
|
str += hr_to_s
|
|
else
|
|
str += row_to_s(row)
|
|
end
|
|
}
|
|
|
|
str += postfix
|
|
|
|
return str
|
|
end
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Returns the header string
|
|
#
|
|
def header_to_s
|
|
if (header)
|
|
pad = " " * headeri
|
|
|
|
return pad + header + "\n" + pad + "=" * header.length + "\n\n"
|
|
end
|
|
|
|
return ''
|
|
end
|
|
|
|
#
|
|
# Prints the contents of the table
|
|
#
|
|
def print
|
|
puts to_s
|
|
end
|
|
|
|
#
|
|
# Adds a row using the supplied fields
|
|
#
|
|
def <<(fields)
|
|
add_row(fields)
|
|
end
|
|
|
|
#
|
|
# Adds a row with the supplied fields
|
|
#
|
|
def add_row(fields = [])
|
|
fields.each_with_index { |field, idx|
|
|
if (colprops[idx]['MaxWidth'] < field.to_s.length)
|
|
colprops[idx]['MaxWidth'] = field.to_s.length
|
|
end
|
|
}
|
|
|
|
rows << fields
|
|
end
|
|
|
|
#
|
|
# Adds a horizontal line
|
|
#
|
|
def add_hr
|
|
rows << '__hr__'
|
|
end
|
|
|
|
alias p print
|
|
|
|
attr_accessor :header, :headeri
|
|
attr_accessor :columns, :rows, :colprops
|
|
attr_accessor :width, :indent, :cellpad
|
|
attr_accessor :prefix, :postfix
|
|
|
|
protected
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Defaults cell widths and alignments
|
|
#
|
|
def defaults
|
|
self.columns.length.times { |idx|
|
|
}
|
|
end
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Checks to see if the row is an hr
|
|
#
|
|
def is_hr(row)
|
|
return ((row.kind_of?(String)) && (row == '__hr__'))
|
|
end
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Converts the columns to a string
|
|
#
|
|
def columns_to_s
|
|
nameline = ' ' * indent
|
|
barline = nameline
|
|
|
|
columns.each_with_index { |col,idx|
|
|
nameline += col + pad(' ', col, idx)
|
|
remainder = colprops[idx]['MaxWidth'] - col.length
|
|
|
|
if (remainder < 0)
|
|
remainder = 0
|
|
end
|
|
|
|
barline += ('-' * col.length) + (' ' * (cellpad + remainder))
|
|
}
|
|
|
|
return "#{nameline}\n#{barline}"
|
|
end
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Converts an hr to a string
|
|
#
|
|
def hr_to_s
|
|
return "\n"
|
|
end
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Converts a row to a string
|
|
#
|
|
def row_to_s(row)
|
|
line = ' ' * indent
|
|
|
|
row.each_with_index { |cell, idx|
|
|
line += cell.to_s + pad(' ', cell.to_s, idx)
|
|
}
|
|
|
|
return line + "\n"
|
|
end
|
|
|
|
#
|
|
# :nodoc:
|
|
#
|
|
# Pads out with the supplied character for the remainder of the space given
|
|
# some text and a column index.
|
|
#
|
|
def pad(chr, buf, colidx, use_cell_pad = true)
|
|
remainder = colprops[colidx]['MaxWidth'] - buf.length
|
|
val = chr * remainder;
|
|
|
|
if (use_cell_pad)
|
|
val += ' ' * cellpad
|
|
end
|
|
|
|
return val
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|