~george-edison55/less/trunk

« back to all changes in this revision

Viewing changes to lib/less/tree/call.js

  • Committer: Nathan Osman
  • Date: 2013-04-16 22:43:51 UTC
  • Revision ID: admin@quickmediasolutions.com-20130416224351-5juqujuu4itkwpat
Initial commit.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
(function (tree) {
 
2
 
 
3
//
 
4
// A function call node.
 
5
//
 
6
tree.Call = function (name, args, index, currentFileInfo) {
 
7
    this.name = name;
 
8
    this.args = args;
 
9
    this.index = index;
 
10
    this.currentFileInfo = currentFileInfo;
 
11
};
 
12
tree.Call.prototype = {
 
13
    type: "Call",
 
14
    accept: function (visitor) {
 
15
        this.args = visitor.visit(this.args);
 
16
    },
 
17
    //
 
18
    // When evaluating a function call,
 
19
    // we either find the function in `tree.functions` [1],
 
20
    // in which case we call it, passing the  evaluated arguments,
 
21
    // if this returns null or we cannot find the function, we 
 
22
    // simply print it out as it appeared originally [2].
 
23
    //
 
24
    // The *functions.js* file contains the built-in functions.
 
25
    //
 
26
    // The reason why we evaluate the arguments, is in the case where
 
27
    // we try to pass a variable to a function, like: `saturate(@color)`.
 
28
    // The function should receive the value, not the variable.
 
29
    //
 
30
    eval: function (env) {
 
31
        var args = this.args.map(function (a) { return a.eval(env); }),
 
32
            nameLC = this.name.toLowerCase(),
 
33
            result, func;
 
34
 
 
35
        if (nameLC in tree.functions) { // 1.
 
36
            try {
 
37
                func = new tree.functionCall(env, this.currentFileInfo);
 
38
                result = func[nameLC].apply(func, args);
 
39
                if (result != null) {
 
40
                    return result;
 
41
                }
 
42
            } catch (e) {
 
43
                throw { type: e.type || "Runtime",
 
44
                        message: "error evaluating function `" + this.name + "`" +
 
45
                                 (e.message ? ': ' + e.message : ''),
 
46
                        index: this.index, filename: this.currentFileInfo.filename };
 
47
            }
 
48
        }
 
49
        
 
50
        // 2.
 
51
        return new(tree.Anonymous)(this.name +
 
52
            "(" + args.map(function (a) { return a.toCSS(env); }).join(', ') + ")");
 
53
    },
 
54
 
 
55
    toCSS: function (env) {
 
56
        return this.eval(env).toCSS();
 
57
    }
 
58
};
 
59
 
 
60
})(require('../tree'));