class Arboretum::Scandent::PathStep

Attributes

action[RW]
attrs[RW]
element_ref[RW]
id[RW]
namespace[RW]
pseudo_exps[RW]
tag[RW]
valid_rules[RW]

Public Class Methods

new(action, element_ref, tag, namespace, id, attrs, pseudo_exps, valid_rules) click to toggle source
# File lib/arboretum/scandent.rb, line 195
def initialize(action, element_ref, tag, namespace, id, attrs, pseudo_exps, valid_rules)
  @action = action
  @element_ref = element_ref
  @tag = tag.nil? ? nil : tag.to_sym
  @namespace = namespace.nil? ? nil : namespace.to_sym
  @id = id
  @attrs = attrs
  @pseudo_exps = pseudo_exps
  @valid_rules = valid_rules
end

Public Instance Methods

describes?(element) click to toggle source

Check if all fields match that of the given element, with no attention paid to the action FIXME: Search time improves by 25% when a tag is given. Reject non-tagged Elements more quickly

to get a similar performance boost across the board
# File lib/arboretum/scandent.rb, line 209
def describes?(element)
  if element.kind_of?(Arboretum::DocTree::Elements::TaggedElement)
    return false if !@tag.nil? and element.tag != @tag
    return false if !@namespace.nil? and element.namespace != @namespace
    return false if !@id.nil? and !element.equals_attr_val?(:id, [@id])
    @attrs[:has].each {|attr_name| return false if !element.has_attr?(attr_name)}
    @attrs[:contains].each {|name,values| values.each {|value| return false if !element.contains_attr_val?(name,value)}}
    @attrs[:equals].each {|name,values| values.each {|value| return false if !element.equals_attr_val?(name,value)}}
    @attrs[:matches].each {|name,values| values.each {|value| return false if !element.matches_attr_val?(name,value)}}
    return false if element_ref == :ELEMENT_ROOT and !element.parent.nil?
  else
    return false if !@tag.nil? or
                    !@namespace.nil? or
                    !@id.nil? or
                    !@attrs[:has].empty? or
                    !@attrs[:contains].empty? or
                    !@attrs[:equals].empty? or
                    !@attrs[:matches].empty? or
                    (element_ref == :ELEMENT_ROOT and !element.parent.nil?)
  end
  @pseudo_exps.each do |pseudo_name, pseudo_arg|
    return false if !PseudoClasses.match(element, pseudo_name, pseudo_arg)
  end
  @valid_rules.each do |rule|
    return false if !rule.valid_on?(element)
  end
  return true
end
to_s_sans_action() click to toggle source
# File lib/arboretum/scandent.rb, line 238
def to_s_sans_action
  step_str = ''
  if !@element_ref.nil?
    if @element_ref == :ELEMENT_ROOT
      step_str << '~'
    elsif @element_ref == :ELEMENT_SELF
      step_str << '.'
    end
  end
  step_str << "%#{@tag.to_s}" if !tag.nil?
  step_str << "@#{@namespace.to_s}" if !namespace.nil?
  step_str << "##{@id}" if !@id.nil?
  @attrs[:has].each {|attr_name| step_str << "[#{attr_name}]"}
  @attrs[:contains].each {|name,values| values.each {|value| step_str << "[#{name}=\"#{value}\"]"}}
  @attrs[:equals].each {|name,values| values.each {|value| step_str << "[#{name}==\"#{value.join(' ')}\"]"}}
  @attrs[:matches].each {|name,values| values.each {|value| step_str << "[#{name}~=|/#{value}/|]"}}
  @valid_rules.each {|rule| step_str << "{#{rule.to_s}}"}
  @pseudo_exps.each {|pseudo, arg| step_str << ":#{pseudo}(#{arg.to_s})"}
  step_str
end