var Node = function() { }; Node.prototype.toCSS = function (context) { var strs = []; this.genCSS(context, { add: function(chunk, fileInfo, index) { strs.push(chunk); }, isEmpty: function () { return strs.length === 0; } }); return strs.join(''); }; Node.prototype.genCSS = function (context, output) { output.add(this.value); }; Node.prototype.accept = function (visitor) { this.value = visitor.visit(this.value); }; Node.prototype.eval = function () { return this; }; Node.prototype._operate = function (context, op, a, b) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } }; Node.prototype.fround = function(context, value) { var precision = context && context.numPrecision; //add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999....) are properly rounded... return (precision == null) ? value : Number((value + 2e-16).toFixed(precision)); }; Node.compare = function (a, b) { /* returns: -1: a < b 0: a = b 1: a > b and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ if ((a.compare) && // for "symmetric results" force toCSS-based comparison // of Quoted or Anonymous if either value is one of those !(b.type === "Quoted" || b.type === "Anonymous")) { return a.compare(b); } else if (b.compare) { return -b.compare(a); } else if (a.type !== b.type) { return undefined; } a = a.value; b = b.value; if (!Array.isArray(a)) { return a === b ? 0 : undefined; } if (a.length !== b.length) { return undefined; } for (var i = 0; i < a.length; i++) { if (Node.compare(a[i], b[i]) !== 0) { return undefined; } } return 0; }; Node.numericCompare = function (a, b) { return a < b ? -1 : a === b ? 0 : a > b ? 1 : undefined; }; // Returns true if this node represents root of ast imported by reference Node.prototype.blocksVisibility = function () { if (this.visibilityBlocks == null) { this.visibilityBlocks = 0; } return this.visibilityBlocks !== 0; }; Node.prototype.addVisibilityBlock = function () { if (this.visibilityBlocks == null) { this.visibilityBlocks = 0; } this.visibilityBlocks = this.visibilityBlocks + 1; }; Node.prototype.removeVisibilityBlock = function () { if (this.visibilityBlocks == null) { this.visibilityBlocks = 0; } this.visibilityBlocks = this.visibilityBlocks - 1; }; //Turns on node visibility - if called node will be shown in output regardless //of whether it comes from import by reference or not Node.prototype.ensureVisibility = function () { this.nodeVisible = true; }; //Turns off node visibility - if called node will NOT be shown in output regardless //of whether it comes from import by reference or not Node.prototype.ensureInvisibility = function () { this.nodeVisible = false; }; // return values: // false - the node must not be visible // true - the node must be visible // undefined or null - the node has the same visibility as its parent Node.prototype.isVisible = function () { return this.nodeVisible; }; Node.prototype.visibilityInfo = function() { return { visibilityBlocks: this.visibilityBlocks, nodeVisible: this.nodeVisible }; }; Node.prototype.copyVisibilityInfo = function(info) { if (!info) { return; } this.visibilityBlocks = info.visibilityBlocks; this.nodeVisible = info.nodeVisible; }; module.exports = Node;