Files
less.js/lib/less/tree/expression.js
2015-01-30 18:28:02 +00:00

57 lines
1.7 KiB
JavaScript

var Node = require("./node"),
Paren = require("./paren"),
Comment = require("./comment");
var Expression = function (value) {
this.value = value;
if (!value) {
throw new Error("Expression requires an array parameter");
}
};
Expression.prototype = new Node();
Expression.prototype.type = "Expression";
Expression.prototype.accept = function (visitor) {
this.value = visitor.visitArray(this.value);
};
Expression.prototype.eval = function (context) {
var returnValue,
inParenthesis = this.parens && !this.parensInOp,
doubleParen = false;
if (inParenthesis) {
context.inParenthesis();
}
if (this.value.length > 1) {
returnValue = new Expression(this.value.map(function (e) {
return e.eval(context);
}));
} else if (this.value.length === 1) {
if (this.value[0].parens && !this.value[0].parensInOp) {
doubleParen = true;
}
returnValue = this.value[0].eval(context);
} else {
returnValue = this;
}
if (inParenthesis) {
context.outOfParenthesis();
}
if (this.parens && this.parensInOp && !(context.isMathOn()) && !doubleParen) {
returnValue = new Paren(returnValue);
}
return returnValue;
};
Expression.prototype.genCSS = function (context, output) {
for (var i = 0; i < this.value.length; i++) {
this.value[i].genCSS(context, output);
if (i + 1 < this.value.length) {
output.add(" ");
}
}
};
Expression.prototype.throwAwayComments = function () {
this.value = this.value.filter(function(v) {
return !(v instanceof Comment);
});
};
module.exports = Expression;