Class: Sass::Selector::SimpleSequence

Inherits:
AbstractSequence show all
Defined in:
lib/sass/selector/simple_sequence.rb

Overview

A unseparated sequence of selectors that all apply to a single element. For example, .foo#bar[attr=baz] is a simple sequence of the selectors .foo, #bar, and [attr=baz].

Instance Attribute Summary collapse

Attributes inherited from AbstractSequence

#filename, #line

Instance Method Summary collapse

Constructor Details

#initialize(selectors) ⇒ SimpleSequence

Returns a new instance of SimpleSequence.

Parameters:



29
30
31
# File 'lib/sass/selector/simple_sequence.rb', line 29

def initialize(selectors)
  @members = selectors
end

Instance Attribute Details

#membersArray<Simple> (readonly)

The array of individual selectors.

Returns:



11
12
13
# File 'lib/sass/selector/simple_sequence.rb', line 11

def members
  @members
end

Instance Method Details

#baseElement, ...

Returns the element or universal selector in this sequence, if it exists.

Returns:



17
18
19
# File 'lib/sass/selector/simple_sequence.rb', line 17

def base
  @base ||= (members.first if members.first.is_a?(Element) || members.first.is_a?(Universal))
end

#do_extend(extends) ⇒ Array<Sequence>

Non-destrucively extends this selector with the extensions specified in a hash (which should be populated via Tree::Node#cssize).

Parameters:

Returns:

  • (Array<Sequence>)

    A list of selectors generated by extending this selector with extends.

See Also:



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/sass/selector/simple_sequence.rb', line 64

def do_extend(extends, seen = Set.new)
  extends.get(members.to_set).map do |seq, sels|
    # If A {@extend B} and C {...},
    # seq is A, sels is B, and self is C

    self_without_sel = self.members - sels
    next unless unified = seq.members.last.unify(self_without_sel)
    [sels, seq.members[0...-1] + [unified]]
  end.compact.map do |sels, seq|
    seq = Sequence.new(seq)
    seen.include?(sels) ? [] : seq.do_extend(extends, seen + [sels])
  end.flatten.uniq
end

#eql?(other) ⇒ Boolean

Checks equality between this and another object.

Parameters:

  • other (Object)

    The object to test equality against

Returns:

  • (Boolean)

    Whether or not this is equal to other



136
137
138
139
# File 'lib/sass/selector/simple_sequence.rb', line 136

def eql?(other)
  other.class == self.class && other.base.eql?(self.base) &&
    Haml::Util.set_eql?(other.rest, self.rest)
end

#hashFixnum

Returns a hash code for this sequence.

Returns:

  • (Fixnum)


128
129
130
# File 'lib/sass/selector/simple_sequence.rb', line 128

def hash
  [base, Haml::Util.set_hash(rest)].hash
end

#inspectString

Returns a string representation of the sequence. This is basically the selector string.

Returns:

  • (String)


121
122
123
# File 'lib/sass/selector/simple_sequence.rb', line 121

def inspect
  members.map {|m| m.inspect}.join
end

#resolve_parent_refs(super_seq) ⇒ Array<SimpleSequence>

Resolves the Parent selectors within this selector by replacing them with the given parent selector, handling commas appropriately.

Parameters:

  • super_seq (Sequence)

    The parent selector sequence

Returns:

Raises:



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/sass/selector/simple_sequence.rb', line 41

def resolve_parent_refs(super_seq)
  # Parent selector only appears as the first selector in the sequence
  return [self] unless @members.first.is_a?(Parent)

  return super_seq.members if @members.size == 1
  unless super_seq.members.last.is_a?(SimpleSequence)
    raise Sass::SyntaxError.new("Invalid parent selector: " + super_seq.to_a.join)
  end

  super_seq.members[0...-1] +
    [SimpleSequence.new(super_seq.members.last.members + @members[1..-1])]
end

#restSet<Simple>

Returns the non-base selectors in this sequence.

Returns:



24
25
26
# File 'lib/sass/selector/simple_sequence.rb', line 24

def rest
  @rest ||= Set.new(base ? members[1..-1] : members)
end

#superselector?(sseq) ⇒ Boolean

Returns whether or not this selector matches all elements that the given selector matches (as well as possibly more).

(.foo).superselector?(.foo.bar) #=> true (.foo).superselector?(.bar) #=> false

Parameters:

Returns:

  • (Boolean)


108
109
110
# File 'lib/sass/selector/simple_sequence.rb', line 108

def superselector?(sseq)
  (base.nil? || base.eql?(sseq.base)) && rest.subset?(sseq.rest)
end

#to_a



113
114
115
# File 'lib/sass/selector/simple_sequence.rb', line 113

def to_a
  @members.map {|sel| sel.to_a}.flatten
end

#unify(sels) ⇒ SimpleSequence?

Unifies this selector with another Sass::Selector::SimpleSequence's members array, returning another SimpleSequence that matches both this selector and the input selector.

Parameters:

Returns:

Raises:

  • (Sass::SyntaxError)

    If this selector cannot be unified. This will only ever occur when a dynamic selector, such as Parent or Interpolation, is used in unification. Since these selectors should be resolved by the time extension and unification happen, this exception will only ever be raised as a result of programmer error



91
92
93
94
95
96
97
# File 'lib/sass/selector/simple_sequence.rb', line 91

def unify(sels)
  return unless sseq = members.inject(sels) do |sseq, sel|
    return unless sseq
    sel.unify(sseq)
  end
  SimpleSequence.new(sseq)
end