Class: Paru::Relation

Inherits:
Object
  • Object
show all
Defined in:
lib/paru/selector.rb

Instance Method Summary collapse

Constructor Details

#initialize(selector, distance, type, classes) ⇒ Relation

Returns a new instance of Relation.



158
159
160
161
162
163
# File 'lib/paru/selector.rb', line 158

def initialize(selector, distance, type, classes)
  @selector = selector
  @distance = distance
  @type = type
  @classes = classes
end

Instance Method Details

#in_sequence?(_node, previous_nodes) ⇒ Boolean

Returns:

  • (Boolean)


183
184
185
186
187
# File 'lib/paru/selector.rb', line 183

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) ⇒ Boolean Also known as: descendant?

Returns:

  • (Boolean)


195
196
197
198
199
200
201
202
203
204
205
# File 'lib/paru/selector.rb', line 195

def is_descendant?(node)
  distance = 0
  parent = nil
  begin
    distance += 1 if @distance.positive?
    node = parent unless parent.nil?
    parent = node.parent
    ancestry = parent.type == @type and @classes.all? { |c| parent.has_class? c }
  end while !ancestry && !parent.is_root? && distance <= @distance
  ancestry
end

#matches?(node, filtered_nodes) ⇒ Boolean

Returns:

  • (Boolean)


165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/paru/selector.rb', line 165

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) ⇒ Boolean

Returns:

  • (Boolean)


189
190
191
192
193
# File 'lib/paru/selector.rb', line 189

def not_in_sequence?(_node, previous_nodes)
  previous_nodes.all? do |other|
    other.type != @type or !@classes.all? { |c| other.has_class? c }
  end
end

#previous(filtered_nodes, distance) ⇒ Object



209
210
211
212
213
214
215
216
# File 'lib/paru/selector.rb', line 209

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