Sha256: fda4797c7341412fba332621d9196c1afe69dc80b80f9e7dae4c78cf1db0e82b

Contents?: true

Size: 1.66 KB

Versions: 5

Compression:

Stored size: 1.66 KB

Contents

require "capybara_table/version"
require "capybara"
require "terminal-table"
require "xpath"

module CapybaraTable
  module XPath
    include ::XPath
    extend self

    def table(caption)
      descendant(:table)[descendant(:caption).string.n.is(caption)]
    end

    def table_row(fields)
      fields.reduce(descendant(:tr)) do |xpath, (header, value)|
        xpath[table_cell(header, value)]
      end
    end

    def table_cell(header, value)
      descendant(:td, :th)[string.n.is(value).and(header_position(header).equals(self_position))]
    end

    def self_position
      cell_position(self_axis)
    end

    def header_position(header)
      header_node = ancestor(:table)[1].descendant(:tr)[1].descendant(:th)[string.n.is(header)]
      cell_position(header_node)
    end

    def cell_position(node)
      siblings = node.preceding_sibling(:td, :th)

      without_colspan = siblings[attr(:colspan).inverse].count
      with_colspan = siblings.attr(:colspan).sum
      exists = node.boolean.number

      without_colspan.plus(with_colspan).plus(exists)
    end
  end

  module Renderer
    extend self

    def render(node)
      node.synchronize do
        rows = node.all("tr").map do |row|
          row.all("th, td").map do |cell|
            {value: cell.text, colspan: (cell[:colspan] || 1).to_i}
          end
        end

        Terminal::Table.new(headings: rows.first, rows: rows.drop(1), style: {all_separators: true}).to_s
      end
    end
  end
end

Capybara.add_selector :table do
  xpath do |caption|
    CapybaraTable::XPath.table(caption)
  end
end

Capybara.add_selector :table_row do
  xpath do |fields|
    CapybaraTable::XPath.table_row(fields)
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
capybara_table-0.3.0 lib/capybara_table.rb
capybara_table-0.2.1 lib/capybara_table.rb
capybara_table-0.2.0 lib/capybara_table.rb
capybara_table-0.1.1 lib/capybara_table.rb
capybara_table-0.1.0 lib/capybara_table.rb