class Pincers::Core::Helpers::Query

Attributes

lang[R]
limit[R]
query[R]

Public Class Methods

build_from_options(_backend, _selector, _options = {}, &_block) click to toggle source
# File lib/pincers/core/helpers/query.rb, line 7
def self.build_from_options(_backend, _selector, _options = {}, &_block)
  limit = _options.delete(:limit)
  lang = :xpath
  exp = nil

  if _selector
    parser = Pincers::CSS::Parser.new _selector
    if parser.is_extended?
      exp = parser.to_xpath('.//') # Should we use // for root?
      exp = exp.first if exp.length == 1
    else
      lang = :css
      exp = _selector
    end
  elsif _options[:xpath]
    exp = _options[:xpath]
  else
    builder = Pincers::Support::XPathBuilder.new _options
    _block.call builder unless _block.nil?
    exp = builder.expression
  end

  self.new _backend, lang, exp, limit
end
new(_backend, _lang, _query, _limit) click to toggle source
# File lib/pincers/core/helpers/query.rb, line 34
def initialize(_backend, _lang, _query, _limit)
  @backend = _backend
  @lang = _lang
  @query = _query
  @limit = _limit
end

Public Instance Methods

execute(_elements, _force_limit = nil) click to toggle source
# File lib/pincers/core/helpers/query.rb, line 41
def execute(_elements, _force_limit = nil)
  fun = case @lang
  when :xpath then :search_by_xpath
  else :search_by_css end

  query_elements _elements, fun, _force_limit || @limit
end

Private Instance Methods

explode_elements(_elements) { |element, q| ... } click to toggle source
# File lib/pincers/core/helpers/query.rb, line 61
def explode_elements(_elements)
  _elements.each do |element|
    if @query.is_a? Array
      @query.each { |q| yield element, q }
    else
      yield element, @query
    end
  end
end
query_elements(_elements, _fun, _limit) click to toggle source
# File lib/pincers/core/helpers/query.rb, line 51
def query_elements(_elements, _fun, _limit)
  elements = []
  explode_elements(_elements) do |element, query|
    limit = _limit.nil? ? nil : _limit - elements.count
    elements += @backend.send(_fun, element, query, limit)
    break if !_limit.nil? && elements.length >= _limit
  end
  elements
end