Class: Sass::Script::Value::Number
- Inherits:
-
Base
- Object
- Base
- Sass::Script::Value::Number
- Defined in:
- .ruby-sass/lib/sass/script/value/number.rb
Overview
A SassScript object representing a number. SassScript numbers can have decimal values, and can also have units. For example, `12`, `1px`, and `10.45em` are all valid values.
Numbers can also have more complex units, such as `1px*em/in`. These cannot be inputted directly in Sass code at the moment.
Constant Summary
- NO_UNITS =
Used so we don't allocate two new arrays for each new number.
[]
Instance Attribute Summary (collapse)
-
#denominator_units ⇒ Array<String>
readonly
A list of units in the denominator of the number.
-
#numerator_units ⇒ Array<String>
readonly
A list of units in the numerator of the number.
-
#original ⇒ Boolean?
The original representation of this number.
-
#value ⇒ Numeric
readonly
The Ruby value of the number.
Attributes inherited from Base
Class Method Summary (collapse)
-
.epsilon ⇒ Object
Used in checking equality of floating point numbers.
- .precision ⇒ Object
-
.precision=(digits) ⇒ Object
Sets the number of digits of precision For example, if this is `3`, `3.1415926` will be printed as `3.142`.
-
.precision_factor ⇒ Object
the precision factor used in numeric output it is derived from the `precision` method.
Instance Method Summary (collapse)
-
#coerce(num_units, den_units) ⇒ Number
Returns this number converted to other units.
-
#comparable_to?(other) ⇒ Boolean
Whether or not this number can be compared with the other.
-
#div(other) ⇒ Value
The SassScript `/` operation.
-
#eq(other) ⇒ Boolean
The SassScript `==` operation.
-
#eql?(other) ⇒ Boolean
Hash-equality works differently than `==` equality for numbers.
-
#gt(other) ⇒ Boolean
The SassScript `>` operation.
-
#gte(other) ⇒ Boolean
The SassScript `>=` operation.
- #hash ⇒ Object
-
#initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS) ⇒ Number
constructor
A new instance of Number.
-
#inspect(opts = {}) ⇒ String
(also: #to_sass)
Returns a readable representation of this number.
-
#int? ⇒ Boolean
Whether or not this number is an integer.
-
#is_unit?(unit) ⇒ Boolean
Checks whether the number has the numerator unit specified.
-
#legal_units? ⇒ Boolean
Whether or not this number has units that can be represented in CSS (that is, zero or one #numerator_units).
-
#lt(other) ⇒ Boolean
The SassScript `<` operation.
-
#lte(other) ⇒ Boolean
The SassScript `<=` operation.
-
#minus(other) ⇒ Value
The SassScript binary `-` operation (e.g. `$a - $b`).
-
#mod(other) ⇒ Number
The SassScript `%` operation.
-
#plus(other) ⇒ Value
The SassScript `+` operation.
-
#times(other) ⇒ Number, Color
The SassScript `*` operation.
-
#to_i ⇒ Integer
The integer value of the number.
-
#to_s(opts = {}) ⇒ String
The CSS representation of this number.
-
#unary_minus ⇒ Number
The SassScript unary `-` operation (e.g. `-$a`).
-
#unary_plus ⇒ Number
The SassScript unary `+` operation (e.g. `+$a`).
-
#unit_str ⇒ String
Returns a human readable representation of the units in this number.
-
#unitless? ⇒ Boolean
Whether or not this number has no units.
Methods inherited from Base
#==, #assert_int!, #bracketed, #neq, #null?, #separator, #single_eq, #to_a, #to_bool, #to_h, #unary_div, #unary_not, #with_contents
Constructor Details
#initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS) ⇒ Number
Returns a new instance of Number
70 71 72 73 74 75 76 77 78 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 70 def initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS) numerator_units = [numerator_units] if numerator_units.is_a?(::String) denominator_units = [denominator_units] if denominator_units.is_a?(::String) super(value) @numerator_units = numerator_units @denominator_units = denominator_units @options = nil normalize! end |
Constructor Details
#initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS) ⇒ Number
Returns a new instance of Number
70 71 72 73 74 75 76 77 78 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 70 def initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS) numerator_units = [numerator_units] if numerator_units.is_a?(::String) denominator_units = [denominator_units] if denominator_units.is_a?(::String) super(value) @numerator_units = numerator_units @denominator_units = denominator_units @options = nil normalize! end |
Instance Attribute Details
#denominator_units ⇒ Array<String> (readonly)
A list of units in the denominator of the number. For example, `1px*em/in*cm` would return `[“in”, “cm”]`
24 25 26 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 24 def denominator_units @denominator_units end |
#numerator_units ⇒ Array<String> (readonly)
A list of units in the numerator of the number. For example, `1px*em/in*cm` would return `[“px”, “em”]`
19 20 21 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 19 def numerator_units @numerator_units end |
#original ⇒ Boolean?
The original representation of this number. For example, although the result of `1px/2px` is `0.5`, the value of `#original` is `“1px/2px”`.
This is only non-nil when the original value should be used as the CSS value, as in `font: 1px/2px`.
34 35 36 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 34 def original @original end |
#value ⇒ Numeric (readonly)
The Ruby value of the number.
14 15 16 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 14 def value @value end |
Class Method Details
.epsilon ⇒ Object
Used in checking equality of floating point numbers. Any numbers within an `epsilon` of each other are considered functionally equal. The value for epsilon is one tenth of the current numeric precision.
60 61 62 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 60 def self.epsilon Thread.current[:sass_numeric_epsilon] ||= 1 / (precision_factor * 10) end |
.precision ⇒ Object
36 37 38 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 36 def self.precision Thread.current[:sass_numeric_precision] || Thread.main[:sass_numeric_precision] || 10 end |
.precision=(digits) ⇒ Object
Sets the number of digits of precision For example, if this is `3`, `3.1415926` will be printed as `3.142`. The numeric precision is stored as a thread local for thread safety reasons. To set for all threads, be sure to set the precision on the main thread.
45 46 47 48 49 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 45 def self.precision=(digits) Thread.current[:sass_numeric_precision] = digits.round Thread.current[:sass_numeric_precision_factor] = nil Thread.current[:sass_numeric_epsilon] = nil end |
.precision_factor ⇒ Object
the precision factor used in numeric output it is derived from the `precision` method.
53 54 55 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 53 def self.precision_factor Thread.current[:sass_numeric_precision_factor] ||= 10.0**precision end |
Instance Method Details
#coerce(num_units, den_units) ⇒ Number
Returns this number converted to other units. The conversion takes into account the relationship between e.g. mm and cm, as well as between e.g. in and cm.
If this number has no units, it will simply return itself with the given units.
An incompatible coercion, e.g. between px and cm, will raise an error.
367 368 369 370 371 372 373 374 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 367 def coerce(num_units, den_units) Number.new(if unitless? value else value * coercion_factor(@numerator_units, num_units) / coercion_factor(@denominator_units, den_units) end, num_units, den_units) end |
#comparable_to?(other) ⇒ Boolean
Returns Whether or not this number can be compared with the other.
378 379 380 381 382 383 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 378 def comparable_to?(other) operate(other, :+) true rescue Sass::UnitConversionError false end |
#div(other) ⇒ Value
The SassScript `/` operation. Its functionality depends on the type of its argument:
Sass::Script::Value::Number : Divides this number by the other, converting units appropriately.
Sass::Script::Value : See Base#div.
172 173 174 175 176 177 178 179 180 181 182 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 172 def div(other) if other.is_a? Number res = operate(other, :/) if original && other.original res.original = "#{original}/#{other.original}" end res else super end end |
#eq(other) ⇒ Boolean
The SassScript `==` operation.
203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 203 def eq(other) return Bool::FALSE unless other.is_a?(Sass::Script::Value::Number) this = self begin if unitless? this = this.coerce(other.numerator_units, other.denominator_units) else other = other.coerce(@numerator_units, @denominator_units) end rescue Sass::UnitConversionError return Bool::FALSE end Bool.new(basically_equal?(this.value, other.value)) end |
#eql?(other) ⇒ Boolean
Hash-equality works differently than `==` equality for numbers. Hash-equality must be transitive, so it just compares the exact value, numerator units, and denominator units.
225 226 227 228 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 225 def eql?(other) basically_equal?(value, other.value) && numerator_units == other.numerator_units && denominator_units == other.denominator_units end |
#gt(other) ⇒ Boolean
The SassScript `>` operation.
235 236 237 238 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 235 def gt(other) raise NoMethodError.new(nil, :gt) unless other.is_a?(Number) operate(other, :>) end |
#gte(other) ⇒ Boolean
The SassScript `>=` operation.
245 246 247 248 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 245 def gte(other) raise NoMethodError.new(nil, :gte) unless other.is_a?(Number) operate(other, :>=) end |
#hash ⇒ Object
218 219 220 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 218 def hash [value, numerator_units, denominator_units].hash end |
#inspect(opts = {}) ⇒ String Also known as: to_sass
Returns a readable representation of this number.
This representation is valid CSS (and valid SassScript) as long as there is only one unit.
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 285 def inspect(opts = {}) return original if original value = self.class.round(self.value) str = value.to_s # Ruby will occasionally print in scientific notation if the number is # small enough. That's technically valid CSS, but it's not well-supported # and confusing. str = ("%0.#{self.class.precision}f" % value).gsub(/0*$/, '') if str.include?('e') # Sometimes numeric formatting will result in a decimal number with a trailing zero (x.0) if str =~ /(.*)\.0$/ str = $1 end # We omit a leading zero before the decimal point in compressed mode. if @options && [:style] == :compressed str.sub!(/^(-)?0\./, '\1.') end unitless? ? str : "#{str}#{unit_str}" end |
#int? ⇒ Boolean
Returns Whether or not this number is an integer.
318 319 320 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 318 def int? basically_equal?(value % 1, 0.0) end |
#is_unit?(unit) ⇒ Boolean
Checks whether the number has the numerator unit specified.
337 338 339 340 341 342 343 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 337 def is_unit?(unit) if unit denominator_units.size == 0 && numerator_units.size == 1 && numerator_units.first == unit else unitless? end end |
#legal_units? ⇒ Boolean
Returns Whether or not this number has units that can be represented in CSS (that is, zero or one #numerator_units).
347 348 349 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 347 def legal_units? (@numerator_units.empty? || @numerator_units.size == 1) && @denominator_units.empty? end |
#lt(other) ⇒ Boolean
The SassScript `<` operation.
255 256 257 258 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 255 def lt(other) raise NoMethodError.new(nil, :lt) unless other.is_a?(Number) operate(other, :<) end |
#lte(other) ⇒ Boolean
The SassScript `<=` operation.
265 266 267 268 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 265 def lte(other) raise NoMethodError.new(nil, :lte) unless other.is_a?(Number) operate(other, :<=) end |
#minus(other) ⇒ Value
The SassScript binary `-` operation (e.g. `$a - $b`). Its functionality depends on the type of its argument:
Sass::Script::Value::Number : Subtracts this number from the other, converting units if possible.
Sass::Script::Value : See Base#minus.
117 118 119 120 121 122 123 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 117 def minus(other) if other.is_a? Number operate(other, :-) else super end end |
#mod(other) ⇒ Number
The SassScript `%` operation.
190 191 192 193 194 195 196 197 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 190 def mod(other) if other.is_a?(Number) return Number.new(Float::NAN) if other.value == 0 operate(other, :%) else raise NoMethodError.new(nil, :mod) end end |
#plus(other) ⇒ Value
The SassScript `+` operation. Its functionality depends on the type of its argument:
Sass::Script::Value::Number : Adds the two numbers together, converting units if possible.
Color : Adds this number to each of the RGB color channels.
Sass::Script::Value : See Base#plus.
95 96 97 98 99 100 101 102 103 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 95 def plus(other) if other.is_a? Number operate(other, :+) elsif other.is_a?(Color) other.plus(self) else super end end |
#times(other) ⇒ Number, Color
The SassScript `*` operation. Its functionality depends on the type of its argument:
Sass::Script::Value::Number : Multiplies the two numbers together, converting units appropriately.
Color : Multiplies each of the RGB color channels by this number.
151 152 153 154 155 156 157 158 159 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 151 def times(other) if other.is_a? Number operate(other, :*) elsif other.is_a? Color other.times(self) else raise NoMethodError.new(nil, :times) end end |
#to_i ⇒ Integer
Returns The integer value of the number
312 313 314 315 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 312 def to_i super unless int? value.to_i end |
#to_s(opts = {}) ⇒ String
Returns The CSS representation of this number
273 274 275 276 277 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 273 def to_s(opts = {}) return original if original raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") unless legal_units? inspect end |
#unary_minus ⇒ Number
The SassScript unary `-` operation (e.g. `-$a`).
135 136 137 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 135 def unary_minus Number.new(-value, @numerator_units, @denominator_units) end |
#unary_plus ⇒ Number
The SassScript unary `+` operation (e.g. `+$a`).
128 129 130 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 128 def unary_plus self end |
#unit_str ⇒ String
Returns a human readable representation of the units in this number. For complex units this takes the form of: numerator_unit1 * numerator_unit2 / denominator_unit1 * denominator_unit2
389 390 391 392 393 394 395 396 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 389 def unit_str rv = @numerator_units.sort.join("*") if @denominator_units.any? rv << "/" rv << @denominator_units.sort.join("*") end rv end |
#unitless? ⇒ Boolean
Returns Whether or not this number has no units.
323 324 325 |
# File '.ruby-sass/lib/sass/script/value/number.rb', line 323 def unitless? @numerator_units.empty? && @denominator_units.empty? end |