diff --git a/lib/sass/engine.rb b/lib/sass/engine.rb index 6b30830f..dedf6772 100644 --- a/lib/sass/engine.rb +++ b/lib/sass/engine.rb @@ -413,9 +413,9 @@ END Tree::MixinNode.new(name, args.map {|s| parse_script(s)}, @options) end - def parse_script(script, line = nil) + def parse_script(script, line = nil, offset = 0) line ||= @line - Script.parse(script, line) + Script.parse(script, line, offset) end def import_paths paths = @options[:load_paths] || [] diff --git a/lib/sass/script.rb b/lib/sass/script.rb index 68366873..0715d5f6 100644 --- a/lib/sass/script.rb +++ b/lib/sass/script.rb @@ -18,12 +18,12 @@ module Sass # The regular expression used to validate variables without matching VALIDATE = /^!\w+$/ - def self.resolve(value, line, environment) - parse(value, line).perform(environment).to_s + def self.resolve(value, line, offset, environment) + parse(value, line, offset).perform(environment).to_s end - def self.parse(value, line) - Parser.parse(value) + def self.parse(value, line, offset) + Parser.parse(value, line, offset) rescue Sass::SyntaxError => e if e.message == "SassScript error" e.instance_eval do diff --git a/lib/sass/script/lexer.rb b/lib/sass/script/lexer.rb index c0869e9a..5a43e67c 100644 --- a/lib/sass/script/lexer.rb +++ b/lib/sass/script/lexer.rb @@ -38,8 +38,10 @@ module Sass :op => %r{(#{Regexp.union(*OP_NAMES.map{|s| Regexp.new(Regexp.escape(s) + (s =~ /\w$/ ? '(?:\b|$)' : ''))})})} } - def initialize(str) + def initialize(str, line, offset) @scanner = StringScanner.new(str) + @line = line + @offset = offset end def token diff --git a/lib/sass/script/parser.rb b/lib/sass/script/parser.rb index 49edecd4..f4131b9b 100644 --- a/lib/sass/script/parser.rb +++ b/lib/sass/script/parser.rb @@ -3,8 +3,8 @@ require 'sass/script/lexer' module Sass module Script class Parser - def initialize(str) - @lexer = Lexer.new(str) + def initialize(str, line, offset) + @lexer = Lexer.new(str, line, offset) end def parse diff --git a/lib/sass/tree/node.rb b/lib/sass/tree/node.rb index 26c02081..7201f64b 100644 --- a/lib/sass/tree/node.rb +++ b/lib/sass/tree/node.rb @@ -68,7 +68,7 @@ module Sass if escapes % 2 == 1 str << '#{' else - str << Sass::Script.resolve(balance(scan, ?{, ?}, 1)[0][0...-1], line, environment) + str << Sass::Script.resolve(balance(scan, ?{, ?}, 1)[0][0...-1], line, scan.pos - scan.matchedsize, environment) end end diff --git a/test/sass/functions_test.rb b/test/sass/functions_test.rb index 8be04739..724e019a 100644 --- a/test/sass/functions_test.rb +++ b/test/sass/functions_test.rb @@ -78,11 +78,12 @@ class SassFunctionTest < Test::Unit::TestCase private def assert_rgb_hsl(rgb, hsl) - assert_equal(rgb, Sass::Script::Functions.hsl(*hsl.map(&Sass::Script::Parser.method(:parse))).value) + hsl = hsl.map {|v| Sass::Script::Parser.parse v, 0, 0 } + assert_equal(rgb, Sass::Script::Functions.hsl(*hsl).value) end def evaluate(value) - Sass::Script::Parser.parse(value).perform({}).to_s + Sass::Script::Parser.parse(value, 0, 0).perform({}).to_s end def assert_error_message(message, value) diff --git a/test/sass/script_test.rb b/test/sass/script_test.rb index f1aa0ddb..5ed7c1c2 100644 --- a/test/sass/script_test.rb +++ b/test/sass/script_test.rb @@ -6,7 +6,7 @@ class SassScriptTest < Test::Unit::TestCase include Sass::Script def eval(str, environment = {}) - Sass::Script.resolve(str, 0, environment) + Sass::Script.resolve(str, 0, 0, environment) end def test_color_checks_input