mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
[Sass] Make all Selector node strings work with interpolation.
This commit is contained in:
parent
630c6703eb
commit
fa1d6e3ba3
2 changed files with 43 additions and 43 deletions
|
@ -391,13 +391,13 @@ module Sass
|
|||
def class_selector
|
||||
return unless tok(/\./)
|
||||
@expected = "class name"
|
||||
Selector::Class.new(expr!(:interp_ident))
|
||||
Selector::Class.new(merge(expr!(:interp_ident)))
|
||||
end
|
||||
|
||||
def id_selector
|
||||
return unless tok(/#(?!\{)/)
|
||||
@expected = "id name"
|
||||
Selector::Id.new(expr!(:interp_name))
|
||||
Selector::Id.new(merge(expr!(:interp_name)))
|
||||
end
|
||||
|
||||
def element_name
|
||||
|
@ -409,9 +409,9 @@ module Sass
|
|||
end
|
||||
|
||||
if name == '*'
|
||||
Selector::Universal.new(ns && [ns].flatten)
|
||||
Selector::Universal.new(merge(ns))
|
||||
else
|
||||
Selector::Element.new([name].flatten, ns && [ns].flatten)
|
||||
Selector::Element.new(merge(name), merge(ns))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -443,7 +443,7 @@ module Sass
|
|||
end
|
||||
tok(/\]/)
|
||||
|
||||
Selector::Attribute.new(name, ns, op, val)
|
||||
Selector::Attribute.new(merge(name), merge(ns), op, merge(val))
|
||||
end
|
||||
|
||||
def attrib_name!
|
||||
|
@ -473,7 +473,7 @@ module Sass
|
|||
arg = expr!(:pseudo_expr)
|
||||
tok!(/\)/)
|
||||
end
|
||||
Selector::Pseudo.new(s == ':' ? :class : :element, name, arg)
|
||||
Selector::Pseudo.new(s == ':' ? :class : :element, merge(name), merge(arg))
|
||||
end
|
||||
|
||||
def pseudo_expr
|
||||
|
@ -656,6 +656,10 @@ MESSAGE
|
|||
result
|
||||
end
|
||||
|
||||
def merge(arr)
|
||||
arr && Haml::Util.merge_adjacent_strings([arr].flatten)
|
||||
end
|
||||
|
||||
EXPR_NAMES = {
|
||||
:media_query => "media query (e.g. print, screen, print and screen)",
|
||||
:media_expr => "media expression (e.g. (min-device-width: 800px)))",
|
||||
|
|
|
@ -98,9 +98,9 @@ module Sass
|
|||
# could be found at all.
|
||||
# If the second value is `false`, the first should be ignored.
|
||||
def unify_namespaces(ns1, ns2)
|
||||
return nil, false unless ns1 == ns2 || ns1.nil? || ns1 == '*' || ns2.nil? || ns2 == '*'
|
||||
return ns2, true if ns1 == '*'
|
||||
return ns1, true if ns2 == '*'
|
||||
return nil, false unless ns1 == ns2 || ns1.nil? || ns1 == ['*'] || ns2.nil? || ns2 == ['*']
|
||||
return ns2, true if ns1 == ['*']
|
||||
return ns1, true if ns2 == ['*']
|
||||
return ns1 || ns2, true
|
||||
end
|
||||
end
|
||||
|
@ -496,17 +496,17 @@ module Sass
|
|||
class Class < Node
|
||||
# The class name.
|
||||
#
|
||||
# @return [String]
|
||||
# @return [Array<String, Sass::Script::Node>]
|
||||
attr_reader :name
|
||||
|
||||
# @param name [String] The class name
|
||||
# @param name [Array<String, Sass::Script::Node>] The class name
|
||||
def initialize(name)
|
||||
@name = name
|
||||
end
|
||||
|
||||
# @see Node#to_a
|
||||
def to_a
|
||||
[".", @name]
|
||||
[".", *@name]
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -514,17 +514,17 @@ module Sass
|
|||
class Id < Node
|
||||
# The id name.
|
||||
#
|
||||
# @return [String]
|
||||
# @return [Array<String, Sass::Script::Node>]
|
||||
attr_reader :name
|
||||
|
||||
# @param name [String] The id name
|
||||
# @param name [Array<String, Sass::Script::Node>] The id name
|
||||
def initialize(name)
|
||||
@name = name
|
||||
end
|
||||
|
||||
# @see Node#to_a
|
||||
def to_a
|
||||
["#", @name]
|
||||
["#", *@name]
|
||||
end
|
||||
|
||||
# Returns `nil` if `sels` contains an {Id} selector
|
||||
|
@ -541,20 +541,20 @@ module Sass
|
|||
class Universal < Node
|
||||
# The selector namespace.
|
||||
# `nil` means the default namespace,
|
||||
# `""` means no namespace,
|
||||
# `"*"` means any namespace.
|
||||
# `[""]` means no namespace,
|
||||
# `["*"]` means any namespace.
|
||||
#
|
||||
# @return [String, nil]
|
||||
# @return [Array<String, Sass::Script::Node>, nil]
|
||||
attr_reader :namespace
|
||||
|
||||
# @param namespace [String, nil] See \{#namespace}
|
||||
# @param namespace [Array<String, Sass::Script::Node>, nil] See \{#namespace}
|
||||
def initialize(namespace)
|
||||
@namespace = namespace
|
||||
end
|
||||
|
||||
# @see Node#to_a
|
||||
def to_a
|
||||
@namespace ? [@namespace, "|*"] : ["*"]
|
||||
@namespace ? @namespace + ["|*"] : ["*"]
|
||||
end
|
||||
|
||||
# Unification of a universal selector is somewhat complicated,
|
||||
|
@ -588,7 +588,7 @@ module Sass
|
|||
when Universal; :universal
|
||||
when Element; sels.first.name
|
||||
else
|
||||
return [self] + sels unless namespace == nil || namespace == '*'
|
||||
return [self] + sels unless namespace.nil? || namespace == ['*']
|
||||
return sels unless sels.empty?
|
||||
return [self]
|
||||
end
|
||||
|
@ -603,19 +603,19 @@ module Sass
|
|||
class Element < Node
|
||||
# The element name.
|
||||
#
|
||||
# @return [String]
|
||||
# @return [Array<String, Sass::Script::Node>]
|
||||
attr_reader :name
|
||||
|
||||
# The selector namespace.
|
||||
# `nil` means the default namespace,
|
||||
# `""` means no namespace,
|
||||
# `"*"` means any namespace.
|
||||
# `[""]` means no namespace,
|
||||
# `["*"]` means any namespace.
|
||||
#
|
||||
# @return [String, nil]
|
||||
# @return [Array<String, Sass::Script::Node>, nil]
|
||||
attr_reader :namespace
|
||||
|
||||
# @param name [String] The element name
|
||||
# @param namespace [String, nil] See \{#namespace}
|
||||
# @param name [Array<String, Sass::Script::Node>] The element name
|
||||
# @param namespace [Array<String, Sass::Script::Node>, nil] See \{#namespace}
|
||||
def initialize(name, namespace)
|
||||
@name = name
|
||||
@namespace = namespace
|
||||
|
@ -623,7 +623,7 @@ module Sass
|
|||
|
||||
# @see Node#to_a
|
||||
def to_a
|
||||
@namespace ? [@namespace, "|", @name] : [@name]
|
||||
@namespace ? @namespace + ["|"] + @name : @name
|
||||
end
|
||||
|
||||
# Unification of an element selector is somewhat complicated,
|
||||
|
@ -691,15 +691,15 @@ module Sass
|
|||
class Attribute < Node
|
||||
# The attribute name.
|
||||
#
|
||||
# @return [String]
|
||||
# @return [Array<String, Sass::Script::Node>]
|
||||
attr_reader :name
|
||||
|
||||
# The attribute namespace.
|
||||
# `nil` means the default namespace,
|
||||
# `""` means no namespace,
|
||||
# `"*"` means any namespace.
|
||||
# `[""]` means no namespace,
|
||||
# `["*"]` means any namespace.
|
||||
#
|
||||
# @return [String, nil]
|
||||
# @return [Array<String, Sass::Script::Node>, nil]
|
||||
attr_reader :namespace
|
||||
|
||||
# The matching operator, e.g. `"="` or `"^="`.
|
||||
|
@ -709,15 +709,11 @@ module Sass
|
|||
|
||||
# The right-hand side of the operator.
|
||||
#
|
||||
# This may include SassScript nodes that will be run during resolution.
|
||||
# Note that this should not include SassScript nodes
|
||||
# after resolution has taken place.
|
||||
#
|
||||
# @return [Array<String, Sass::Script::Node>]
|
||||
attr_reader :value
|
||||
|
||||
# @param name [String] The attribute name
|
||||
# @param namespace [String, nil] See \{#namespace}
|
||||
# @param name [Array<String, Sass::Script::Node>] The attribute name
|
||||
# @param namespace [Array<String, Sass::Script::Node>, nil] See \{#namespace}
|
||||
# @param operator [String] The matching operator, e.g. `"="` or `"^="`
|
||||
# @param value [Array<String, Sass::Script::Node>] See \{#value}
|
||||
def initialize(name, namespace, operator, value)
|
||||
|
@ -730,8 +726,8 @@ module Sass
|
|||
# @see Node#to_a
|
||||
def to_a
|
||||
res = ["["]
|
||||
res << @namespace << "|" if @namespace
|
||||
res << @name
|
||||
res.concat(@namespace) << "|" if @namespace
|
||||
res.concat @name
|
||||
(res << @operator).concat @value if @value
|
||||
res << "]"
|
||||
end
|
||||
|
@ -749,7 +745,7 @@ module Sass
|
|||
|
||||
# The name of the selector.
|
||||
#
|
||||
# @return [String]
|
||||
# @return [Array<String, Sass::Script::Node>]
|
||||
attr_reader :name
|
||||
|
||||
# The argument to the selector,
|
||||
|
@ -763,7 +759,7 @@ module Sass
|
|||
attr_reader :arg
|
||||
|
||||
# @param type [Symbol] See \{#type}
|
||||
# @param name [String] The name of the selector
|
||||
# @param name [Array<String, Sass::Script::Node>] The name of the selector
|
||||
# @param arg [nil, Array<String, Sass::Script::Node>] The argument to the selector,
|
||||
# or nil if no argument was given
|
||||
def initialize(type, name, arg)
|
||||
|
@ -774,7 +770,7 @@ module Sass
|
|||
|
||||
# @see Node#to_a
|
||||
def to_a
|
||||
res = [@type == :class ? ":" : "::", @name]
|
||||
res = [@type == :class ? ":" : "::"] + @name
|
||||
(res << "(").concat(@arg) << ")" if @arg
|
||||
res
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue