class Sass::Selector::Sequence

def _superselector?(seq1, seq2)

Returns:
  • (Boolean) -

Parameters:
  • seq2 (Array) --
  • seq1 (Array) --
def _superselector?(seq1, seq2)
  seq1 = seq1.reject {|e| e == "\n"}
  seq2 = seq2.reject {|e| e == "\n"}
  # Selectors with leading or trailing operators are neither
  # superselectors nor subselectors.
  return if seq1.last.is_a?(String) || seq2.last.is_a?(String) ||
    seq1.first.is_a?(String) || seq2.first.is_a?(String)
  # More complex selectors are never superselectors of less complex ones
  return if seq1.size > seq2.size
  return seq1.first.superselector?(seq2.last, seq2[0...-1]) if seq1.size == 1
  _, si = seq2.each_with_index.find do |e, i|
    return if i == seq2.size - 1
    next if e.is_a?(String)
    seq1.first.superselector?(e, seq2[0...i])
  end
  return unless si
  if seq1[1].is_a?(String)
    return unless seq2[si + 1].is_a?(String)
    # .foo ~ .bar is a superselector of .foo + .bar
    return unless seq1[1] == "~" ? seq2[si + 1] != ">" : seq1[1] == seq2[si + 1]
    # .foo > .baz is not a superselector of .foo > .bar > .baz or .foo >
    # .bar .baz, despite the fact that .baz is a superselector of .bar >
    # .baz and .bar .baz. Same goes for + and ~.
    return if seq1.length == 3 && seq2.length > 3
    return _superselector?(seq1[2..-1], seq2[si + 2..-1])
  elsif seq2[si + 1].is_a?(String)
    return unless seq2[si + 1] == ">"
    return _superselector?(seq1[1..-1], seq2[si + 2..-1])
  else
    return _superselector?(seq1[1..-1], seq2[si + 1..-1])
  end
end