225 lines
5.1 KiB
Ruby
225 lines
5.1 KiB
Ruby
# A namespace for the `@supports` condition parse tree.
|
|
module Sass::Supports
|
|
# The abstract superclass of all Supports conditions.
|
|
class Condition
|
|
# Runs the SassScript in the supports condition.
|
|
#
|
|
# @param environment [Sass::Environment] The environment in which to run the script.
|
|
def perform(environment); Sass::Util.abstract(self); end
|
|
|
|
# Returns the CSS for this condition.
|
|
#
|
|
# @return [String]
|
|
def to_css; Sass::Util.abstract(self); end
|
|
|
|
# Returns the Sass/CSS code for this condition.
|
|
#
|
|
# @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
|
|
# @return [String]
|
|
def to_src(options); Sass::Util.abstract(self); end
|
|
|
|
# Returns a deep copy of this condition and all its children.
|
|
#
|
|
# @return [Condition]
|
|
def deep_copy; Sass::Util.abstract(self); end
|
|
|
|
# Sets the options hash for the script nodes in the supports condition.
|
|
#
|
|
# @param options [{Symbol => Object}] The options has to set.
|
|
def options=(options); Sass::Util.abstract(self); end
|
|
end
|
|
|
|
# An operator condition (e.g. `CONDITION1 and CONDITION2`).
|
|
class Operator < Condition
|
|
# The left-hand condition.
|
|
#
|
|
# @return [Sass::Supports::Condition]
|
|
attr_accessor :left
|
|
|
|
# The right-hand condition.
|
|
#
|
|
# @return [Sass::Supports::Condition]
|
|
attr_accessor :right
|
|
|
|
# The operator ("and" or "or").
|
|
#
|
|
# @return [String]
|
|
attr_accessor :op
|
|
|
|
def initialize(left, right, op)
|
|
@left = left
|
|
@right = right
|
|
@op = op
|
|
end
|
|
|
|
def perform(env)
|
|
@left.perform(env)
|
|
@right.perform(env)
|
|
end
|
|
|
|
def to_css
|
|
"#{parens @left, @left.to_css} #{op} #{parens @right, @right.to_css}"
|
|
end
|
|
|
|
def to_src(options)
|
|
"#{parens @left, @left.to_src(options)} #{op} #{parens @right, @right.to_src(options)}"
|
|
end
|
|
|
|
def deep_copy
|
|
copy = dup
|
|
copy.left = @left.deep_copy
|
|
copy.right = @right.deep_copy
|
|
copy
|
|
end
|
|
|
|
def options=(options)
|
|
@left.options = options
|
|
@right.options = options
|
|
end
|
|
|
|
private
|
|
|
|
def parens(condition, str)
|
|
if condition.is_a?(Negation) || (condition.is_a?(Operator) && condition.op != op)
|
|
return "(#{str})"
|
|
else
|
|
return str
|
|
end
|
|
end
|
|
end
|
|
|
|
# A negation condition (`not CONDITION`).
|
|
class Negation < Condition
|
|
# The condition being negated.
|
|
#
|
|
# @return [Sass::Supports::Condition]
|
|
attr_accessor :condition
|
|
|
|
def initialize(condition)
|
|
@condition = condition
|
|
end
|
|
|
|
def perform(env)
|
|
@condition.perform(env)
|
|
end
|
|
|
|
def to_css
|
|
"not #{parens @condition.to_css}"
|
|
end
|
|
|
|
def to_src(options)
|
|
"not #{parens @condition.to_src(options)}"
|
|
end
|
|
|
|
def deep_copy
|
|
copy = dup
|
|
copy.condition = condition.deep_copy
|
|
copy
|
|
end
|
|
|
|
def options=(options)
|
|
condition.options = options
|
|
end
|
|
|
|
private
|
|
|
|
def parens(str)
|
|
return "(#{str})" if @condition.is_a?(Negation) || @condition.is_a?(Operator)
|
|
str
|
|
end
|
|
end
|
|
|
|
# A declaration condition (e.g. `(feature: value)`).
|
|
class Declaration < Condition
|
|
# @return [Sass::Script::Tree::Node] The feature name.
|
|
attr_accessor :name
|
|
|
|
# @!attribute resolved_name
|
|
# The name of the feature after any SassScript has been resolved.
|
|
# Only set once \{Tree::Visitors::Perform} has been run.
|
|
#
|
|
# @return [String]
|
|
attr_accessor :resolved_name
|
|
|
|
# The feature value.
|
|
#
|
|
# @return [Sass::Script::Tree::Node]
|
|
attr_accessor :value
|
|
|
|
# The value of the feature after any SassScript has been resolved.
|
|
# Only set once \{Tree::Visitors::Perform} has been run.
|
|
#
|
|
# @return [String]
|
|
attr_accessor :resolved_value
|
|
|
|
def initialize(name, value)
|
|
@name = name
|
|
@value = value
|
|
end
|
|
|
|
def perform(env)
|
|
@resolved_name = name.perform(env)
|
|
@resolved_value = value.perform(env)
|
|
end
|
|
|
|
def to_css
|
|
"(#{@resolved_name}: #{@resolved_value})"
|
|
end
|
|
|
|
def to_src(options)
|
|
"(#{@name.to_sass(options)}: #{@value.to_sass(options)})"
|
|
end
|
|
|
|
def deep_copy
|
|
copy = dup
|
|
copy.name = @name.deep_copy
|
|
copy.value = @value.deep_copy
|
|
copy
|
|
end
|
|
|
|
def options=(options)
|
|
@name.options = options
|
|
@value.options = options
|
|
end
|
|
end
|
|
|
|
# An interpolation condition (e.g. `#{$var}`).
|
|
class Interpolation < Condition
|
|
# The SassScript expression in the interpolation.
|
|
#
|
|
# @return [Sass::Script::Tree::Node]
|
|
attr_accessor :value
|
|
|
|
# The value of the expression after it's been resolved.
|
|
# Only set once \{Tree::Visitors::Perform} has been run.
|
|
#
|
|
# @return [String]
|
|
attr_accessor :resolved_value
|
|
|
|
def initialize(value)
|
|
@value = value
|
|
end
|
|
|
|
def perform(env)
|
|
@resolved_value = value.perform(env).to_s(:quote => :none)
|
|
end
|
|
|
|
def to_css
|
|
@resolved_value
|
|
end
|
|
|
|
def to_src(options)
|
|
@value.to_sass(options)
|
|
end
|
|
|
|
def deep_copy
|
|
copy = dup
|
|
copy.value = @value.deep_copy
|
|
copy
|
|
end
|
|
|
|
def options=(options)
|
|
@value.options = options
|
|
end
|
|
end
|
|
end
|