mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
[Sass] Support long selectors extending.
This commit is contained in:
parent
6d9009eb6a
commit
627293f3bf
4 changed files with 51 additions and 10 deletions
|
@ -187,7 +187,7 @@ module Sass
|
|||
# @todo Link this to the reference documentation on `@extend`
|
||||
# when such a thing exists.
|
||||
#
|
||||
# @param extends [{Selector::Node => Selector::Node}]
|
||||
# @param extends [{Selector::Node => Selector::SimpleSequence}]
|
||||
# The extensions to perform on this selector
|
||||
# @return [CommaSequence] A copy of this selector,
|
||||
# with extensions made according to `extends`
|
||||
|
@ -288,7 +288,7 @@ module Sass
|
|||
# with the extensions specified in a hash
|
||||
# (which should be populated via {Sass::Tree::Node#cssize}).
|
||||
#
|
||||
# @param extends [{Selector::Node => Selector::Node}]
|
||||
# @param extends [{Selector::Node => Selector::SimpleSequence}]
|
||||
# The extensions to perform on this selector
|
||||
# @return [Array<Sequence>] A list of selectors generated
|
||||
# by extending this selector with `extends`.
|
||||
|
@ -390,7 +390,7 @@ module Sass
|
|||
# (which should be populated via {Sass::Tree::Node#cssize}).
|
||||
#
|
||||
# @overload def extend(extends)
|
||||
# @param extends [{Selector::Node => Selector::Node}]
|
||||
# @param extends [{Selector::Node => Selector::SimpleSequence}]
|
||||
# The extensions to perform on this selector
|
||||
# @return [Array<SimpleSequence>] A list of selectors generated
|
||||
# by extending this selector with `extends`.
|
||||
|
@ -403,7 +403,12 @@ module Sass
|
|||
seqs = Haml::Util.enum_with_index(members).map do |sel, i|
|
||||
next unless extenders = extends[sel]
|
||||
sseq_without_sel = members[0...i] + members[i+1..-1]
|
||||
extenders.map {|sel2| sel2.unify(sseq_without_sel)}
|
||||
extenders.map do |sseq|
|
||||
sseq.members.inject(sseq_without_sel) do |sseq2, sel2|
|
||||
next unless sseq2
|
||||
sel2.unify(sseq2)
|
||||
end
|
||||
end
|
||||
end.flatten(1).compact.map {|seq| SimpleSequence.new(seq)}
|
||||
seqs.concat seqs.map {|seq| seq.extend(extends)}.flatten.uniq
|
||||
rescue SystemStackError
|
||||
|
|
|
@ -34,11 +34,7 @@ module Sass::Tree
|
|||
raise Sass::SyntaxError.new("#{seq.to_a.join} can't extend: invalid selector")
|
||||
end
|
||||
|
||||
if sseq.members.size > 1
|
||||
raise Sass::SyntaxError.new("#{seq.to_a.join} can't extend: long selectors can't extend ")
|
||||
end
|
||||
|
||||
extends[sel] << sseq.members.first
|
||||
extends[sel] << sseq
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@ module Sass
|
|||
# @todo Link this to the reference documentation on `@extend`
|
||||
# when such a thing exists.
|
||||
#
|
||||
# @param extends [{Selector::Node => Selector::Node}]
|
||||
# @param extends [{Selector::Node => Selector::SimpleSequence}]
|
||||
# The extensions to perform on this tree
|
||||
# @return [Tree::Node] The resulting tree of static CSS nodes.
|
||||
# @raise [Sass::SyntaxError] Only if there's a programmer error
|
||||
|
|
|
@ -838,6 +838,46 @@ a.baz {@extend .foo.bar}
|
|||
SCSS
|
||||
end
|
||||
|
||||
## Long Extenders
|
||||
|
||||
def test_long_extender
|
||||
assert_equal <<CSS, render(<<SCSS)
|
||||
.foo.bar, .bar.baz.bang {
|
||||
a: b; }
|
||||
CSS
|
||||
.foo.bar {a: b}
|
||||
.baz.bang {@extend .foo}
|
||||
SCSS
|
||||
end
|
||||
|
||||
def test_long_extender_runs_unification
|
||||
assert_equal <<CSS, render(<<SCSS)
|
||||
ns|*.foo.bar, ns|a.bar.baz {
|
||||
a: b; }
|
||||
CSS
|
||||
ns|*.foo.bar {a: b}
|
||||
a.baz {@extend .foo}
|
||||
SCSS
|
||||
end
|
||||
|
||||
def test_long_extender_aborts_unification
|
||||
assert_equal <<CSS, render(<<SCSS)
|
||||
a.foo#bar {
|
||||
a: b; }
|
||||
CSS
|
||||
a.foo#bar {a: b}
|
||||
h1.baz {@extend .foo}
|
||||
SCSS
|
||||
|
||||
assert_equal <<CSS, render(<<SCSS)
|
||||
a.foo#bar {
|
||||
a: b; }
|
||||
CSS
|
||||
a.foo#bar {a: b}
|
||||
.bang#baz {@extend .foo}
|
||||
SCSS
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def render(sass, options = {})
|
||||
|
|
Loading…
Add table
Reference in a new issue