Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

149 lines (128 sloc) 5.166 kb
module Sass::Tree
# A static node reprenting a CSS property.
#
# @see Sass::Tree
class PropNode < Node
# The name of the property,
# interspersed with {Sass::Script::Node}s
# representing `#{}`-interpolation.
# Any adjacent strings will be merged together.
#
# @return [Array<String, Sass::Script::Node>]
attr_accessor :name
# The name of the property
# after any interpolated SassScript has been resolved.
# Only set once \{Tree::Visitors::Perform} has been run.
#
# @return [String]
attr_accessor :resolved_name
# The value of the property.
#
# @return [Sass::Script::Node]
attr_accessor :value
# The value of the property
# after any interpolated SassScript has been resolved.
# Only set once \{Tree::Visitors::Perform} has been run.
#
# @return [String]
attr_accessor :resolved_value
# How deep this property is indented
# relative to a normal property.
# This is only greater than 0 in the case that:
#
# * This node is in a CSS tree
# * The style is :nested
# * This is a child property of another property
# * The parent property has a value, and thus will be rendered
#
# @return [Fixnum]
attr_accessor :tabs
# @param name [Array<String, Sass::Script::Node>] See \{#name}
# @param value [Sass::Script::Node] See \{#value}
# @param prop_syntax [Symbol] `:new` if this property uses `a: b`-style syntax,
# `:old` if it uses `:a b`-style syntax
def initialize(name, value, prop_syntax)
@name = Sass::Util.strip_string_array(
Sass::Util.merge_adjacent_strings(name))
@value = value
@tabs = 0
@prop_syntax = prop_syntax
super()
end
# Compares the names and values of two properties.
#
# @param other [Object] The object to compare with
# @return [Boolean] Whether or not this node and the other object
# are the same
def ==(other)
self.class == other.class && name == other.name && value == other.value && super
end
# Returns a appropriate message indicating how to escape pseudo-class selectors.
# This only applies for old-style properties with no value,
# so returns the empty string if this is new-style.
#
# @return [String] The message
def pseudo_class_selector_message
return "" if @prop_syntax == :new || !value.is_a?(Sass::Script::String) || !value.value.empty?
"\nIf #{declaration.dump} should be a selector, use \"\\#{declaration}\" instead."
end
# Computes the Sass or SCSS code for the variable declaration.
# This is like \{#to\_scss} or \{#to\_sass},
# except it doesn't print any child properties or a trailing semicolon.
#
# @param opts [{Symbol => Object}] The options hash for the tree.
# @param fmt [Symbol] `:scss` or `:sass`.
def declaration(opts = {:old => @prop_syntax == :old}, fmt = :sass)
name = self.name.map {|n| n.is_a?(String) ? n : "\#{#{n.to_sass(opts)}}"}.join
if name[0] == ?:
raise Sass::SyntaxError.new("The \"#{name}: #{self.class.val_to_sass(value, opts)}\" hack is not allowed in the Sass indented syntax")
end
old = opts[:old] && fmt == :sass
initial = old ? ':' : ''
mid = old ? '' : ':'
"#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}".rstrip
end
private
def check!
if @options[:property_syntax] && @options[:property_syntax] != @prop_syntax
raise Sass::SyntaxError.new(
"Illegal property syntax: can't use #{@prop_syntax} syntax when :property_syntax => #{@options[:property_syntax].inspect} is set.")
elsif value.is_a?(Sass::Script::String) && value.to_s.empty?
raise Sass::SyntaxError.new("Invalid property: #{declaration.dump} (no value)." +
pseudo_class_selector_message)
end
end
class << self
# @private
def val_to_sass(value, opts)
val_to_sass_comma(value, opts).to_sass(opts)
end
private
def val_to_sass_comma(node, opts)
return node unless node.is_a?(Sass::Script::Operation)
return val_to_sass_concat(node, opts) unless node.operator == :comma
Sass::Script::Operation.new(
val_to_sass_concat(node.operand1, opts),
val_to_sass_comma(node.operand2, opts),
node.operator)
end
def val_to_sass_concat(node, opts)
return node unless node.is_a?(Sass::Script::Operation)
return val_to_sass_div(node, opts) unless node.operator == :space
Sass::Script::Operation.new(
val_to_sass_div(node.operand1, opts),
val_to_sass_concat(node.operand2, opts),
node.operator)
end
def val_to_sass_div(node, opts)
unless node.is_a?(Sass::Script::Operation) && node.operator == :div &&
node.operand1.is_a?(Sass::Script::Number) &&
node.operand2.is_a?(Sass::Script::Number) &&
(!node.operand1.original || !node.operand2.original)
return node
end
Sass::Script::String.new("(#{node.to_sass(opts)})")
end
end
end
end
Jump to Line
Something went wrong with that request. Please try again.