Sha256: 489cc8a2207969dbc0c8f08c959cfcb3f14782397d9304b9e8e2787f7dae157c

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

class Tableware

  class Parser

    class TableWithoutHeaderError < StandardError; end

    ROW_START = /^>?\s*\|?/
    ROW_END   = /\|?\s*$/

    def arrays(input)
      make_arrays(input)
    end

    def hashes(input)
      items = make_arrays(input)
      raise TableWithoutHeaderError, 'Sorry, only text tables with header rows can be turned into hashes' unless @headers
      items.map! { |row| @headers.zip(row).to_h }
    end

    private def make_arrays(input)
      lines = prepare_lines(input)
      lines[@data_start..-1].map do |line|
        parsed = parse_line(line)
        return [parsed] if @focused_line
        parsed
      end
    end

    private def prepare_lines(input)
      lines = input.strip.lines

      @data_start = lines[1] =~ /^\s*[-=\| ]+\s*$/ ? 2 : 0
      if @data_start.nonzero?
        @headers = parse_line(lines[0])
                   .map!(&:downcase)
                   .map! { |head| head.gsub(/\s+/, '_') }
                   .map!(&:to_sym)
      end

      lines
    end

    private def parse_line(line)
      line
        .strip
        .tap { |ln| @focused_line = ln[0] == '>' }
        .sub(ROW_START, '')
        .sub(ROW_END, '')
        .split(' | ')
        .map!(&:strip)
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tableware-0.2.1 lib/tableware/parser.rb
tableware-0.2.0 lib/tableware/parser.rb