mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
Delay SassScript variable resolution until #perform.
This commit is contained in:
parent
983f8c199e
commit
6e347d5cca
7 changed files with 34 additions and 28 deletions
|
@ -1,4 +1,5 @@
|
|||
require 'strscan'
|
||||
require 'sass/script/variable'
|
||||
require 'sass/script/funcall'
|
||||
require 'sass/script/operation'
|
||||
require 'sass/script/literal'
|
||||
|
@ -22,7 +23,7 @@ module Sass
|
|||
end
|
||||
|
||||
def self.parse(value, environment, line)
|
||||
Parser.parse(value, environment).perform
|
||||
Parser.parse(value).perform(environment)
|
||||
rescue Sass::SyntaxError => e
|
||||
if e.message == "SassScript error"
|
||||
e.instance_eval do
|
||||
|
|
|
@ -8,18 +8,14 @@ module Sass
|
|||
@args = args
|
||||
end
|
||||
|
||||
def to_s
|
||||
perform.to_s
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#{name}(#{args.map {|a| a.inspect}.join(', ')})"
|
||||
end
|
||||
|
||||
def perform
|
||||
args = self.args.map {|a| a.perform}
|
||||
def perform(environment)
|
||||
args = self.args.map {|a| a.perform(environment)}
|
||||
unless Functions.public_instance_methods.include?(name) && name !~ /^__/
|
||||
return Script::String.new("#{name}(#{args.join(', ')})")
|
||||
return Script::String.new("#{name}(#{args.map {|a| a.perform(environment)}.join(', ')})")
|
||||
end
|
||||
|
||||
return Functions.send(name, *args)
|
||||
|
|
|
@ -10,7 +10,7 @@ class Sass::Script::Literal # :nodoc:
|
|||
@value = value
|
||||
end
|
||||
|
||||
def perform
|
||||
def perform(environment)
|
||||
self
|
||||
end
|
||||
|
||||
|
|
|
@ -12,17 +12,13 @@ module Sass::Script
|
|||
@operator = operator
|
||||
end
|
||||
|
||||
def to_s
|
||||
self.perform.to_s
|
||||
end
|
||||
|
||||
def inspect
|
||||
"(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})"
|
||||
end
|
||||
|
||||
def perform
|
||||
literal1 = @operand1.perform
|
||||
literal2 = @operand2.perform
|
||||
def perform(environment)
|
||||
literal1 = @operand1.perform(environment)
|
||||
literal2 = @operand2.perform(environment)
|
||||
begin
|
||||
literal1.send(@operator, literal2)
|
||||
rescue NoMethodError => e
|
||||
|
|
|
@ -2,10 +2,9 @@ require 'sass/script/lexer'
|
|||
|
||||
module Sass
|
||||
module Script
|
||||
class Parser # :nodoc:
|
||||
def initialize(str, environment = {})
|
||||
class Parser
|
||||
def initialize(str)
|
||||
@lexer = Lexer.new(str)
|
||||
@environment = environment
|
||||
end
|
||||
|
||||
def parse
|
||||
|
@ -88,9 +87,7 @@ RUBY
|
|||
|
||||
def variable
|
||||
return literal unless c = try_tok(:const)
|
||||
(val = @environment[c.last]) && (return val)
|
||||
|
||||
raise SyntaxError.new("Undefined variable: \"!#{c.last}\".")
|
||||
Variable.new(c.last)
|
||||
end
|
||||
|
||||
def literal
|
||||
|
|
|
@ -5,17 +5,13 @@ module Sass::Script
|
|||
@operator = operator
|
||||
end
|
||||
|
||||
def to_s
|
||||
self.perform.to_s
|
||||
end
|
||||
|
||||
def inspect
|
||||
"(#{@operator.inspect} #{@operand.inspect})"
|
||||
end
|
||||
|
||||
def perform
|
||||
def perform(environment)
|
||||
operator = "unary_#{@operator}"
|
||||
literal = @operand.perform
|
||||
literal = @operand.perform(environment)
|
||||
literal.send(operator)
|
||||
rescue NoMethodError => e
|
||||
raise e unless e.name.to_s == operator.to_s
|
||||
|
|
20
lib/sass/script/variable.rb
Normal file
20
lib/sass/script/variable.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
module Sass
|
||||
module Script
|
||||
class Variable # :nodoc:
|
||||
attr_reader :name
|
||||
|
||||
def initialize(name)
|
||||
@name = name
|
||||
end
|
||||
|
||||
def inspect
|
||||
"!#{name}"
|
||||
end
|
||||
|
||||
def perform(environment)
|
||||
(val = environment[name]) && (return val)
|
||||
raise SyntaxError.new("Undefined variable: \"!#{name}\".")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Reference in a new issue