class Paru::Relation
@private
Public Class Methods
new(selector, distance, type, classes)
click to toggle source
# File lib/paru/selector.rb, line 151 def initialize(selector, distance, type, classes) @selector = selector @distance = distance @type = type @classes = classes end
Public Instance Methods
in_sequence?(node, previous_nodes)
click to toggle source
# File lib/paru/selector.rb, line 176 def in_sequence?(node, previous_nodes) previous_nodes.any? do |other| other.type == @type and @classes.all? {|c| other.has_class? c} end end
is_descendant?(node)
click to toggle source
# File lib/paru/selector.rb, line 188 def is_descendant?(node) distance = 0 parent = nil begin distance += 1 if @distance > 0 node = parent unless parent.nil? parent = node.parent ancestry = parent.type == @type and @classes.all? {|c| parent.has_class? c} end while not ancestry and not parent.is_root? and distance <= @distance ancestry end
matches?(node, filtered_nodes)
click to toggle source
# File lib/paru/selector.rb, line 158 def matches?(node, filtered_nodes) level_nodes = filtered_nodes.keep_if do |n| node.is_inline? == n.is_inline? or node.can_act_as_both_block_and_inline? end previous_nodes = previous level_nodes, @distance case @selector when '+' in_sequence? node, previous_nodes when '-' not_in_sequence? node, previous_nodes when '>' is_descendant? node else false end end
not_in_sequence?(node, previous_nodes)
click to toggle source
# File lib/paru/selector.rb, line 182 def not_in_sequence?(node, previous_nodes) previous_nodes.all? do |other| other.type != @type or not @classes.all? {|c| other.has_class? c} end end
previous(filtered_nodes, distance)
click to toggle source
# File lib/paru/selector.rb, line 200 def previous(filtered_nodes, distance) distance = [distance, filtered_nodes.size - 1].min if distance <= 0 filtered_nodes.slice(0, filtered_nodes.size - 1) else filtered_nodes.slice(-1 * distance - 1, distance) end end