Class Sass::Selector::SimpleSequence
In: lib/sass/selector/simple_sequence.rb
Parent: AbstractSequence
Haml::Util Engine Color SyntaxError UnitConversionError StandardError AbstractSequence CommaSequence Sequence SimpleSequence Simple Parent Universal Class SelectorPseudoClass Id Pseudo Attribute Interpolation Element Node Operation Literal UnaryOperation StringInterpolation Funcall Interpolation Variable Lexer CssLexer Number Bool String Parser Parser CssParser EvaluationContext StaticParser SassParser CssParser Node DebugNode IfNode CommentNode ForNode PropNode MixinNode DirectiveNode ExtendNode VariableNode WarnNode RootNode WhileNode RuleNode MixinDefNode Enumerable ImportNode Merb::BootLoader MerbBootLoader Repl CSS Environment Rack StalenessChecker lib/sass/repl.rb lib/sass/css.rb lib/sass/environment.rb lib/sass/error.rb lib/sass/engine.rb lib/sass/selector/simple_sequence.rb lib/sass/selector/abstract_sequence.rb lib/sass/selector/sequence.rb lib/sass/selector/comma_sequence.rb lib/sass/selector/simple.rb lib/sass/selector.rb Selector lib/sass/script/css_parser.rb lib/sass/script/lexer.rb lib/sass/script/color.rb lib/sass/script/string.rb lib/sass/script/unary_operation.rb lib/sass/script/variable.rb lib/sass/script/funcall.rb lib/sass/script/string_interpolation.rb lib/sass/script/operation.rb lib/sass/script/bool.rb lib/sass/script/parser.rb lib/sass/script/literal.rb lib/sass/script/node.rb lib/sass/script/interpolation.rb lib/sass/script/css_lexer.rb lib/sass/script/number.rb lib/sass/script/functions.rb Functions Script lib/sass/scss/sass_parser.rb lib/sass/scss/static_parser.rb lib/sass/scss/parser.rb lib/sass/scss/css_parser.rb ScriptLexer ScriptParser RX SCSS Files Callbacks lib/sass/tree/while_node.rb lib/sass/tree/if_node.rb lib/sass/tree/mixin_def_node.rb lib/sass/tree/debug_node.rb lib/sass/tree/root_node.rb lib/sass/tree/for_node.rb lib/sass/tree/import_node.rb lib/sass/tree/prop_node.rb lib/sass/tree/node.rb lib/sass/tree/comment_node.rb lib/sass/tree/extend_node.rb lib/sass/tree/mixin_node.rb lib/sass/tree/warn_node.rb lib/sass/tree/directive_node.rb lib/sass/tree/rule_node.rb lib/sass/tree/variable_node.rb Tree lib/sass/plugin/rack.rb lib/sass/plugin/staleness_checker.rb lib/sass/plugin/merb.rb Plugin Sass dot/m_85_0.png

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]`.

Methods

_eql?   _hash   base   do_extend   inspect   new   resolve_parent_refs   rest   superselector?   to_a   unify  

Attributes

members  [R]  The array of individual selectors.

@return [Array<Simple>]

Public Class methods

@param selectors [Array<Simple>] See \{members}

[Source]

    # File lib/sass/selector/simple_sequence.rb, line 29
29:       def initialize(selectors)
30:         @members = selectors
31:       end

Public Instance methods

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

@return [Element, Universal, nil]

[Source]

    # File lib/sass/selector/simple_sequence.rb, line 17
17:       def base
18:         @base ||= (members.first if members.first.is_a?(Element) || members.first.is_a?(Universal))
19:       end

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

@overload def do_extend(extends) @param extends [{Selector::Simple => Selector::Sequence}]

  The extensions to perform on this selector

@return [Array<Sequence>] A list of selectors generated

  by extending this selector with `extends`.

@see CommaSequence#do_extend

[Source]

    # File lib/sass/selector/simple_sequence.rb, line 64
64:       def do_extend(extends, seen = Set.new)
65:         extends.get(members.to_set).map do |seq, sels|
66:           # If A {@extend B} and C {...},
67:           # seq is A, sels is B, and self is C
68: 
69:           self_without_sel = self.members - sels
70:           next unless unified = seq.members.last.unify(self_without_sel)
71:           [sels, seq.members[0...-1] + [unified]]
72:         end.compact.map do |sels, seq|
73:           seq = Sequence.new(seq)
74:           seen.include?(sels) ? [] : seq.do_extend(extends, seen + [sels])
75:         end.flatten.uniq
76:       end

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

@return [String]

[Source]

     # File lib/sass/selector/simple_sequence.rb, line 121
121:       def inspect
122:         members.map {|m| m.inspect}.join
123:       end

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

@param super_seq [Sequence] The parent selector sequence @return [Array<SimpleSequence>] This selector, with parent references resolved.

  This is an array because the parent selector is itself a {Sequence}

@raise [Sass::SyntaxError] If a parent selector is invalid

[Source]

    # File lib/sass/selector/simple_sequence.rb, line 41
41:       def resolve_parent_refs(super_seq)
42:         # Parent selector only appears as the first selector in the sequence
43:         return [self] unless @members.first.is_a?(Parent)
44: 
45:         return super_seq.members if @members.size == 1
46:         unless super_seq.members.last.is_a?(SimpleSequence)
47:           raise Sass::SyntaxError.new("Invalid parent selector: " + super_seq.to_a.join)
48:         end
49: 
50:         super_seq.members[0...-1] +
51:           [SimpleSequence.new(super_seq.members.last.members + @members[1..-1])]
52:       end

Returns the non-base selectors in this sequence.

@return [Set<Simple>]

[Source]

    # File lib/sass/selector/simple_sequence.rb, line 24
24:       def rest
25:         @rest ||= Set.new(base ? members[1..-1] : members)
26:       end

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

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

@param sseq [SimpleSequence] @return [Boolean]

[Source]

     # File lib/sass/selector/simple_sequence.rb, line 108
108:       def superselector?(sseq)
109:         (base.nil? || base.eql?(sseq.base)) && rest.subset?(sseq.rest)
110:       end

@see Simple#to_a

[Source]

     # File lib/sass/selector/simple_sequence.rb, line 113
113:       def to_a
114:         @members.map {|sel| sel.to_a}.flatten
115:       end

Unifies this selector with another {SimpleSequence}’s {SimpleSequence#members members array}, returning another `SimpleSequence` that matches both this selector and the input selector.

@param sels [Array<Simple>] A {SimpleSequence}’s {SimpleSequence#members members array} @return [SimpleSequence, nil] A {SimpleSequence} matching both `sels` and this selector,

  or `nil` if this is impossible (e.g. unifying `#foo` and `#bar`)

@raise [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

[Source]

    # File lib/sass/selector/simple_sequence.rb, line 91
91:       def unify(sels)
92:         return unless sseq = members.inject(sels) do |sseq, sel|
93:           return unless sseq
94:           sel.unify(sseq)
95:         end
96:         SimpleSequence.new(sseq)
97:       end

Private Instance methods

[Source]

     # File lib/sass/selector/simple_sequence.rb, line 131
131:       def _eql?(other)
132:         other.base.eql?(self.base) && Haml::Util.set_eql?(other.rest, self.rest)
133:       end

[Source]

     # File lib/sass/selector/simple_sequence.rb, line 127
127:       def _hash
128:         [base, Haml::Util.set_hash(rest)].hash
129:       end

[Validate]