138 lines
4.1 KiB
Ruby
138 lines
4.1 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
# The abstract superclass for SassScript objects.
|
||
# Many of these methods, especially the ones that correspond to SassScript operations,
|
||
# are designed to be overridden by subclasses which may change the semantics somewhat.
|
||
# The operations listed here are just the defaults.
|
||
|
||
class SassC::Script::Value
|
||
|
||
# Returns the pure Ruby value of the value.
|
||
# The type of this value varies based on the subclass.
|
||
attr_reader :value
|
||
|
||
# The source range in the document on which this node appeared.
|
||
attr_accessor :source_range
|
||
|
||
# Creates a new value.
|
||
def initialize(value = nil)
|
||
value.freeze unless value.nil? || value == true || value == false
|
||
@value = value
|
||
@options = nil
|
||
end
|
||
|
||
# Sets the options hash for this node,
|
||
# as well as for all child nodes.
|
||
# See the official Sass reference for options.
|
||
attr_writer :options
|
||
|
||
# Returns the options hash for this node.
|
||
# Raises SassC::SyntaxError if the value was created
|
||
# outside of the parser and \{#to\_s} was called on it
|
||
def options
|
||
return @options if @options
|
||
raise SassC::SyntaxError.new("The #options attribute is not set on this #{self.class}. This error is probably occurring because #to_s was called on this value within a custom Sass function without first setting the #options attribute.")
|
||
end
|
||
|
||
# Returns the hash code of this value. Two objects' hash codes should be
|
||
# equal if the objects are equal.
|
||
def hash
|
||
value.hash
|
||
end
|
||
|
||
# True if this Value is the same as `other`
|
||
def eql?(other)
|
||
self == other
|
||
end
|
||
|
||
# Returns a system inspect value for this object
|
||
def inspect
|
||
value.inspect
|
||
end
|
||
|
||
# Returns `true` (all Values are truthy)
|
||
def to_bool
|
||
true
|
||
end
|
||
|
||
# Compares this object to `other`
|
||
def ==(other)
|
||
self.class == other.class && value == other.value
|
||
end
|
||
|
||
# Returns the integer value of this value.
|
||
# Raises SassC::SyntaxError if this value doesn’t implment integer conversion.
|
||
def to_i
|
||
raise SassC::SyntaxError.new("#{inspect} is not an integer.")
|
||
end
|
||
|
||
# @raise [SassC::SyntaxError] if this value isn't an integer
|
||
def assert_int!; to_i; end
|
||
|
||
# Returns the separator for this value. For non-list-like values or the
|
||
# empty list, this will be `nil`. For lists or maps, it will be `:space` or `:comma`.
|
||
def separator
|
||
nil
|
||
end
|
||
|
||
# Whether the value is surrounded by square brackets. For non-list values,
|
||
# this will be `false`.
|
||
def bracketed
|
||
false
|
||
end
|
||
|
||
# Returns the value of this Value as an array.
|
||
# Single Values are considered the same as single-element arrays.
|
||
def to_a
|
||
[self]
|
||
end
|
||
|
||
# Returns the value of this value as a hash. Most values don't have hash
|
||
# representations, but [Map]s and empty [List]s do.
|
||
#
|
||
# @return [Hash<Value, Value>] This value as a hash
|
||
# @raise [SassC::SyntaxError] if this value doesn't have a hash representation
|
||
def to_h
|
||
raise SassC::SyntaxError.new("#{inspect} is not a map.")
|
||
end
|
||
|
||
# Returns the string representation of this value
|
||
# as it would be output to the CSS document.
|
||
#
|
||
# @options opts :quote [String]
|
||
# The preferred quote style for quoted strings. If `:none`, strings are
|
||
# always emitted unquoted.
|
||
# @return [String]
|
||
def to_s(opts = {})
|
||
SassC::Util.abstract(self)
|
||
end
|
||
alias_method :to_sass, :to_s
|
||
|
||
# Returns `false` (all Values are truthy)
|
||
def null?
|
||
false
|
||
end
|
||
|
||
# Creates a new list containing `contents` but with the same brackets and
|
||
# separators as this object, when interpreted as a list.
|
||
#
|
||
# @param contents [Array<Value>] The contents of the new list.
|
||
# @param separator [Symbol] The separator of the new list. Defaults to \{#separator}.
|
||
# @param bracketed [Boolean] Whether the new list is bracketed. Defaults to \{#bracketed}.
|
||
# @return [Sass::Script::Value::List]
|
||
def with_contents(contents, separator: self.separator, bracketed: self.bracketed)
|
||
SassC::Script::Value::List.new(contents, separator: separator, bracketed: bracketed)
|
||
end
|
||
|
||
protected
|
||
|
||
# Evaluates the value.
|
||
#
|
||
# @param environment [Sass::Environment] The environment in which to evaluate the SassScript
|
||
# @return [Value] This value
|
||
def _perform(environment)
|
||
self
|
||
end
|
||
|
||
end
|