diff options
Diffstat (limited to 'node_modules/stylus/lib/nodes')
41 files changed, 4784 insertions, 0 deletions
diff --git a/node_modules/stylus/lib/nodes/arguments.js b/node_modules/stylus/lib/nodes/arguments.js new file mode 100644 index 00000000..3c56b49c --- /dev/null +++ b/node_modules/stylus/lib/nodes/arguments.js @@ -0,0 +1,92 @@ + +/*! + * Stylus - Arguments + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('../nodes') + , utils = require('../utils'); + +/** + * Initialize a new `Arguments`. + * + * @api public + */ + +var Arguments = module.exports = function Arguments(){ + nodes.Expression.call(this); + this.map = {}; +}; + +/** + * Inherit from `nodes.Expression.prototype`. + */ + +Arguments.prototype.__proto__ = nodes.Expression.prototype; + +/** + * Initialize an `Arguments` object with the nodes + * from the given `expr`. + * + * @param {Expression} expr + * @return {Arguments} + * @api public + */ + +Arguments.fromExpression = function(expr){ + var args = new Arguments + , len = expr.nodes.length; + args.lineno = expr.lineno; + args.column = expr.column; + args.isList = expr.isList; + for (var i = 0; i < len; ++i) { + args.push(expr.nodes[i]); + } + return args; +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Arguments.prototype.clone = function(parent){ + var clone = nodes.Expression.prototype.clone.call(this, parent); + clone.map = {}; + for (var key in this.map) { + clone.map[key] = this.map[key].clone(parent, clone); + } + clone.isList = this.isList; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Arguments.prototype.toJSON = function(){ + return { + __type: 'Arguments', + map: this.map, + isList: this.isList, + preserve: this.preserve, + lineno: this.lineno, + column: this.column, + filename: this.filename, + nodes: this.nodes + }; +}; diff --git a/node_modules/stylus/lib/nodes/atblock.js b/node_modules/stylus/lib/nodes/atblock.js new file mode 100644 index 00000000..03a191cf --- /dev/null +++ b/node_modules/stylus/lib/nodes/atblock.js @@ -0,0 +1,79 @@ +/*! + * Stylus - @block + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `@block` node. + * + * @api public + */ + +var Atblock = module.exports = function Atblock(){ + Node.call(this); +}; + +/** + * Return `block` nodes. + */ + +Atblock.prototype.__defineGetter__('nodes', function(){ + return this.block.nodes; +}); + +/** + * Inherit from `Node.prototype`. + */ + +Atblock.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Atblock.prototype.clone = function(parent){ + var clone = new Atblock; + clone.block = this.block.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return @block. + * + * @return {String} + * @api public + */ + +Atblock.prototype.toString = function(){ + return '@block'; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Atblock.prototype.toJSON = function(){ + return { + __type: 'Atblock', + block: this.block, + lineno: this.lineno, + column: this.column, + fileno: this.fileno + }; +}; diff --git a/node_modules/stylus/lib/nodes/atrule.js b/node_modules/stylus/lib/nodes/atrule.js new file mode 100644 index 00000000..43301b50 --- /dev/null +++ b/node_modules/stylus/lib/nodes/atrule.js @@ -0,0 +1,136 @@ +/*! + * Stylus - at-rule + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new at-rule node. + * + * @param {String} type + * @api public + */ + +var Atrule = module.exports = function Atrule(type){ + Node.call(this); + this.type = type; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Atrule.prototype.__proto__ = Node.prototype; + +/** + * Check if at-rule's block has only properties. + * + * @return {Boolean} + * @api public + */ + +Atrule.prototype.__defineGetter__('hasOnlyProperties', function(){ + if (!this.block) return false; + + var nodes = this.block.nodes; + for (var i = 0, len = nodes.length; i < len; ++i) { + var nodeName = nodes[i].nodeName; + switch(nodes[i].nodeName) { + case 'property': + case 'expression': + case 'comment': + continue; + default: + return false; + } + } + return true; +}); + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Atrule.prototype.clone = function(parent){ + var clone = new Atrule(this.type); + if (this.block) clone.block = this.block.clone(parent, clone); + clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); }); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Atrule.prototype.toJSON = function(){ + var json = { + __type: 'Atrule', + type: this.type, + segments: this.segments, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.block) json.block = this.block; + return json; +}; + +/** + * Return @<type>. + * + * @return {String} + * @api public + */ + +Atrule.prototype.toString = function(){ + return '@' + this.type; +}; + +/** + * Check if the at-rule's block has output nodes. + * + * @return {Boolean} + * @api public + */ + +Atrule.prototype.__defineGetter__('hasOutput', function(){ + return !!this.block && hasOutput(this.block); +}); + +function hasOutput(block) { + var nodes = block.nodes; + + // only placeholder selectors + if (nodes.every(function(node){ + return 'group' == node.nodeName && node.hasOnlyPlaceholders; + })) return false; + + // something visible + return nodes.some(function(node) { + switch (node.nodeName) { + case 'property': + case 'literal': + case 'import': + return true; + case 'block': + return hasOutput(node); + default: + if (node.block) return hasOutput(node.block); + } + }); +} diff --git a/node_modules/stylus/lib/nodes/binop.js b/node_modules/stylus/lib/nodes/binop.js new file mode 100644 index 00000000..c56aee39 --- /dev/null +++ b/node_modules/stylus/lib/nodes/binop.js @@ -0,0 +1,83 @@ + +/*! + * Stylus - BinOp + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `BinOp` with `op`, `left` and `right`. + * + * @param {String} op + * @param {Node} left + * @param {Node} right + * @api public + */ + +var BinOp = module.exports = function BinOp(op, left, right){ + Node.call(this); + this.op = op; + this.left = left; + this.right = right; +}; + +/** + * Inherit from `Node.prototype`. + */ + +BinOp.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +BinOp.prototype.clone = function(parent){ + var clone = new BinOp(this.op); + clone.left = this.left.clone(parent, clone); + clone.right = this.right && this.right.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + if (this.val) clone.val = this.val.clone(parent, clone); + return clone; +}; + +/** + * Return <left> <op> <right> + * + * @return {String} + * @api public + */ +BinOp.prototype.toString = function() { + return this.left.toString() + ' ' + this.op + ' ' + this.right.toString(); +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +BinOp.prototype.toJSON = function(){ + var json = { + __type: 'BinOp', + left: this.left, + right: this.right, + op: this.op, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.val) json.val = this.val; + return json; +}; diff --git a/node_modules/stylus/lib/nodes/block.js b/node_modules/stylus/lib/nodes/block.js new file mode 100644 index 00000000..ed4e9776 --- /dev/null +++ b/node_modules/stylus/lib/nodes/block.js @@ -0,0 +1,127 @@ + +/*! + * Stylus - Block + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Block` node with `parent` Block. + * + * @param {Block} parent + * @api public + */ + +var Block = module.exports = function Block(parent, node){ + Node.call(this); + this.nodes = []; + this.parent = parent; + this.node = node; + this.scope = true; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Block.prototype.__proto__ = Node.prototype; + +/** + * Check if this block has properties.. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.__defineGetter__('hasProperties', function(){ + for (var i = 0, len = this.nodes.length; i < len; ++i) { + if ('property' == this.nodes[i].nodeName) { + return true; + } + } +}); + +/** + * Check if this block has @media nodes. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.__defineGetter__('hasMedia', function(){ + for (var i = 0, len = this.nodes.length; i < len; ++i) { + var nodeName = this.nodes[i].nodeName; + if ('media' == nodeName) { + return true; + } + } + return false; +}); + +/** + * Check if this block is empty. + * + * @return {Boolean} + * @api public + */ + +Block.prototype.__defineGetter__('isEmpty', function(){ + return !this.nodes.length; +}); + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Block.prototype.clone = function(parent, node){ + parent = parent || this.parent; + var clone = new Block(parent, node || this.node); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + clone.scope = this.scope; + this.nodes.forEach(function(node){ + clone.push(node.clone(clone, clone)); + }); + return clone; +}; + +/** + * Push a `node` to this block. + * + * @param {Node} node + * @api public + */ + +Block.prototype.push = function(node){ + this.nodes.push(node); +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Block.prototype.toJSON = function(){ + return { + __type: 'Block', + // parent: this.parent, + // node: this.node, + scope: this.scope, + lineno: this.lineno, + column: this.column, + filename: this.filename, + nodes: this.nodes + }; +}; diff --git a/node_modules/stylus/lib/nodes/boolean.js b/node_modules/stylus/lib/nodes/boolean.js new file mode 100644 index 00000000..97c11971 --- /dev/null +++ b/node_modules/stylus/lib/nodes/boolean.js @@ -0,0 +1,117 @@ + +/*! + * Stylus - Boolean + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Initialize a new `Boolean` node with the given `val`. + * + * @param {Boolean} val + * @api public + */ + +var Boolean = module.exports = function Boolean(val){ + Node.call(this); + if (this.nodeName) { + this.val = !!val; + } else { + return new Boolean(val); + } +}; + +/** + * Inherit from `Node.prototype`. + */ + +Boolean.prototype.__proto__ = Node.prototype; + +/** + * Return `this` node. + * + * @return {Boolean} + * @api public + */ + +Boolean.prototype.toBoolean = function(){ + return this; +}; + +/** + * Return `true` if this node represents `true`. + * + * @return {Boolean} + * @api public + */ + +Boolean.prototype.__defineGetter__('isTrue', function(){ + return this.val; +}); + +/** + * Return `true` if this node represents `false`. + * + * @return {Boolean} + * @api public + */ + +Boolean.prototype.__defineGetter__('isFalse', function(){ + return ! this.val; +}); + +/** + * Negate the value. + * + * @return {Boolean} + * @api public + */ + +Boolean.prototype.negate = function(){ + return new Boolean(!this.val); +}; + +/** + * Return 'Boolean'. + * + * @return {String} + * @api public + */ + +Boolean.prototype.inspect = function(){ + return '[Boolean ' + this.val + ']'; +}; + +/** + * Return 'true' or 'false'. + * + * @return {String} + * @api public + */ + +Boolean.prototype.toString = function(){ + return this.val + ? 'true' + : 'false'; +}; + +/** + * Return a JSON representaiton of this node. + * + * @return {Object} + * @api public + */ + +Boolean.prototype.toJSON = function(){ + return { + __type: 'Boolean', + val: this.val + }; +}; diff --git a/node_modules/stylus/lib/nodes/call.js b/node_modules/stylus/lib/nodes/call.js new file mode 100644 index 00000000..5cf655df --- /dev/null +++ b/node_modules/stylus/lib/nodes/call.js @@ -0,0 +1,85 @@ + +/*! + * Stylus - Call + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Call` with `name` and `args`. + * + * @param {String} name + * @param {Expression} args + * @api public + */ + +var Call = module.exports = function Call(name, args){ + Node.call(this); + this.name = name; + this.args = args; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Call.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Call.prototype.clone = function(parent){ + var clone = new Call(this.name); + clone.args = this.args.clone(parent, clone); + if (this.block) clone.block = this.block.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return <name>(param1, param2, ...). + * + * @return {String} + * @api public + */ + +Call.prototype.toString = function(){ + var args = this.args.nodes.map(function(node) { + var str = node.toString(); + return str.slice(1, str.length - 1); + }).join(', '); + + return this.name + '(' + args + ')'; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Call.prototype.toJSON = function(){ + var json = { + __type: 'Call', + name: this.name, + args: this.args, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.block) json.block = this.block; + return json; +}; diff --git a/node_modules/stylus/lib/nodes/charset.js b/node_modules/stylus/lib/nodes/charset.js new file mode 100644 index 00000000..e6d52077 --- /dev/null +++ b/node_modules/stylus/lib/nodes/charset.js @@ -0,0 +1,58 @@ + +/*! + * Stylus - Charset + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Charset` with the given `val` + * + * @param {String} val + * @api public + */ + +var Charset = module.exports = function Charset(val){ + Node.call(this); + this.val = val; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Charset.prototype.__proto__ = Node.prototype; + +/** + * Return @charset "val". + * + * @return {String} + * @api public + */ + +Charset.prototype.toString = function(){ + return '@charset ' + this.val; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Charset.prototype.toJSON = function(){ + return { + __type: 'Charset', + val: this.val, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/comment.js b/node_modules/stylus/lib/nodes/comment.js new file mode 100644 index 00000000..56b59b3b --- /dev/null +++ b/node_modules/stylus/lib/nodes/comment.js @@ -0,0 +1,64 @@ + +/*! + * Stylus - Comment + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Comment` with the given `str`. + * + * @param {String} str + * @param {Boolean} suppress + * @param {Boolean} inline + * @api public + */ + +var Comment = module.exports = function Comment(str, suppress, inline){ + Node.call(this); + this.str = str; + this.suppress = suppress; + this.inline = inline; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Comment.prototype.__proto__ = Node.prototype; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Comment.prototype.toJSON = function(){ + return { + __type: 'Comment', + str: this.str, + suppress: this.suppress, + inline: this.inline, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return comment. + * + * @return {String} + * @api public + */ + +Comment.prototype.toString = function(){ + return this.str; +}; diff --git a/node_modules/stylus/lib/nodes/each.js b/node_modules/stylus/lib/nodes/each.js new file mode 100644 index 00000000..985bd29d --- /dev/null +++ b/node_modules/stylus/lib/nodes/each.js @@ -0,0 +1,75 @@ + +/*! + * Stylus - Each + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Initialize a new `Each` node with the given `val` name, + * `key` name, `expr`, and `block`. + * + * @param {String} val + * @param {String} key + * @param {Expression} expr + * @param {Block} block + * @api public + */ + +var Each = module.exports = function Each(val, key, expr, block){ + Node.call(this); + this.val = val; + this.key = key; + this.expr = expr; + this.block = block; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Each.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Each.prototype.clone = function(parent){ + var clone = new Each(this.val, this.key); + clone.expr = this.expr.clone(parent, clone); + clone.block = this.block.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Each.prototype.toJSON = function(){ + return { + __type: 'Each', + val: this.val, + key: this.key, + expr: this.expr, + block: this.block, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/expression.js b/node_modules/stylus/lib/nodes/expression.js new file mode 100644 index 00000000..92293f32 --- /dev/null +++ b/node_modules/stylus/lib/nodes/expression.js @@ -0,0 +1,220 @@ + +/*! + * Stylus - Expression + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('../nodes') + , utils = require('../utils'); + +/** + * Initialize a new `Expression`. + * + * @param {Boolean} isList + * @api public + */ + +var Expression = module.exports = function Expression(isList){ + Node.call(this); + this.nodes = []; + this.isList = isList; +}; + +/** + * Check if the variable has a value. + * + * @return {Boolean} + * @api public + */ + +Expression.prototype.__defineGetter__('isEmpty', function(){ + return !this.nodes.length; +}); + +/** + * Return the first node in this expression. + * + * @return {Node} + * @api public + */ + +Expression.prototype.__defineGetter__('first', function(){ + return this.nodes[0] + ? this.nodes[0].first + : nodes.null; +}); + +/** + * Hash all the nodes in order. + * + * @return {String} + * @api public + */ + +Expression.prototype.__defineGetter__('hash', function(){ + return this.nodes.map(function(node){ + return node.hash; + }).join('::'); +}); + +/** + * Inherit from `Node.prototype`. + */ + +Expression.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Expression.prototype.clone = function(parent){ + var clone = new this.constructor(this.isList); + clone.preserve = this.preserve; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + clone.nodes = this.nodes.map(function(node) { + return node.clone(parent, clone); + }); + return clone; +}; + +/** + * Push the given `node`. + * + * @param {Node} node + * @api public + */ + +Expression.prototype.push = function(node){ + this.nodes.push(node); +}; + +/** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +Expression.prototype.operate = function(op, right, val){ + switch (op) { + case '[]=': + var self = this + , range = utils.unwrap(right).nodes + , val = utils.unwrap(val) + , len + , node; + range.forEach(function(unit){ + len = self.nodes.length; + if ('unit' == unit.nodeName) { + var i = unit.val < 0 ? len + unit.val : unit.val + , n = i; + while (i-- > len) self.nodes[i] = nodes.null; + self.nodes[n] = val; + } else if (unit.string) { + node = self.nodes[0]; + if (node && 'object' == node.nodeName) node.set(unit.string, val.clone()); + } + }); + return val; + case '[]': + var expr = new nodes.Expression + , vals = utils.unwrap(this).nodes + , range = utils.unwrap(right).nodes + , node; + range.forEach(function(unit){ + if ('unit' == unit.nodeName) { + node = vals[unit.val < 0 ? vals.length + unit.val : unit.val]; + } else if ('object' == vals[0].nodeName) { + node = vals[0].get(unit.string); + } + if (node) expr.push(node); + }); + return expr.isEmpty + ? nodes.null + : utils.unwrap(expr); + case '||': + return this.toBoolean().isTrue + ? this + : right; + case 'in': + return Node.prototype.operate.call(this, op, right); + case '!=': + return this.operate('==', right, val).negate(); + case '==': + var len = this.nodes.length + , right = right.toExpression() + , a + , b; + if (len != right.nodes.length) return nodes.false; + for (var i = 0; i < len; ++i) { + a = this.nodes[i]; + b = right.nodes[i]; + if (a.operate(op, b).isTrue) continue; + return nodes.false; + } + return nodes.true; + break; + default: + return this.first.operate(op, right, val); + } +}; + +/** + * Expressions with length > 1 are truthy, + * otherwise the first value's toBoolean() + * method is invoked. + * + * @return {Boolean} + * @api public + */ + +Expression.prototype.toBoolean = function(){ + if (this.nodes.length > 1) return nodes.true; + return this.first.toBoolean(); +}; + +/** + * Return "<a> <b> <c>" or "<a>, <b>, <c>" if + * the expression represents a list. + * + * @return {String} + * @api public + */ + +Expression.prototype.toString = function(){ + return '(' + this.nodes.map(function(node){ + return node.toString(); + }).join(this.isList ? ', ' : ' ') + ')'; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Expression.prototype.toJSON = function(){ + return { + __type: 'Expression', + isList: this.isList, + preserve: this.preserve, + lineno: this.lineno, + column: this.column, + filename: this.filename, + nodes: this.nodes + }; +}; diff --git a/node_modules/stylus/lib/nodes/extend.js b/node_modules/stylus/lib/nodes/extend.js new file mode 100644 index 00000000..05458b61 --- /dev/null +++ b/node_modules/stylus/lib/nodes/extend.js @@ -0,0 +1,69 @@ + +/*! + * Stylus - Extend + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Extend` with the given `selectors` array. + * + * @param {Array} selectors array of the selectors + * @api public + */ + +var Extend = module.exports = function Extend(selectors){ + Node.call(this); + this.selectors = selectors; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Extend.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Extend.prototype.clone = function(){ + return new Extend(this.selectors); +}; + +/** + * Return `@extend selectors`. + * + * @return {String} + * @api public + */ + +Extend.prototype.toString = function(){ + return '@extend ' + this.selectors.join(', '); +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Extend.prototype.toJSON = function(){ + return { + __type: 'Extend', + selectors: this.selectors, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/feature.js b/node_modules/stylus/lib/nodes/feature.js new file mode 100644 index 00000000..f4e18328 --- /dev/null +++ b/node_modules/stylus/lib/nodes/feature.js @@ -0,0 +1,84 @@ + +/*! + * Stylus - Feature + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Feature` with the given `segs`. + * + * @param {Array} segs + * @api public + */ + +var Feature = module.exports = function Feature(segs){ + Node.call(this); + this.segments = segs; + this.expr = null; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Feature.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Feature.prototype.clone = function(parent){ + var clone = new Feature; + clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); }); + if (this.expr) clone.expr = this.expr.clone(parent, clone); + if (this.name) clone.name = this.name; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return "<ident>" or "(<ident>: <expr>)" + * + * @return {String} + * @api public + */ + +Feature.prototype.toString = function(){ + if (this.expr) { + return '(' + this.segments.join('') + ': ' + this.expr.toString() + ')'; + } else { + return this.segments.join(''); + } +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Feature.prototype.toJSON = function(){ + var json = { + __type: 'Feature', + segments: this.segments, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.expr) json.expr = this.expr; + if (this.name) json.name = this.name; + return json; +}; diff --git a/node_modules/stylus/lib/nodes/function.js b/node_modules/stylus/lib/nodes/function.js new file mode 100644 index 00000000..25a6586b --- /dev/null +++ b/node_modules/stylus/lib/nodes/function.js @@ -0,0 +1,128 @@ + +/*! + * Stylus - Function + * Copyright (c) Automattic <developer.wordpress.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(parent){ + if (this.fn) { + var clone = new Function( + this.name + , this.fn); + } else { + var clone = new Function(this.name); + clone.params = this.params.clone(parent, clone); + clone.block = this.block.clone(parent, clone); + } + clone.lineno = this.lineno; + clone.column = this.column; + 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 *\w*\((.*?)\)/) + .slice(1) + .join(', ') + + ')'; + } else { + return this.name + + '(' + + this.params.nodes.join(', ') + + ')'; + } +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Function.prototype.toJSON = function(){ + var json = { + __type: 'Function', + name: this.name, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.fn) { + json.fn = this.fn; + } else { + json.params = this.params; + json.block = this.block; + } + return json; +}; diff --git a/node_modules/stylus/lib/nodes/group.js b/node_modules/stylus/lib/nodes/group.js new file mode 100644 index 00000000..8c1a4ea3 --- /dev/null +++ b/node_modules/stylus/lib/nodes/group.js @@ -0,0 +1,110 @@ + +/*! + * Stylus - Group + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Group`. + * + * @api public + */ + +var Group = module.exports = function Group(){ + Node.call(this); + this.nodes = []; + this.extends = []; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Group.prototype.__proto__ = Node.prototype; + +/** + * Push the given `selector` node. + * + * @param {Selector} selector + * @api public + */ + +Group.prototype.push = function(selector){ + this.nodes.push(selector); +}; + +/** + * Return this set's `Block`. + */ + +Group.prototype.__defineGetter__('block', function(){ + return this.nodes[0].block; +}); + +/** + * Assign `block` to each selector in this set. + * + * @param {Block} block + * @api public + */ + +Group.prototype.__defineSetter__('block', function(block){ + for (var i = 0, len = this.nodes.length; i < len; ++i) { + this.nodes[i].block = block; + } +}); + +/** + * Check if this set has only placeholders. + * + * @return {Boolean} + * @api public + */ + +Group.prototype.__defineGetter__('hasOnlyPlaceholders', function(){ + return this.nodes.every(function(selector) { return selector.isPlaceholder; }); +}); + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Group.prototype.clone = function(parent){ + var clone = new Group; + clone.lineno = this.lineno; + clone.column = this.column; + this.nodes.forEach(function(node){ + clone.push(node.clone(parent, clone)); + }); + clone.filename = this.filename; + clone.block = this.block.clone(parent, clone); + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Group.prototype.toJSON = function(){ + return { + __type: 'Group', + nodes: this.nodes, + block: this.block, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/hsla.js b/node_modules/stylus/lib/nodes/hsla.js new file mode 100644 index 00000000..bea1e124 --- /dev/null +++ b/node_modules/stylus/lib/nodes/hsla.js @@ -0,0 +1,277 @@ + +/*! + * Stylus - HSLA + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Initialize a new `HSLA` with the given h,s,l,a component values. + * + * @param {Number} h + * @param {Number} s + * @param {Number} l + * @param {Number} a + * @api public + */ + +var HSLA = exports = module.exports = function HSLA(h,s,l,a){ + Node.call(this); + this.h = clampDegrees(h); + this.s = clampPercentage(s); + this.l = clampPercentage(l); + this.a = clampAlpha(a); + this.hsla = this; +}; + +/** + * Inherit from `Node.prototype`. + */ + +HSLA.prototype.__proto__ = Node.prototype; + +/** + * Return hsla(n,n,n,n). + * + * @return {String} + * @api public + */ + +HSLA.prototype.toString = function(){ + return 'hsla(' + + this.h + ',' + + this.s.toFixed(0) + '%,' + + this.l.toFixed(0) + '%,' + + this.a + ')'; +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +HSLA.prototype.clone = function(parent){ + var clone = new HSLA( + this.h + , this.s + , this.l + , this.a); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +HSLA.prototype.toJSON = function(){ + return { + __type: 'HSLA', + h: this.h, + s: this.s, + l: this.l, + a: this.a, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return rgba `RGBA` representation. + * + * @return {RGBA} + * @api public + */ + +HSLA.prototype.__defineGetter__('rgba', function(){ + return nodes.RGBA.fromHSLA(this); +}); + +/** + * Return hash. + * + * @return {String} + * @api public + */ + +HSLA.prototype.__defineGetter__('hash', function(){ + return this.rgba.toString(); +}); + +/** + * Add h,s,l to the current component values. + * + * @param {Number} h + * @param {Number} s + * @param {Number} l + * @return {HSLA} new node + * @api public + */ + +HSLA.prototype.add = function(h,s,l){ + return new HSLA( + this.h + h + , this.s + s + , this.l + l + , this.a); +}; + +/** + * Subtract h,s,l from the current component values. + * + * @param {Number} h + * @param {Number} s + * @param {Number} l + * @return {HSLA} new node + * @api public + */ + +HSLA.prototype.sub = function(h,s,l){ + return this.add(-h, -s, -l); +}; + +/** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +HSLA.prototype.operate = function(op, right){ + switch (op) { + case '==': + case '!=': + case '<=': + case '>=': + case '<': + case '>': + case 'is a': + case '||': + case '&&': + return this.rgba.operate(op, right); + default: + return this.rgba.operate(op, right).hsla; + } +}; + +/** + * Return `HSLA` representation of the given `color`. + * + * @param {RGBA} color + * @return {HSLA} + * @api public + */ + +exports.fromRGBA = function(rgba){ + var r = rgba.r / 255 + , g = rgba.g / 255 + , b = rgba.b / 255 + , a = rgba.a; + + var min = Math.min(r,g,b) + , max = Math.max(r,g,b) + , l = (max + min) / 2 + , d = max - min + , h, s; + + switch (max) { + case min: h = 0; break; + case r: h = 60 * (g-b) / d; break; + case g: h = 60 * (b-r) / d + 120; break; + case b: h = 60 * (r-g) / d + 240; break; + } + + if (max == min) { + s = 0; + } else if (l < .5) { + s = d / (2 * l); + } else { + s = d / (2 - 2 * l); + } + + h %= 360; + s *= 100; + l *= 100; + + return new HSLA(h,s,l,a); +}; + +/** + * Adjust lightness by `percent`. + * + * @param {Number} percent + * @return {HSLA} for chaining + * @api public + */ + +HSLA.prototype.adjustLightness = function(percent){ + this.l = clampPercentage(this.l + this.l * (percent / 100)); + return this; +}; + +/** + * Adjust hue by `deg`. + * + * @param {Number} deg + * @return {HSLA} for chaining + * @api public + */ + +HSLA.prototype.adjustHue = function(deg){ + this.h = clampDegrees(this.h + deg); + return this; +}; + +/** + * Clamp degree `n` >= 0 and <= 360. + * + * @param {Number} n + * @return {Number} + * @api private + */ + +function clampDegrees(n) { + n = n % 360; + return n >= 0 ? n : 360 + n; +} + +/** + * Clamp percentage `n` >= 0 and <= 100. + * + * @param {Number} n + * @return {Number} + * @api private + */ + +function clampPercentage(n) { + return Math.max(0, Math.min(n, 100)); +} + +/** + * Clamp alpha `n` >= 0 and <= 1. + * + * @param {Number} n + * @return {Number} + * @api private + */ + +function clampAlpha(n) { + return Math.max(0, Math.min(n, 1)); +} diff --git a/node_modules/stylus/lib/nodes/ident.js b/node_modules/stylus/lib/nodes/ident.js new file mode 100644 index 00000000..181f738a --- /dev/null +++ b/node_modules/stylus/lib/nodes/ident.js @@ -0,0 +1,156 @@ + +/*! + * 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); +}; diff --git a/node_modules/stylus/lib/nodes/if.js b/node_modules/stylus/lib/nodes/if.js new file mode 100644 index 00000000..e7d354d2 --- /dev/null +++ b/node_modules/stylus/lib/nodes/if.js @@ -0,0 +1,78 @@ + +/*! + * Stylus - If + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `If` with the given `cond`. + * + * @param {Expression} cond + * @param {Boolean|Block} negate, block + * @api public + */ + +var If = module.exports = function If(cond, negate){ + Node.call(this); + this.cond = cond; + this.elses = []; + if (negate && negate.nodeName) { + this.block = negate; + } else { + this.negate = negate; + } +}; + +/** + * Inherit from `Node.prototype`. + */ + +If.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +If.prototype.clone = function(parent){ + var clone = new If(); + clone.cond = this.cond.clone(parent, clone); + clone.block = this.block.clone(parent, clone); + clone.elses = this.elses.map(function(node){ return node.clone(parent, clone); }); + clone.negate = this.negate; + clone.postfix = this.postfix; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +If.prototype.toJSON = function(){ + return { + __type: 'If', + cond: this.cond, + block: this.block, + elses: this.elses, + negate: this.negate, + postfix: this.postfix, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/import.js b/node_modules/stylus/lib/nodes/import.js new file mode 100644 index 00000000..7a3548a4 --- /dev/null +++ b/node_modules/stylus/lib/nodes/import.js @@ -0,0 +1,68 @@ + +/*! + * Stylus - Import + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Import` with the given `expr`. + * + * @param {Expression} expr + * @api public + */ + +var Import = module.exports = function Import(expr, once){ + Node.call(this); + this.path = expr; + this.once = once || false; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Import.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Import.prototype.clone = function(parent){ + var clone = new Import(); + clone.path = this.path.nodeName ? this.path.clone(parent, clone) : this.path; + clone.once = this.once; + clone.mtime = this.mtime; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Import.prototype.toJSON = function(){ + return { + __type: 'Import', + path: this.path, + once: this.once, + mtime: this.mtime, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/index.js b/node_modules/stylus/lib/nodes/index.js new file mode 100644 index 00000000..d9b79b99 --- /dev/null +++ b/node_modules/stylus/lib/nodes/index.js @@ -0,0 +1,59 @@ + +/*! + * Stylus - nodes + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Constructors + */ + +exports.Node = require('./node'); +exports.Root = require('./root'); +exports.Null = require('./null'); +exports.Each = require('./each'); +exports.If = require('./if'); +exports.Call = require('./call'); +exports.UnaryOp = require('./unaryop'); +exports.BinOp = require('./binop'); +exports.Ternary = require('./ternary'); +exports.Block = require('./block'); +exports.Unit = require('./unit'); +exports.String = require('./string'); +exports.HSLA = require('./hsla'); +exports.RGBA = require('./rgba'); +exports.Ident = require('./ident'); +exports.Group = require('./group'); +exports.Literal = require('./literal'); +exports.Boolean = require('./boolean'); +exports.Return = require('./return'); +exports.Media = require('./media'); +exports.QueryList = require('./query-list'); +exports.Query = require('./query'); +exports.Feature = require('./feature'); +exports.Params = require('./params'); +exports.Comment = require('./comment'); +exports.Keyframes = require('./keyframes'); +exports.Member = require('./member'); +exports.Charset = require('./charset'); +exports.Namespace = require('./namespace'); +exports.Import = require('./import'); +exports.Extend = require('./extend'); +exports.Object = require('./object'); +exports.Function = require('./function'); +exports.Property = require('./property'); +exports.Selector = require('./selector'); +exports.Expression = require('./expression'); +exports.Arguments = require('./arguments'); +exports.Atblock = require('./atblock'); +exports.Atrule = require('./atrule'); +exports.Supports = require('./supports'); + +/** + * Singletons. + */ + +exports.true = new exports.Boolean(true); +exports.false = new exports.Boolean(false); +exports.null = new exports.Null; diff --git a/node_modules/stylus/lib/nodes/keyframes.js b/node_modules/stylus/lib/nodes/keyframes.js new file mode 100644 index 00000000..e4e1271a --- /dev/null +++ b/node_modules/stylus/lib/nodes/keyframes.js @@ -0,0 +1,81 @@ + +/*! + * Stylus - Keyframes + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Atrule = require('./atrule'); + +/** + * Initialize a new `Keyframes` with the given `segs`, + * and optional vendor `prefix`. + * + * @param {Array} segs + * @param {String} prefix + * @api public + */ + +var Keyframes = module.exports = function Keyframes(segs, prefix){ + Atrule.call(this, 'keyframes'); + this.segments = segs; + this.prefix = prefix || 'official'; +}; + +/** + * Inherit from `Atrule.prototype`. + */ + +Keyframes.prototype.__proto__ = Atrule.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Keyframes.prototype.clone = function(parent){ + var clone = new Keyframes; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + clone.segments = this.segments.map(function(node) { return node.clone(parent, clone); }); + clone.prefix = this.prefix; + clone.block = this.block.clone(parent, clone); + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Keyframes.prototype.toJSON = function(){ + return { + __type: 'Keyframes', + segments: this.segments, + prefix: this.prefix, + block: this.block, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return `@keyframes name`. + * + * @return {String} + * @api public + */ + +Keyframes.prototype.toString = function(){ + return '@keyframes ' + this.segments.join(''); +}; diff --git a/node_modules/stylus/lib/nodes/literal.js b/node_modules/stylus/lib/nodes/literal.js new file mode 100644 index 00000000..c95d9638 --- /dev/null +++ b/node_modules/stylus/lib/nodes/literal.js @@ -0,0 +1,112 @@ + +/*! + * Stylus - Literal + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Initialize a new `Literal` with the given `str`. + * + * @param {String} str + * @api public + */ + +var Literal = module.exports = function Literal(str){ + Node.call(this); + this.val = str; + this.string = str; + this.prefixed = false; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Literal.prototype.__proto__ = Node.prototype; + +/** + * Return hash. + * + * @return {String} + * @api public + */ + +Literal.prototype.__defineGetter__('hash', function(){ + return this.val; +}); + +/** + * Return literal value. + * + * @return {String} + * @api public + */ + +Literal.prototype.toString = function(){ + return this.val; +}; + +/** + * Coerce `other` to a literal. + * + * @param {Node} other + * @return {String} + * @api public + */ + +Literal.prototype.coerce = function(other){ + switch (other.nodeName) { + case 'ident': + case 'string': + case 'literal': + return new Literal(other.string); + 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 + */ + +Literal.prototype.operate = function(op, right){ + var val = right.first; + switch (op) { + case '+': + return new nodes.Literal(this.string + this.coerce(val).string); + default: + return Node.prototype.operate.call(this, op, right); + } +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Literal.prototype.toJSON = function(){ + return { + __type: 'Literal', + val: this.val, + string: this.string, + prefixed: this.prefixed, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/media.js b/node_modules/stylus/lib/nodes/media.js new file mode 100644 index 00000000..65fdf7ba --- /dev/null +++ b/node_modules/stylus/lib/nodes/media.js @@ -0,0 +1,76 @@ + +/*! + * Stylus - Media + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Atrule = require('./atrule'); + +/** + * Initialize a new `Media` with the given `val` + * + * @param {String} val + * @api public + */ + +var Media = module.exports = function Media(val){ + Atrule.call(this, 'media'); + this.val = val; +}; + +/** + * Inherit from `Atrule.prototype`. + */ + +Media.prototype.__proto__ = Atrule.prototype; + +/** + * Clone this node. + * + * @return {Media} + * @api public + */ + +Media.prototype.clone = function(parent){ + var clone = new Media; + clone.val = this.val.clone(parent, clone); + clone.block = this.block.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Media.prototype.toJSON = function(){ + return { + __type: 'Media', + val: this.val, + block: this.block, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return @media "val". + * + * @return {String} + * @api public + */ + +Media.prototype.toString = function(){ + return '@media ' + this.val; +}; diff --git a/node_modules/stylus/lib/nodes/member.js b/node_modules/stylus/lib/nodes/member.js new file mode 100644 index 00000000..af947388 --- /dev/null +++ b/node_modules/stylus/lib/nodes/member.js @@ -0,0 +1,82 @@ + +/*! + * Stylus - Member + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Member` with `left` and `right`. + * + * @param {Node} left + * @param {Node} right + * @api public + */ + +var Member = module.exports = function Member(left, right){ + Node.call(this); + this.left = left; + this.right = right; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Member.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Member.prototype.clone = function(parent){ + var clone = new Member; + clone.left = this.left.clone(parent, clone); + clone.right = this.right.clone(parent, clone); + if (this.val) clone.val = this.val.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Member.prototype.toJSON = function(){ + var json = { + __type: 'Member', + left: this.left, + right: this.right, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.val) json.val = this.val; + return json; +}; + +/** + * Return a string representation of this node. + * + * @return {String} + * @api public + */ + +Member.prototype.toString = function(){ + return this.left.toString() + + '.' + this.right.toString(); +}; diff --git a/node_modules/stylus/lib/nodes/namespace.js b/node_modules/stylus/lib/nodes/namespace.js new file mode 100644 index 00000000..878b474e --- /dev/null +++ b/node_modules/stylus/lib/nodes/namespace.js @@ -0,0 +1,60 @@ +/*! + * Stylus - Namespace + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Namespace` with the given `val` and `prefix` + * + * @param {String|Call} val + * @param {String} [prefix] + * @api public + */ + +var Namespace = module.exports = function Namespace(val, prefix){ + Node.call(this); + this.val = val; + this.prefix = prefix; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Namespace.prototype.__proto__ = Node.prototype; + +/** + * Return @namespace "val". + * + * @return {String} + * @api public + */ + +Namespace.prototype.toString = function(){ + return '@namespace ' + (this.prefix ? this.prefix + ' ' : '') + this.val; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Namespace.prototype.toJSON = function(){ + return { + __type: 'Namespace', + val: this.val, + prefix: this.prefix, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/node.js b/node_modules/stylus/lib/nodes/node.js new file mode 100644 index 00000000..a392c970 --- /dev/null +++ b/node_modules/stylus/lib/nodes/node.js @@ -0,0 +1,250 @@ + +/*! + * Stylus - Node + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Evaluator = require('../visitor/evaluator') + , utils = require('../utils') + , nodes = require('./'); + +/** + * Initialize a new `CoercionError` with the given `msg`. + * + * @param {String} msg + * @api private + */ + +function CoercionError(msg) { + this.name = 'CoercionError' + this.message = msg + Error.captureStackTrace(this, CoercionError); +} + +/** + * Inherit from `Error.prototype`. + */ + +CoercionError.prototype.__proto__ = Error.prototype; + +/** + * Node constructor. + * + * @api public + */ + +var Node = module.exports = function Node(){ + this.lineno = nodes.lineno || 1; + this.column = nodes.column || 1; + this.filename = nodes.filename; +}; + +Node.prototype = { + constructor: Node, + + /** + * Return this node. + * + * @return {Node} + * @api public + */ + + get first() { + return this; + }, + + /** + * Return hash. + * + * @return {String} + * @api public + */ + + get hash() { + return this.val; + }, + + /** + * Return node name. + * + * @return {String} + * @api public + */ + + get nodeName() { + return this.constructor.name.toLowerCase(); + }, + + /** + * Return this node. + * + * @return {Node} + * @api public + */ + + clone: function(){ + return this; + }, + + /** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + + toJSON: function(){ + return { + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + }, + + /** + * Nodes by default evaluate to themselves. + * + * @return {Node} + * @api public + */ + + eval: function(){ + return new Evaluator(this).evaluate(); + }, + + /** + * Return true. + * + * @return {Boolean} + * @api public + */ + + toBoolean: function(){ + return nodes.true; + }, + + /** + * Return the expression, or wrap this node in an expression. + * + * @return {Expression} + * @api public + */ + + toExpression: function(){ + if ('expression' == this.nodeName) return this; + var expr = new nodes.Expression; + expr.push(this); + return expr; + }, + + /** + * Return false if `op` is generally not coerced. + * + * @param {String} op + * @return {Boolean} + * @api private + */ + + shouldCoerce: function(op){ + switch (op) { + case 'is a': + case 'in': + case '||': + case '&&': + return false; + default: + return true; + } + }, + + /** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + + operate: function(op, right){ + switch (op) { + case 'is a': + if ('string' == right.first.nodeName) { + return nodes.Boolean(this.nodeName == right.val); + } else { + throw new Error('"is a" expects a string, got ' + right.toString()); + } + case '==': + return nodes.Boolean(this.hash == right.hash); + case '!=': + return nodes.Boolean(this.hash != right.hash); + case '>=': + return nodes.Boolean(this.hash >= right.hash); + case '<=': + return nodes.Boolean(this.hash <= right.hash); + case '>': + return nodes.Boolean(this.hash > right.hash); + case '<': + return nodes.Boolean(this.hash < right.hash); + case '||': + return this.toBoolean().isTrue + ? this + : right; + case 'in': + var vals = utils.unwrap(right).nodes + , len = vals && vals.length + , hash = this.hash; + if (!vals) throw new Error('"in" given invalid right-hand operand, expecting an expression'); + + // 'prop' in obj + if (1 == len && 'object' == vals[0].nodeName) { + return nodes.Boolean(vals[0].has(this.hash)); + } + + for (var i = 0; i < len; ++i) { + if (hash == vals[i].hash) { + return nodes.true; + } + } + return nodes.false; + case '&&': + var a = this.toBoolean() + , b = right.toBoolean(); + return a.isTrue && b.isTrue + ? right + : a.isFalse + ? this + : right; + default: + if ('[]' == op) { + var msg = 'cannot perform ' + + this + + '[' + right + ']'; + } else { + var msg = 'cannot perform' + + ' ' + this + + ' ' + op + + ' ' + right; + } + throw new Error(msg); + } + }, + + /** + * Default coercion throws. + * + * @param {Node} other + * @return {Node} + * @api public + */ + + coerce: function(other){ + if (other.nodeName == this.nodeName) return other; + throw new CoercionError('cannot coerce ' + other + ' to ' + this.nodeName); + } +}; diff --git a/node_modules/stylus/lib/nodes/null.js b/node_modules/stylus/lib/nodes/null.js new file mode 100644 index 00000000..4efea99f --- /dev/null +++ b/node_modules/stylus/lib/nodes/null.js @@ -0,0 +1,88 @@ + +/*! + * Stylus - Null + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Initialize a new `Null` node. + * + * @api public + */ + +var Null = module.exports = function Null(){}; + +/** + * Inherit from `Node.prototype`. + */ + +Null.prototype.__proto__ = Node.prototype; + +/** + * Return 'Null'. + * + * @return {String} + * @api public + */ + +Null.prototype.inspect = +Null.prototype.toString = function(){ + return 'null'; +}; + +/** + * Return false. + * + * @return {Boolean} + * @api public + */ + +Null.prototype.toBoolean = function(){ + return nodes.false; +}; + +/** + * Check if the node is a null node. + * + * @return {Boolean} + * @api public + */ + +Null.prototype.__defineGetter__('isNull', function(){ + return true; +}); + +/** + * Return hash. + * + * @return {String} + * @api public + */ + +Null.prototype.__defineGetter__('hash', function(){ + return null; +}); + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Null.prototype.toJSON = function(){ + return { + __type: 'Null', + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/object.js b/node_modules/stylus/lib/nodes/object.js new file mode 100644 index 00000000..a52c749c --- /dev/null +++ b/node_modules/stylus/lib/nodes/object.js @@ -0,0 +1,213 @@ + +/*! + * Stylus - Object + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./') + , nativeObj = {}.constructor; + +/** + * Initialize a new `Object`. + * + * @api public + */ + +var Object = module.exports = function Object(){ + Node.call(this); + this.vals = {}; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Object.prototype.__proto__ = Node.prototype; + +/** + * Set `key` to `val`. + * + * @param {String} key + * @param {Node} val + * @return {Object} for chaining + * @api public + */ + +Object.prototype.set = function(key, val){ + this.vals[key] = val; + return this; +}; + +/** + * Return length. + * + * @return {Number} + * @api public + */ + +Object.prototype.__defineGetter__('length', function() { + return nativeObj.keys(this.vals).length; +}); + +/** + * Get `key`. + * + * @param {String} key + * @return {Node} + * @api public + */ + +Object.prototype.get = function(key){ + return this.vals[key] || nodes.null; +}; + +/** + * Has `key`? + * + * @param {String} key + * @return {Boolean} + * @api public + */ + +Object.prototype.has = function(key){ + return key in this.vals; +}; + +/** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +Object.prototype.operate = function(op, right){ + switch (op) { + case '.': + case '[]': + return this.get(right.hash); + case '==': + var vals = this.vals + , a + , b; + if ('object' != right.nodeName || this.length != right.length) + return nodes.false; + for (var key in vals) { + a = vals[key]; + b = right.vals[key]; + if (a.operate(op, b).isFalse) + return nodes.false; + } + return nodes.true; + case '!=': + return this.operate('==', right).negate(); + default: + return Node.prototype.operate.call(this, op, right); + } +}; + +/** + * Return Boolean based on the length of this object. + * + * @return {Boolean} + * @api public + */ + +Object.prototype.toBoolean = function(){ + return nodes.Boolean(this.length); +}; + +/** + * Convert object to string with properties. + * + * @return {String} + * @api private + */ + +Object.prototype.toBlock = function(){ + var str = '{' + , key + , val; + for (key in this.vals) { + val = this.get(key); + if ('object' == val.first.nodeName) { + str += key + ' ' + val.first.toBlock(); + } else { + switch (key) { + case '@charset': + str += key + ' ' + val.first.toString() + ';'; + break; + default: + str += key + ':' + toString(val) + ';'; + } + } + } + str += '}'; + return str; + + function toString(node) { + if (node.nodes) { + return node.nodes.map(toString).join(node.isList ? ',' : ' '); + } else if ('literal' == node.nodeName && ',' == node.val) { + return '\\,'; + } + return node.toString(); + } +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Object.prototype.clone = function(parent){ + var clone = new Object; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + for (var key in this.vals) { + clone.vals[key] = this.vals[key].clone(parent, clone); + } + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Object.prototype.toJSON = function(){ + return { + __type: 'Object', + vals: this.vals, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return "{ <prop>: <val> }" + * + * @return {String} + * @api public + */ + +Object.prototype.toString = function(){ + var obj = {}; + for (var prop in this.vals) { + obj[prop] = this.vals[prop].toString(); + } + return JSON.stringify(obj); +}; diff --git a/node_modules/stylus/lib/nodes/params.js b/node_modules/stylus/lib/nodes/params.js new file mode 100644 index 00000000..d7ac6d74 --- /dev/null +++ b/node_modules/stylus/lib/nodes/params.js @@ -0,0 +1,90 @@ + +/*! + * Stylus - Params + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Params` with `name`, `params`, and `body`. + * + * @param {String} name + * @param {Params} params + * @param {Expression} body + * @api public + */ + +var Params = module.exports = function Params(){ + Node.call(this); + this.nodes = []; +}; + +/** + * Check function arity. + * + * @return {Boolean} + * @api public + */ + +Params.prototype.__defineGetter__('length', function(){ + return this.nodes.length; +}); + +/** + * Inherit from `Node.prototype`. + */ + +Params.prototype.__proto__ = Node.prototype; + +/** + * Push the given `node`. + * + * @param {Node} node + * @api public + */ + +Params.prototype.push = function(node){ + this.nodes.push(node); +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Params.prototype.clone = function(parent){ + var clone = new Params; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + this.nodes.forEach(function(node){ + clone.push(node.clone(parent, clone)); + }); + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Params.prototype.toJSON = function(){ + return { + __type: 'Params', + nodes: this.nodes, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + diff --git a/node_modules/stylus/lib/nodes/property.js b/node_modules/stylus/lib/nodes/property.js new file mode 100644 index 00000000..215785ac --- /dev/null +++ b/node_modules/stylus/lib/nodes/property.js @@ -0,0 +1,96 @@ + +/*! + * Stylus - Property + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Property` with the given `segs` and optional `expr`. + * + * @param {Array} segs + * @param {Expression} expr + * @api public + */ + +var Property = module.exports = function Property(segs, expr){ + Node.call(this); + this.segments = segs; + this.expr = expr; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Property.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Property.prototype.clone = function(parent){ + var clone = new Property(this.segments); + clone.name = this.name; + if (this.literal) clone.literal = this.literal; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); }); + if (this.expr) clone.expr = this.expr.clone(parent, clone); + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Property.prototype.toJSON = function(){ + var json = { + __type: 'Property', + segments: this.segments, + name: this.name, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; + if (this.expr) json.expr = this.expr; + if (this.literal) json.literal = this.literal; + return json; +}; + +/** + * Return string representation of this node. + * + * @return {String} + * @api public + */ + +Property.prototype.toString = function(){ + return 'property(' + this.segments.join('') + ', ' + this.expr + ')'; +}; + +/** + * Operate on the property expression. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +Property.prototype.operate = function(op, right, val){ + return this.expr.operate(op, right, val); +}; diff --git a/node_modules/stylus/lib/nodes/query-list.js b/node_modules/stylus/lib/nodes/query-list.js new file mode 100644 index 00000000..3819640b --- /dev/null +++ b/node_modules/stylus/lib/nodes/query-list.js @@ -0,0 +1,108 @@ + +/*! + * Stylus - QueryList + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `QueryList`. + * + * @api public + */ + +var QueryList = module.exports = function QueryList(){ + Node.call(this); + this.nodes = []; +}; + +/** + * Inherit from `Node.prototype`. + */ + +QueryList.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +QueryList.prototype.clone = function(parent){ + var clone = new QueryList; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + for (var i = 0; i < this.nodes.length; ++i) { + clone.push(this.nodes[i].clone(parent, clone)); + } + return clone; +}; + +/** + * Push the given `node`. + * + * @param {Node} node + * @api public + */ + +QueryList.prototype.push = function(node){ + this.nodes.push(node); +}; + +/** + * Merges this query list with the `other`. + * + * @param {QueryList} other + * @return {QueryList} + * @api private + */ + +QueryList.prototype.merge = function(other){ + var list = new QueryList + , merged; + this.nodes.forEach(function(query){ + for (var i = 0, len = other.nodes.length; i < len; ++i){ + merged = query.merge(other.nodes[i]); + if (merged) list.push(merged); + } + }); + return list; +}; + +/** + * Return "<a>, <b>, <c>" + * + * @return {String} + * @api public + */ + +QueryList.prototype.toString = function(){ + return '(' + this.nodes.map(function(node){ + return node.toString(); + }).join(', ') + ')'; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +QueryList.prototype.toJSON = function(){ + return { + __type: 'QueryList', + nodes: this.nodes, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/query.js b/node_modules/stylus/lib/nodes/query.js new file mode 100644 index 00000000..47a568b7 --- /dev/null +++ b/node_modules/stylus/lib/nodes/query.js @@ -0,0 +1,170 @@ + +/*! + * Stylus - Query + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Query`. + * + * @api public + */ + +var Query = module.exports = function Query(){ + Node.call(this); + this.nodes = []; + this.type = ''; + this.predicate = ''; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Query.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Query.prototype.clone = function(parent){ + var clone = new Query; + clone.predicate = this.predicate; + clone.type = this.type; + for (var i = 0, len = this.nodes.length; i < len; ++i) { + clone.push(this.nodes[i].clone(parent, clone)); + } + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Push the given `feature`. + * + * @param {Feature} feature + * @api public + */ + +Query.prototype.push = function(feature){ + this.nodes.push(feature); +}; + +/** + * Return resolved type of this query. + * + * @return {String} + * @api private + */ + +Query.prototype.__defineGetter__('resolvedType', function(){ + if (this.type) { + return this.type.nodeName + ? this.type.string + : this.type; + } +}); + +/** + * Return resolved predicate of this query. + * + * @return {String} + * @api private + */ + +Query.prototype.__defineGetter__('resolvedPredicate', function(){ + if (this.predicate) { + return this.predicate.nodeName + ? this.predicate.string + : this.predicate; + } +}); + +/** + * Merges this query with the `other`. + * + * @param {Query} other + * @return {Query} + * @api private + */ + +Query.prototype.merge = function(other){ + var query = new Query + , p1 = this.resolvedPredicate + , p2 = other.resolvedPredicate + , t1 = this.resolvedType + , t2 = other.resolvedType + , type, pred; + + // Stolen from Sass :D + t1 = t1 || t2; + t2 = t2 || t1; + if (('not' == p1) ^ ('not' == p2)) { + if (t1 == t2) return; + type = ('not' == p1) ? t2 : t1; + pred = ('not' == p1) ? p2 : p1; + } else if (('not' == p1) && ('not' == p2)) { + if (t1 != t2) return; + type = t1; + pred = 'not'; + } else if (t1 != t2) { + return; + } else { + type = t1; + pred = p1 || p2; + } + query.predicate = pred; + query.type = type; + query.nodes = this.nodes.concat(other.nodes); + return query; +}; + +/** + * Return "<a> and <b> and <c>" + * + * @return {String} + * @api public + */ + +Query.prototype.toString = function(){ + var pred = this.predicate ? this.predicate + ' ' : '' + , type = this.type || '' + , len = this.nodes.length + , str = pred + type; + if (len) { + str += (type && ' and ') + this.nodes.map(function(expr){ + return expr.toString(); + }).join(' and '); + } + return str; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Query.prototype.toJSON = function(){ + return { + __type: 'Query', + predicate: this.predicate, + type: this.type, + nodes: this.nodes, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/return.js b/node_modules/stylus/lib/nodes/return.js new file mode 100644 index 00000000..003ef380 --- /dev/null +++ b/node_modules/stylus/lib/nodes/return.js @@ -0,0 +1,63 @@ + +/*! + * Stylus - Return + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Initialize a new `Return` node with the given `expr`. + * + * @param {Expression} expr + * @api public + */ + +var Return = module.exports = function Return(expr){ + this.expr = expr || nodes.null; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Return.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Return.prototype.clone = function(parent){ + var clone = new Return(); + clone.expr = this.expr.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Return.prototype.toJSON = function(){ + return { + __type: 'Return', + expr: this.expr, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/rgba.js b/node_modules/stylus/lib/nodes/rgba.js new file mode 100644 index 00000000..a961dc9c --- /dev/null +++ b/node_modules/stylus/lib/nodes/rgba.js @@ -0,0 +1,367 @@ + +/*! + * Stylus - RGBA + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , HSLA = require('./hsla') + , functions = require('../functions') + , adjust = functions.adjust + , nodes = require('./'); + +/** + * Initialize a new `RGBA` with the given r,g,b,a component values. + * + * @param {Number} r + * @param {Number} g + * @param {Number} b + * @param {Number} a + * @api public + */ + +var RGBA = exports = module.exports = function RGBA(r,g,b,a){ + Node.call(this); + this.r = clamp(r); + this.g = clamp(g); + this.b = clamp(b); + this.a = clampAlpha(a); + this.name = ''; + this.rgba = this; +}; + +/** + * Inherit from `Node.prototype`. + */ + +RGBA.prototype.__proto__ = Node.prototype; + +/** + * Return an `RGBA` without clamping values. + * + * @param {Number} r + * @param {Number} g + * @param {Number} b + * @param {Number} a + * @return {RGBA} + * @api public + */ + +RGBA.withoutClamping = function(r,g,b,a){ + var rgba = new RGBA(0,0,0,0); + rgba.r = r; + rgba.g = g; + rgba.b = b; + rgba.a = a; + return rgba; +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +RGBA.prototype.clone = function(){ + var clone = new RGBA( + this.r + , this.g + , this.b + , this.a); + clone.raw = this.raw; + clone.name = this.name; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +RGBA.prototype.toJSON = function(){ + return { + __type: 'RGBA', + r: this.r, + g: this.g, + b: this.b, + a: this.a, + raw: this.raw, + name: this.name, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return true. + * + * @return {Boolean} + * @api public + */ + +RGBA.prototype.toBoolean = function(){ + return nodes.true; +}; + +/** + * Return `HSLA` representation. + * + * @return {HSLA} + * @api public + */ + +RGBA.prototype.__defineGetter__('hsla', function(){ + return HSLA.fromRGBA(this); +}); + +/** + * Return hash. + * + * @return {String} + * @api public + */ + +RGBA.prototype.__defineGetter__('hash', function(){ + return this.toString(); +}); + +/** + * Add r,g,b,a to the current component values. + * + * @param {Number} r + * @param {Number} g + * @param {Number} b + * @param {Number} a + * @return {RGBA} new node + * @api public + */ + +RGBA.prototype.add = function(r,g,b,a){ + return new RGBA( + this.r + r + , this.g + g + , this.b + b + , this.a + a); +}; + +/** + * Subtract r,g,b,a from the current component values. + * + * @param {Number} r + * @param {Number} g + * @param {Number} b + * @param {Number} a + * @return {RGBA} new node + * @api public + */ + +RGBA.prototype.sub = function(r,g,b,a){ + return new RGBA( + this.r - r + , this.g - g + , this.b - b + , a == 1 ? this.a : this.a - a); +}; + +/** + * Multiply rgb components by `n`. + * + * @param {String} n + * @return {RGBA} new node + * @api public + */ + +RGBA.prototype.multiply = function(n){ + return new RGBA( + this.r * n + , this.g * n + , this.b * n + , this.a); +}; + +/** + * Divide rgb components by `n`. + * + * @param {String} n + * @return {RGBA} new node + * @api public + */ + +RGBA.prototype.divide = function(n){ + return new RGBA( + this.r / n + , this.g / n + , this.b / n + , this.a); +}; + +/** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +RGBA.prototype.operate = function(op, right){ + if ('in' != op) right = right.first + + switch (op) { + case 'is a': + if ('string' == right.nodeName && 'color' == right.string) { + return nodes.true; + } + break; + case '+': + switch (right.nodeName) { + case 'unit': + var n = right.val; + switch (right.type) { + case '%': return adjust(this, new nodes.String('lightness'), right); + case 'deg': return this.hsla.adjustHue(n).rgba; + default: return this.add(n,n,n,0); + } + case 'rgba': + return this.add(right.r, right.g, right.b, right.a); + case 'hsla': + return this.hsla.add(right.h, right.s, right.l); + } + break; + case '-': + switch (right.nodeName) { + case 'unit': + var n = right.val; + switch (right.type) { + case '%': return adjust(this, new nodes.String('lightness'), new nodes.Unit(-n, '%')); + case 'deg': return this.hsla.adjustHue(-n).rgba; + default: return this.sub(n,n,n,0); + } + case 'rgba': + return this.sub(right.r, right.g, right.b, right.a); + case 'hsla': + return this.hsla.sub(right.h, right.s, right.l); + } + break; + case '*': + switch (right.nodeName) { + case 'unit': + return this.multiply(right.val); + } + break; + case '/': + switch (right.nodeName) { + case 'unit': + return this.divide(right.val); + } + break; + } + return Node.prototype.operate.call(this, op, right); +}; + +/** + * Return #nnnnnn, #nnn, or rgba(n,n,n,n) string representation of the color. + * + * @return {String} + * @api public + */ + +RGBA.prototype.toString = function(){ + function pad(n) { + return n < 16 + ? '0' + n.toString(16) + : n.toString(16); + } + + // special case for transparent named color + if ('transparent' == this.name) + return this.name; + + if (1 == this.a) { + var r = pad(this.r) + , g = pad(this.g) + , b = pad(this.b); + + // Compress + if (r[0] == r[1] && g[0] == g[1] && b[0] == b[1]) { + return '#' + r[0] + g[0] + b[0]; + } else { + return '#' + r + g + b; + } + } else { + return 'rgba(' + + this.r + ',' + + this.g + ',' + + this.b + ',' + + (+this.a.toFixed(3)) + ')'; + } +}; + +/** + * Return a `RGBA` from the given `hsla`. + * + * @param {HSLA} hsla + * @return {RGBA} + * @api public + */ + +exports.fromHSLA = function(hsla){ + var h = hsla.h / 360 + , s = hsla.s / 100 + , l = hsla.l / 100 + , a = hsla.a; + + var m2 = l <= .5 ? l * (s + 1) : l + s - l * s + , m1 = l * 2 - m2; + + var r = hue(h + 1/3) * 0xff + , g = hue(h) * 0xff + , b = hue(h - 1/3) * 0xff; + + function hue(h) { + if (h < 0) ++h; + if (h > 1) --h; + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; + return m1; + } + + return new RGBA(r,g,b,a); +}; + +/** + * Clamp `n` >= 0 and <= 255. + * + * @param {Number} n + * @return {Number} + * @api private + */ + +function clamp(n) { + return Math.max(0, Math.min(n.toFixed(0), 255)); +} + +/** + * Clamp alpha `n` >= 0 and <= 1. + * + * @param {Number} n + * @return {Number} + * @api private + */ + +function clampAlpha(n) { + return Math.max(0, Math.min(n, 1)); +} diff --git a/node_modules/stylus/lib/nodes/root.js b/node_modules/stylus/lib/nodes/root.js new file mode 100644 index 00000000..3bfb3c21 --- /dev/null +++ b/node_modules/stylus/lib/nodes/root.js @@ -0,0 +1,96 @@ + +/*! + * Stylus - Root + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Root` node. + * + * @api public + */ + +var Root = module.exports = function Root(){ + this.nodes = []; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Root.prototype.__proto__ = Node.prototype; + +/** + * Push a `node` to this block. + * + * @param {Node} node + * @api public + */ + +Root.prototype.push = function(node){ + this.nodes.push(node); +}; + +/** + * Unshift a `node` to this block. + * + * @param {Node} node + * @api public + */ + +Root.prototype.unshift = function(node){ + this.nodes.unshift(node); +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Root.prototype.clone = function(){ + var clone = new Root(); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + this.nodes.forEach(function(node){ + clone.push(node.clone(clone, clone)); + }); + return clone; +}; + +/** + * Return "root". + * + * @return {String} + * @api public + */ + +Root.prototype.toString = function(){ + return '[Root]'; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Root.prototype.toJSON = function(){ + return { + __type: 'Root', + nodes: this.nodes, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/selector.js b/node_modules/stylus/lib/nodes/selector.js new file mode 100644 index 00000000..db183cc7 --- /dev/null +++ b/node_modules/stylus/lib/nodes/selector.js @@ -0,0 +1,94 @@ + +/*! + * Stylus - Selector + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Block = require('./block') + , Node = require('./node'); + +/** + * Initialize a new `Selector` with the given `segs`. + * + * @param {Array} segs + * @api public + */ + +var Selector = module.exports = function Selector(segs){ + Node.call(this); + this.inherits = true; + this.segments = segs; + this.optional = false; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Selector.prototype.__proto__ = Node.prototype; + +/** + * Return the selector string. + * + * @return {String} + * @api public + */ + +Selector.prototype.toString = function(){ + return this.segments.join('') + (this.optional ? ' !optional' : ''); +}; + +/** + * Check if this is placeholder selector. + * + * @return {Boolean} + * @api public + */ + +Selector.prototype.__defineGetter__('isPlaceholder', function(){ + return this.val && ~this.val.substr(0, 2).indexOf('$'); +}); + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Selector.prototype.clone = function(parent){ + var clone = new Selector; + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + clone.inherits = this.inherits; + clone.val = this.val; + clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); }); + clone.optional = this.optional; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Selector.prototype.toJSON = function(){ + return { + __type: 'Selector', + inherits: this.inherits, + segments: this.segments, + optional: this.optional, + val: this.val, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/string.js b/node_modules/stylus/lib/nodes/string.js new file mode 100644 index 00000000..1fd2b450 --- /dev/null +++ b/node_modules/stylus/lib/nodes/string.js @@ -0,0 +1,147 @@ +/*! + * Stylus - String + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , sprintf = require('../functions').s + , utils = require('../utils') + , nodes = require('./'); + +/** + * Initialize a new `String` with the given `val`. + * + * @param {String} val + * @param {String} quote + * @api public + */ + +var String = module.exports = function String(val, quote){ + Node.call(this); + this.val = val; + this.string = val; + this.prefixed = false; + if (typeof quote !== 'string') { + this.quote = "'"; + } else { + this.quote = quote; + } +}; + +/** + * Inherit from `Node.prototype`. + */ + +String.prototype.__proto__ = Node.prototype; + +/** + * Return quoted string. + * + * @return {String} + * @api public + */ + +String.prototype.toString = function(){ + return this.quote + this.val + this.quote; +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +String.prototype.clone = function(){ + var clone = new String(this.val, this.quote); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +String.prototype.toJSON = function(){ + return { + __type: 'String', + val: this.val, + quote: this.quote, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return Boolean based on the length of this string. + * + * @return {Boolean} + * @api public + */ + +String.prototype.toBoolean = function(){ + return nodes.Boolean(this.val.length); +}; + +/** + * Coerce `other` to a string. + * + * @param {Node} other + * @return {String} + * @api public + */ + +String.prototype.coerce = function(other){ + switch (other.nodeName) { + case 'string': + return other; + case 'expression': + return new String(other.nodes.map(function(node){ + return this.coerce(node).val; + }, this).join(' ')); + default: + return new String(other.toString()); + } +}; + +/** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +String.prototype.operate = function(op, right){ + switch (op) { + case '%': + var expr = new nodes.Expression; + expr.push(this); + + // constructargs + var args = 'expression' == right.nodeName + ? utils.unwrap(right).nodes + : [right]; + + // apply + return sprintf.apply(null, [expr].concat(args)); + case '+': + var expr = new nodes.Expression; + expr.push(new String(this.val + this.coerce(right).val)); + return expr; + default: + return Node.prototype.operate.call(this, op, right); + } +}; diff --git a/node_modules/stylus/lib/nodes/supports.js b/node_modules/stylus/lib/nodes/supports.js new file mode 100644 index 00000000..ab058783 --- /dev/null +++ b/node_modules/stylus/lib/nodes/supports.js @@ -0,0 +1,75 @@ +/*! + * Stylus - supports + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Atrule = require('./atrule'); + +/** + * Initialize a new supports node. + * + * @param {Expression} condition + * @api public + */ + +var Supports = module.exports = function Supports(condition){ + Atrule.call(this, 'supports'); + this.condition = condition; +}; + +/** + * Inherit from `Atrule.prototype`. + */ + +Supports.prototype.__proto__ = Atrule.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Supports.prototype.clone = function(parent){ + var clone = new Supports; + clone.condition = this.condition.clone(parent, clone); + clone.block = this.block.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Supports.prototype.toJSON = function(){ + return { + __type: 'Supports', + condition: this.condition, + block: this.block, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Return @supports + * + * @return {String} + * @api public + */ + +Supports.prototype.toString = function(){ + return '@supports ' + this.condition; +}; diff --git a/node_modules/stylus/lib/nodes/ternary.js b/node_modules/stylus/lib/nodes/ternary.js new file mode 100644 index 00000000..2034170a --- /dev/null +++ b/node_modules/stylus/lib/nodes/ternary.js @@ -0,0 +1,71 @@ + +/*! + * Stylus - Ternary + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `Ternary` with `cond`, `trueExpr` and `falseExpr`. + * + * @param {Expression} cond + * @param {Expression} trueExpr + * @param {Expression} falseExpr + * @api public + */ + +var Ternary = module.exports = function Ternary(cond, trueExpr, falseExpr){ + Node.call(this); + this.cond = cond; + this.trueExpr = trueExpr; + this.falseExpr = falseExpr; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Ternary.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Ternary.prototype.clone = function(parent){ + var clone = new Ternary(); + clone.cond = this.cond.clone(parent, clone); + clone.trueExpr = this.trueExpr.clone(parent, clone); + clone.falseExpr = this.falseExpr.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Ternary.prototype.toJSON = function(){ + return { + __type: 'Ternary', + cond: this.cond, + trueExpr: this.trueExpr, + falseExpr: this.falseExpr, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/unaryop.js b/node_modules/stylus/lib/nodes/unaryop.js new file mode 100644 index 00000000..6ac92ab3 --- /dev/null +++ b/node_modules/stylus/lib/nodes/unaryop.js @@ -0,0 +1,66 @@ + +/*! + * Stylus - UnaryOp + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node'); + +/** + * Initialize a new `UnaryOp` with `op`, and `expr`. + * + * @param {String} op + * @param {Node} expr + * @api public + */ + +var UnaryOp = module.exports = function UnaryOp(op, expr){ + Node.call(this); + this.op = op; + this.expr = expr; +}; + +/** + * Inherit from `Node.prototype`. + */ + +UnaryOp.prototype.__proto__ = Node.prototype; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +UnaryOp.prototype.clone = function(parent){ + var clone = new UnaryOp(this.op); + clone.expr = this.expr.clone(parent, clone); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +UnaryOp.prototype.toJSON = function(){ + return { + __type: 'UnaryOp', + op: this.op, + expr: this.expr, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; diff --git a/node_modules/stylus/lib/nodes/unit.js b/node_modules/stylus/lib/nodes/unit.js new file mode 100644 index 00000000..2d38d84f --- /dev/null +++ b/node_modules/stylus/lib/nodes/unit.js @@ -0,0 +1,214 @@ + +/*! + * Stylus - Unit + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var Node = require('./node') + , nodes = require('./'); + +/** + * Unit conversion table. + */ + +var FACTOR_TABLE = { + 'mm': {val: 1, label: 'mm'}, + 'cm': {val: 10, label: 'mm'}, + 'in': {val: 25.4, label: 'mm'}, + 'pt': {val: 25.4/72, label: 'mm'}, + 'ms': {val: 1, label: 'ms'}, + 's': {val: 1000, label: 'ms'}, + 'Hz': {val: 1, label: 'Hz'}, + 'kHz': {val: 1000, label: 'Hz'} +}; + +/** + * Initialize a new `Unit` with the given `val` and unit `type` + * such as "px", "pt", "in", etc. + * + * @param {String} val + * @param {String} type + * @api public + */ + +var Unit = module.exports = function Unit(val, type){ + Node.call(this); + this.val = val; + this.type = type; +}; + +/** + * Inherit from `Node.prototype`. + */ + +Unit.prototype.__proto__ = Node.prototype; + +/** + * Return Boolean based on the unit value. + * + * @return {Boolean} + * @api public + */ + +Unit.prototype.toBoolean = function(){ + return nodes.Boolean(this.type + ? true + : this.val); +}; + +/** + * Return unit string. + * + * @return {String} + * @api public + */ + +Unit.prototype.toString = function(){ + return this.val + (this.type || ''); +}; + +/** + * Return a clone of this node. + * + * @return {Node} + * @api public + */ + +Unit.prototype.clone = function(){ + var clone = new Unit(this.val, this.type); + clone.lineno = this.lineno; + clone.column = this.column; + clone.filename = this.filename; + return clone; +}; + +/** + * Return a JSON representation of this node. + * + * @return {Object} + * @api public + */ + +Unit.prototype.toJSON = function(){ + return { + __type: 'Unit', + val: this.val, + type: this.type, + lineno: this.lineno, + column: this.column, + filename: this.filename + }; +}; + +/** + * Operate on `right` with the given `op`. + * + * @param {String} op + * @param {Node} right + * @return {Node} + * @api public + */ + +Unit.prototype.operate = function(op, right){ + var type = this.type || right.first.type; + + // swap color + if ('rgba' == right.nodeName || 'hsla' == right.nodeName) { + return right.operate(op, this); + } + + // operate + if (this.shouldCoerce(op)) { + right = right.first; + // percentages + if ('%' != this.type && ('-' == op || '+' == op) && '%' == right.type) { + right = new Unit(this.val * (right.val / 100), '%'); + } else { + right = this.coerce(right); + } + + switch (op) { + case '-': + return new Unit(this.val - right.val, type); + case '+': + // keyframes interpolation + type = type || (right.type == '%' && right.type); + return new Unit(this.val + right.val, type); + case '/': + return new Unit(this.val / right.val, type); + case '*': + return new Unit(this.val * right.val, type); + case '%': + return new Unit(this.val % right.val, type); + case '**': + return new Unit(Math.pow(this.val, right.val), type); + case '..': + case '...': + var start = this.val + , end = right.val + , expr = new nodes.Expression + , inclusive = '..' == op; + if (start < end) { + do { + expr.push(new nodes.Unit(start)); + } while (inclusive ? ++start <= end : ++start < end); + } else { + do { + expr.push(new nodes.Unit(start)); + } while (inclusive ? --start >= end : --start > end); + } + return expr; + } + } + + return Node.prototype.operate.call(this, op, right); +}; + +/** + * Coerce `other` unit to the same type as `this` unit. + * + * Supports: + * + * mm -> cm | in + * cm -> mm | in + * in -> mm | cm + * + * ms -> s + * s -> ms + * + * Hz -> kHz + * kHz -> Hz + * + * @param {Unit} other + * @return {Unit} + * @api public + */ + +Unit.prototype.coerce = function(other){ + if ('unit' == other.nodeName) { + var a = this + , b = other + , factorA = FACTOR_TABLE[a.type] + , factorB = FACTOR_TABLE[b.type]; + + if (factorA && factorB && (factorA.label == factorB.label)) { + var bVal = b.val * (factorB.val / factorA.val); + return new nodes.Unit(bVal, a.type); + } else { + return new nodes.Unit(b.val, a.type); + } + } else if ('string' == other.nodeName) { + // keyframes interpolation + if ('%' == other.val) return new nodes.Unit(0, '%'); + var val = parseFloat(other.val); + if (isNaN(val)) Node.prototype.coerce.call(this, other); + return new nodes.Unit(val); + } else { + return Node.prototype.coerce.call(this, other); + } +}; |
