1
0
Fork 0
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:
Nathan Weizenbaum 2010-03-09 19:04:03 -08:00
parent 6d9009eb6a
commit 627293f3bf
4 changed files with 51 additions and 10 deletions

View file

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

View file

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

View file

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

View file

@ -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 = {})