Sha256: f29129420612abddebd2aed9b197c9c0608e6b9ff2b0310b6a732fe85701df94

Contents?: true

Size: 1.11 KB

Versions: 3

Compression:

Stored size: 1.11 KB

Contents

class Cl
  class Help
    class Table
      include Wrap

      attr_reader :data, :padding

      def initialize(data)
        @data = data
      end

      def any?
        data.any?
      end

      def format(padding = 8)
        @padding = padding
        rows.join("\n")
      end
      alias to_s format

      def rows
        data.map { |row| cells(row).join(' ').rstrip }
      end

      def cells(row)
        row.map.with_index do |cell, ix|
          indent(wrap(cell.to_s), widths[ix - 1]).ljust(widths[ix])
        end
      end

      def indent(str, width)
        return str if str.empty? || !width
        [str.lines[0], *str.lines[1..-1].map { |str| ' ' * (width + 1) + str }].join.rstrip
      end

      def width
        widths = cols[0..-2].map { |col| col.max_by(&:size).size }.inject(&:+).to_i
        widths + cols.size - 1
      end

      def widths
        cols.map.with_index do |col, ix|
          width = col.compact.max_by(&:size)&.size
          ix < cols.size - 2 ? width.to_i : width.to_i + padding.to_i
        end
      end

      def cols
        @cols ||= data.transpose
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
cl-0.1.5 lib/cl/help/table.rb
cl-0.1.4 lib/cl/help/table.rb
cl-0.1.3 lib/cl/help/table.rb