Sha256: 6f73347babf1941b8b9d2ebd2d40a05db2098278a0a91bfeaca8d7b258fb5469

Contents?: true

Size: 1.48 KB

Versions: 2

Compression:

Stored size: 1.48 KB

Contents

# frozen_string_literal: true

require 'xpath'

module Capybara
  class Selector
    # @api private
    class XPathBuilder
      class << self
        def attribute_conditions(attributes)
          attributes.map do |attribute, value|
            case value
            when XPath::Expression
              XPath.attr(attribute)[value]
            when Regexp
              XPath.attr(attribute)[regexp_to_xpath_conditions(value)]
            when true
              XPath.attr(attribute)
            when false, nil
              !XPath.attr(attribute)
            else
              XPath.attr(attribute) == value.to_s
            end
          end.reduce(:&)
        end

        def class_conditions(classes)
          case classes
          when XPath::Expression, Regexp
            attribute_conditions(class: classes)
          else
            Array(classes).map do |klass|
              if klass.start_with?('!') && !klass.start_with?('!!!')
                !XPath.attr(:class).contains_word(klass.slice(1..-1))
              else
                XPath.attr(:class).contains_word(klass.sub(/^!!/, ''))
              end
            end.reduce(:&)
          end
        end

      private

        def regexp_to_xpath_conditions(regexp)
          condition = XPath.current
          condition = condition.uppercase if regexp.casefold?
          Selector::RegexpDisassembler.new(regexp).substrings.map do |str|
            condition.contains(str)
          end.reduce(:&)
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
capybara-3.10.1 lib/capybara/selector/builders/xpath_builder.rb
capybara-3.10.0 lib/capybara/selector/builders/xpath_builder.rb