Class: Sass::Script::Funcall
Overview
A SassScript parse node representing a function call.
A function call either calls one of the functions in Functions, or if no function with the given name exists it returns a string representation of the function call.
Instance Attribute Summary collapse
-
#args ⇒ Array<Script::Node>
readonly
The arguments to the function.
-
#keywords ⇒ {String => Script::Node}
readonly
The keyword arguments to the function.
-
#name ⇒ String
readonly
The name of the function.
-
#splat ⇒ Script::Node?
The splat argument for this function, if one exists.
Attributes inherited from Node
Instance Method Summary collapse
-
#_perform(environment) ⇒ Literal
protected
Evaluates the function call.
-
#children ⇒ Array<Node>
Returns the arguments to the function.
- #deep_copy
-
#initialize(name, args, keywords, splat) ⇒ Funcall
constructor
A new instance of Funcall.
-
#inspect ⇒ String
A string representation of the function call.
-
#to_literal(args)
protected
This method is factored out from
_perform
so that compass can override it with a cross-browser implementation for functions that require vendor prefixes in the generated css. - #to_sass(opts = {})
Methods inherited from Node
Constructor Details
#initialize(name, args, keywords, splat) ⇒ Funcall
Returns a new instance of Funcall.
35 36 37 38 39 40 41 |
# File 'lib/sass/script/funcall.rb', line 35
def initialize(name, args, keywords, splat)
@name = name
@args = args
@keywords = keywords
@splat = splat
super()
end
|
Instance Attribute Details
#args ⇒ Array<Script::Node> (readonly)
The arguments to the function.
19 20 21 |
# File 'lib/sass/script/funcall.rb', line 19
def args
@args
end
|
#keywords ⇒ {String => Script::Node} (readonly)
The keyword arguments to the function.
24 25 26 |
# File 'lib/sass/script/funcall.rb', line 24
def keywords
@keywords
end
|
#name ⇒ String (readonly)
The name of the function.
14 15 16 |
# File 'lib/sass/script/funcall.rb', line 14
def name
@name
end
|
#splat ⇒ Script::Node?
The splat argument for this function, if one exists.
29 30 31 |
# File 'lib/sass/script/funcall.rb', line 29
def splat
@splat
end
|
Instance Method Details
#_perform(environment) ⇒ Literal (protected)
Evaluates the function call.
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 |
# File 'lib/sass/script/funcall.rb', line 92
def _perform(environment)
args = @args.map {|a| a.perform(environment)}
splat = @splat.perform(environment) if @splat
if fn = environment.function(@name)
keywords = Sass::Util.map_hash(@keywords) {|k, v| [k, v.perform(environment)]}
return perform_sass_fn(fn, args, keywords, splat)
end
ruby_name = @name.tr('-', '_')
args = construct_ruby_args(ruby_name, args, splat, environment)
unless Functions.callable?(ruby_name)
opts(to_literal(args))
else
opts(Functions::EvaluationContext.new(environment.options).send(ruby_name, *args))
end
rescue ArgumentError => e
# If this is a legitimate Ruby-raised argument error, re-raise it.
# Otherwise, it's an error in the user's stylesheet, so wrap it.
if e.message =~ /^wrong number of arguments \(\d+ for \d+\)/ &&
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/ &&
# JRuby (as of 1.6.7.2) doesn't put the actual method for
# which the argument error was thrown in the backtrace, so
# we detect whether our send threw an argument error.
(RUBY_PLATFORM !~ /java/ || e.backtrace[0] !~ /:in `send'$/ ||
e.backtrace[1] !~ /:in `_perform'$/)
raise e
end
raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
end
|
#children ⇒ Array<Node>
Returns the arguments to the function.
71 72 73 74 75 |
# File 'lib/sass/script/funcall.rb', line 71
def children
res = @args + @keywords.values
res << @splat if @splat
res
end
|
#deep_copy
78 79 80 81 82 83 |
# File 'lib/sass/script/funcall.rb', line 78
def deep_copy
node = dup
node.instance_variable_set('@args', args.map {|a| a.deep_copy})
node.instance_variable_set('@keywords', Hash[keywords.map {|k, v| [k, v.deep_copy]}])
node
end
|
#inspect ⇒ String
Returns A string representation of the function call.
44 45 46 47 48 49 50 51 52 53 |
# File 'lib/sass/script/funcall.rb', line 44
def inspect
args = @args.map {|a| a.inspect}.join(', ')
keywords = Sass::Util.hash_to_a(@keywords).
map {|k, v| "$#{k}: #{v.inspect}"}.join(', ')
if self.splat
splat = (args.empty? && keywords.empty?) ? "" : ", "
splat = "#{splat}#{self.splat.inspect}..."
end
"#{name}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords}#{splat})"
end
|
#to_literal(args) (protected)
This method is factored out from _perform
so that compass can override
it with a cross-browser implementation for functions that require vendor prefixes
in the generated css.
126 127 128 |
# File 'lib/sass/script/funcall.rb', line 126
def to_literal(args)
Script::String.new("#{name}(#{args.join(', ')})")
end
|
#to_sass(opts = {})
56 57 58 59 60 61 62 63 64 65 |
# File 'lib/sass/script/funcall.rb', line 56
def to_sass(opts = {})
args = @args.map {|a| a.to_sass(opts)}.join(', ')
keywords = Sass::Util.hash_to_a(@keywords).
map {|k, v| "$#{dasherize(k, opts)}: #{v.to_sass(opts)}"}.join(', ')
if self.splat
splat = (args.empty? && keywords.empty?) ? "" : ", "
splat = "#{splat}#{self.splat.inspect}..."
end
"#{dasherize(name, opts)}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords}#{splat})"
end
|