Class: Sass::Script::Funcall

Inherits:
Node
  • Object
show all
Defined in:
lib/sass/script/funcall.rb

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

Attributes inherited from Node

#line, #options

Instance Method Summary collapse

Methods inherited from Node

#dasherize, #opts, #perform

Constructor Details

#initialize(name, args, keywords) ⇒ Funcall

Returns a new instance of Funcall.

Parameters:



29
30
31
32
33
34
# File 'lib/sass/script/funcall.rb', line 29

def initialize(name, args, keywords)
  @name = name
  @args = args
  @keywords = keywords
  super()
end

Instance Attribute Details

#argsArray<Script::Node> (readonly)

The arguments to the function.

Returns:



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.

Returns:



24
25
26
# File 'lib/sass/script/funcall.rb', line 24

def keywords
  @keywords
end

#nameString (readonly)

The name of the function.

Returns:



14
15
16
# File 'lib/sass/script/funcall.rb', line 14

def name
  @name
end

Instance Method Details

#_perform(environment) ⇒ Literal (protected)

Evaluates the function call.

Parameters:

  • environment (Sass::Environment)

    The environment in which to evaluate the SassScript

Returns:

  • (Literal)

    The SassScript object that is the value of the function call

Raises:



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/sass/script/funcall.rb', line 75

def _perform(environment)
  args = @args.map {|a| a.perform(environment)}
  if fn = environment.function(@name)
    keywords = Sass::Util.map_hash(@keywords) {|k, v| [k, v.perform(environment)]}
    return perform_sass_fn(fn, args, keywords)
  end

  ruby_name = @name.tr('-', '_')
  args = construct_ruby_args(ruby_name, args, 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}'$/
    raise e
  end
  raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
end

#childrenArray<Node>

Returns the arguments to the function.

Returns:

See Also:



56
57
58
# File 'lib/sass/script/funcall.rb', line 56

def children
  @args + @keywords.values
end

#deep_copy

See Also:



61
62
63
64
65
66
# File 'lib/sass/script/funcall.rb', line 61

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

#inspectString

Returns A string representation of the function call.

Returns:

  • (String)

    A string representation of the function call



37
38
39
40
41
42
# File 'lib/sass/script/funcall.rb', line 37

def inspect
  args = @args.map {|a| a.inspect}.join(', ')
  keywords = @keywords.sort_by {|k, v| k}.
      map {|k, v| "$#{k}: #{v.inspect}"}.join(', ')
  "#{name}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords})"
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.



103
104
105
# File 'lib/sass/script/funcall.rb', line 103

def to_literal(args)
  Script::String.new("#{name}(#{args.join(', ')})")
end

#to_sass(opts = {})

See Also:



45
46
47
48
49
50
# File 'lib/sass/script/funcall.rb', line 45

def to_sass(opts = {})
  args = @args.map {|a| a.to_sass(opts)}.join(', ')
  keywords = @keywords.sort_by {|k, v| k}.
    map {|k, v| "$#{dasherize(k, opts)}: #{v.to_sass(opts)}"}.join(', ')
  "#{dasherize(name, opts)}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords})"
end