Class: Sass::Selector::Sequence

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

Overview

An operator-separated sequence of simple selector sequences.

Instance Attribute Summary collapse

Attributes inherited from AbstractSequence

#filename, #line

Instance Method Summary collapse

Methods inherited from AbstractSequence

#_specificity, #eql?, #has_placeholder?, #hash, #specificity, #to_s

Constructor Details

#initialize(seqs_and_ops) ⇒ Sequence

Returns a new instance of Sequence.

Parameters:



38
39
40
# File 'lib/sass/selector/sequence.rb', line 38

def initialize(seqs_and_ops)
  @members = seqs_and_ops
end

Instance Attribute Details

#membersArray<SimpleSequence, String|Array<Sass::Tree::Node, String>> (readonly)

The array of simple selector sequences, operators, and newlines. The operators are strings such as "+" and ">" representing the corresponding CSS operators, or interpolated SassScript. Newlines are also newline strings; these aren't semantically relevant, but they do affect formatting.

Returns:



34
35
36
# File 'lib/sass/selector/sequence.rb', line 34

def members
  @members
end

Instance Method Details

#add_sources!(sources)

Add to the Sass::Selector::SimpleSequence#sources sets of the child simple sequences. This destructively modifies this sequence's members array, but not the child simple sequences.

Parameters:



138
139
140
# File 'lib/sass/selector/sequence.rb', line 138

def add_sources!(sources)
  members.map! {|m| m.is_a?(SimpleSequence) ? m.with_more_sources(sources) : m}
end

#do_extend(extends, parent_directives) ⇒ Array<Sequence>

Non-destructively extends this selector with the extensions specified in a hash (which should come from Tree::Visitors::Cssize).

The extensions to perform on this selector

Parameters:

Returns:

See Also:



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/sass/selector/sequence.rb', line 91

def do_extend(extends, parent_directives, seen = Set.new)
  extended_not_expanded = members.map do |sseq_or_op|
    next [[sseq_or_op]] unless sseq_or_op.is_a?(SimpleSequence)
    extended = sseq_or_op.do_extend(extends, parent_directives, seen)
    choices = extended.map {|seq| seq.members}
    choices.unshift([sseq_or_op]) unless extended.any? {|seq| seq.superselector?(sseq_or_op)}
    choices
  end
  weaves = Sass::Util.paths(extended_not_expanded).map {|path| weave(path)}
  trim(weaves).map {|p| Sequence.new(p)}
end

#filename=(filename) ⇒ String?

Sets the name of the file in which this selector was declared, or nil if it was not declared in a file (e.g. on stdin). This also sets the filename for all child selectors.

Parameters:

  • filename (String, nil)

Returns:

  • (String, nil)


22
23
24
25
# File 'lib/sass/selector/sequence.rb', line 22

def filename=(filename)
  members.each {|m| m.filename = filename if m.is_a?(SimpleSequence)}
  filename
end

#inspectString

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

Returns:

  • (String)


129
130
131
# File 'lib/sass/selector/sequence.rb', line 129

def inspect
  members.map {|m| m.inspect}.join(" ")
end

#line=(line) ⇒ Fixnum

Sets the line of the Sass template on which this selector was declared. This also sets the line for all child selectors.

Parameters:

  • line (Fixnum)

Returns:

  • (Fixnum)


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

def line=(line)
  members.each {|m| m.line = line if m.is_a?(SimpleSequence)}
  line
end

#resolve_parent_refs(super_cseq, implicit_parent) ⇒ CommaSequence

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

Parameters:

  • super_cseq (CommaSequence)

    The parent selector

  • implicit_parent (Boolean)

    Whether the the parent selector should automatically be prepended to the resolved selector if it contains no parent refs.

Returns:

  • (CommaSequence)

    This selector, with parent references resolved

Raises:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/sass/selector/sequence.rb', line 52

def resolve_parent_refs(super_cseq, implicit_parent)
  members = @members.dup
  nl = (members.first == "\n" && members.shift)
  contains_parent_ref = members.any? do |seq_or_op|
    seq_or_op.is_a?(SimpleSequence) && seq_or_op.members.first.is_a?(Parent)
  end
  return CommaSequence.new([self]) if !implicit_parent && !contains_parent_ref

  unless contains_parent_ref
    old_members, members = members, []
    members << nl if nl
    members << SimpleSequence.new([Parent.new], false)
    members += old_members
  end

  CommaSequence.new(Sass::Util.paths(members.map do |sseq_or_op|
    next [sseq_or_op] unless sseq_or_op.is_a?(SimpleSequence)
    sseq_or_op.resolve_parent_refs(super_cseq).members
  end).map do |path|
    Sequence.new(path.map do |seq_or_op|
      next seq_or_op unless seq_or_op.is_a?(Sequence)
      seq_or_op.members
    end.flatten)
  end)
end

#superselector?(sseq) ⇒ Boolean

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

Examples:

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

Parameters:

Returns:

  • (Boolean)


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

def superselector?(sseq)
  return false unless members.size == 1
  members.last.superselector?(sseq)
end

#to_a



118
119
120
121
122
123
# File 'lib/sass/selector/sequence.rb', line 118

def to_a
  ary = @members.map do |seq_or_op|
    seq_or_op.is_a?(SimpleSequence) ? seq_or_op.to_a : seq_or_op
  end
  Sass::Util.intersperse(ary, " ").flatten.compact
end