Class: Paru::Relation
- Inherits:
-
Object
- Object
- Paru::Relation
- Defined in:
- lib/paru/selector.rb
Instance Method Summary collapse
- #in_sequence?(_node, previous_nodes) ⇒ Boolean
-
#initialize(selector, distance, type, classes) ⇒ Relation
constructor
A new instance of Relation.
- #is_descendant?(node) ⇒ Boolean (also: #descendant?)
- #matches?(node, filtered_nodes) ⇒ Boolean
- #not_in_sequence?(_node, previous_nodes) ⇒ Boolean
- #previous(filtered_nodes, distance) ⇒ Object
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
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?
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
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
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 |