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