1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
|
module Sass::Script::Value
# 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 Base
# Returns the Ruby value of the value.
# The type of this value varies based on the subclass.
#
# @return [Object]
attr_reader :value
# The source range in the document on which this node appeared.
#
# @return [Sass::Source::Range]
attr_accessor :source_range
# Creates a new value.
#
# @param value [Object] The object for \{#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 {file:SASS_REFERENCE.md#Options the Sass options documentation}.
#
# @param options [{Symbol => Object}] The options
attr_writer :options
# Returns the options hash for this node.
#
# @return [{Symbol => Object}]
# @raise [Sass::SyntaxError] if the options hash hasn't been set.
# This should only happen when the value was created
# outside of the parser and \{#to\_s} was called on it
def options
return @options if @options
raise Sass::SyntaxError.new(<<MSG)
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.
MSG
end
# The SassScript `==` operation.
# **Note that this returns a {Sass::Script::Value::Bool} object,
# not a Ruby boolean**.
#
# @param other [Value] The right-hand side of the operator
# @return [Sass::Script::Value::Bool] True if this value is the same as the other,
# false otherwise
def eq(other)
Sass::Script::Value::Bool.new(self.class == other.class && value == other.value)
end
# The SassScript `!=` operation.
# **Note that this returns a {Sass::Script::Value::Bool} object,
# not a Ruby boolean**.
#
# @param other [Value] The right-hand side of the operator
# @return [Sass::Script::Value::Bool] False if this value is the same as the other,
# true otherwise
def neq(other)
Sass::Script::Value::Bool.new(!eq(other).to_bool)
end
# The SassScript `==` operation.
# **Note that this returns a {Sass::Script::Value::Bool} object,
# not a Ruby boolean**.
#
# @param other [Value] The right-hand side of the operator
# @return [Sass::Script::Value::Bool] True if this value is the same as the other,
# false otherwise
def unary_not
Sass::Script::Value::Bool.new(!to_bool)
end
# The SassScript `=` operation
# (used for proprietary MS syntax like `alpha(opacity=20)`).
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing both values
# separated by `"="`
def single_eq(other)
Sass::Script::Value::String.new("#{self}=#{other}")
end
# The SassScript `+` operation.
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing both values
# without any separation
def plus(other)
type = other.is_a?(Sass::Script::Value::String) ? other.type : :identifier
Sass::Script::Value::String.new(to_s(:quote => :none) + other.to_s(:quote => :none), type)
end
# The SassScript `-` operation.
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing both values
# separated by `"-"`
def minus(other)
Sass::Script::Value::String.new("#{self}-#{other}")
end
# The SassScript `/` operation.
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing both values
# separated by `"/"`
def div(other)
Sass::Script::Value::String.new("#{self}/#{other}")
end
# The SassScript unary `+` operation (e.g. `+$a`).
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing the value
# preceded by `"+"`
def unary_plus
Sass::Script::Value::String.new("+#{self}")
end
# The SassScript unary `-` operation (e.g. `-$a`).
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing the value
# preceded by `"-"`
def unary_minus
Sass::Script::Value::String.new("-#{self}")
end
# The SassScript unary `/` operation (e.g. `/$a`).
#
# @param other [Value] The right-hand side of the operator
# @return [Script::Value::String] A string containing the value
# preceded by `"/"`
def unary_div
Sass::Script::Value::String.new("/#{self}")
end
# Returns the hash code of this value. Two objects' hash codes should be
# equal if the objects are equal.
#
# @return [Integer for Ruby 2.4.0+, Fixnum for earlier Ruby versions] The hash code.
def hash
value.hash
end
def eql?(other)
self == other
end
# @return [String] A readable representation of the value
def inspect
value.inspect
end
# @return [Boolean] `true` (the Ruby boolean value)
def to_bool
true
end
# Compares this object with another.
#
# @param other [Object] The object to compare with
# @return [Boolean] Whether or not this value is equivalent to `other`
def ==(other)
eq(other).to_bool
end
# @return [Integer] The integer value of this value
# @raise [Sass::SyntaxError] if this value isn't an integer
def to_i
raise Sass::SyntaxError.new("#{inspect} is not an integer.")
end
# @raise [Sass::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`.
#
# @return [Symbol]
def separator; nil; end
# Whether the value is surrounded by square brackets. For non-list values,
# this will be `false`.
#
# @return [Boolean]
def bracketed; false; end
# Returns the value of this value as a list.
# Single values are considered the same as single-element lists.
#
# @return [Array<Value>] This value as a list
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 [Sass::SyntaxError] if this value doesn't have a hash representation
def to_h
raise Sass::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 = {})
Sass::Util.abstract(self)
end
alias_method :to_sass, :to_s
# Returns whether or not this object is null.
#
# @return [Boolean] `false`
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)
Sass::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
end
|