stylus
Version:
Robust, expressive, and feature-rich CSS superset
105 lines (89 loc) • 1.76 kB
JavaScript
/*!
* Stylus - Function
* Copyright(c) 2010 LearnBoost <dev@learnboost.com>
* MIT Licensed
*/
/**
* Module dependencies.
*/
var Node = require('./node');
/**
* Initialize a new `Function` with `name`, `params`, and `body`.
*
* @param {String} name
* @param {Params|Function} params
* @param {Block} body
* @api public
*/
var Function = module.exports = function Function(name, params, body){
Node.call(this);
this.name = name;
this.params = params;
this.block = body;
if ('function' == typeof params) this.fn = params;
};
/**
* Check function arity.
*
* @return {Boolean}
* @api public
*/
Function.prototype.__defineGetter__('arity', function(){
return this.params.length;
});
/**
* Inherit from `Node.prototype`.
*/
Function.prototype.__proto__ = Node.prototype;
/**
* Return hash.
*
* @return {String}
* @api public
*/
Function.prototype.__defineGetter__('hash', function(){
return 'function ' + this.name;
});
/**
* Return a clone of this node.
*
* @return {Node}
* @api public
*/
Function.prototype.clone = function(){
if (this.fn) {
var clone = new Function(
this.name
, this.fn);
} else {
var clone = new Function(
this.name
, this.params.clone()
, this.block.clone());
}
clone.lineno = this.lineno;
clone.filename = this.filename;
return clone;
};
/**
* Return <name>(param1, param2, ...).
*
* @return {String}
* @api public
*/
Function.prototype.toString = function(){
if (this.fn) {
return this.name
+ '('
+ this.fn.toString()
.match(/^function *\((.*?)\)/)
.slice(1)
.join(', ')
+ ')';
} else {
return this.name
+ '('
+ this.params.nodes.join(', ')
+ ')';
}
};