diff --git a/lib/sass/script/number.rb b/lib/sass/script/number.rb index 9806d256..b3a80b59 100644 --- a/lib/sass/script/number.rb +++ b/lib/sass/script/number.rb @@ -25,6 +25,8 @@ module Sass::Script # @return [Array] attr_reader :denominator_units + attr_accessor :original + # The precision with which numbers will be printed to CSS files. # For example, if this is `1000.0`, # `3.1415926` will be printed as `3.142`. @@ -134,7 +136,9 @@ module Sass::Script # @return [Literal] The result of the operation def div(other) if other.is_a? Number - operate(other, :/) + res = operate(other, :/) + res.original = "#{self.original}/#{other.original}" if self.original && other.original + res else super end @@ -221,6 +225,7 @@ module Sass::Script # @raise [Sass::SyntaxError] if this number has units that can't be used in CSS # (e.g. `px*in`) def to_s + return original if original raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") unless legal_units? inspect end diff --git a/lib/sass/script/parser.rb b/lib/sass/script/parser.rb index 7bdbac64..8ce1a0a1 100644 --- a/lib/sass/script/parser.rb +++ b/lib/sass/script/parser.rb @@ -262,9 +262,13 @@ RUBY def paren return variable unless try_tok(:lparen) + was_in_parens = @in_parens + @in_parens = true e = assert_expr(:expr) assert_tok(:rparen) return e + ensure + @in_parens = was_in_parens end def variable @@ -273,7 +277,7 @@ RUBY end def string - return literal unless first = try_tok(:string) + return number unless first = try_tok(:string) return first.value unless try_tok(:begin_interpolation) line = @lexer.line mid = parse_interpolated @@ -283,8 +287,15 @@ RUBY op end + def number + return literal unless tok = try_tok(:number) + num = tok.value + num.original = num.to_s unless @in_parens + num + end + def literal - (t = try_tok(:number, :color, :bool)) && (return t.value) + (t = try_tok(:color, :bool)) && (return t.value) end # It would be possible to have unified #assert and #try methods, diff --git a/lib/sass/script/variable.rb b/lib/sass/script/variable.rb index cf0d51a1..b12c17ce 100644 --- a/lib/sass/script/variable.rb +++ b/lib/sass/script/variable.rb @@ -36,8 +36,12 @@ module Sass # @return [Literal] The SassScript object that is the value of the variable # @raise [Sass::SyntaxError] if the variable is undefined def _perform(environment) - (val = environment.var(name)) && (return val) - raise SyntaxError.new("Undefined variable: \"$#{name}\".") + raise SyntaxError.new("Undefined variable: \"$#{name}\".") unless val = environment.var(name) + if val.is_a?(Number) + val = val.dup + val.original = nil + end + return val end end end diff --git a/test/sass/script_test.rb b/test/sass/script_test.rb index 43579d99..f5ccfc9e 100755 --- a/test/sass/script_test.rb +++ b/test/sass/script_test.rb @@ -182,8 +182,8 @@ SASS assert_equal "2", resolve("1 + 1") assert_equal "0", resolve("1 - 1") assert_equal "8", resolve("2 * 4") - assert_equal "0.5", resolve("2 / 4") - assert_equal "2", resolve("4 / 2") + assert_equal "0.5", resolve("(2 / 4)") + assert_equal "2", resolve("(4 / 2)") assert_equal "-1", resolve("-1") end diff --git a/test/sass/scss/css_test.rb b/test/sass/scss/css_test.rb index 654ea55e..e84f4a68 100755 --- a/test/sass/scss/css_test.rb +++ b/test/sass/scss/css_test.rb @@ -297,7 +297,7 @@ SCSS assert_parses <