You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
2.7 KiB
156 lines
2.7 KiB
|
|
/*! |
|
* Stylus - Ident |
|
* Copyright (c) Automattic <developer.wordpress.com> |
|
* MIT Licensed |
|
*/ |
|
|
|
/** |
|
* Module dependencies. |
|
*/ |
|
|
|
var Node = require('./node') |
|
, nodes = require('./'); |
|
|
|
/** |
|
* Initialize a new `Ident` by `name` with the given `val` node. |
|
* |
|
* @param {String} name |
|
* @param {Node} val |
|
* @api public |
|
*/ |
|
|
|
var Ident = module.exports = function Ident(name, val, mixin){ |
|
Node.call(this); |
|
this.name = name; |
|
this.string = name; |
|
this.val = val || nodes.null; |
|
this.mixin = !!mixin; |
|
}; |
|
|
|
/** |
|
* Check if the variable has a value. |
|
* |
|
* @return {Boolean} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.__defineGetter__('isEmpty', function(){ |
|
return undefined == this.val; |
|
}); |
|
|
|
/** |
|
* Return hash. |
|
* |
|
* @return {String} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.__defineGetter__('hash', function(){ |
|
return this.name; |
|
}); |
|
|
|
/** |
|
* Inherit from `Node.prototype`. |
|
*/ |
|
|
|
Ident.prototype.__proto__ = Node.prototype; |
|
|
|
/** |
|
* Return a clone of this node. |
|
* |
|
* @return {Node} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.clone = function(parent){ |
|
var clone = new Ident(this.name); |
|
clone.val = this.val.clone(parent, clone); |
|
clone.mixin = this.mixin; |
|
clone.lineno = this.lineno; |
|
clone.column = this.column; |
|
clone.filename = this.filename; |
|
clone.property = this.property; |
|
clone.rest = this.rest; |
|
return clone; |
|
}; |
|
|
|
/** |
|
* Return a JSON representation of this node. |
|
* |
|
* @return {Object} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.toJSON = function(){ |
|
return { |
|
__type: 'Ident', |
|
name: this.name, |
|
val: this.val, |
|
mixin: this.mixin, |
|
property: this.property, |
|
rest: this.rest, |
|
lineno: this.lineno, |
|
column: this.column, |
|
filename: this.filename |
|
}; |
|
}; |
|
|
|
/** |
|
* Return <name>. |
|
* |
|
* @return {String} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.toString = function(){ |
|
return this.name; |
|
}; |
|
|
|
/** |
|
* Coerce `other` to an ident. |
|
* |
|
* @param {Node} other |
|
* @return {String} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.coerce = function(other){ |
|
switch (other.nodeName) { |
|
case 'ident': |
|
case 'string': |
|
case 'literal': |
|
return new Ident(other.string); |
|
case 'unit': |
|
return new Ident(other.toString()); |
|
default: |
|
return Node.prototype.coerce.call(this, other); |
|
} |
|
}; |
|
|
|
/** |
|
* Operate on `right` with the given `op`. |
|
* |
|
* @param {String} op |
|
* @param {Node} right |
|
* @return {Node} |
|
* @api public |
|
*/ |
|
|
|
Ident.prototype.operate = function(op, right){ |
|
var val = right.first; |
|
switch (op) { |
|
case '-': |
|
if ('unit' == val.nodeName) { |
|
var expr = new nodes.Expression; |
|
val = val.clone(); |
|
val.val = -val.val; |
|
expr.push(this); |
|
expr.push(val); |
|
return expr; |
|
} |
|
case '+': |
|
return new nodes.Ident(this.string + this.coerce(val).string); |
|
} |
|
return Node.prototype.operate.call(this, op, right); |
|
};
|
|
|