From 01ffcf63e4258d49bbe0375fe5508c708448481a Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 4 Jul 2018 19:20:52 +0300 Subject: [PATCH] use js from http://stylus-lang.com/try/stylus.min.js --- vendor/stylus-lang/stylus.min.js | 6200 +----------------------------- 1 file changed, 6 insertions(+), 6194 deletions(-) diff --git a/vendor/stylus-lang/stylus.min.js b/vendor/stylus-lang/stylus.min.js index defb814d..77e30038 100644 --- a/vendor/stylus-lang/stylus.min.js +++ b/vendor/stylus-lang/stylus.min.js @@ -1,6194 +1,6 @@ -if (Function.prototype.name === undefined && Object.defineProperty !== undefined) { - Object.defineProperty(Function.prototype, "name", { - get: function () { - var regex = /function\s([^(]{1,})\(/, match = regex.exec(this.toString()); - return match && match.length > 1 ? match[1].trim() : "" - }, - }) -} -if (String.prototype.trimRight === undefined) { - String.prototype.trimRight = function () { - return String(this).replace(/\s+$/, "") - } -} -var stylus = function () { - function require(p) { - var path = require.resolve(p), mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)) - } - return mod.exports - } - - var bifs = "called-from = ()\n\nvendors = moz webkit o ms official\n\n// stringify the given arg\n\n-string(arg)\n type(arg) + ' ' + arg\n\n// require a color\n\nrequire-color(color)\n unless color is a 'color'\n error('RGB or HSL value expected, got a ' + -string(color))\n\n// require a unit\n\nrequire-unit(n)\n unless n is a 'unit'\n error('unit expected, got a ' + -string(n))\n\n// require a string\n\nrequire-string(str)\n unless str is a 'string' or str is a 'ident'\n error('string expected, got a ' + -string(str))\n\n// Math functions\n\nabs(n) { math(n, 'abs') }\nmin(a, b) { a < b ? a : b }\nmax(a, b) { a > b ? a : b }\n\n// Trigonometrics\nPI = -math-prop('PI')\n\nradians-to-degrees(angle)\n angle * (180 / PI)\n\ndegrees-to-radians(angle)\n unit(angle * (PI / 180),'')\n\nsin(n)\n n = degrees-to-radians(n) if unit(n) == 'deg'\n round(math(n, 'sin'), 9)\n\ncos(n)\n n = degrees-to-radians(n) if unit(n) == 'deg'\n round(math(n, 'cos'), 9)\n\n// Rounding Math functions\n\nceil(n, precision = 0)\n multiplier = 10 ** precision\n math(n * multiplier, 'ceil') / multiplier\n\nfloor(n, precision = 0)\n multiplier = 10 ** precision\n math(n * multiplier, 'floor') / multiplier\n\nround(n, precision = 0)\n multiplier = 10 ** precision\n math(n * multiplier, 'round') / multiplier\n\n// return the sum of the given numbers\n\nsum(nums)\n sum = 0\n sum += n for n in nums\n\n// return the average of the given numbers\n\navg(nums)\n sum(nums) / length(nums)\n\n// return a unitless number, or pass through\n\nremove-unit(n)\n if typeof(n) is 'unit'\n unit(n, '')\n else\n n\n\n// convert a percent to a decimal, or pass through\n\npercent-to-decimal(n)\n if unit(n) is '%'\n remove-unit(n) / 100\n else\n n\n\n// check if n is an odd number\n\nodd(n)\n 1 == n % 2\n\n// check if n is an even number\n\neven(n)\n 0 == n % 2\n\n// check if color is light\n\nlight(color)\n lightness(color) >= 50%\n\n// check if color is dark\n\ndark(color)\n lightness(color) < 50%\n\n// desaturate color by amount\n\ndesaturate(color, amount)\n adjust(color, 'saturation', - amount)\n\n// saturate color by amount\n\nsaturate(color = '', amount = 100%)\n if color is a 'color'\n adjust(color, 'saturation', amount)\n else\n unquote( 'saturate(' + color + ')' )\n\n// darken by the given amount\n\ndarken(color, amount)\n adjust(color, 'lightness', - amount)\n\n// lighten by the given amount\n\nlighten(color, amount)\n adjust(color, 'lightness', amount)\n\n// decrease opacity by amount\n\nfade-out(color, amount)\n color - rgba(black, percent-to-decimal(amount))\n\n// increase opacity by amount\n\nfade-in(color, amount)\n color + rgba(black, percent-to-decimal(amount))\n\n// spin hue by a given amount\n\nspin(color, amount)\n color + unit(amount, deg)\n\n// mix two colors by a given amount\n\nmix(color1, color2, weight = 50%)\n unless weight in 0..100\n error('Weight must be between 0% and 100%')\n\n if length(color1) == 2\n weight = color1[0]\n color1 = color1[1]\n\n else if length(color2) == 2\n weight = 100 - color2[0]\n color2 = color2[1]\n\n require-color(color1)\n require-color(color2)\n\n p = unit(weight / 100, '')\n w = p * 2 - 1\n\n a = alpha(color1) - alpha(color2)\n\n w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2\n w2 = 1 - w1\n\n channels = (red(color1) red(color2)) (green(color1) green(color2)) (blue(color1) blue(color2))\n rgb = ()\n\n for pair in channels\n push(rgb, floor(pair[0] * w1 + pair[1] * w2))\n\n a1 = alpha(color1) * p\n a2 = alpha(color2) * (1 - p)\n alpha = a1 + a2\n\n rgba(rgb[0], rgb[1], rgb[2], alpha)\n\n// invert colors, leave alpha intact\n\ninvert(color = '')\n if color is a 'color'\n rgba(#fff - color, alpha(color))\n else\n unquote( 'invert(' + color + ')' )\n\n// give complement of the given color\n\ncomplement( color )\n spin( color, 180 )\n\n// give grayscale of the given color\n\ngrayscale( color = '' )\n if color is a 'color'\n desaturate( color, 100% )\n else\n unquote( 'grayscale(' + color + ')' )\n\n// mix the given color with white\n\ntint( color, percent )\n mix( white, color, percent )\n\n// mix the given color with black\n\nshade( color, percent )\n mix( black, color, percent )\n\n// return the last value in the given expr\n\nlast(expr)\n expr[length(expr) - 1]\n\n// return keys in the given pairs or object\n\nkeys(pairs)\n ret = ()\n if type(pairs) == 'object'\n for key in pairs\n push(ret, key)\n else\n for pair in pairs\n push(ret, pair[0]);\n ret\n\n// return values in the given pairs or object\n\nvalues(pairs)\n ret = ()\n if type(pairs) == 'object'\n for key, val in pairs\n push(ret, val)\n else\n for pair in pairs\n push(ret, pair[1]);\n ret\n\n// join values with the given delimiter\n\njoin(delim, vals...)\n buf = ''\n vals = vals[0] if length(vals) == 1\n for val, i in vals\n buf += i ? delim + val : val\n\n// add a CSS rule to the containing block\n\n// - This definition allows add-property to be used as a mixin\n// - It has the same effect as interpolation but allows users\n// to opt for a functional style\n\nadd-property-function = add-property\nadd-property(name, expr)\n if mixin\n {name} expr\n else\n add-property-function(name, expr)\n\nprefix-classes(prefix)\n -prefix-classes(prefix, block)\n\n// Caching mixin, use inside your functions to enable caching by extending.\n\n$stylus_mixin_cache = {}\ncache()\n $key = (current-media() or 'no-media') + '__' + called-from[0] + '__' + arguments\n if $key in $stylus_mixin_cache\n @extend {'$cache_placeholder_for_' + $stylus_mixin_cache[$key]}\n else if 'cache' in called-from\n {block}\n else\n $id = length($stylus_mixin_cache)\n\n &,\n /$cache_placeholder_for_{$id}\n $stylus_mixin_cache[$key] = $id\n {block}\n\n// Percentage function to convert a number, e.g. '.45', into a percentage, e.g. '45%'\n\npercentage(num)\n return unit(num * 100, '%')\n\n// Returns the position of a `value` within a `list`\n\nindex(list, value)\n for val, i in list\n return i if val == value\n"; - require.modules = {}; - require.resolve = function (path) { - var orig = path, reg = path + ".js", index = path + "/index.js"; - return require.modules[reg] && reg || require.modules[index] && index || orig - }; - require.register = function (path, fn) { - require.modules[path] = fn - }; - require.relative = function (parent) { - return function (p) { - if ("." != p[0]) return require(p); - var path = parent.split("/"), segs = p.split("/"); - path.pop(); - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if (".." == seg) path.pop(); else if ("." != seg) path.push(seg) - } - return require(path.join("/")) - } - }; - require.register("path.js", function (module, exports, require) { - var isWindows = false; - - function normalizeArray(parts, allowAboveRoot) { - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last == ".") {parts.splice(i, 1)} else if (last === "..") { - parts.splice(i, 1); - up++ - } else if (up) { - parts.splice(i, 1); - up-- - } - } - if (allowAboveRoot) {for (; up--; up) {parts.unshift("..")}} - return parts - } - - var splitPathRe = /^([\s\S]+\/(?!$)|\/)?((?:[\s\S]+?)?(\.[^.]*)?)$/; - exports.normalize = function (path) { - var isAbsolute = path.charAt(0) === "/", trailingSlash = path.slice(-1) === "/"; - path = normalizeArray(path.split("/").filter(function (p) { - return !!p - }), !isAbsolute).join("/"); - if (!path && !isAbsolute) {path = "."} - if (path && trailingSlash) {path += "/"} - return (isAbsolute ? "/" : "") + path - }; - exports.join = function () { - var paths = Array.prototype.slice.call(arguments, 0); - return exports.normalize(paths.filter(function (p, index) { - return p && typeof p === "string" - }).join("/")) - }; - exports.relative = function (from, to) { - from = exports.resolve(from).substr(1); - to = exports.resolve(to).substr(1); - - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) {if (arr[start] !== "") break} - var end = arr.length - 1; - for (; end >= 0; end--) {if (arr[end] !== "") break} - if (start > end) return []; - return arr.slice(start, end - start + 1) - } - - var fromParts = trim(from.split("/")); - var toParts = trim(to.split("/")); - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) {outputParts.push("..")} - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/") - }; - exports.dirname = function (path) { - var dir = splitPathRe.exec(path)[1] || ""; - if (!dir) {return "."} else if (dir.length === 1 || isWindows && dir.length <= 3 && dir.charAt(1) === ":") {return dir} else {return dir.substring(0, dir.length - 1)} - }; - exports.basename = function (path, ext) { - var f = splitPathRe.exec(path)[2] || ""; - if (ext && f.substr(-1 * ext.length) === ext) {f = f.substr(0, f.length - ext.length)} - return f - }; - exports.extname = function (path) { - return splitPathRe.exec(path)[3] || "" - } - }); - require.register("colors.js", function (module, exports, require) { - module.exports = { - aliceblue: [240, 248, 255, 1], antiquewhite: [250, 235, 215, 1], aqua: [0, 255, 255, 1], - aquamarine: [127, 255, 212, 1], azure: [240, 255, 255, 1], beige: [245, 245, 220, 1], - bisque: [255, 228, 196, 1], black: [0, 0, 0, 1], blanchedalmond: [255, 235, 205, 1], - blue: [0, 0, 255, 1], blueviolet: [138, 43, 226, 1], brown: [165, 42, 42, 1], - burlywood: [222, 184, 135, 1], cadetblue: [95, 158, 160, 1], chartreuse: [127, 255, 0, 1], - chocolate: [210, 105, 30, 1], coral: [255, 127, 80, 1], cornflowerblue: [100, 149, 237, 1], - cornsilk: [255, 248, 220, 1], crimson: [220, 20, 60, 1], cyan: [0, 255, 255, 1], - darkblue: [0, 0, 139, 1], darkcyan: [0, 139, 139, 1], darkgoldenrod: [184, 134, 11, 1], - darkgray: [169, 169, 169, 1], darkgreen: [0, 100, 0, 1], darkgrey: [169, 169, 169, 1], - darkkhaki: [189, 183, 107, 1], darkmagenta: [139, 0, 139, 1], darkolivegreen: [85, 107, 47, 1], - darkorange: [255, 140, 0, 1], darkorchid: [153, 50, 204, 1], darkred: [139, 0, 0, 1], - darksalmon: [233, 150, 122, 1], darkseagreen: [143, 188, 143, 1], darkslateblue: [72, 61, 139, 1], - darkslategray: [47, 79, 79, 1], darkslategrey: [47, 79, 79, 1], darkturquoise: [0, 206, 209, 1], - darkviolet: [148, 0, 211, 1], deeppink: [255, 20, 147, 1], deepskyblue: [0, 191, 255, 1], - dimgray: [105, 105, 105, 1], dimgrey: [105, 105, 105, 1], dodgerblue: [30, 144, 255, 1], - firebrick: [178, 34, 34, 1], floralwhite: [255, 250, 240, 1], forestgreen: [34, 139, 34, 1], - fuchsia: [255, 0, 255, 1], gainsboro: [220, 220, 220, 1], ghostwhite: [248, 248, 255, 1], - gold: [255, 215, 0, 1], goldenrod: [218, 165, 32, 1], gray: [128, 128, 128, 1], - green: [0, 128, 0, 1], greenyellow: [173, 255, 47, 1], grey: [128, 128, 128, 1], - honeydew: [240, 255, 240, 1], hotpink: [255, 105, 180, 1], indianred: [205, 92, 92, 1], - indigo: [75, 0, 130, 1], ivory: [255, 255, 240, 1], khaki: [240, 230, 140, 1], - lavender: [230, 230, 250, 1], lavenderblush: [255, 240, 245, 1], lawngreen: [124, 252, 0, 1], - lemonchiffon: [255, 250, 205, 1], lightblue: [173, 216, 230, 1], lightcoral: [240, 128, 128, 1], - lightcyan: [224, 255, 255, 1], lightgoldenrodyellow: [250, 250, 210, 1], lightgray: [211, 211, 211, 1], - lightgreen: [144, 238, 144, 1], lightgrey: [211, 211, 211, 1], lightpink: [255, 182, 193, 1], - lightsalmon: [255, 160, 122, 1], lightseagreen: [32, 178, 170, 1], lightskyblue: [135, 206, 250, 1], - lightslategray: [119, 136, 153, 1], lightslategrey: [119, 136, 153, 1], lightsteelblue: [176, 196, 222, 1], - lightyellow: [255, 255, 224, 1], lime: [0, 255, 0, 1], limegreen: [50, 205, 50, 1], - linen: [250, 240, 230, 1], magenta: [255, 0, 255, 1], maroon: [128, 0, 0, 1], - mediumaquamarine: [102, 205, 170, 1], mediumblue: [0, 0, 205, 1], mediumorchid: [186, 85, 211, 1], - mediumpurple: [147, 112, 219, 1], mediumseagreen: [60, 179, 113, 1], mediumslateblue: [123, 104, 238, 1], - mediumspringgreen: [0, 250, 154, 1], mediumturquoise: [72, 209, 204, 1], mediumvioletred: [199, 21, 133, 1], - midnightblue: [25, 25, 112, 1], mintcream: [245, 255, 250, 1], mistyrose: [255, 228, 225, 1], - moccasin: [255, 228, 181, 1], navajowhite: [255, 222, 173, 1], navy: [0, 0, 128, 1], - oldlace: [253, 245, 230, 1], olive: [128, 128, 0, 1], olivedrab: [107, 142, 35, 1], - orange: [255, 165, 0, 1], orangered: [255, 69, 0, 1], orchid: [218, 112, 214, 1], - palegoldenrod: [238, 232, 170, 1], palegreen: [152, 251, 152, 1], paleturquoise: [175, 238, 238, 1], - palevioletred: [219, 112, 147, 1], papayawhip: [255, 239, 213, 1], peachpuff: [255, 218, 185, 1], - peru: [205, 133, 63, 1], pink: [255, 192, 203, 1], plum: [221, 160, 221, 1], - powderblue: [176, 224, 230, 1], purple: [128, 0, 128, 1], red: [255, 0, 0, 1], - rosybrown: [188, 143, 143, 1], royalblue: [65, 105, 225, 1], saddlebrown: [139, 69, 19, 1], - salmon: [250, 128, 114, 1], sandybrown: [244, 164, 96, 1], seagreen: [46, 139, 87, 1], - seashell: [255, 245, 238, 1], sienna: [160, 82, 45, 1], silver: [192, 192, 192, 1], - skyblue: [135, 206, 235, 1], slateblue: [106, 90, 205, 1], slategray: [112, 128, 144, 1], - slategrey: [112, 128, 144, 1], snow: [255, 250, 250, 1], springgreen: [0, 255, 127, 1], - steelblue: [70, 130, 180, 1], tan: [210, 180, 140, 1], teal: [0, 128, 128, 1], - thistle: [216, 191, 216, 1], tomato: [255, 99, 71, 1], transparent: [0, 0, 0, 0], - turquoise: [64, 224, 208, 1], violet: [238, 130, 238, 1], wheat: [245, 222, 179, 1], - white: [255, 255, 255, 1], whitesmoke: [245, 245, 245, 1], yellow: [255, 255, 0, 1], - yellowgreen: [154, 205, 50, 1], rebeccapurple: [102, 51, 153, 1], - } - }); - require.register("errors.js", function (module, exports, require) { - exports.ParseError = ParseError; - exports.SyntaxError = SyntaxError; - SyntaxError.prototype.__proto__ = Error.prototype; - - function ParseError(msg) { - this.name = "ParseError"; - this.message = msg; - Error.captureStackTrace(this, ParseError) - } - - ParseError.prototype.__proto__ = Error.prototype; - - function SyntaxError(msg) { - this.name = "SyntaxError"; - this.message = msg; - Error.captureStackTrace(this, ParseError) - } - - SyntaxError.prototype.__proto__ = Error.prototype - }); - require.register("units.js", function (module, exports, require) { - module.exports = ["em", "ex", "ch", "rem", "vw", "vh", "vmin", "vmax", "cm", "mm", "in", "pt", "pc", "px", "deg", "grad", "rad", "turn", "s", "ms", "Hz", "kHz", "dpi", "dpcm", "dppx", "x", "%", "fr"] - }); - require.register("functions/index.js", function (module, exports, require) { - exports["add-property"] = require("./add-property"); - exports.adjust = require("./adjust"); - exports.alpha = require("./alpha"); - exports["base-convert"] = require("./base-convert"); - exports.basename = require("./basename"); - exports.blend = require("./blend"); - exports.blue = require("./blue"); - exports.clone = require("./clone"); - exports.component = require("./component"); - exports.contrast = require("./contrast"); - exports.convert = require("./convert"); - exports["current-media"] = require("./current-media"); - exports.define = require("./define"); - exports.dirname = require("./dirname"); - exports.error = require("./error"); - exports.extname = require("./extname"); - exports.green = require("./green"); - exports.hsl = require("./hsl"); - exports.hsla = require("./hsla"); - exports.hue = require("./hue"); - exports.length = require("./length"); - exports.lightness = require("./lightness"); - exports["list-separator"] = require("./list-separator"); - exports.lookup = require("./lookup"); - exports.luminosity = require("./luminosity"); - exports.match = require("./match"); - exports.math = require("./math"); - exports.merge = exports.extend = require("./merge"); - exports.operate = require("./operate"); - exports["opposite-position"] = require("./opposite-position"); - exports.p = require("./p"); - exports.pathjoin = require("./pathjoin"); - exports.pop = require("./pop"); - exports.push = exports.append = require("./push"); - exports.range = require("./range"); - exports.red = require("./red"); - exports.remove = require("./remove"); - exports.replace = require("./replace"); - exports.rgb = require("./rgb"); - exports.rgba = require("./rgba"); - exports.s = require("./s"); - exports.saturation = require("./saturation"); - exports["selector-exists"] = require("./selector-exists"); - exports.selector = require("./selector"); - exports.selectors = require("./selectors"); - exports.shift = require("./shift"); - exports.split = require("./split"); - exports.substr = require("./substr"); - exports.slice = require("./slice"); - exports.tan = require("./tan"); - exports.trace = require("./trace"); - exports.transparentify = require("./transparentify"); - exports.type = exports.typeof = exports["type-of"] = require("./type"); - exports.unit = require("./unit"); - exports.unquote = require("./unquote"); - exports.unshift = exports.prepend = require("./unshift"); - exports.warn = require("./warn"); - exports["-math-prop"] = require("./math-prop"); - exports["-prefix-classes"] = require("./prefix-classes") - }); - require.register("functions/url.js", function (module, exports, require) { - var Compiler = require("../visitor/compiler"), - events = require("../renderer").events, - nodes = require("../nodes"), - extname = require("../path").extname, - utils = require("../utils"); - var defaultMimes = { - ".gif": "image/gif", ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".svg": "image/svg+xml", - ".webp": "image/webp", ".ttf": "application/x-font-ttf", ".eot": "application/vnd.ms-fontobject", - ".woff": "application/font-woff", ".woff2": "application/font-woff2", - }; - var encodingTypes = {BASE_64: "base64", UTF8: "charset=utf-8"}; - module.exports = function (options) { - options = options || {}; - var _paths = options.paths || []; - var sizeLimit = null != options.limit ? options.limit : 3e4; - var mimes = options.mimes || defaultMimes; - - function fn(url, enc) { - var compiler = new Compiler(url), encoding = encodingTypes.BASE_64; - compiler.isURL = true; - url = url.nodes.map(function (node) { - return compiler.visit(node) - }).join(""); - url = parse(url); - var ext = extname(url.pathname), - mime = mimes[ext], - hash = url.hash || "", - literal = new nodes.Literal('url("' + url.href + '")'), - paths = _paths.concat(this.paths), - buf, - result; - if (!mime) return literal; - if (url.protocol) return literal; - var found = utils.lookup(url.pathname, paths); - if (!found) { - events.emit("file not found", "File " + literal + " could not be found, literal url retained!"); - return literal - } - buf = fs.readFileSync(found); - if (false !== sizeLimit && buf.length > sizeLimit) return literal; - if (enc && "utf8" == enc.first.val.toLowerCase()) { - encoding = encodingTypes.UTF8; - result = buf.toString("utf8").replace(/\s+/g, " ").replace(/[{}\|\\\^~\[\]`"<>#%]/g, function (match) { - return "%" + match[0].charCodeAt(0).toString(16).toUpperCase() - }).trim() - } else {result = buf.toString(encoding) + hash} - return new nodes.Literal('url("data:' + mime + ";" + encoding + "," + result + '")') - } - - fn.raw = true; - return fn - }; - module.exports.mimes = defaultMimes - }); - require.register("functions/add-property.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - (module.exports = function addProperty(name, expr) { - utils.assertType(name, "expression", "name"); - name = utils.unwrap(name).first; - utils.assertString(name, "name"); - utils.assertType(expr, "expression", "expr"); - var prop = new nodes.Property([name], expr); - var block = this.closestBlock; - var len = block.nodes.length, - head = block.nodes.slice(0, block.index), - tail = block.nodes.slice(block.index++, len); - head.push(prop); - block.nodes = head.concat(tail); - return prop - }).raw = true - }); - require.register("functions/adjust.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function adjust(color, prop, amount) { - utils.assertColor(color, "color"); - utils.assertString(prop, "prop"); - utils.assertType(amount, "unit", "amount"); - var hsl = color.hsla.clone(); - prop = {hue: "h", saturation: "s", lightness: "l"}[prop.string]; - if (!prop) throw new Error("invalid adjustment property"); - var val = amount.val; - if ("%" == amount.type) {val = "l" == prop && val > 0 ? (100 - hsl[prop]) * val / 100 : hsl[prop] * (val / 100)} - hsl[prop] += val; - return hsl.rgba - } - }); - require.register("functions/alpha.js", function (module, exports, require) { - var nodes = require("../nodes"), rgba = require("./rgba"); - module.exports = function alpha(color, value) { - color = color.rgba; - if (value) {return rgba(new nodes.Unit(color.r), new nodes.Unit(color.g), new nodes.Unit(color.b), value)} - return new nodes.Unit(color.a, "") - } - }); - require.register("functions/base-convert.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - (module.exports = function (num, base, width) { - utils.assertPresent(num, "number"); - utils.assertPresent(base, "base"); - num = utils.unwrap(num).nodes[0].val; - base = utils.unwrap(base).nodes[0].val; - width = width && utils.unwrap(width).nodes[0].val || 2; - var result = Number(num).toString(base); - while (result.length < width) {result = "0" + result} - return new nodes.Literal(result) - }).raw = true - }); - require.register("functions/basename.js", function (module, exports, require) { - var utils = require("../utils"), path = require("../path"); - module.exports = function basename(p, ext) { - utils.assertString(p, "path"); - return path.basename(p.val, ext && ext.val) - } - }); - require.register("functions/blend.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function blend(top, bottom) { - utils.assertColor(top); - top = top.rgba; - bottom = bottom || new nodes.RGBA(255, 255, 255, 1); - utils.assertColor(bottom); - bottom = bottom.rgba; - return new nodes.RGBA(top.r * top.a + bottom.r * (1 - top.a), top.g * top.a + bottom.g * (1 - top.a), top.b * top.a + bottom.b * (1 - top.a), top.a + bottom.a - top.a * bottom.a) - } - }); - require.register("functions/blue.js", function (module, exports, require) { - var nodes = require("../nodes"), rgba = require("./rgba"); - module.exports = function blue(color, value) { - color = color.rgba; - if (value) {return rgba(new nodes.Unit(color.r), new nodes.Unit(color.g), value, new nodes.Unit(color.a))} - return new nodes.Unit(color.b, "") - } - }); - require.register("functions/clone.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function clone(expr) { - utils.assertPresent(expr, "expr"); - return expr.clone() - }).raw = true - }); - require.register("functions/component.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - var componentMap = {red: "r", green: "g", blue: "b", alpha: "a", hue: "h", saturation: "s", lightness: "l"}; - var unitMap = {hue: "deg", saturation: "%", lightness: "%"}; - var typeMap = { - red: "rgba", blue: "rgba", green: "rgba", alpha: "rgba", hue: "hsla", saturation: "hsla", lightness: "hsla", - }; - module.exports = function component(color, name) { - utils.assertColor(color, "color"); - utils.assertString(name, "name"); - var name = name.string, unit = unitMap[name], type = typeMap[name], name = componentMap[name]; - if (!name) throw new Error('invalid color component "' + name + '"'); - return new nodes.Unit(color[type][name], unit) - } - }); - require.register("functions/contrast.js", function (module, exports, require) { - var utils = require("../utils"), - nodes = require("../nodes"), - blend = require("./blend"), - luminosity = require("./luminosity"); - module.exports = function contrast(top, bottom) { - if ("rgba" != top.nodeName && "hsla" != top.nodeName) {return new nodes.Literal("contrast(" + (top.isNull ? "" : top.toString()) + ")")} - var result = new nodes.Object; - top = top.rgba; - bottom = bottom || new nodes.RGBA(255, 255, 255, 1); - utils.assertColor(bottom); - bottom = bottom.rgba; - - function contrast(top, bottom) { - if (1 > top.a) {top = blend(top, bottom)} - var l1 = luminosity(bottom).val + .05, l2 = luminosity(top).val + .05, ratio = l1 / l2; - if (l2 > l1) {ratio = 1 / ratio} - return Math.round(ratio * 10) / 10 - } - - if (1 <= bottom.a) { - var resultRatio = new nodes.Unit(contrast(top, bottom)); - result.set("ratio", resultRatio); - result.set("error", new nodes.Unit(0)); - result.set("min", resultRatio); - result.set("max", resultRatio) - } else { - var onBlack = contrast(top, blend(bottom, new nodes.RGBA(0, 0, 0, 1))), - onWhite = contrast(top, blend(bottom, new nodes.RGBA(255, 255, 255, 1))), - max = Math.max(onBlack, onWhite); - - function processChannel(topChannel, bottomChannel) { - return Math.min(Math.max(0, (topChannel - bottomChannel * bottom.a) / (1 - bottom.a)), 255) - } - - var closest = new nodes.RGBA(processChannel(top.r, bottom.r), processChannel(top.g, bottom.g), processChannel(top.b, bottom.b), 1); - var min = contrast(top, blend(bottom, closest)); - result.set("ratio", new nodes.Unit(Math.round((min + max) * 50) / 100)); - result.set("error", new nodes.Unit(Math.round((max - min) * 50) / 100)); - result.set("min", new nodes.Unit(min)); - result.set("max", new nodes.Unit(max)) - } - return result - } - }); - require.register("functions/convert.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function convert(str) { - utils.assertString(str, "str"); - return utils.parseString(str.string) - } - }); - require.register("functions/current-media.js", function (module, exports, require) { - var nodes = require("../nodes"); - module.exports = function currentMedia() { - var self = this; - return new nodes.String(lookForMedia(this.closestBlock.node) || ""); - - function lookForMedia(node) { - if ("media" == node.nodeName) { - node.val = self.visit(node.val); - return node.toString() - } else if (node.block.parent.node) {return lookForMedia(node.block.parent.node)} - } - } - }); - require.register("functions/define.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function define(name, expr, global) { - utils.assertType(name, "string", "name"); - expr = utils.unwrap(expr); - var scope = this.currentScope; - if (global && global.toBoolean().isTrue) {scope = this.global.scope} - var node = new nodes.Ident(name.val, expr); - scope.add(node); - return nodes.nil - } - }); - require.register("functions/dirname.js", function (module, exports, require) { - var utils = require("../utils"), path = require("../path"); - module.exports = function dirname(p) { - utils.assertString(p, "path"); - return path.dirname(p.val).replace(/\\/g, "/") - } - }); - require.register("functions/error.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function error(msg) { - utils.assertType(msg, "string", "msg"); - var err = new Error(msg.val); - err.fromStylus = true; - throw err - } - }); - require.register("functions/extname.js", function (module, exports, require) { - var utils = require("../utils"), path = require("../path"); - module.exports = function extname(p) { - utils.assertString(p, "path"); - return path.extname(p.val) - } - }); - require.register("functions/green.js", function (module, exports, require) { - var nodes = require("../nodes"), rgba = require("./rgba"); - module.exports = function green(color, value) { - color = color.rgba; - if (value) {return rgba(new nodes.Unit(color.r), value, new nodes.Unit(color.b), new nodes.Unit(color.a))} - return new nodes.Unit(color.g, "") - } - }); - require.register("functions/hsl.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"), hsla = require("./hsla"); - module.exports = function hsl(hue, saturation, lightness) { - if (1 == arguments.length) { - utils.assertColor(hue, "color"); - return hue.hsla - } else {return hsla(hue, saturation, lightness, new nodes.Unit(1))} - } - }); - require.register("functions/hsla.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function hsla(hue, saturation, lightness, alpha) { - switch (arguments.length) { - case 1: - utils.assertColor(hue); - return hue.hsla; - case 2: - utils.assertColor(hue); - var color = hue.hsla; - utils.assertType(saturation, "unit", "alpha"); - var alpha = saturation.clone(); - if ("%" == alpha.type) alpha.val /= 100; - return new nodes.HSLA(color.h, color.s, color.l, alpha.val); - default: - utils.assertType(hue, "unit", "hue"); - utils.assertType(saturation, "unit", "saturation"); - utils.assertType(lightness, "unit", "lightness"); - utils.assertType(alpha, "unit", "alpha"); - var alpha = alpha.clone(); - if (alpha && "%" == alpha.type) alpha.val /= 100; - return new nodes.HSLA(hue.val, saturation.val, lightness.val, alpha.val) - } - } - }); - require.register("functions/hue.js", function (module, exports, require) { - var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component"); - module.exports = function hue(color, value) { - if (value) { - var hslaColor = color.hsla; - return hsla(value, new nodes.Unit(hslaColor.s), new nodes.Unit(hslaColor.l), new nodes.Unit(hslaColor.a)) - } - return component(color, new nodes.String("hue")) - } - }); - require.register("functions/length.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function length(expr) { - if (expr) { - if (expr.nodes) { - var nodes = utils.unwrap(expr).nodes; - if (1 == nodes.length && "object" == nodes[0].nodeName) {return nodes[0].length} else {return nodes.length} - } else {return 1} - } - return 0 - }).raw = true - }); - require.register("functions/lightness.js", function (module, exports, require) { - var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component"); - module.exports = function lightness(color, value) { - if (value) { - var hslaColor = color.hsla; - return hsla(new nodes.Unit(hslaColor.h), new nodes.Unit(hslaColor.s), value, new nodes.Unit(hslaColor.a)) - } - return component(color, new nodes.String("lightness")) - } - }); - require.register("functions/list-separator.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - (module.exports = function listSeparator(list) { - list = utils.unwrap(list); - return new nodes.String(list.isList ? "," : " ") - }).raw = true - }); - require.register("functions/lookup.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function lookup(name) { - utils.assertType(name, "string", "name"); - var node = this.lookup(name.val); - if (!node) return nodes.nil; - return this.visit(node) - } - }); - require.register("functions/luminosity.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function luminosity(color) { - utils.assertColor(color); - color = color.rgba; - - function processChannel(channel) { - channel = channel / 255; - return .03928 > channel ? channel / 12.92 : Math.pow((channel + .055) / 1.055, 2.4) - } - - return new nodes.Unit(.2126 * processChannel(color.r) + .7152 * processChannel(color.g) + .0722 * processChannel(color.b)) - } - }); - require.register("functions/match.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - var VALID_FLAGS = "igm"; - module.exports = function match(pattern, val, flags) { - utils.assertType(pattern, "string", "pattern"); - utils.assertString(val, "val"); - var re = new RegExp(pattern.val, validateFlags(flags) ? flags.string : ""); - return val.string.match(re) - }; - - function validateFlags(flags) { - flags = flags && flags.string; - if (flags) { - return flags.split("").every(function (flag) { - return ~VALID_FLAGS.indexOf(flag) - }) - } - return false - } - }); - require.register("functions/math-prop.js", function (module, exports, require) { - var nodes = require("../nodes"); - module.exports = function math(prop) { - return new nodes.Unit(Math[prop.string]) - } - }); - require.register("functions/math.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function math(n, fn) { - utils.assertType(n, "unit", "n"); - utils.assertString(fn, "fn"); - return new nodes.Unit(Math[fn.string](n.val), n.type) - } - }); - require.register("functions/merge.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function merge(dest) { - utils.assertPresent(dest, "dest"); - dest = utils.unwrap(dest).first; - utils.assertType(dest, "object", "dest"); - var last = utils.unwrap(arguments[arguments.length - 1]).first, deep = true === last.val; - for (var i = 1, len = arguments.length - deep; i < len; ++i) {utils.merge(dest.vals, utils.unwrap(arguments[i]).first.vals, deep)} - return dest - }).raw = true - }); - require.register("functions/operate.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function operate(op, left, right) { - utils.assertType(op, "string", "op"); - utils.assertPresent(left, "left"); - utils.assertPresent(right, "right"); - return left.operate(op.val, right) - } - }); - require.register("functions/opposite-position.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - (module.exports = function oppositePosition(positions) { - var expr = []; - utils.unwrap(positions).nodes.forEach(function (pos, i) { - utils.assertString(pos, "position " + i); - pos = function () { - switch (pos.string) { - case"top": - return "bottom"; - case"bottom": - return "top"; - case"left": - return "right"; - case"right": - return "left"; - case"center": - return "center"; - default: - throw new Error("invalid position " + pos) - } - }(); - expr.push(new nodes.Literal(pos)) - }); - return expr - }).raw = true - }); - require.register("functions/p.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - (module.exports = function p() { - [].slice.call(arguments).forEach(function (expr) { - expr = utils.unwrap(expr); - if (!expr.nodes.length) return; - console.log("inspect: %s", expr.toString().replace(/^\(|\)$/g, "")) - }); - return nodes.nil - }).raw = true - }); - require.register("functions/pathjoin.js", function (module, exports, require) { - var path = require("../path"); - (module.exports = function pathjoin() { - var paths = [].slice.call(arguments).map(function (path) { - return path.first.string - }); - return path.join.apply(null, paths).replace(/\\/g, "/") - }).raw = true - }); - require.register("functions/pop.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function pop(expr) { - expr = utils.unwrap(expr); - return expr.nodes.pop() - }).raw = true - }); - require.register("functions/prefix-classes.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function prefixClasses(prefix, block) { - utils.assertString(prefix, "prefix"); - utils.assertType(block, "block", "block"); - var _prefix = this.prefix; - this.options.prefix = this.prefix = prefix.string; - block = this.visit(block); - this.options.prefix = this.prefix = _prefix; - return block - } - }); - require.register("functions/push.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function (expr) { - expr = utils.unwrap(expr); - for (var i = 1, len = arguments.length; i < len; ++i) {expr.nodes.push(utils.unwrap(arguments[i]).clone())} - return expr.nodes.length - }).raw = true - }); - require.register("functions/range.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function range(start, stop, step) { - utils.assertType(start, "unit", "start"); - utils.assertType(stop, "unit", "stop"); - if (step) { - utils.assertType(step, "unit", "step"); - if (0 == step.val) {throw new Error('ArgumentError: "step" argument must not be zero')} - } else {step = new nodes.Unit(1)} - var list = new nodes.Expression; - for (var i = start.val; i <= stop.val; i += step.val) {list.push(new nodes.Unit(i, start.type))} - return list - } - }); - require.register("functions/red.js", function (module, exports, require) { - var nodes = require("../nodes"), rgba = require("./rgba"); - module.exports = function red(color, value) { - color = color.rgba; - if (value) {return rgba(value, new nodes.Unit(color.g), new nodes.Unit(color.b), new nodes.Unit(color.a))} - return new nodes.Unit(color.r, "") - } - }); - require.register("functions/remove.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function remove(object, key) { - utils.assertType(object, "object", "object"); - utils.assertString(key, "key"); - delete object.vals[key.string]; - return object - } - }); - require.register("functions/replace.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function replace(pattern, replacement, val) { - utils.assertString(pattern, "pattern"); - utils.assertString(replacement, "replacement"); - utils.assertString(val, "val"); - pattern = new RegExp(pattern.string, "g"); - var res = val.string.replace(pattern, replacement.string); - return val instanceof nodes.Ident ? new nodes.Ident(res) : new nodes.String(res) - } - }); - require.register("functions/rgb.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"), rgba = require("./rgba"); - module.exports = function rgb(red, green, blue) { - switch (arguments.length) { - case 1: - utils.assertColor(red); - var color = red.rgba; - return new nodes.RGBA(color.r, color.g, color.b, 1); - default: - return rgba(red, green, blue, new nodes.Unit(1)) - } - } - }); - require.register("functions/rgba.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function rgba(red, green, blue, alpha) { - switch (arguments.length) { - case 1: - utils.assertColor(red); - return red.rgba; - case 2: - utils.assertColor(red); - var color = red.rgba; - utils.assertType(green, "unit", "alpha"); - alpha = green.clone(); - if ("%" == alpha.type) alpha.val /= 100; - return new nodes.RGBA(color.r, color.g, color.b, alpha.val); - default: - utils.assertType(red, "unit", "red"); - utils.assertType(green, "unit", "green"); - utils.assertType(blue, "unit", "blue"); - utils.assertType(alpha, "unit", "alpha"); - var r = "%" == red.type ? Math.round(red.val * 2.55) : red.val, - g = "%" == green.type ? Math.round(green.val * 2.55) : green.val, - b = "%" == blue.type ? Math.round(blue.val * 2.55) : blue.val; - alpha = alpha.clone(); - if (alpha && "%" == alpha.type) alpha.val /= 100; - return new nodes.RGBA(r, g, b, alpha.val) - } - } - }); - require.register("functions/s.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"), Compiler = require("../visitor/compiler"); - (module.exports = function s(fmt) { - fmt = utils.unwrap(fmt).nodes[0]; - utils.assertString(fmt); - var self = this, str = fmt.string, args = arguments, i = 1; - str = str.replace(/%(s|d)/g, function (_, specifier) { - var arg = args[i++] || nodes.nil; - switch (specifier) { - case"s": - return new Compiler(arg, self.options).compile(); - case"d": - arg = utils.unwrap(arg).first; - if ("unit" != arg.nodeName) throw new Error("%d requires a unit"); - return arg.val - } - }); - return new nodes.Literal(str) - }).raw = true - }); - require.register("functions/saturation.js", function (module, exports, require) { - var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component"); - module.exports = function saturation(color, value) { - if (value) { - var hslaColor = color.hsla; - return hsla(new nodes.Unit(hslaColor.h), value, new nodes.Unit(hslaColor.l), new nodes.Unit(hslaColor.a)) - } - return component(color, new nodes.String("saturation")) - } - }); - require.register("functions/selector-exists.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function selectorExists(sel) { - utils.assertString(sel, "selector"); - if (!this.__selectorsMap__) { - var Normalizer = require("../visitor/normalizer"), - visitor = new Normalizer(this.root.clone()); - visitor.visit(visitor.root); - this.__selectorsMap__ = visitor.map - } - return sel.string in this.__selectorsMap__ - } - }); - require.register("functions/selector.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function selector() { - var stack = this.selectorStack, args = [].slice.call(arguments); - if (1 == args.length) { - var expr = utils.unwrap(args[0]), len = expr.nodes.length; - if (1 == len) { - utils.assertString(expr.first, "selector"); - var SelectorParser = require("../selector-parser"), - val = expr.first.string, - parsed = new SelectorParser(val).parse().val; - if (parsed == val) return val; - stack.push(parse(val)) - } else if (len > 1) { - if (expr.isList) {pushToStack(expr.nodes, stack)} else { - stack.push(parse(expr.nodes.map(function (node) { - utils.assertString(node, "selector"); - return node.string - }).join(" "))) - } - } - } else if (args.length > 1) {pushToStack(args, stack)} - return stack.length ? utils.compileSelectors(stack).join(",") : "&" - }).raw = true; - - function pushToStack(selectors, stack) { - selectors.forEach(function (sel) { - sel = sel.first; - utils.assertString(sel, "selector"); - stack.push(parse(sel.string)) - }) - } - - function parse(selector) { - var Parser = new require("../parser"), parser = new Parser(selector), nodes; - parser.state.push("selector-parts"); - nodes = parser.selector(); - nodes.forEach(function (node) { - node.val = node.segments.map(function (seg) { - return seg.toString() - }).join("") - }); - return nodes - } - }); - require.register("functions/selectors.js", function (module, exports, require) { - var nodes = require("../nodes"), Parser = require("../selector-parser"); - module.exports = function selectors() { - var stack = this.selectorStack, expr = new nodes.Expression(true); - if (stack.length) { - for (var i = 0; i < stack.length; i++) { - var group = stack[i], nested; - if (group.length > 1) { - expr.push(new nodes.String(group.map(function (selector) { - nested = new Parser(selector.val).parse().nested; - return (nested && i ? "& " : "") + selector.val - }).join(","))) - } else { - var selector = group[0].val; - nested = new Parser(selector).parse().nested; - expr.push(new nodes.String((nested && i ? "& " : "") + selector)) - } - } - } else {expr.push(new nodes.String("&"))} - return expr - } - }); - require.register("functions/shift.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function (expr) { - expr = utils.unwrap(expr); - return expr.nodes.shift() - }).raw = true - }); - require.register("functions/split.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function split(delim, val) { - utils.assertString(delim, "delimiter"); - utils.assertString(val, "val"); - var splitted = val.string.split(delim.string); - var expr = new nodes.Expression; - var ItemNode = val instanceof nodes.Ident ? nodes.Ident : nodes.String; - for (var i = 0, len = splitted.length; i < len; ++i) {expr.nodes.push(new ItemNode(splitted[i]))} - return expr - } - }); - require.register("functions/slice.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - (module.exports = function slice(val, start, end) { - start = start && start.nodes[0].val; - end = end && end.nodes[0].val; - val = utils.unwrap(val).nodes; - if (val.length > 1) {return utils.coerce(val.slice(start, end), true)} - var result = val[0].string.slice(start, end); - return val[0] instanceof nodes.Ident ? new nodes.Ident(result) : new nodes.String(result) - }).raw = true - }); - require.register("functions/substr.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function substr(val, start, length) { - utils.assertString(val, "val"); - utils.assertType(start, "unit", "start"); - length = length && length.val; - var res = val.string.substr(start.val, length); - return val instanceof nodes.Ident ? new nodes.Ident(res) : new nodes.String(res) - } - }); - require.register("functions/tan.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function tan(angle) { - utils.assertType(angle, "unit", "angle"); - var radians = angle.val; - if (angle.type === "deg") {radians *= Math.PI / 180} - var m = Math.pow(10, 9); - var sin = Math.round(Math.sin(radians) * m) / m, - cos = Math.round(Math.cos(radians) * m) / m, - tan = Math.round(m * sin / cos) / m; - return new nodes.Unit(tan, "") - } - }); - require.register("functions/trace.js", function (module, exports, require) { - var nodes = require("../nodes"); - module.exports = function trace() { - console.log(this.stack); - return nodes.nil - } - }); - require.register("functions/transparentify.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function transparentify(top, bottom, alpha) { - utils.assertColor(top); - top = top.rgba; - bottom = bottom || new nodes.RGBA(255, 255, 255, 1); - if (!alpha && bottom && !bottom.rgba) { - alpha = bottom; - bottom = new nodes.RGBA(255, 255, 255, 1) - } - utils.assertColor(bottom); - bottom = bottom.rgba; - var bestAlpha = ["r", "g", "b"].map(function (channel) { - return (top[channel] - bottom[channel]) / ((0 < top[channel] - bottom[channel] ? 255 : 0) - bottom[channel]) - }).sort(function (a, b) { - return a < b - })[0]; - if (alpha) { - utils.assertType(alpha, "unit", "alpha"); - if ("%" == alpha.type) {bestAlpha = alpha.val / 100} else if (!alpha.type) {bestAlpha = alpha = alpha.val} - } - bestAlpha = Math.max(Math.min(bestAlpha, 1), 0); - - function processChannel(channel) { - if (0 == bestAlpha) {return bottom[channel]} else {return bottom[channel] + (top[channel] - bottom[channel]) / bestAlpha} - } - - return new nodes.RGBA(processChannel("r"), processChannel("g"), processChannel("b"), Math.round(bestAlpha * 100) / 100) - } - }); - require.register("functions/type.js", function (module, exports, require) { - var utils = require("../utils"); - module.exports = function type(node) { - utils.assertPresent(node, "expression"); - return node.nodeName - } - }); - require.register("functions/unit.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function unit(unit, type) { - utils.assertType(unit, "unit", "unit"); - if (type) { - utils.assertString(type, "type"); - return new nodes.Unit(unit.val, type.string) - } else {return unit.type || ""} - } - }); - require.register("functions/unquote.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function unquote(string) { - utils.assertString(string, "string"); - return new nodes.Literal(string.string) - } - }); - require.register("functions/unshift.js", function (module, exports, require) { - var utils = require("../utils"); - (module.exports = function (expr) { - expr = utils.unwrap(expr); - for (var i = 1, len = arguments.length; i < len; ++i) {expr.nodes.unshift(utils.unwrap(arguments[i]))} - return expr.nodes.length - }).raw = true - }); - require.register("functions/warn.js", function (module, exports, require) { - var utils = require("../utils"), nodes = require("../nodes"); - module.exports = function warn(msg) { - utils.assertType(msg, "string", "msg"); - console.warn("Warning: %s", msg.val); - return nodes.nil - } - }); - require.register("lexer.js", function (module, exports, require) { - var Token = require("./token"), nodes = require("./nodes"), errors = require("./errors"); - exports = module.exports = Lexer; - var alias = {and: "&&", or: "||", is: "==", isnt: "!=", "is not": "!=", ":=": "?="}; - - function Lexer(str, options) { - options = options || {}; - this.stash = []; - this.indentStack = []; - this.indentRe = null; - this.lineno = 1; - this.column = 1; - - function comment(str, val, offset, s) { - var inComment = s.lastIndexOf("/*", offset) > s.lastIndexOf("*/", offset), - commentIdx = s.lastIndexOf("//", offset), - i = s.lastIndexOf("\n", offset), - double = 0, - single = 0; - if (~commentIdx && commentIdx > i) { - while (i != offset) { - if ("'" == s[i]) single ? single-- : single++; - if ('"' == s[i]) double ? double-- : double++; - if ("/" == s[i] && "/" == s[i + 1]) { - inComment = !single && !double; - break - } - ++i - } - } - return inComment ? str : val + "\r" - } - - if ("\ufeff" == str.charAt(0)) str = str.slice(1); - this.str = str.replace(/\s+$/, "\n").replace(/\r\n?/g, "\n").replace(/\\ *\n/g, "\r").replace(/([,(:](?!\/\/[^ ])) *(?:\/\/[^\n]*|\/\*.*?\*\/)?\n\s*/g, comment).replace(/\s*\n[ \t]*([,)])/g, comment) - } - - Lexer.prototype = { - inspect: function () { - var tok, tmp = this.str, buf = []; - while ("eos" != (tok = this.next()).type) {buf.push(tok.inspect())} - this.str = tmp; - return buf.concat(tok.inspect()).join("\n") - }, lookahead: function (n) { - var fetch = n - this.stash.length; - while (fetch-- > 0) this.stash.push(this.advance()); - return this.stash[--n] - }, skip: function (len) { - var chunk = len[0]; - len = chunk ? chunk.length : len; - this.str = this.str.substr(len); - if (chunk) {this.move(chunk)} else {this.column += len} - }, move: function (str) { - var lines = str.match(/\n/g), idx = str.lastIndexOf("\n"); - if (lines) this.lineno += lines.length; - this.column = ~idx ? str.length - idx : this.column + str.length - }, next: function () { - var tok = this.stashed() || this.advance(); - this.prev = tok; - return tok - }, isPartOfSelector: function () { - var tok = this.stash[this.stash.length - 1] || this.prev; - switch (tok && tok.type) { - case"color": - return 2 == tok.val.raw.length; - case".": - case"[": - return true - } - return false - }, advance: function () { - var column = this.column, - line = this.lineno, - tok = this.eos() || this.nil() || this.sep() || this.keyword() || this.urlchars() || this.comment() || this.newline() || this.escaped() || this.important() || this.literal() || this.fun() || this.anonFunc() || this.atrule() || this.brace() || this.paren() || this.color() || this.string() || this.unit() || this.namedop() || this.boolean() || this.unicode() || this.ident() || this.op() || this.eol() || this.space() || this.selector(); - tok.lineno = line; - tok.column = column; - return tok - }, peek: function () { - return this.lookahead(1) - }, stashed: function () { - return this.stash.shift() - }, eos: function () { - if (this.str.length) return; - if (this.indentStack.length) { - this.indentStack.shift(); - return new Token("outdent") - } else {return new Token("eos")} - }, urlchars: function () { - var captures; - if (!this.isURL) return; - if (captures = /^[\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)) { - this.skip(captures); - return new Token("literal", new nodes.Literal(captures[0])) - } - }, sep: function () { - var captures; - if (captures = /^;[ \t]*/.exec(this.str)) { - this.skip(captures); - return new Token(";") - } - }, eol: function () { - if ("\r" == this.str[0]) { - ++this.lineno; - this.skip(1); - return this.advance() - } - }, space: function () { - var captures; - if (captures = /^([ \t]+)/.exec(this.str)) { - this.skip(captures); - return new Token("space") - } - }, escaped: function () { - var captures; - if (captures = /^\\(.)[ \t]*/.exec(this.str)) { - var c = captures[1]; - this.skip(captures); - return new Token("ident", new nodes.Literal(c)) - } - }, literal: function () { - var captures; - if (captures = /^@css[ \t]*\{/.exec(this.str)) { - this.skip(captures); - var c, braces = 1, css = "", node; - while (c = this.str[0]) { - this.str = this.str.substr(1); - switch (c) { - case"{": - ++braces; - break; - case"}": - --braces; - break; - case"\n": - case"\r": - ++this.lineno; - break - } - css += c; - if (!braces) break - } - css = css.replace(/\s*}$/, ""); - node = new nodes.Literal(css); - node.css = true; - return new Token("literal", node) - } - }, important: function () { - var captures; - if (captures = /^!important[ \t]*/.exec(this.str)) { - this.skip(captures); - return new Token("ident", new nodes.Literal("!important")) - } - }, brace: function () { - var captures; - if (captures = /^([{}])/.exec(this.str)) { - this.skip(1); - var brace = captures[1]; - return new Token(brace, brace) - } - }, paren: function () { - var captures; - if (captures = /^([()])([ \t]*)/.exec(this.str)) { - var paren = captures[1]; - this.skip(captures); - if (")" == paren) this.isURL = false; - var tok = new Token(paren, paren); - tok.space = captures[2]; - return tok - } - }, nil: function () { - var captures, tok; - if (captures = /^(null)\b[ \t]*/.exec(this.str)) { - this.skip(captures); - if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {tok = new Token("null", nodes.nil)} - return tok - } - }, keyword: function () { - var captures, tok; - if (captures = /^(return|if|else|unless|for|in)\b[ \t]*/.exec(this.str)) { - var keyword = captures[1]; - this.skip(captures); - if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {tok = new Token(keyword, keyword)} - return tok - } - }, namedop: function () { - var captures, tok; - if (captures = /^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\b([ \t]*)/.exec(this.str)) { - var op = captures[1]; - this.skip(captures); - if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else { - op = alias[op] || op; - tok = new Token(op, op) - } - tok.space = captures[2]; - return tok - } - }, op: function () { - var captures; - if (captures = /^([.]{1,3}|&&|\|\||[!<>=?:]=|\*\*|[-+*\/%]=?|[,=?:!~<>&\[\]])([ \t]*)/.exec(this.str)) { - var op = captures[1]; - this.skip(captures); - op = alias[op] || op; - var tok = new Token(op, op); - tok.space = captures[2]; - this.isURL = false; - return tok - } - }, anonFunc: function () { - var tok; - if ("@" == this.str[0] && "(" == this.str[1]) { - this.skip(2); - tok = new Token("function", new nodes.Ident("anonymous")); - tok.anonymous = true; - return tok - } - }, atrule: function () { - var captures; - if (captures = /^@(?:-(\w+)-)?([a-zA-Z0-9-_]+)[ \t]*/.exec(this.str)) { - this.skip(captures); - var vendor = captures[1], type = captures[2], tok; - switch (type) { - case"require": - case"import": - case"charset": - case"namespace": - case"media": - case"scope": - case"supports": - return new Token(type); - case"document": - return new Token("-moz-document"); - case"block": - return new Token("atblock"); - case"extend": - case"extends": - return new Token("extend"); - case"keyframes": - return new Token(type, vendor); - default: - return new Token("atrule", vendor ? "-" + vendor + "-" + type : type) - } - } - }, comment: function () { - if ("/" == this.str[0] && "/" == this.str[1]) { - var end = this.str.indexOf("\n"); - if (-1 == end) end = this.str.length; - this.skip(end); - return this.advance() - } - if ("/" == this.str[0] && "*" == this.str[1]) { - var end = this.str.indexOf("*/"); - if (-1 == end) end = this.str.length; - var str = this.str.substr(0, end + 2), lines = str.split(/\n|\r/).length - 1, suppress = true, inline = false; - this.lineno += lines; - this.skip(end + 2); - if ("!" == str[2]) { - str = str.replace("*!", "*"); - suppress = false - } - if (this.prev && ";" == this.prev.type) inline = true; - return new Token("comment", new nodes.Comment(str, suppress, inline)) - } - }, "boolean": function () { - var captures; - if (captures = /^(true|false)\b([ \t]*)/.exec(this.str)) { - var val = nodes.Boolean("true" == captures[1]); - this.skip(captures); - var tok = new Token("boolean", val); - tok.space = captures[2]; - return tok - } - }, unicode: function () { - var captures; - if (captures = /^u\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)) { - this.skip(captures); - return new Token("literal", new nodes.Literal(captures[0])) - } - }, fun: function () { - var captures; - if (captures = /^(-*[_a-zA-Z$][-\w\d$]*)\(([ \t]*)/.exec(this.str)) { - var name = captures[1]; - this.skip(captures); - this.isURL = "url" == name; - var tok = new Token("function", new nodes.Ident(name)); - tok.space = captures[2]; - return tok - } - }, ident: function () { - var captures; - if (captures = /^-*[_a-zA-Z$][-\w\d$]*/.exec(this.str)) { - this.skip(captures); - return new Token("ident", new nodes.Ident(captures[0])) - } - }, newline: function () { - var captures, re; - if (this.indentRe) {captures = this.indentRe.exec(this.str)} else { - re = /^\n([\t]*)[ \t]*/; - captures = re.exec(this.str); - if (captures && !captures[1].length) { - re = /^\n([ \t]*)/; - captures = re.exec(this.str) - } - if (captures && captures[1].length) this.indentRe = re - } - if (captures) { - var tok, indents = captures[1].length; - this.skip(captures); - if (this.str[0] === " " || this.str[0] === " ") {throw new errors.SyntaxError("Invalid indentation. You can use tabs or spaces to indent, but not both.")} - if ("\n" == this.str[0]) return this.advance(); - if (this.indentStack.length && indents < this.indentStack[0]) { - while (this.indentStack.length && this.indentStack[0] > indents) { - this.stash.push(new Token("outdent")); - this.indentStack.shift() - } - tok = this.stash.pop() - } else if (indents && indents != this.indentStack[0]) { - this.indentStack.unshift(indents); - tok = new Token("indent") - } else {tok = new Token("newline")} - return tok - } - }, unit: function () { - var captures; - if (captures = /^(-)?(\d+\.\d+|\d+|\.\d+)(%|[a-zA-Z]+)?[ \t]*/.exec(this.str)) { - this.skip(captures); - var n = parseFloat(captures[2]); - if ("-" == captures[1]) n = -n; - var node = new nodes.Unit(n, captures[3]); - node.raw = captures[0]; - return new Token("unit", node) - } - }, string: function () { - var captures; - if (captures = /^("[^"]*"|'[^']*')[ \t]*/.exec(this.str)) { - var str = captures[1], quote = captures[0][0]; - this.skip(captures); - str = str.slice(1, -1).replace(/\\n/g, "\n"); - return new Token("string", new nodes.String(str, quote)) - } - }, color: function () { - return this.rrggbbaa() || this.rrggbb() || this.rgba() || this.rgb() || this.nn() || this.n() - }, n: function () { - var captures; - if (captures = /^#([a-fA-F0-9]{1})[ \t]*/.exec(this.str)) { - this.skip(captures); - var n = parseInt(captures[1] + captures[1], 16), color = new nodes.RGBA(n, n, n, 1); - color.raw = captures[0]; - return new Token("color", color) - } - }, nn: function () { - var captures; - if (captures = /^#([a-fA-F0-9]{2})[ \t]*/.exec(this.str)) { - this.skip(captures); - var n = parseInt(captures[1], 16), color = new nodes.RGBA(n, n, n, 1); - color.raw = captures[0]; - return new Token("color", color) - } - }, rgb: function () { - var captures; - if (captures = /^#([a-fA-F0-9]{3})[ \t]*/.exec(this.str)) { - this.skip(captures); - var rgb = captures[1], - r = parseInt(rgb[0] + rgb[0], 16), - g = parseInt(rgb[1] + rgb[1], 16), - b = parseInt(rgb[2] + rgb[2], 16), - color = new nodes.RGBA(r, g, b, 1); - color.raw = captures[0]; - return new Token("color", color) - } - }, rgba: function () { - var captures; - if (captures = /^#([a-fA-F0-9]{4})[ \t]*/.exec(this.str)) { - this.skip(captures); - var rgb = captures[1], - r = parseInt(rgb[0] + rgb[0], 16), - g = parseInt(rgb[1] + rgb[1], 16), - b = parseInt(rgb[2] + rgb[2], 16), - a = parseInt(rgb[3] + rgb[3], 16), - color = new nodes.RGBA(r, g, b, a / 255); - color.raw = captures[0]; - return new Token("color", color) - } - }, rrggbb: function () { - var captures; - if (captures = /^#([a-fA-F0-9]{6})[ \t]*/.exec(this.str)) { - this.skip(captures); - var rgb = captures[1], - r = parseInt(rgb.substr(0, 2), 16), - g = parseInt(rgb.substr(2, 2), 16), - b = parseInt(rgb.substr(4, 2), 16), - color = new nodes.RGBA(r, g, b, 1); - color.raw = captures[0]; - return new Token("color", color) - } - }, rrggbbaa: function () { - var captures; - if (captures = /^#([a-fA-F0-9]{8})[ \t]*/.exec(this.str)) { - this.skip(captures); - var rgb = captures[1], - r = parseInt(rgb.substr(0, 2), 16), - g = parseInt(rgb.substr(2, 2), 16), - b = parseInt(rgb.substr(4, 2), 16), - a = parseInt(rgb.substr(6, 2), 16), - color = new nodes.RGBA(r, g, b, a / 255); - color.raw = captures[0]; - return new Token("color", color) - } - }, selector: function () { - var captures; - if (captures = /^\^|.*?(?=\/\/(?![^\[]*\])|[,\n{])/.exec(this.str)) { - var selector = captures[0]; - this.skip(captures); - return new Token("selector", selector) - } - }, - } - }); - require.register("nodes/arguments.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("../nodes"), utils = require("../utils"); - var Arguments = module.exports = function Arguments() { - nodes.Expression.call(this); - this.map = {} - }; - Arguments.prototype.__proto__ = nodes.Expression.prototype; - 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 - }; - 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 - }; - 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, - } - } - }); - require.register("nodes/binop.js", function (module, exports, require) { - var Node = require("./node"); - var BinOp = module.exports = function BinOp(op, left, right) { - Node.call(this); - this.op = op; - this.left = left; - this.right = right - }; - BinOp.prototype.__proto__ = Node.prototype; - 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 - }; - BinOp.prototype.toString = function () { - return this.left.toString() + " " + this.op + " " + this.right.toString() - }; - 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 - } - }); - require.register("nodes/block.js", function (module, exports, require) { - var Node = require("./node"); - var Block = module.exports = function Block(parent, node) { - Node.call(this); - this.nodes = []; - this.parent = parent; - this.node = node; - this.scope = true - }; - Block.prototype.__proto__ = Node.prototype; - Block.prototype.__defineGetter__("hasProperties", function () { - for (var i = 0, len = this.nodes.length; i < len; ++i) {if ("property" == this.nodes[i].nodeName) {return true}} - }); - 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 - }); - Block.prototype.__defineGetter__("isEmpty", function () { - return !this.nodes.length - }); - 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 - }; - Block.prototype.push = function (node) { - this.nodes.push(node) - }; - Block.prototype.toJSON = function () { - return { - __type: "Block", scope: this.scope, lineno: this.lineno, column: this.column, filename: this.filename, - nodes: this.nodes, - } - } - }); - require.register("nodes/boolean.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - var Boolean = module.exports = function Boolean(val) { - Node.call(this); - if (this.nodeName) {this.val = !!val} else {return new Boolean(val)} - }; - Boolean.prototype.__proto__ = Node.prototype; - Boolean.prototype.toBoolean = function () { - return this - }; - Boolean.prototype.__defineGetter__("isTrue", function () { - return this.val - }); - Boolean.prototype.__defineGetter__("isFalse", function () { - return !this.val - }); - Boolean.prototype.negate = function () { - return new Boolean(!this.val) - }; - Boolean.prototype.inspect = function () { - return "[Boolean " + this.val + "]" - }; - Boolean.prototype.toString = function () { - return this.val ? "true" : "false" - }; - Boolean.prototype.toJSON = function () { - return {__type: "Boolean", val: this.val} - } - }); - require.register("nodes/call.js", function (module, exports, require) { - var Node = require("./node"); - var Call = module.exports = function Call(name, args) { - Node.call(this); - this.name = name; - this.args = args - }; - Call.prototype.__proto__ = Node.prototype; - 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 - }; - 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 + ")" - }; - 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 - } - }); - require.register("nodes/charset.js", function (module, exports, require) { - var Node = require("./node"); - var Charset = module.exports = function Charset(val) { - Node.call(this); - this.val = val - }; - Charset.prototype.__proto__ = Node.prototype; - Charset.prototype.toString = function () { - return "@charset " + this.val - }; - Charset.prototype.toJSON = function () { - return {__type: "Charset", val: this.val, lineno: this.lineno, column: this.column, filename: this.filename} - } - }); - require.register("nodes/namespace.js", function (module, exports, require) { - var Node = require("./node"); - var Namespace = module.exports = function Namespace(val, prefix) { - Node.call(this); - this.val = val; - this.prefix = prefix - }; - Namespace.prototype.__proto__ = Node.prototype; - Namespace.prototype.toString = function () { - return "@namespace " + (this.prefix ? this.prefix + " " : "") + this.val - }; - Namespace.prototype.toJSON = function () { - return { - __type: "Namespace", val: this.val, prefix: this.prefix, lineno: this.lineno, column: this.column, - filename: this.filename, - } - } - }); - require.register("nodes/comment.js", function (module, exports, require) { - var Node = require("./node"); - var Comment = module.exports = function Comment(str, suppress, inline) { - Node.call(this); - this.str = str; - this.suppress = suppress; - this.inline = inline - }; - Comment.prototype.__proto__ = Node.prototype; - 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, - } - }; - Comment.prototype.toString = function () { - return this.str - } - }); - require.register("nodes/each.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - 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 - }; - Each.prototype.__proto__ = Node.prototype; - 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 - }; - 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, - } - } - }); - require.register("nodes/expression.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("../nodes"), utils = require("../utils"); - var Expression = module.exports = function Expression(isList) { - Node.call(this); - this.nodes = []; - this.isList = isList - }; - Expression.prototype.__defineGetter__("isEmpty", function () { - return !this.nodes.length - }); - Expression.prototype.__defineGetter__("first", function () { - return this.nodes[0] ? this.nodes[0].first : nodes.nil - }); - Expression.prototype.__defineGetter__("hash", function () { - return this.nodes.map(function (node) { - return node.hash - }).join("::") - }); - Expression.prototype.__proto__ = Node.prototype; - 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 - }; - Expression.prototype.push = function (node) { - this.nodes.push(node) - }; - 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.nil; - 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.nil : 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.no; - for (var i = 0; i < len; ++i) { - a = this.nodes[i]; - b = right.nodes[i]; - if (a.operate(op, b).isTrue) continue; - return nodes.no - } - return nodes.yes; - break; - default: - return this.first.operate(op, right, val) - } - }; - Expression.prototype.toBoolean = function () { - if (this.nodes.length > 1) return nodes.yes; - return this.first.toBoolean() - }; - Expression.prototype.toString = function () { - return "(" + this.nodes.map(function (node) { - return node.toString() - }).join(this.isList ? ", " : " ") + ")" - }; - 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, - } - } - }); - require.register("nodes/function.js", function (module, exports, require) { - var Node = require("./node"); - 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 - }; - Function.prototype.__defineGetter__("arity", function () { - return this.params.length - }); - Function.prototype.__proto__ = Node.prototype; - Function.prototype.__defineGetter__("hash", function () { - return "function " + this.name - }); - 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 - }; - 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(", ") + ")"} - }; - 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 - } - }); - require.register("nodes/group.js", function (module, exports, require) { - var Node = require("./node"); - var Group = module.exports = function Group() { - Node.call(this); - this.nodes = []; - this.extends = [] - }; - Group.prototype.__proto__ = Node.prototype; - Group.prototype.push = function (selector) { - this.nodes.push(selector) - }; - Group.prototype.__defineGetter__("block", function () { - return this.nodes[0].block - }); - Group.prototype.__defineSetter__("block", function (block) { - for (var i = 0, len = this.nodes.length; i < len; ++i) {this.nodes[i].block = block} - }); - Group.prototype.__defineGetter__("hasOnlyPlaceholders", function () { - return this.nodes.every(function (selector) { - return selector.isPlaceholder - }) - }); - 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 - }; - Group.prototype.toJSON = function () { - return { - __type: "Group", nodes: this.nodes, block: this.block, lineno: this.lineno, column: this.column, - filename: this.filename, - } - } - }); - require.register("nodes/hsla.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - 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 - }; - HSLA.prototype.__proto__ = Node.prototype; - HSLA.prototype.toString = function () { - return "hsla(" + this.h + "," + this.s.toFixed(0) + "%," + this.l.toFixed(0) + "%," + this.a + ")" - }; - 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 - }; - 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, - } - }; - HSLA.prototype.__defineGetter__("rgba", function () { - return nodes.RGBA.fromHSLA(this) - }); - HSLA.prototype.__defineGetter__("hash", function () { - return this.rgba.toString() - }); - HSLA.prototype.add = function (h, s, l) { - return new HSLA(this.h + h, this.s + s, this.l + l, this.a) - }; - HSLA.prototype.sub = function (h, s, l) { - return this.add(-h, -s, -l) - }; - 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 - } - }; - 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) - }; - HSLA.prototype.adjustLightness = function (percent) { - this.l = clampPercentage(this.l + this.l * (percent / 100)); - return this - }; - HSLA.prototype.adjustHue = function (deg) { - this.h = clampDegrees(this.h + deg); - return this - }; - - function clampDegrees(n) { - n = n % 360; - return n >= 0 ? n : 360 + n - } - - function clampPercentage(n) { - return Math.max(0, Math.min(n, 100)) - } - - function clampAlpha(n) { - return Math.max(0, Math.min(n, 1)) - } - }); - require.register("nodes/ident.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - var Ident = module.exports = function Ident(name, val, mixin) { - Node.call(this); - this.name = name; - this.string = name; - this.val = val || nodes.nil; - this.mixin = !!mixin - }; - Ident.prototype.__defineGetter__("isEmpty", function () { - return undefined == this.val - }); - Ident.prototype.__defineGetter__("hash", function () { - return this.name - }); - Ident.prototype.__proto__ = Node.prototype; - 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 - }; - 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, - } - }; - Ident.prototype.toString = function () { - return this.name - }; - 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) - } - }; - 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) - } - }); - require.register("nodes/if.js", function (module, exports, require) { - var Node = require("./node"); - 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} - }; - If.prototype.__proto__ = Node.prototype; - 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 - }; - 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, - } - } - }); - require.register("nodes/import.js", function (module, exports, require) { - var Node = require("./node"); - var Import = module.exports = function Import(expr, once) { - Node.call(this); - this.path = expr; - this.once = once || false - }; - Import.prototype.__proto__ = Node.prototype; - 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 - }; - 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, - } - } - }); - require.register("nodes/extend.js", function (module, exports, require) { - var Node = require("./node"); - var Extend = module.exports = function Extend(selectors) { - Node.call(this); - this.selectors = selectors - }; - Extend.prototype.__proto__ = Node.prototype; - Extend.prototype.clone = function () { - return new Extend(this.selectors) - }; - Extend.prototype.toString = function () { - return "@extend " + this.selectors.join(", ") - }; - Extend.prototype.toJSON = function () { - return { - __type: "Extend", selectors: this.selectors, lineno: this.lineno, column: this.column, filename: this.filename, - } - } - }); - require.register("nodes/index.js", function (module, exports, require) { - 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"); - exports.yes = new exports.Boolean(true); - exports.no = new exports.Boolean(false); - exports.nil = new exports.Null - }); - require.register("nodes/keyframes.js", function (module, exports, require) { - var Atrule = require("./atrule"); - var Keyframes = module.exports = function Keyframes(segs, prefix) { - Atrule.call(this, "keyframes"); - this.segments = segs; - this.prefix = prefix || "official" - }; - Keyframes.prototype.__proto__ = Atrule.prototype; - 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 - }; - 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, - } - }; - Keyframes.prototype.toString = function () { - return "@keyframes " + this.segments.join("") - } - }); - require.register("nodes/literal.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - var Literal = module.exports = function Literal(str) { - Node.call(this); - this.val = str; - this.string = str; - this.prefixed = false - }; - Literal.prototype.__proto__ = Node.prototype; - Literal.prototype.__defineGetter__("hash", function () { - return this.val - }); - Literal.prototype.toString = function () { - return this.val - }; - 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) - } - }; - 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) - } - }; - 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, - } - } - }); - require.register("nodes/media.js", function (module, exports, require) { - var Atrule = require("./atrule"); - var Media = module.exports = function Media(val) { - Atrule.call(this, "media"); - this.val = val - }; - Media.prototype.__proto__ = Atrule.prototype; - 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 - }; - Media.prototype.toJSON = function () { - return { - __type: "Media", val: this.val, block: this.block, lineno: this.lineno, column: this.column, - filename: this.filename, - } - }; - Media.prototype.toString = function () { - return "@media " + this.val - } - }); - require.register("nodes/query-list.js", function (module, exports, require) { - var Node = require("./node"); - var QueryList = module.exports = function QueryList() { - Node.call(this); - this.nodes = [] - }; - QueryList.prototype.__proto__ = Node.prototype; - 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 - }; - QueryList.prototype.push = function (node) { - this.nodes.push(node) - }; - 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 - }; - QueryList.prototype.toString = function () { - return "(" + this.nodes.map(function (node) { - return node.toString() - }).join(", ") + ")" - }; - QueryList.prototype.toJSON = function () { - return {__type: "QueryList", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename} - } - }); - require.register("nodes/query.js", function (module, exports, require) { - var Node = require("./node"); - var Query = module.exports = function Query() { - Node.call(this); - this.nodes = []; - this.type = ""; - this.predicate = "" - }; - Query.prototype.__proto__ = Node.prototype; - 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 - }; - Query.prototype.push = function (feature) { - this.nodes.push(feature) - }; - Query.prototype.__defineGetter__("resolvedType", function () { - if (this.type) {return this.type.nodeName ? this.type.string : this.type} - }); - Query.prototype.__defineGetter__("resolvedPredicate", function () { - if (this.predicate) {return this.predicate.nodeName ? this.predicate.string : this.predicate} - }); - Query.prototype.merge = function (other) { - var query = new Query, - p1 = this.resolvedPredicate, - p2 = other.resolvedPredicate, - t1 = this.resolvedType, - t2 = other.resolvedType, - type, - pred; - 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 - }; - 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 - }; - 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, - } - } - }); - require.register("nodes/feature.js", function (module, exports, require) { - var Node = require("./node"); - var Feature = module.exports = function Feature(segs) { - Node.call(this); - this.segments = segs; - this.expr = null - }; - Feature.prototype.__proto__ = Node.prototype; - 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 - }; - Feature.prototype.toString = function () { - if (this.expr) {return "(" + this.segments.join("") + ": " + this.expr.toString() + ")"} else {return this.segments.join("")} - }; - 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 - } - }); - require.register("nodes/node.js", function (module, exports, require) { - var Evaluator = require("../visitor/evaluator"), utils = require("../utils"), nodes = require("./index"); - - function CoercionError(msg) { - this.name = "CoercionError"; - this.message = msg; - Error.captureStackTrace(this, CoercionError) - } - - CoercionError.prototype.__proto__ = Error.prototype; - var Node = module.exports = function Node() { - this.lineno = nodes.lineno || 1; - this.column = nodes.column || 1; - this.filename = nodes.filename - }; - Node.prototype = { - constructor: Node, get first() { - return this - }, get hash() { - return this.val - }, get nodeName() { - return this.constructor.name.toLowerCase() - }, clone: function () { - return this - }, toJSON: function () { - return {lineno: this.lineno, column: this.column, filename: this.filename} - }, eval: function () { - return new Evaluator(this).evaluate() - }, toBoolean: function () { - return nodes.yes - }, toExpression: function () { - if ("expression" == this.nodeName) return this; - var expr = new nodes.Expression; - expr.push(this); - return expr - }, shouldCoerce: function (op) { - switch (op) { - case"is a": - case"in": - case"||": - case"&&": - return false; - default: - return true - } - }, 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'); - 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.yes}} - return nodes.no; - 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) - } - }, coerce: function (other) { - if (other.nodeName == this.nodeName) return other; - throw new CoercionError("cannot coerce " + other + " to " + this.nodeName) - }, - } - }); - require.register("nodes/null.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - var Null = module.exports = function Null() { - }; - Null.prototype.__proto__ = Node.prototype; - Null.prototype.inspect = Null.prototype.toString = function () { - return "null" - }; - Null.prototype.toBoolean = function () { - return nodes.no - }; - Null.prototype.__defineGetter__("isNull", function () { - return true - }); - Null.prototype.__defineGetter__("hash", function () { - return null - }); - Null.prototype.toJSON = function () { - return {__type: "Null", lineno: this.lineno, column: this.column, filename: this.filename} - } - }); - require.register("nodes/params.js", function (module, exports, require) { - var Node = require("./node"); - var Params = module.exports = function Params() { - Node.call(this); - this.nodes = [] - }; - Params.prototype.__defineGetter__("length", function () { - return this.nodes.length - }); - Params.prototype.__proto__ = Node.prototype; - Params.prototype.push = function (node) { - this.nodes.push(node) - }; - 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 - }; - Params.prototype.toJSON = function () { - return {__type: "Params", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename} - } - }); - require.register("nodes/property.js", function (module, exports, require) { - var Node = require("./node"); - var Property = module.exports = function Property(segs, expr) { - Node.call(this); - this.segments = segs; - this.expr = expr - }; - Property.prototype.__proto__ = Node.prototype; - 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 - }; - 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 - }; - Property.prototype.toString = function () { - return "property(" + this.segments.join("") + ", " + this.expr + ")" - }; - Property.prototype.operate = function (op, right, val) { - return this.expr.operate(op, right, val) - } - }); - require.register("nodes/return.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - var Return = module.exports = function Return(expr) { - this.expr = expr || nodes.nil - }; - Return.prototype.__proto__ = Node.prototype; - 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.prototype.toJSON = function () { - return {__type: "Return", expr: this.expr, lineno: this.lineno, column: this.column, filename: this.filename} - } - }); - require.register("nodes/rgba.js", function (module, exports, require) { - var Node = require("./node"), - HSLA = require("./hsla"), - functions = require("../functions"), - adjust = functions.adjust, - nodes = require("./index"); - 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 - }; - RGBA.prototype.__proto__ = Node.prototype; - 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 - }; - 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 - }; - 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, - } - }; - RGBA.prototype.toBoolean = function () { - return nodes.yes - }; - RGBA.prototype.__defineGetter__("hsla", function () { - return HSLA.fromRGBA(this) - }); - RGBA.prototype.__defineGetter__("hash", function () { - return this.toString() - }); - RGBA.prototype.add = function (r, g, b, a) { - return new RGBA(this.r + r, this.g + g, this.b + b, this.a + a) - }; - 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) - }; - RGBA.prototype.multiply = function (n) { - return new RGBA(this.r * n, this.g * n, this.b * n, this.a) - }; - RGBA.prototype.divide = function (n) { - return new RGBA(this.r / n, this.g / n, this.b / n, this.a) - }; - 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.yes} - 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) - }; - RGBA.prototype.toString = function () { - function pad(n) { - return n < 16 ? "0" + n.toString(16) : n.toString(16) - } - - if ("transparent" == this.name) return this.name; - if (1 == this.a) { - var r = pad(this.r), g = pad(this.g), b = pad(this.b); - 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) + ")"} - }; - 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) * 255, g = hue(h) * 255, b = hue(h - 1 / 3) * 255; - - 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) - }; - - function clamp(n) { - return Math.max(0, Math.min(n.toFixed(0), 255)) - } - - function clampAlpha(n) { - return Math.max(0, Math.min(n, 1)) - } - }); - require.register("nodes/root.js", function (module, exports, require) { - var Node = require("./node"); - var Root = module.exports = function Root() { - this.nodes = [] - }; - Root.prototype.__proto__ = Node.prototype; - Root.prototype.push = function (node) { - this.nodes.push(node) - }; - Root.prototype.unshift = function (node) { - this.nodes.unshift(node) - }; - 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 - }; - Root.prototype.toString = function () { - return "[Root]" - }; - Root.prototype.toJSON = function () { - return {__type: "Root", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename} - } - }); - require.register("nodes/selector.js", function (module, exports, require) { - var Block = require("./block"), Node = require("./node"); - var Selector = module.exports = function Selector(segs) { - Node.call(this); - this.inherits = true; - this.segments = segs; - this.optional = false - }; - Selector.prototype.__proto__ = Node.prototype; - Selector.prototype.toString = function () { - return this.segments.join("") + (this.optional ? " !optional" : "") - }; - Selector.prototype.__defineGetter__("isPlaceholder", function () { - return this.val && ~this.val.substr(0, 2).indexOf("$") - }); - 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 - }; - 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, - } - } - }); - require.register("nodes/string.js", function (module, exports, require) { - var Node = require("./node"), - sprintf = require("../functions").s, - utils = require("../utils"), - nodes = require("./index"); - 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} - }; - String.prototype.__proto__ = Node.prototype; - String.prototype.toString = function () { - return this.quote + this.val + this.quote - }; - 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 - }; - String.prototype.toJSON = function () { - return { - __type: "String", val: this.val, quote: this.quote, lineno: this.lineno, column: this.column, - filename: this.filename, - } - }; - String.prototype.toBoolean = function () { - return nodes.Boolean(this.val.length) - }; - 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()) - } - }; - String.prototype.operate = function (op, right) { - switch (op) { - case"%": - var expr = new nodes.Expression; - expr.push(this); - var args = "expression" == right.nodeName ? utils.unwrap(right).nodes : [right]; - 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) - } - } - }); - require.register("nodes/ternary.js", function (module, exports, require) { - var Node = require("./node"); - var Ternary = module.exports = function Ternary(cond, trueExpr, falseExpr) { - Node.call(this); - this.cond = cond; - this.trueExpr = trueExpr; - this.falseExpr = falseExpr - }; - Ternary.prototype.__proto__ = Node.prototype; - 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 - }; - 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, - } - } - }); - require.register("nodes/unaryop.js", function (module, exports, require) { - var Node = require("./node"); - var UnaryOp = module.exports = function UnaryOp(op, expr) { - Node.call(this); - this.op = op; - this.expr = expr - }; - UnaryOp.prototype.__proto__ = Node.prototype; - 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 - }; - UnaryOp.prototype.toJSON = function () { - return { - __type: "UnaryOp", op: this.op, expr: this.expr, lineno: this.lineno, column: this.column, - filename: this.filename, - } - } - }); - require.register("nodes/unit.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"); - 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: 1e3, label: "ms"}, - Hz: {val: 1, label: "Hz"}, kHz: {val: 1e3, label: "Hz"}, - }; - var Unit = module.exports = function Unit(val, type) { - Node.call(this); - this.val = val; - this.type = type - }; - Unit.prototype.__proto__ = Node.prototype; - Unit.prototype.toBoolean = function () { - return nodes.Boolean(this.type ? true : this.val) - }; - Unit.prototype.toString = function () { - return this.val + (this.type || "") - }; - 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 - }; - Unit.prototype.toJSON = function () { - return { - __type: "Unit", val: this.val, type: this.type, lineno: this.lineno, column: this.column, - filename: this.filename, - } - }; - Unit.prototype.operate = function (op, right) { - var type = this.type || right.first.type; - if ("rgba" == right.nodeName || "hsla" == right.nodeName) {return right.operate(op, this)} - if (this.shouldCoerce(op)) { - right = right.first; - 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"+": - 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) - }; - 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) { - 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)} - } - }); - require.register("nodes/object.js", function (module, exports, require) { - var Node = require("./node"), nodes = require("./index"), nativeObj = {}.constructor; - var Object = module.exports = function Object() { - Node.call(this); - this.vals = {} - }; - Object.prototype.__proto__ = Node.prototype; - Object.prototype.set = function (key, val) { - this.vals[key] = val; - return this - }; - Object.prototype.__defineGetter__("length", function () { - return nativeObj.keys(this.vals).length - }); - Object.prototype.get = function (key) { - return this.vals[key] || nodes.nil - }; - Object.prototype.has = function (key) { - return key in this.vals - }; - 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.no; - for (var key in vals) { - a = vals[key]; - b = right.vals[key]; - if (a.operate(op, b).isFalse) return nodes.no; - } - return nodes.yes; - case"!=": - return this.operate("==", right).negate(); - default: - return Node.prototype.operate.call(this, op, right) - } - }; - Object.prototype.toBoolean = function () { - return nodes.Boolean(this.length) - }; - 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() - } - }; - 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 - }; - Object.prototype.toJSON = function () { - return {__type: "Object", vals: this.vals, lineno: this.lineno, column: this.column, filename: this.filename} - }; - Object.prototype.toString = function () { - var obj = {}; - for (var prop in this.vals) {obj[prop] = this.vals[prop].toString()} - return JSON.stringify(obj) - } - }); - require.register("nodes/supports.js", function (module, exports, require) { - var Atrule = require("./atrule"); - var Supports = module.exports = function Supports(condition) { - Atrule.call(this, "supports"); - this.condition = condition - }; - Supports.prototype.__proto__ = Atrule.prototype; - 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 - }; - Supports.prototype.toJSON = function () { - return { - __type: "Supports", condition: this.condition, block: this.block, lineno: this.lineno, column: this.column, - filename: this.filename, - } - }; - Supports.prototype.toString = function () { - return "@supports " + this.condition - } - }); - require.register("nodes/member.js", function (module, exports, require) { - var Node = require("./node"); - var Member = module.exports = function Member(left, right) { - Node.call(this); - this.left = left; - this.right = right - }; - Member.prototype.__proto__ = Node.prototype; - 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 - }; - 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 - }; - Member.prototype.toString = function () { - return this.left.toString() + "." + this.right.toString() - } - }); - require.register("nodes/atblock.js", function (module, exports, require) { - var Node = require("./node"); - var Atblock = module.exports = function Atblock() { - Node.call(this) - }; - Atblock.prototype.__defineGetter__("nodes", function () { - return this.block.nodes - }); - Atblock.prototype.__proto__ = Node.prototype; - 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 - }; - Atblock.prototype.toString = function () { - return "@block" - }; - Atblock.prototype.toJSON = function () { - return {__type: "Atblock", block: this.block, lineno: this.lineno, column: this.column, fileno: this.fileno} - } - }); - require.register("nodes/atrule.js", function (module, exports, require) { - var Node = require("./node"); - var Atrule = module.exports = function Atrule(type) { - Node.call(this); - this.type = type - }; - Atrule.prototype.__proto__ = Node.prototype; - 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 - }); - 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 - }; - 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 - }; - Atrule.prototype.toString = function () { - return "@" + this.type - }; - Atrule.prototype.__defineGetter__("hasOutput", function () { - return !!this.block && hasOutput(this.block) - }); - - function hasOutput(block) { - var nodes = block.nodes; - if (nodes.every(function (node) { - return "group" == node.nodeName && node.hasOnlyPlaceholders - })) { - return false; - } - 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) - } - }) - } - }); - require.register("parser.js", function (module, exports, require) { - var Lexer = require("./lexer"), - nodes = require("./nodes"), - Token = require("./token"), - units = require("./units"), - errors = require("./errors"); - var selectorTokens = ["ident", "string", "selector", "function", "comment", "boolean", "space", "color", "unit", "for", "in", "[", "]", "(", ")", "+", "-", "*", "*=", "<", ">", "=", ":", "&", "&&", "~", "{", "}", ".", "..", "/"]; - var pseudoSelectors = ["matches", "not", "dir", "lang", "any-link", "link", "visited", "local-link", "target", "scope", "hover", "active", "focus", "drop", "current", "past", "future", "enabled", "disabled", "read-only", "read-write", "placeholder-shown", "checked", "indeterminate", "valid", "invalid", "in-range", "out-of-range", "required", "optional", "user-error", "root", "empty", "blank", "nth-child", "nth-last-child", "first-child", "last-child", "only-child", "nth-of-type", "nth-last-of-type", "first-of-type", "last-of-type", "only-of-type", "nth-match", "nth-last-match", "nth-column", "nth-last-column", "first-line", "first-letter", "before", "after", "selection"]; - var Parser = module.exports = function Parser(str, options) { - var self = this; - options = options || {}; - this.lexer = new Lexer(str, options); - this.prefix = options.prefix || ""; - this.root = options.root || new nodes.Root; - this.state = ["root"]; - this.stash = []; - this.parens = 0; - this.css = 0; - this.state.pop = function () { - self.prevState = [].pop.call(this) - } - }; - Parser.prototype = { - constructor: Parser, currentState: function () { - return this.state[this.state.length - 1] - }, previousState: function () { - return this.state[this.state.length - 2] - }, parse: function () { - var block = this.parent = this.root; - while ("eos" != this.peek().type) { - this.skipWhitespace(); - if ("eos" == this.peek().type) break; - var stmt = this.statement(); - this.accept(";"); - if (!stmt) this.error("unexpected token {peek}, not allowed at the root level"); - block.push(stmt) - } - return block - }, error: function (msg) { - var type = this.peek().type, val = undefined == this.peek().val ? "" : " " + this.peek().toString(); - if (val.trim() == type.trim()) val = ""; - throw new errors.ParseError(msg.replace("{peek}", '"' + type + val + '"')) - }, accept: function (type) { - if (type == this.peek().type) {return this.next()} - }, expect: function (type) { - if (type != this.peek().type) {this.error('expected "' + type + '", got {peek}')} - return this.next() - }, next: function () { - var tok = this.stash.length ? this.stash.pop() : this.lexer.next(), line = tok.lineno, column = tok.column || 1; - if (tok.val && tok.val.nodeName) { - tok.val.lineno = line; - tok.val.column = column - } - nodes.lineno = line; - nodes.column = column; - return tok - }, peek: function () { - return this.lexer.peek() - }, lookahead: function (n) { - return this.lexer.lookahead(n) - }, isSelectorToken: function (n) { - var la = this.lookahead(n).type; - switch (la) { - case"for": - return this.bracketed; - case"[": - this.bracketed = true; - return true; - case"]": - this.bracketed = false; - return true; - default: - return ~selectorTokens.indexOf(la) - } - }, isPseudoSelector: function (n) { - var val = this.lookahead(n).val; - return val && ~pseudoSelectors.indexOf(val.name) - }, lineContains: function (type) { - var i = 1, la; - while (la = this.lookahead(i++)) { - if (~["indent", "outdent", "newline", "eos"].indexOf(la.type)) return; - if (type == la.type) return true - } - }, selectorToken: function () { - if (this.isSelectorToken(1)) { - if ("{" == this.peek().type) { - if (!this.lineContains("}")) return; - var i = 0, la; - while (la = this.lookahead(++i)) { - if ("}" == la.type) { - if (i == 2 || i == 3 && this.lookahead(i - 1).type == "space") return; - break - } - if (":" == la.type) return - } - } - return this.next() - } - }, skip: function (tokens) { - while (~tokens.indexOf(this.peek().type)) this.next() - }, skipWhitespace: function () { - this.skip(["space", "indent", "outdent", "newline"]) - }, skipNewlines: function () { - while ("newline" == this.peek().type) this.next() - }, skipSpaces: function () { - while ("space" == this.peek().type) this.next() - }, skipSpacesAndComments: function () { - while ("space" == this.peek().type || "comment" == this.peek().type) this.next() - }, looksLikeFunctionDefinition: function (i) { - return "indent" == this.lookahead(i).type || "{" == this.lookahead(i).type - }, looksLikeSelector: function (fromProperty) { - var i = 1, brace; - if (fromProperty && ":" == this.lookahead(i + 1).type && (this.lookahead(i + 1).space || "indent" == this.lookahead(i + 2).type)) return false; - while ("ident" == this.lookahead(i).type && ("newline" == this.lookahead(i + 1).type || "," == this.lookahead(i + 1).type)) i += 2; - while (this.isSelectorToken(i) || "," == this.lookahead(i).type) { - if ("selector" == this.lookahead(i).type) return true; - if ("&" == this.lookahead(i + 1).type) return true; - if ("." == this.lookahead(i).type && "ident" == this.lookahead(i + 1).type) return true; - if ("*" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true; - if (":" == this.lookahead(i).type && ":" == this.lookahead(i + 1).type) return true; - if ("color" == this.lookahead(i).type && "newline" == this.lookahead(i - 1).type) return true; - if (this.looksLikeAttributeSelector(i)) return true; - if (("=" == this.lookahead(i).type || "function" == this.lookahead(i).type) && "{" == this.lookahead(i + 1).type) return false; - if (":" == this.lookahead(i).type && !this.isPseudoSelector(i + 1) && this.lineContains(".")) return false; - if ("{" == this.lookahead(i).type) brace = true; else if ("}" == this.lookahead(i).type) brace = false; - if (brace && ":" == this.lookahead(i).type) return true; - if ("space" == this.lookahead(i).type && "{" == this.lookahead(i + 1).type) return true; - if (":" == this.lookahead(i++).type && !this.lookahead(i - 1).space && this.isPseudoSelector(i)) return true; - if ("space" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type && "{" == this.lookahead(i + 2).type) return true; - if ("," == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true - } - if ("," == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true; - if ("{" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true; - if (this.css) {if (";" == this.lookahead(i).type || "}" == this.lookahead(i - 1).type) return false} - while (!~["indent", "outdent", "newline", "for", "if", ";", "}", "eos"].indexOf(this.lookahead(i).type)) ++i; - if ("indent" == this.lookahead(i).type) return true - }, looksLikeAttributeSelector: function (n) { - var type = this.lookahead(n).type; - if ("=" == type && this.bracketed) return true; - return ("ident" == type || "string" == type) && "]" == this.lookahead(n + 1).type && ("newline" == this.lookahead(n + 2).type || this.isSelectorToken(n + 2)) && !this.lineContains(":") && !this.lineContains("=") - }, looksLikeKeyframe: function () { - var i = 2, type; - switch (this.lookahead(i).type) { - case"{": - case"indent": - case",": - return true; - case"newline": - while ("unit" == this.lookahead(++i).type || "newline" == this.lookahead(i).type) ; - type = this.lookahead(i).type; - return "indent" == type || "{" == type - } - }, stateAllowsSelector: function () { - switch (this.currentState()) { - case"root": - case"atblock": - case"selector": - case"conditional": - case"function": - case"atrule": - case"for": - return true - } - }, assignAtblock: function (expr) { - try {expr.push(this.atblock(expr))} - catch (err) {this.error("invalid right-hand side operand in assignment, got {peek}")} - }, statement: function () { - var stmt = this.stmt(), state = this.prevState, block, op; - if (this.allowPostfix) { - this.allowPostfix = false; - state = "expression" - } - switch (state) { - case"assignment": - case"expression": - case"function arguments": - while (op = this.accept("if") || this.accept("unless") || this.accept("for")) { - switch (op.type) { - case"if": - case"unless": - stmt = new nodes.If(this.expression(), stmt); - stmt.postfix = true; - stmt.negate = "unless" == op.type; - this.accept(";"); - break; - case"for": - var key, val = this.id().name; - if (this.accept(",")) key = this.id().name; - this.expect("in"); - var each = new nodes.Each(val, key, this.expression()); - block = new nodes.Block(this.parent, each); - block.push(stmt); - each.block = block; - stmt = each - } - } - } - return stmt - }, stmt: function () { - var type = this.peek().type; - switch (type) { - case"keyframes": - return this.keyframes(); - case"-moz-document": - return this.mozdocument(); - case"comment": - case"selector": - case"extend": - case"literal": - case"charset": - case"namespace": - case"require": - case"extend": - case"media": - case"atrule": - case"ident": - case"scope": - case"supports": - case"unless": - return this[type](); - case"function": - return this.fun(); - case"import": - return this.atimport(); - case"if": - return this.ifstmt(); - case"for": - return this.forin(); - case"return": - return this.ret(); - case"{": - return this.property(); - default: - if (this.stateAllowsSelector()) { - switch (type) { - case"color": - case"~": - case">": - case"<": - case":": - case"&": - case"&&": - case"[": - case".": - case"/": - return this.selector(); - case"..": - if ("/" == this.lookahead(2).type) return this.selector(); - case"+": - return "function" == this.lookahead(2).type ? this.functionCall() : this.selector(); - case"*": - return this.property(); - case"unit": - if (this.looksLikeKeyframe()) return this.selector(); - case"-": - if ("{" == this.lookahead(2).type) return this.property() - } - } - var expr = this.expression(); - if (expr.isEmpty) this.error("unexpected {peek}"); - return expr - } - }, block: function (node, scope) { - var delim, stmt, next, block = this.parent = new nodes.Block(this.parent, node); - if (false === scope) block.scope = false; - this.accept("newline"); - if (this.accept("{")) { - this.css++; - delim = "}"; - this.skipWhitespace() - } else { - delim = "outdent"; - this.expect("indent") - } - while (delim != this.peek().type) { - if (this.css) { - if (this.accept("newline") || this.accept("indent")) continue; - stmt = this.statement(); - this.accept(";"); - this.skipWhitespace() - } else { - if (this.accept("newline")) continue; - next = this.lookahead(2).type; - if ("indent" == this.peek().type && ~["outdent", "newline", "comment"].indexOf(next)) { - this.skip(["indent", "outdent"]); - continue - } - if ("eos" == this.peek().type) return block; - stmt = this.statement(); - this.accept(";") - } - if (!stmt) this.error("unexpected token {peek} in block"); - block.push(stmt) - } - if (this.css) { - this.skipWhitespace(); - this.expect("}"); - this.skipSpaces(); - this.css-- - } else {this.expect("outdent")} - this.parent = block.parent; - return block - }, comment: function () { - var node = this.next().val; - this.skipSpaces(); - return node - }, forin: function () { - this.expect("for"); - var key, val = this.id().name; - if (this.accept(",")) key = this.id().name; - this.expect("in"); - this.state.push("for"); - this.cond = true; - var each = new nodes.Each(val, key, this.expression()); - this.cond = false; - each.block = this.block(each, false); - this.state.pop(); - return each - }, ret: function () { - this.expect("return"); - var expr = this.expression(); - return expr.isEmpty ? new nodes.Return : new nodes.Return(expr) - }, unless: function () { - this.expect("unless"); - this.state.push("conditional"); - this.cond = true; - var node = new nodes.If(this.expression(), true); - this.cond = false; - node.block = this.block(node, false); - this.state.pop(); - return node - }, ifstmt: function () { - this.expect("if"); - this.state.push("conditional"); - this.cond = true; - var node = new nodes.If(this.expression()), cond, block; - this.cond = false; - node.block = this.block(node, false); - this.skip(["newline", "comment"]); - while (this.accept("else")) { - if (this.accept("if")) { - this.cond = true; - cond = this.expression(); - this.cond = false; - block = this.block(node, false); - node.elses.push(new nodes.If(cond, block)) - } else { - node.elses.push(this.block(node, false)); - break - } - this.skip(["newline", "comment"]) - } - this.state.pop(); - return node - }, atblock: function (node) { - if (!node) this.expect("atblock"); - node = new nodes.Atblock; - this.state.push("atblock"); - node.block = this.block(node, false); - this.state.pop(); - return node - }, atrule: function () { - var type = this.expect("atrule").val, node = new nodes.Atrule(type), tok; - this.skipSpacesAndComments(); - node.segments = this.selectorParts(); - this.skipSpacesAndComments(); - tok = this.peek().type; - if ("indent" == tok || "{" == tok || "newline" == tok && "{" == this.lookahead(2).type) { - this.state.push("atrule"); - node.block = this.block(node); - this.state.pop() - } - return node - }, scope: function () { - this.expect("scope"); - var selector = this.selectorParts().map(function (selector) { - return selector.val - }).join(""); - this.selectorScope = selector.trim(); - return nodes.nil - }, supports: function () { - this.expect("supports"); - var node = new nodes.Supports(this.supportsCondition()); - this.state.push("atrule"); - node.block = this.block(node); - this.state.pop(); - return node - }, supportsCondition: function () { - var node = this.supportsNegation() || this.supportsOp(); - if (!node) { - this.cond = true; - node = this.expression(); - this.cond = false - } - return node - }, supportsNegation: function () { - if (this.accept("not")) { - var node = new nodes.Expression; - node.push(new nodes.Literal("not")); - node.push(this.supportsFeature()); - return node - } - }, supportsOp: function () { - var feature = this.supportsFeature(), op, expr; - if (feature) { - expr = new nodes.Expression; - expr.push(feature); - while (op = this.accept("&&") || this.accept("||")) { - expr.push(new nodes.Literal("&&" == op.val ? "and" : "or")); - expr.push(this.supportsFeature()) - } - return expr - } - }, supportsFeature: function () { - this.skipSpacesAndComments(); - if ("(" == this.peek().type) { - var la = this.lookahead(2).type; - if ("ident" == la || "{" == la) {return this.feature()} else { - this.expect("("); - var node = new nodes.Expression; - node.push(new nodes.Literal("(")); - node.push(this.supportsCondition()); - this.expect(")"); - node.push(new nodes.Literal(")")); - this.skipSpacesAndComments(); - return node - } - } - }, extend: function () { - var tok = this.expect("extend"), selectors = [], sel, node, arr; - do { - arr = this.selectorParts(); - if (!arr.length) continue; - sel = new nodes.Selector(arr); - selectors.push(sel); - if ("!" !== this.peek().type) continue; - tok = this.lookahead(2); - if ("ident" !== tok.type || "optional" !== tok.val.name) continue; - this.skip(["!", "ident"]); - sel.optional = true - } while (this.accept(",")); - node = new nodes.Extend(selectors); - node.lineno = tok.lineno; - node.column = tok.column; - return node - }, media: function () { - this.expect("media"); - this.state.push("atrule"); - var media = new nodes.Media(this.queries()); - media.block = this.block(media); - this.state.pop(); - return media - }, queries: function () { - var queries = new nodes.QueryList, skip = ["comment", "newline", "space"]; - do { - this.skip(skip); - queries.push(this.query()); - this.skip(skip) - } while (this.accept(",")); - return queries - }, query: function () { - var query = new nodes.Query, expr, pred, id; - if ("ident" == this.peek().type && ("." == this.lookahead(2).type || "[" == this.lookahead(2).type)) { - this.cond = true; - expr = this.expression(); - this.cond = false; - query.push(new nodes.Feature(expr.nodes)); - return query - } - if (pred = this.accept("ident") || this.accept("not")) { - pred = new nodes.Literal(pred.val.string || pred.val); - this.skipSpacesAndComments(); - if (id = this.accept("ident")) { - query.type = id.val; - query.predicate = pred - } else {query.type = pred} - this.skipSpacesAndComments(); - if (!this.accept("&&")) return query - } - do {query.push(this.feature())} while (this.accept("&&")); - return query - }, feature: function () { - this.skipSpacesAndComments(); - this.expect("("); - this.skipSpacesAndComments(); - var node = new nodes.Feature(this.interpolate()); - this.skipSpacesAndComments(); - this.accept(":"); - this.skipSpacesAndComments(); - this.inProperty = true; - node.expr = this.list(); - this.inProperty = false; - this.skipSpacesAndComments(); - this.expect(")"); - this.skipSpacesAndComments(); - return node - }, mozdocument: function () { - this.expect("-moz-document"); - var mozdocument = new nodes.Atrule("-moz-document"), calls = []; - do { - this.skipSpacesAndComments(); - calls.push(this.functionCall()); - this.skipSpacesAndComments() - } while (this.accept(",")); - mozdocument.segments = [new nodes.Literal(calls.join(", "))]; - this.state.push("atrule"); - mozdocument.block = this.block(mozdocument, false); - this.state.pop(); - return mozdocument - }, atimport: function () { - this.expect("import"); - this.allowPostfix = true; - return new nodes.Import(this.expression(), false) - }, require: function () { - this.expect("require"); - this.allowPostfix = true; - return new nodes.Import(this.expression(), true) - }, charset: function () { - this.expect("charset"); - var str = this.expect("string").val; - this.allowPostfix = true; - return new nodes.Charset(str) - }, namespace: function () { - var str, prefix; - this.expect("namespace"); - this.skipSpacesAndComments(); - if (prefix = this.accept("ident")) {prefix = prefix.val} - this.skipSpacesAndComments(); - str = this.accept("string") || this.url(); - this.allowPostfix = true; - return new nodes.Namespace(str, prefix) - }, keyframes: function () { - var tok = this.expect("keyframes"), keyframes; - this.skipSpacesAndComments(); - keyframes = new nodes.Keyframes(this.selectorParts(), tok.val); - this.skipSpacesAndComments(); - this.state.push("atrule"); - keyframes.block = this.block(keyframes); - this.state.pop(); - return keyframes - }, literal: function () { - return this.expect("literal").val - }, id: function () { - var tok = this.expect("ident"); - this.accept("space"); - return tok.val - }, ident: function () { - var i = 2, la = this.lookahead(i).type; - while ("space" == la) la = this.lookahead(++i).type; - switch (la) { - case"=": - case"?=": - case"-=": - case"+=": - case"*=": - case"/=": - case"%=": - return this.assignment(); - case".": - if ("space" == this.lookahead(i - 1).type) return this.selector(); - if (this._ident == this.peek()) return this.id(); - while ("=" != this.lookahead(++i).type && !~["[", ",", "newline", "indent", "eos"].indexOf(this.lookahead(i).type)) ; - if ("=" == this.lookahead(i).type) { - this._ident = this.peek(); - return this.expression() - } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {return this.selector()} - case"[": - if (this._ident == this.peek()) return this.id(); - while ("]" != this.lookahead(i++).type && "selector" != this.lookahead(i).type && "eos" != this.lookahead(i).type) ; - if ("=" == this.lookahead(i).type) { - this._ident = this.peek(); - return this.expression() - } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {return this.selector()} - case"-": - case"+": - case"/": - case"*": - case"%": - case"**": - case"&&": - case"||": - case">": - case"<": - case">=": - case"<=": - case"!=": - case"==": - case"?": - case"in": - case"is a": - case"is defined": - if (this._ident == this.peek()) {return this.id()} else { - this._ident = this.peek(); - switch (this.currentState()) { - case"for": - case"selector": - return this.property(); - case"root": - case"atblock": - case"atrule": - return "[" == la ? this.subscript() : this.selector(); - case"function": - case"conditional": - return this.looksLikeSelector() ? this.selector() : this.expression(); - default: - return this.operand ? this.id() : this.expression() - } - } - default: - switch (this.currentState()) { - case"root": - return this.selector(); - case"for": - case"selector": - case"function": - case"conditional": - case"atblock": - case"atrule": - return this.property(); - default: - var id = this.id(); - if ("interpolation" == this.previousState()) id.mixin = true; - return id - } - } - }, interpolate: function () { - var node, segs = [], star; - star = this.accept("*"); - if (star) segs.push(new nodes.Literal("*")); - while (true) { - if (this.accept("{")) { - this.state.push("interpolation"); - segs.push(this.expression()); - this.expect("}"); - this.state.pop() - } else if (node = this.accept("-")) {segs.push(new nodes.Literal("-"))} else if (node = this.accept("ident")) {segs.push(node.val)} else {break} - } - if (!segs.length) this.expect("ident"); - return segs - }, property: function () { - if (this.looksLikeSelector(true)) return this.selector(); - var ident = this.interpolate(), prop = new nodes.Property(ident), ret = prop; - this.accept("space"); - if (this.accept(":")) this.accept("space"); - this.state.push("property"); - this.inProperty = true; - prop.expr = this.list(); - if (prop.expr.isEmpty) ret = ident[0]; - this.inProperty = false; - this.allowPostfix = true; - this.state.pop(); - this.accept(";"); - return ret - }, selector: function () { - var arr, group = new nodes.Group, scope = this.selectorScope, isRoot = "root" == this.currentState(), selector; - do { - this.accept("newline"); - arr = this.selectorParts(); - if (isRoot && scope) arr.unshift(new nodes.Literal(scope + " ")); - if (arr.length) { - selector = new nodes.Selector(arr); - selector.lineno = arr[0].lineno; - selector.column = arr[0].column; - group.push(selector) - } - } while (this.accept(",") || this.accept("newline")); - if ("selector-parts" == this.currentState()) return group.nodes; - this.state.push("selector"); - group.block = this.block(group); - this.state.pop(); - return group - }, selectorParts: function () { - var tok, arr = []; - while (tok = this.selectorToken()) { - switch (tok.type) { - case"{": - this.skipSpaces(); - var expr = this.expression(); - this.skipSpaces(); - this.expect("}"); - arr.push(expr); - break; - case this.prefix && ".": - var literal = new nodes.Literal(tok.val + this.prefix); - literal.prefixed = true; - arr.push(literal); - break; - case"comment": - break; - case"color": - case"unit": - arr.push(new nodes.Literal(tok.val.raw)); - break; - case"space": - arr.push(new nodes.Literal(" ")); - break; - case"function": - arr.push(new nodes.Literal(tok.val.name + "(")); - break; - case"ident": - arr.push(new nodes.Literal(tok.val.name || tok.val.string)); - break; - default: - arr.push(new nodes.Literal(tok.val)); - if (tok.space) arr.push(new nodes.Literal(" ")) - } - } - return arr - }, assignment: function () { - var op, node, name = this.id().name; - if (op = this.accept("=") || this.accept("?=") || this.accept("+=") || this.accept("-=") || this.accept("*=") || this.accept("/=") || this.accept("%=")) { - this.state.push("assignment"); - var expr = this.list(); - if (expr.isEmpty) this.assignAtblock(expr); - node = new nodes.Ident(name, expr); - this.state.pop(); - switch (op.type) { - case"?=": - var defined = new nodes.BinOp("is defined", node), lookup = new nodes.Expression; - lookup.push(new nodes.Ident(name)); - node = new nodes.Ternary(defined, lookup, node); - break; - case"+=": - case"-=": - case"*=": - case"/=": - case"%=": - node.val = new nodes.BinOp(op.type[0], new nodes.Ident(name), expr); - break - } - } - return node - }, fun: function () { - var parens = 1, i = 2, tok; - out:while (tok = this.lookahead(i++)) { - switch (tok.type) { - case"function": - case"(": - ++parens; - break; - case")": - if (!--parens) break out; - break; - case"eos": - this.error('failed to find closing paren ")"') - } - } - switch (this.currentState()) { - case"expression": - return this.functionCall(); - default: - return this.looksLikeFunctionDefinition(i) ? this.functionDefinition() : this.expression() - } - }, url: function () { - this.expect("function"); - this.state.push("function arguments"); - var args = this.args(); - this.expect(")"); - this.state.pop(); - return new nodes.Call("url", args) - }, functionCall: function () { - var withBlock = this.accept("+"); - if ("url" == this.peek().val.name) return this.url(); - var name = this.expect("function").val.name; - this.state.push("function arguments"); - this.parens++; - var args = this.args(); - this.expect(")"); - this.parens--; - this.state.pop(); - var call = new nodes.Call(name, args); - if (withBlock) { - this.state.push("function"); - call.block = this.block(call); - this.state.pop() - } - return call - }, functionDefinition: function () { - var name = this.expect("function").val.name; - this.state.push("function params"); - this.skipWhitespace(); - var params = this.params(); - this.skipWhitespace(); - this.expect(")"); - this.state.pop(); - this.state.push("function"); - var fn = new nodes.Function(name, params); - fn.block = this.block(fn); - this.state.pop(); - return new nodes.Ident(name, fn) - }, params: function () { - var tok, node, params = new nodes.Params; - while (tok = this.accept("ident")) { - this.accept("space"); - params.push(node = tok.val); - if (this.accept("...")) {node.rest = true} else if (this.accept("=")) {node.val = this.expression()} - this.skipWhitespace(); - this.accept(","); - this.skipWhitespace() - } - return params - }, args: function () { - var args = new nodes.Arguments, keyword; - do { - if ("ident" == this.peek().type && ":" == this.lookahead(2).type) { - keyword = this.next().val.string; - this.expect(":"); - args.map[keyword] = this.expression() - } else {args.push(this.expression())} - } while (this.accept(",")); - return args - }, list: function () { - var node = this.expression(); - while (this.accept(",")) { - if (node.isList) {list.push(this.expression())} else { - var list = new nodes.Expression(true); - list.push(node); - list.push(this.expression()); - node = list - } - } - return node - }, expression: function () { - var node, expr = new nodes.Expression; - this.state.push("expression"); - while (node = this.negation()) { - if (!node) this.error("unexpected token {peek} in expression"); - expr.push(node) - } - this.state.pop(); - if (expr.nodes.length) { - expr.lineno = expr.nodes[0].lineno; - expr.column = expr.nodes[0].column - } - return expr - }, negation: function () { - if (this.accept("not")) {return new nodes.UnaryOp("!", this.negation())} - return this.ternary() - }, ternary: function () { - var node = this.logical(); - if (this.accept("?")) { - var trueExpr = this.expression(); - this.expect(":"); - var falseExpr = this.expression(); - node = new nodes.Ternary(node, trueExpr, falseExpr) - } - return node - }, logical: function () { - var op, node = this.typecheck(); - while (op = this.accept("&&") || this.accept("||")) {node = new nodes.BinOp(op.type, node, this.typecheck())} - return node - }, typecheck: function () { - var op, node = this.equality(); - while (op = this.accept("is a")) { - this.operand = true; - if (!node) this.error('illegal unary "' + op + '", missing left-hand operand'); - node = new nodes.BinOp(op.type, node, this.equality()); - this.operand = false - } - return node - }, equality: function () { - var op, node = this.inop(); - while (op = this.accept("==") || this.accept("!=")) { - this.operand = true; - if (!node) this.error('illegal unary "' + op + '", missing left-hand operand'); - node = new nodes.BinOp(op.type, node, this.inop()); - this.operand = false - } - return node - }, inop: function () { - var node = this.relational(); - while (this.accept("in")) { - this.operand = true; - if (!node) this.error('illegal unary "in", missing left-hand operand'); - node = new nodes.BinOp("in", node, this.relational()); - this.operand = false - } - return node - }, relational: function () { - var op, node = this.range(); - while (op = this.accept(">=") || this.accept("<=") || this.accept("<") || this.accept(">")) { - this.operand = true; - if (!node) this.error('illegal unary "' + op + '", missing left-hand operand'); - node = new nodes.BinOp(op.type, node, this.range()); - this.operand = false - } - return node - }, range: function () { - var op, node = this.additive(); - if (op = this.accept("...") || this.accept("..")) { - this.operand = true; - if (!node) this.error('illegal unary "' + op + '", missing left-hand operand'); - node = new nodes.BinOp(op.val, node, this.additive()); - this.operand = false - } - return node - }, additive: function () { - var op, node = this.multiplicative(); - while (op = this.accept("+") || this.accept("-")) { - this.operand = true; - node = new nodes.BinOp(op.type, node, this.multiplicative()); - this.operand = false - } - return node - }, multiplicative: function () { - var op, node = this.defined(); - while (op = this.accept("**") || this.accept("*") || this.accept("/") || this.accept("%")) { - this.operand = true; - if ("/" == op && this.inProperty && !this.parens) { - this.stash.push(new Token("literal", new nodes.Literal("/"))); - this.operand = false; - return node - } else { - if (!node) this.error('illegal unary "' + op + '", missing left-hand operand'); - node = new nodes.BinOp(op.type, node, this.defined()); - this.operand = false - } - } - return node - }, defined: function () { - var node = this.unary(); - if (this.accept("is defined")) { - if (!node) this.error('illegal unary "is defined", missing left-hand operand'); - node = new nodes.BinOp("is defined", node) - } - return node - }, unary: function () { - var op, node; - if (op = this.accept("!") || this.accept("~") || this.accept("+") || this.accept("-")) { - this.operand = true; - node = this.unary(); - if (!node) this.error('illegal unary "' + op + '"'); - node = new nodes.UnaryOp(op.type, node); - this.operand = false; - return node - } - return this.subscript() - }, subscript: function () { - var node = this.member(), id; - while (this.accept("[")) { - node = new nodes.BinOp("[]", node, this.expression()); - this.expect("]") - } - if (this.accept("=")) { - node.op += "="; - node.val = this.list(); - if (node.val.isEmpty) this.assignAtblock(node.val) - } - return node - }, member: function () { - var node = this.primary(); - if (node) { - while (this.accept(".")) { - var id = new nodes.Ident(this.expect("ident").val.string); - node = new nodes.Member(node, id) - } - this.skipSpaces(); - if (this.accept("=")) { - node.val = this.list(); - if (node.val.isEmpty) this.assignAtblock(node.val) - } - } - return node - }, object: function () { - var obj = new nodes.Object, id, val, comma; - this.expect("{"); - this.skipWhitespace(); - while (!this.accept("}")) { - if (this.accept("comment") || this.accept("newline")) continue; - if (!comma) this.accept(","); - id = this.accept("ident") || this.accept("string"); - if (!id) this.error('expected "ident" or "string", got {peek}'); - id = id.val.hash; - this.skipSpacesAndComments(); - this.expect(":"); - val = this.expression(); - obj.set(id, val); - comma = this.accept(","); - this.skipWhitespace() - } - return obj - }, primary: function () { - var tok; - this.skipSpaces(); - if (this.accept("(")) { - ++this.parens; - var expr = this.expression(), paren = this.expect(")"); - --this.parens; - if (this.accept("%")) expr.push(new nodes.Ident("%")); - tok = this.peek(); - if (!paren.space && "ident" == tok.type && ~units.indexOf(tok.val.string)) { - expr.push(new nodes.Ident(tok.val.string)); - this.next() - } - return expr - } - tok = this.peek(); - switch (tok.type) { - case"null": - case"unit": - case"color": - case"string": - case"literal": - case"boolean": - case"comment": - return this.next().val; - case!this.cond && "{": - return this.object(); - case"atblock": - return this.atblock(); - case"atrule": - var id = new nodes.Ident(this.next().val); - id.property = true; - return id; - case"ident": - return this.ident(); - case"function": - return tok.anonymous ? this.functionDefinition() : this.functionCall() - } - }, - } - }); - require.register("renderer.js", function (module, exports, require) { - var Parser = require("./parser"), - Evaluator = require("./visitor/evaluator"), - Normalizer = require("./visitor/normalizer"), - utils = require("./utils"), - nodes = require("./nodes"), - join = require("./path").join; - module.exports = Renderer; - - function Renderer(str, options) { - options = options || {}; - options.globals = options.globals || {}; - options.functions = options.functions || {}; - options.use = options.use || []; - options.use = Array.isArray(options.use) ? options.use : [options.use]; - options.imports = []; - options.paths = options.paths || []; - options.filename = options.filename || "stylus"; - options.Evaluator = options.Evaluator || Evaluator; - this.options = options; - this.str = str - } - - Renderer.prototype.render = function (fn) { - var parser = this.parser = new Parser(this.str, this.options); - for (var i = 0, len = this.options.use.length; i < len; i++) {this.use(this.options.use[i])} - try { - nodes.filename = this.options.filename; - var ast = parser.parse(); - this.evaluator = new this.options.Evaluator(ast, this.options); - this.nodes = nodes; - this.evaluator.renderer = this; - ast = this.evaluator.evaluate(); - var normalizer = new Normalizer(ast, this.options); - ast = normalizer.normalize(); - var compiler = this.options.sourcemap ? new (require("./visitor/sourcemapper"))(ast, this.options) : new (require("./visitor/compiler"))(ast, this.options), - css = compiler.compile(); - if (this.options.sourcemap) this.sourcemap = compiler.map.toJSON() - } - catch (err) { - var options = {}; - options.input = err.input || this.str; - options.filename = err.filename || this.options.filename; - options.lineno = err.lineno || parser.lexer.lineno; - options.column = err.column || parser.lexer.column; - if (!fn) throw utils.formatException(err, options); - return fn(utils.formatException(err, options)) - } - if (!fn) return css; - fn(null, css) - }; - Renderer.prototype.deps = function (filename) { - var opts = utils.merge({cache: false}, this.options); - if (filename) opts.filename = filename; - var DepsResolver = require("./visitor/deps-resolver"), parser = new Parser(this.str, opts); - try { - nodes.filename = opts.filename; - var ast = parser.parse(), resolver = new DepsResolver(ast, opts); - return resolver.resolve() - } - catch (err) { - var options = {}; - options.input = err.input || this.str; - options.filename = err.filename || opts.filename; - options.lineno = err.lineno || parser.lexer.lineno; - options.column = err.column || parser.lexer.column; - throw utils.formatException(err, options) - } - }; - Renderer.prototype.set = function (key, val) { - this.options[key] = val; - return this - }; - Renderer.prototype.get = function (key) { - return this.options[key] - }; - Renderer.prototype.include = function (path) { - this.options.paths.push(path); - return this - }; - Renderer.prototype.use = function (fn) { - fn.call(this, this); - return this - }; - Renderer.prototype.define = function (name, fn, raw) { - fn = utils.coerce(fn, raw); - if (fn.nodeName) { - this.options.globals[name] = fn; - return this - } - this.options.functions[name] = fn; - if (undefined != raw) fn.raw = raw; - return this - } - }); - require.register("selector-parser.js", function (module, exports, require) { - var COMBINATORS = [">", "+", "~"]; - var SelectorParser = module.exports = function SelectorParser(str, stack, parts) { - this.str = str; - this.stack = stack || []; - this.parts = parts || []; - this.pos = 0; - this.level = 2; - this.nested = true; - this.ignore = false - }; - SelectorParser.prototype.skip = function (len) { - this.str = this.str.substr(len); - this.pos += len - }; - SelectorParser.prototype.skipSpaces = function () { - while (" " == this.str[0]) this.skip(1) - }; - SelectorParser.prototype.advance = function () { - return this.root() || this.relative() || this.initial() || this.escaped() || this.parent() || this.partial() || this.char() - }; - SelectorParser.prototype.root = function () { - if (!this.pos && "/" == this.str[0] && "deep" != this.str.slice(1, 5)) { - this.nested = false; - this.skip(1) - } - }; - SelectorParser.prototype.relative = function (multi) { - if ((!this.pos || multi) && "../" == this.str.slice(0, 3)) { - this.nested = false; - this.skip(3); - while (this.relative(true)) this.level++; - if (!this.raw) { - var ret = this.stack[this.stack.length - this.level]; - if (ret) {return ret} else {this.ignore = true} - } - } - }; - SelectorParser.prototype.initial = function () { - if (!this.pos && "~" == this.str[0] && "/" == this.str[1]) { - this.nested = false; - this.skip(2); - return this.stack[0] - } - }; - SelectorParser.prototype.escaped = function () { - if ("\\" == this.str[0]) { - var char = this.str[1]; - if ("&" == char || "^" == char) { - this.skip(2); - return char - } - } - }; - SelectorParser.prototype.parent = function () { - if ("&" == this.str[0]) { - this.nested = false; - if (!this.pos && (!this.stack.length || this.raw)) { - var i = 0; - while (" " == this.str[++i]) ; - if (~COMBINATORS.indexOf(this.str[i])) { - this.skip(i + 1); - return - } - } - this.skip(1); - if (!this.raw) return this.stack[this.stack.length - 1] - } - }; - SelectorParser.prototype.partial = function () { - if ("^" == this.str[0] && "[" == this.str[1]) { - this.skip(2); - this.skipSpaces(); - var ret = this.range(); - this.skipSpaces(); - if ("]" != this.str[0]) return "^["; - this.nested = false; - this.skip(1); - if (ret) {return ret} else {this.ignore = true} - } - }; - SelectorParser.prototype.number = function () { - var i = 0, ret = ""; - if ("-" == this.str[i]) ret += this.str[i++]; - while (this.str.charCodeAt(i) >= 48 && this.str.charCodeAt(i) <= 57) ret += this.str[i++]; - if (ret) { - this.skip(i); - return Number(ret) - } - }; - SelectorParser.prototype.range = function () { - var start = this.number(), ret; - if (".." == this.str.slice(0, 2)) { - this.skip(2); - var end = this.number(), len = this.parts.length; - if (start < 0) start = len + start - 1; - if (end < 0) end = len + end - 1; - if (start > end) { - var tmp = start; - start = end; - end = tmp - } - if (end < len - 1) { - ret = this.parts.slice(start, end + 1).map(function (part) { - var selector = new SelectorParser(part, this.stack, this.parts); - selector.raw = true; - return selector.parse() - }, this).map(function (selector) { - return (selector.nested ? " " : "") + selector.val - }).join("").trim() - } - } else {ret = this.stack[start < 0 ? this.stack.length + start - 1 : start]} - if (ret) {return ret} else {this.ignore = true} - }; - SelectorParser.prototype.char = function () { - var char = this.str[0]; - this.skip(1); - return char - }; - SelectorParser.prototype.parse = function () { - var val = ""; - while (this.str.length) { - val += this.advance() || ""; - if (this.ignore) { - val = ""; - break - } - } - return {val: val.trimRight(), nested: this.nested} - } - }); - require.register("stack/index.js", function (module, exports, require) { - var Stack = module.exports = function Stack() { - Array.apply(this, arguments) - }; - Stack.prototype.__proto__ = Array.prototype; - Stack.prototype.push = function (frame) { - frame.stack = this; - frame.parent = this.currentFrame; - return [].push.apply(this, arguments) - }; - Stack.prototype.__defineGetter__("currentFrame", function () { - return this[this.length - 1] - }); - Stack.prototype.getBlockFrame = function (block) { - for (var i = 0; i < this.length; ++i) {if (block == this[i].block) {return this[i]}} - }; - Stack.prototype.lookup = function (name) { - var block = this.currentFrame.block, val, ret; - do { - var frame = this.getBlockFrame(block); - if (frame && (val = frame.lookup(name))) {return val} - } while (block = block.parent) - }; - Stack.prototype.inspect = function () { - return this.reverse().map(function (frame) { - return frame.inspect() - }).join("\n") - }; - Stack.prototype.toString = function () { - var block, node, buf = [], location, len = this.length; - while (len--) { - block = this[len].block; - if (node = block.node) { - location = "(" + node.filename + ":" + (node.lineno + 1) + ":" + node.column + ")"; - switch (node.nodeName) { - case"function": - buf.push(" at " + node.name + "() " + location); - break; - case"group": - buf.push(' at "' + node.nodes[0].val + '" ' + location); - break - } - } - } - return buf.join("\n") - } - }); - require.register("stack/frame.js", function (module, exports, require) { - var Scope = require("./scope"); - var Frame = module.exports = function Frame(block) { - this._scope = false === block.scope ? null : new Scope; - this.block = block - }; - Frame.prototype.__defineGetter__("scope", function () { - return this._scope || this.parent.scope - }); - Frame.prototype.lookup = function (name) { - return this.scope.lookup(name) - }; - Frame.prototype.inspect = function () { - return "[Frame " + (false === this.block.scope ? "scope-less" : this.scope.inspect()) + "]" - } - }); - require.register("stack/scope.js", function (module, exports, require) { - var Scope = module.exports = function Scope() { - this.locals = {} - }; - Scope.prototype.add = function (ident) { - this.locals[ident.name] = ident.val - }; - Scope.prototype.lookup = function (name) { - return this.locals[name] - }; - Scope.prototype.inspect = function () { - var keys = Object.keys(this.locals).map(function (key) { - return "@" + key - }); - return "[Scope" + (keys.length ? " " + keys.join(", ") : "") + "]" - } - }); - require.register("stylus.js", function (module, exports, require) { - var Renderer = require("./renderer"), nodes = require("./nodes"), utils = require("./utils"); - exports = module.exports = render; - exports.version = "0.54.5"; - exports.nodes = nodes; - exports.functions = require("./functions"); - exports.utils = require("./utils"); - exports.Visitor = require("./visitor"); - exports.Parser = require("./parser"); - exports.Evaluator = require("./visitor/evaluator"); - exports.Normalizer = require("./visitor/normalizer"); - exports.Compiler = require("./visitor/compiler"); - exports.render = function (str, options, fn) { - if ("function" == typeof options) fn = options, options = {}; - if (bifs) str = bifs + str; - return new Renderer(str, options).render(fn) - }; - - function render(str, options) { - if (bifs) str = bifs + str; - return new Renderer(str, options) - } - - exports.url = require("./functions/url") - }); - require.register("token.js", function (module, exports, require) { - var Token = exports = module.exports = function Token(type, val) { - this.type = type; - this.val = val - }; - Token.prototype.inspect = function () { - var val = " " + this.val; - return "[Token:" + this.lineno + ":" + this.column + " " + "" + this.type + "" + "" + (this.val ? val : "") + "" + "]" - }; - Token.prototype.toString = function () { - return (undefined === this.val ? this.type : this.val).toString() - } - }); - require.register("utils.js", function (module, exports, require) { - var nodes = require("./nodes"), join = require("./path").join, isAbsolute = require("./path").isAbsolute; - exports.absolute = isAbsolute || function (path) { - return path.substr(0, 2) == "\\\\" || "/" === path.charAt(0) || /^[a-z]:[\\\/]/i.test(path) - }; - exports.lookup = function (path, paths, ignore) { - var lookup, i = paths.length; - if (exports.absolute(path)) { - try {return path} - catch (err) {} - } - while (i--) { - try { - lookup = join(paths[i], path); - if (ignore == lookup) continue; - return lookup - } - catch (err) {} - } - }; - exports.find = function (path, paths, ignore) { - var lookup, found, i = paths.length; - if (exports.absolute(path)) {if ((found = glob.sync(path)).length) {return found}} - while (i--) { - lookup = join(paths[i], path); - if (ignore == lookup) continue; - if ((found = glob.sync(lookup)).length) {return found} - } - }; - exports.lookupIndex = function (name, paths, filename) { - var found = exports.find(join(name, "index.styl"), paths, filename); - if (!found) {found = exports.find(join(name, basename(name).replace(/\.styl/i, "") + ".styl"), paths, filename)} - if (!found && !~name.indexOf("node_modules")) {found = lookupPackage(join("node_modules", name))} - return found; - - function lookupPackage(dir) { - var pkg = exports.lookup(join(dir, "package.json"), paths, filename); - if (!pkg) {return /\.styl$/i.test(dir) ? exports.lookupIndex(dir, paths, filename) : lookupPackage(dir + ".styl")} - var main = require(relative(__dirname, pkg)).main; - if (main) {found = exports.find(join(dir, main), paths, filename)} else {found = exports.lookupIndex(dir, paths, filename)} - return found - } - }; - exports.formatException = function (err, options) { - var lineno = options.lineno, - column = options.column, - filename = options.filename, - str = options.input, - context = options.context || 8, - context = context / 2, - lines = ("\n" + str).split("\n"), - start = Math.max(lineno - context, 1), - end = Math.min(lines.length, lineno + context), - pad = end.toString().length; - var context = lines.slice(start, end).map(function (line, i) { - var curr = i + start; - return " " + Array(pad - curr.toString().length + 1).join(" ") + curr + "| " + line + (curr == lineno ? "\n" + Array(curr.toString().length + 5 + column).join("-") + "^" : "") - }).join("\n"); - err.message = filename + ":" + lineno + ":" + column + "\n" + context + "\n\n" + err.message + "\n" + (err.stylusStack ? err.stylusStack + "\n" : ""); - if (err.fromStylus) err.stack = "Error: " + err.message; - return err - }; - exports.assertType = function (node, type, param) { - exports.assertPresent(node, param); - if (node.nodeName == type) return; - var actual = node.nodeName, - msg = "expected " + (param ? '"' + param + '" to be a ' : "") + type + ", but got " + actual + ":" + node; - throw new Error("TypeError: " + msg) - }; - exports.assertString = function (node, param) { - exports.assertPresent(node, param); - switch (node.nodeName) { - case"string": - case"ident": - case"literal": - return; - default: - var actual = node.nodeName, msg = "expected string, ident or literal, but got " + actual + ":" + node; - throw new Error("TypeError: " + msg) - } - }; - exports.assertColor = function (node, param) { - exports.assertPresent(node, param); - switch (node.nodeName) { - case"rgba": - case"hsla": - return; - default: - var actual = node.nodeName, msg = "expected rgba or hsla, but got " + actual + ":" + node; - throw new Error("TypeError: " + msg) - } - }; - exports.assertPresent = function (node, name) { - if (node) return; - if (name) throw new Error('"' + name + '" argument required'); - throw new Error("argument missing") - }; - exports.unwrap = function (expr) { - if (expr.preserve) return expr; - if ("arguments" != expr.nodeName && "expression" != expr.nodeName) return expr; - if (1 != expr.nodes.length) return expr; - if ("arguments" != expr.nodes[0].nodeName && "expression" != expr.nodes[0].nodeName) return expr; - return exports.unwrap(expr.nodes[0]) - }; - exports.coerce = function (val, raw) { - switch (typeof val) { - case"function": - return val; - case"string": - return new nodes.String(val); - case"boolean": - return new nodes.Boolean(val); - case"number": - return new nodes.Unit(val); - default: - if (null == val) return nodes.nil; - if (Array.isArray(val)) return exports.coerceArray(val, raw); - if (val.nodeName) return val; - return exports.coerceObject(val, raw) - } - }; - exports.coerceArray = function (val, raw) { - var expr = new nodes.Expression; - val.forEach(function (val) { - expr.push(exports.coerce(val, raw)) - }); - return expr - }; - exports.coerceObject = function (obj, raw) { - var node = raw ? new nodes.Object : new nodes.Expression, val; - for (var key in obj) { - val = exports.coerce(obj[key], raw); - key = new nodes.Ident(key); - if (raw) {node.set(key, val)} else {node.push(exports.coerceArray([key, val]))} - } - return node - }; - exports.params = function (fn) { - return fn.toString().match(/\(([^)]*)\)/)[1].split(/ *, */) - }; - exports.merge = function (a, b, deep) { - for (var k in b) { - if (deep && a[k]) { - var nodeA = exports.unwrap(a[k]).first, nodeB = exports.unwrap(b[k]).first; - if ("object" == nodeA.nodeName && "object" == nodeB.nodeName) {a[k].first.vals = exports.merge(nodeA.vals, nodeB.vals, deep)} else {a[k] = b[k]} - } else {a[k] = b[k]} - } - return a - }; - exports.uniq = function (arr) { - var obj = {}, ret = []; - for (var i = 0, len = arr.length; i < len; ++i) { - if (arr[i] in obj) continue; - obj[arr[i]] = true; - ret.push(arr[i]) - } - return ret - }; - exports.compileSelectors = function (arr, leaveHidden) { - var selectors = [], Parser = require("./selector-parser"), indent = this.indent || "", buf = []; - - function parse(selector, buf) { - var parts = [selector.val], str = new Parser(parts[0], parents, parts).parse().val, parents = []; - if (buf.length) { - for (var i = 0, len = buf.length; i < len; ++i) { - parts.push(buf[i]); - parents.push(str); - var child = new Parser(buf[i], parents, parts).parse(); - if (child.nested) {str += " " + child.val} else {str = child.val} - } - } - return str.trim() - } - - function compile(arr, i) { - if (i) { - arr[i].forEach(function (selector) { - if (!leaveHidden && selector.isPlaceholder) return; - if (selector.inherits) { - buf.unshift(selector.val); - compile(arr, i - 1); - buf.shift() - } else {selectors.push(indent + parse(selector, buf))} - }) - } else { - arr[0].forEach(function (selector) { - if (!leaveHidden && selector.isPlaceholder) return; - var str = parse(selector, buf); - if (str) selectors.push(indent + str) - }) - } - } - - compile(arr, arr.length - 1); - return exports.uniq(selectors) - }; - exports.parseString = function (str) { - var Parser = require("./parser"), parser, ret; - try { - parser = new Parser(str); - parser.state.push("expression"); - ret = new nodes.Expression; - ret.nodes = parser.parse().nodes - } - catch (e) {ret = new nodes.Literal(str)} - return ret - } - }); - require.register("visitor/index.js", function (module, exports, require) { - var Visitor = module.exports = function Visitor(root) { - this.root = root - }; - Visitor.prototype.visit = function (node, fn) { - var method = "visit" + node.constructor.name; - if (this[method]) return this[method](node); - return node - } - }); - require.register("visitor/compiler.js", function (module, exports, require) { - var Visitor = require("./index"), utils = require("../utils"); - var Compiler = module.exports = function Compiler(root, options) { - options = options || {}; - this.compress = options.compress; - this.firebug = options.firebug; - this.linenos = options.linenos; - this.spaces = options["indent spaces"] || 2; - this.indents = 1; - Visitor.call(this, root); - this.stack = [] - }; - Compiler.prototype.__proto__ = Visitor.prototype; - Compiler.prototype.compile = function () { - return this.visit(this.root) - }; - Compiler.prototype.out = function (str, node) { - return str - }; - Compiler.prototype.__defineGetter__("indent", function () { - if (this.compress) return ""; - return new Array(this.indents).join(Array(this.spaces + 1).join(" ")) - }); - Compiler.prototype.needBrackets = function (node) { - return 1 == this.indents || "atrule" != node.nodeName || node.hasOnlyProperties - }; - Compiler.prototype.visitRoot = function (block) { - this.buf = ""; - for (var i = 0, len = block.nodes.length; i < len; ++i) { - var node = block.nodes[i]; - if (this.linenos || this.firebug) this.debugInfo(node); - var ret = this.visit(node); - if (ret) this.buf += this.out(ret + "\n", node) - } - return this.buf - }; - Compiler.prototype.visitBlock = function (block) { - var node, separator = this.compress ? "" : "\n", needBrackets; - if (block.hasProperties && !block.lacksRenderedSelectors) { - needBrackets = this.needBrackets(block.node); - if (needBrackets) { - this.buf += this.out(this.compress ? "{" : " {\n"); - ++this.indents - } - for (var i = 0, len = block.nodes.length; i < len; ++i) { - this.last = len - 1 == i; - node = block.nodes[i]; - switch (node.nodeName) { - case"null": - case"expression": - case"function": - case"group": - case"block": - case"unit": - case"media": - case"keyframes": - case"atrule": - case"supports": - continue; - case!this.compress && node.inline && "comment": - this.buf = this.buf.slice(0, -1); - this.buf += this.out(" " + this.visit(node) + "\n", node); - break; - case"property": - var ret = this.visit(node) + separator; - this.buf += this.compress ? ret : this.out(ret, node); - break; - default: - this.buf += this.out(this.visit(node) + separator, node) - } - } - if (needBrackets) { - --this.indents; - this.buf += this.out(this.indent + "}" + separator) - } - } - for (var i = 0, len = block.nodes.length; i < len; ++i) { - node = block.nodes[i]; - switch (node.nodeName) { - case"group": - case"block": - case"keyframes": - if (this.linenos || this.firebug) this.debugInfo(node); - this.visit(node); - break; - case"media": - case"import": - case"atrule": - case"supports": - this.visit(node); - break; - case"comment": - if (!node.suppress) {this.buf += this.out(this.indent + this.visit(node) + "\n", node)} - break; - case"charset": - case"literal": - case"namespace": - this.buf += this.out(this.visit(node) + "\n", node); - break - } - } - }; - Compiler.prototype.visitKeyframes = function (node) { - if (!node.frames) return; - var prefix = "official" == node.prefix ? "" : "-" + node.prefix + "-"; - this.buf += this.out("@" + prefix + "keyframes " + this.visit(node.val) + (this.compress ? "{" : " {\n"), node); - this.keyframe = true; - ++this.indents; - this.visit(node.block); - --this.indents; - this.keyframe = false; - this.buf += this.out("}" + (this.compress ? "" : "\n")) - }; - Compiler.prototype.visitMedia = function (media) { - var val = media.val; - if (!media.hasOutput || !val.nodes.length) return; - this.buf += this.out("@media ", media); - this.visit(val); - this.buf += this.out(this.compress ? "{" : " {\n"); - ++this.indents; - this.visit(media.block); - --this.indents; - this.buf += this.out("}" + (this.compress ? "" : "\n")) - }; - Compiler.prototype.visitQueryList = function (queries) { - for (var i = 0, len = queries.nodes.length; i < len; ++i) { - this.visit(queries.nodes[i]); - if (len - 1 != i) this.buf += this.out("," + (this.compress ? "" : " ")) - } - }; - Compiler.prototype.visitQuery = function (node) { - var len = node.nodes.length; - if (node.predicate) this.buf += this.out(node.predicate + " "); - if (node.type) this.buf += this.out(node.type + (len ? " and " : "")); - for (var i = 0; i < len; ++i) { - this.buf += this.out(this.visit(node.nodes[i])); - if (len - 1 != i) this.buf += this.out(" and ") - } - }; - Compiler.prototype.visitFeature = function (node) { - if (!node.expr) {return node.name} else if (node.expr.isEmpty) {return "(" + node.name + ")"} else {return "(" + node.name + ":" + (this.compress ? "" : " ") + this.visit(node.expr) + ")"} - }; - Compiler.prototype.visitImport = function (imported) { - this.buf += this.out("@import " + this.visit(imported.path) + ";\n", imported) - }; - Compiler.prototype.visitAtrule = function (atrule) { - var newline = this.compress ? "" : "\n"; - this.buf += this.out(this.indent + "@" + atrule.type, atrule); - if (atrule.val) this.buf += this.out(" " + atrule.val.trim()); - if (atrule.block) { - if (atrule.hasOnlyProperties) {this.visit(atrule.block)} else { - this.buf += this.out(this.compress ? "{" : " {\n"); - ++this.indents; - this.visit(atrule.block); - --this.indents; - this.buf += this.out(this.indent + "}" + newline) - } - } else {this.buf += this.out(";" + newline)} - }; - Compiler.prototype.visitSupports = function (node) { - if (!node.hasOutput) return; - this.buf += this.out(this.indent + "@supports ", node); - this.isCondition = true; - this.buf += this.out(this.visit(node.condition)); - this.isCondition = false; - this.buf += this.out(this.compress ? "{" : " {\n"); - ++this.indents; - this.visit(node.block); - --this.indents; - this.buf += this.out(this.indent + "}" + (this.compress ? "" : "\n")) - }, Compiler.prototype.visitComment = function (comment) { - return this.compress ? comment.suppress ? "" : comment.str : comment.str - }; - Compiler.prototype.visitFunction = function (fn) { - return fn.name - }; - Compiler.prototype.visitCharset = function (charset) { - return "@charset " + this.visit(charset.val) + ";" - }; - Compiler.prototype.visitNamespace = function (namespace) { - return "@namespace " + (namespace.prefix ? this.visit(namespace.prefix) + " " : "") + this.visit(namespace.val) + ";" - }; - Compiler.prototype.visitLiteral = function (lit) { - var val = lit.val; - if (lit.css) val = val.replace(/^ /gm, ""); - return val - }; - Compiler.prototype.visitBoolean = function (bool) { - return bool.toString() - }; - Compiler.prototype.visitRGBA = function (rgba) { - return rgba.toString() - }; - Compiler.prototype.visitHSLA = function (hsla) { - return hsla.rgba.toString() - }; - Compiler.prototype.visitUnit = function (unit) { - var type = unit.type || "", n = unit.val, float = n != (n | 0); - if (this.compress) { - if ("%" != type && "s" != type && "ms" != type && 0 == n) return "0"; - if (float && n < 1 && n > -1) {return n.toString().replace("0.", ".") + type} - } - return (float ? parseFloat(n.toFixed(15)) : n).toString() + type - }; - Compiler.prototype.visitGroup = function (group) { - var stack = this.keyframe ? [] : this.stack, comma = this.compress ? "," : ",\n"; - stack.push(group.nodes); - if (group.block.hasProperties) { - var selectors = utils.compileSelectors.call(this, stack), len = selectors.length; - if (len) { - if (this.keyframe) comma = this.compress ? "," : ", "; - for (var i = 0; i < len; ++i) { - var selector = selectors[i], last = i == len - 1; - if (this.keyframe) selector = i ? selector.trim() : selector; - this.buf += this.out(selector + (last ? "" : comma), group.nodes[i]) - } - } else {group.block.lacksRenderedSelectors = true} - } - this.visit(group.block); - stack.pop() - }; - Compiler.prototype.visitIdent = function (ident) { - return ident.name - }; - Compiler.prototype.visitString = function (string) { - return this.isURL ? string.val : string.toString() - }; - Compiler.prototype.visitNull = function (node) { - return "" - }; - Compiler.prototype.visitCall = function (call) { - this.isURL = "url" == call.name; - var args = call.args.nodes.map(function (arg) { - return this.visit(arg) - }, this).join(this.compress ? "," : ", "); - if (this.isURL) args = '"' + args + '"'; - this.isURL = false; - return call.name + "(" + args + ")" - }; - Compiler.prototype.visitExpression = function (expr) { - var buf = [], self = this, len = expr.nodes.length, nodes = expr.nodes.map(function (node) { - return self.visit(node) - }); - nodes.forEach(function (node, i) { - var last = i == len - 1; - buf.push(node); - if ("/" == nodes[i + 1] || "/" == node) return; - if (last) return; - var space = self.isURL || self.isCondition && (")" == nodes[i + 1] || "(" == node) ? "" : " "; - buf.push(expr.isList ? self.compress ? "," : ", " : space) - }); - return buf.join("") - }; - Compiler.prototype.visitArguments = Compiler.prototype.visitExpression; - Compiler.prototype.visitProperty = function (prop) { - var val = this.visit(prop.expr).trim(), name = prop.name || prop.segments.join(""), arr = []; - arr.push(this.out(this.indent), this.out(name + (this.compress ? ":" : ": "), prop), this.out(val, prop.expr), this.out(this.compress ? this.last ? "" : ";" : ";")); - return arr.join("") - }; - Compiler.prototype.debugInfo = function (node) { - var path = node.filename == "stdin" ? "stdin" : fs.realpathSync(node.filename), - line = (node.nodes && node.nodes.length ? node.nodes[0].lineno : node.lineno) || 1; - if (this.linenos) {this.buf += "\n/* " + "line " + line + " : " + path + " */\n"} - if (this.firebug) { - path = "file\\:\\/\\/" + path.replace(/([.:\/\\])/g, function (m) { - return "\\" + (m === "\\" ? "/" : m) - }); - line = "\\00003" + line; - this.buf += "\n@media -stylus-debug-info" + "{filename{font-family:" + path + "}line{font-family:" + line + "}}\n" - } - } - }); - require.register("visitor/evaluator.js", function (module, exports, require) { - var Visitor = require("./index"), - nodes = require("../nodes"), - Stack = require("../stack"), - Frame = require("../stack/frame"), - utils = require("../utils"), - bifs = require("../functions"), - dirname = require("../path").dirname, - colors = require("../colors"), - units = require("../units"); - - function cloneNode(node) { - if (node.block && node.block.node) {node.block.node = node.block.node.clone()} - if (node.nodes && node.nodes.length) {node.nodes.map(cloneNode)} - return node - } - - function importFile(node, file, literal) { - var importStack = this.importStack, Parser = require("../parser"), stat; - if (node.once) { - if (this.requireHistory[file]) return nodes.nil; - this.requireHistory[file] = true; - if (literal && !this.includeCSS) {return node} - } - if (~importStack.indexOf(file)) throw new Error("import loop has been found"); - var str = fs.readFileSync(file, "utf8"); - if (!str.trim()) return nodes.nil; - node.path = file; - node.dirname = dirname(file); - stat = fs.statSync(file); - node.mtime = stat.mtime; - this.paths.push(node.dirname); - if (this.options._imports) this.options._imports.push(node.clone()); - importStack.push(file); - nodes.filename = file; - if (literal) { - literal = new nodes.Literal(str.replace(/\r\n?/g, "\n")); - literal.lineno = literal.column = 1; - if (!this.resolveURL) return literal - } - var block = new nodes.Block, parser = new Parser(str, utils.merge({root: block}, this.options)); - try {block = parser.parse()} - catch (err) { - var line = parser.lexer.lineno, column = parser.lexer.column; - if (literal && this.includeCSS && this.resolveURL) { - this.warn("ParseError: " + file + ":" + line + ":" + column + ". This file included as-is"); - return literal - } else { - err.filename = file; - err.lineno = line; - err.column = column; - err.input = str; - throw err - } - } - block = block.clone(this.currentBlock); - block.parent = this.currentBlock; - block.scope = false; - var ret = this.visit(block); - importStack.pop(); - if (!this.resolveURL || this.resolveURL.nocheck) this.paths.pop(); - return ret - } - - var Evaluator = module.exports = function Evaluator(root, options) { - options = options || {}; - Visitor.call(this, root); - var functions = this.functions = options.functions || {}; - this.stack = new Stack; - this.imports = options.imports || []; - this.globals = options.globals || {}; - this.paths = options.paths || []; - this.prefix = options.prefix || ""; - this.filename = options.filename; - this.includeCSS = options["include css"]; - this.resolveURL = functions.url && "resolver" == functions.url.name && functions.url.options; - this.paths.push(dirname(options.filename || ".")); - this.stack.push(this.global = new Frame(root)); - this.warnings = options.warn; - this.options = options; - this.calling = []; - this.importStack = []; - this.ret = 0; - this.requireHistory = {} - }; - Evaluator.prototype.__proto__ = Visitor.prototype; - var visit = Visitor.prototype.visit; - Evaluator.prototype.visit = function (node) { - try {return visit.call(this, node)} - catch (err) { - if (err.filename) throw err; - err.lineno = node.lineno; - err.column = node.column; - err.filename = node.filename; - err.stylusStack = this.stack.toString(); - try {} - catch (err) {} - throw err - } - }; - Evaluator.prototype.setup = function () { - var root = this.root; - var imports = []; - this.populateGlobalScope(); - this.imports.forEach(function (file) { - var expr = new nodes.Expression; - expr.push(new nodes.String(file)); - imports.push(new nodes.Import(expr)) - }, this); - root.nodes = imports.concat(root.nodes) - }; - Evaluator.prototype.populateGlobalScope = function () { - var scope = this.global.scope; - Object.keys(colors).forEach(function (name) { - var color = colors[name], - rgba = new nodes.RGBA(color[0], color[1], color[2], color[3]), - node = new nodes.Ident(name, rgba); - rgba.name = name; - scope.add(node) - }); - scope.add(new nodes.Ident("embedurl", new nodes.Function("embedurl", require("../functions/url")({limit: false})))); - var globals = this.globals; - Object.keys(globals).forEach(function (name) { - var val = globals[name]; - if (!val.nodeName) val = new nodes.Literal(val); - scope.add(new nodes.Ident(name, val)) - }) - }; - Evaluator.prototype.evaluate = function () { - this.setup(); - return this.visit(this.root) - }; - Evaluator.prototype.visitGroup = function (group) { - group.nodes = group.nodes.map(function (selector) { - selector.val = this.interpolate(selector); - return selector - }, this); - group.block = this.visit(group.block); - return group - }; - Evaluator.prototype.visitReturn = function (ret) { - ret.expr = this.visit(ret.expr); - throw ret - }; - Evaluator.prototype.visitMedia = function (media) { - media.block = this.visit(media.block); - media.val = this.visit(media.val); - return media - }; - Evaluator.prototype.visitQueryList = function (queries) { - var val, query; - queries.nodes.forEach(this.visit, this); - if (1 == queries.nodes.length) { - query = queries.nodes[0]; - if (val = this.lookup(query.type)) { - val = val.first.string; - if (!val) return queries; - var Parser = require("../parser"), parser = new Parser(val, this.options); - queries = this.visit(parser.queries()) - } - } - return queries - }; - Evaluator.prototype.visitQuery = function (node) { - node.predicate = this.visit(node.predicate); - node.type = this.visit(node.type); - node.nodes.forEach(this.visit, this); - return node - }; - Evaluator.prototype.visitFeature = function (node) { - node.name = this.interpolate(node); - if (node.expr) { - this.ret++; - node.expr = this.visit(node.expr); - this.ret-- - } - return node - }; - Evaluator.prototype.visitObject = function (obj) { - for (var key in obj.vals) {obj.vals[key] = this.visit(obj.vals[key])} - return obj - }; - Evaluator.prototype.visitMember = function (node) { - var left = node.left, right = node.right, obj = this.visit(left).first; - if ("object" != obj.nodeName) {throw new Error(left.toString() + " has no property ." + right)} - if (node.val) { - this.ret++; - obj.set(right.name, this.visit(node.val)); - this.ret-- - } - return obj.get(right.name) - }; - Evaluator.prototype.visitKeyframes = function (keyframes) { - var val; - if (keyframes.fabricated) return keyframes; - keyframes.val = this.interpolate(keyframes).trim(); - if (val = this.lookup(keyframes.val)) {keyframes.val = val.first.string || val.first.name} - keyframes.block = this.visit(keyframes.block); - if ("official" != keyframes.prefix) return keyframes; - this.vendors.forEach(function (prefix) { - if ("ms" == prefix) return; - var node = keyframes.clone(); - node.val = keyframes.val; - node.prefix = prefix; - node.block = keyframes.block; - node.fabricated = true; - this.currentBlock.push(node) - }, this); - return nodes.nil - }; - Evaluator.prototype.visitFunction = function (fn) { - var local = this.stack.currentFrame.scope.lookup(fn.name); - if (local) this.warn("local " + local.nodeName + ' "' + fn.name + '" previously defined in this scope'); - var user = this.functions[fn.name]; - if (user) this.warn('user-defined function "' + fn.name + '" is already defined'); - var bif = bifs[fn.name]; - if (bif) this.warn('built-in function "' + fn.name + '" is already defined'); - return fn - }; - Evaluator.prototype.visitEach = function (each) { - this.ret++; - var expr = utils.unwrap(this.visit(each.expr)), - len = expr.nodes.length, - val = new nodes.Ident(each.val), - key = new nodes.Ident(each.key || "__index__"), - scope = this.currentScope, - block = this.currentBlock, - vals = [], - self = this, - body, - obj; - this.ret--; - each.block.scope = false; - - function visitBody(key, val) { - scope.add(val); - scope.add(key); - body = self.visit(each.block.clone()); - vals = vals.concat(body.nodes) - } - - if (1 == len && "object" == expr.nodes[0].nodeName) { - obj = expr.nodes[0]; - for (var prop in obj.vals) { - val.val = new nodes.String(prop); - key.val = obj.get(prop); - visitBody(key, val) - } - } else { - for (var i = 0; i < len; ++i) { - val.val = expr.nodes[i]; - key.val = new nodes.Unit(i); - visitBody(key, val) - } - } - this.mixin(vals, block); - return vals[vals.length - 1] || nodes.nil - }; - Evaluator.prototype.visitCall = function (call) { - var fn = this.lookup(call.name), literal, ret; - this.ignoreColors = "url" == call.name; - if (fn && "expression" == fn.nodeName) {fn = fn.nodes[0]} - if (fn && "function" != fn.nodeName) {fn = this.lookupFunction(call.name)} - if (!fn || fn.nodeName != "function") { - if ("calc" == this.unvendorize(call.name)) { - literal = call.args.nodes && call.args.nodes[0]; - if (literal) ret = new nodes.Literal(call.name + literal) - } else {ret = this.literalCall(call)} - this.ignoreColors = false; - return ret - } - this.calling.push(call.name); - if (this.calling.length > 200) {throw new RangeError("Maximum stylus call stack size exceeded")} - if ("expression" == fn.nodeName) fn = fn.first; - this.ret++; - var args = this.visit(call.args); - for (var key in args.map) {args.map[key] = this.visit(args.map[key].clone())} - this.ret--; - if (fn.fn) {ret = this.invokeBuiltin(fn.fn, args)} else if ("function" == fn.nodeName) { - if (call.block) call.block = this.visit(call.block); - ret = this.invokeFunction(fn, args, call.block) - } - this.calling.pop(); - this.ignoreColors = false; - return ret - }; - Evaluator.prototype.visitIdent = function (ident) { - var prop; - if (ident.property) { - if (prop = this.lookupProperty(ident.name)) {return this.visit(prop.expr.clone())} - return nodes.nil - } else if (ident.val.isNull) { - var val = this.lookup(ident.name); - if (val && ident.mixin) this.mixinNode(val); - return val ? this.visit(val) : ident - } else { - this.ret++; - ident.val = this.visit(ident.val); - this.ret--; - this.currentScope.add(ident); - return ident.val - } - }; - Evaluator.prototype.visitBinOp = function (binop) { - if ("is defined" == binop.op) return this.isDefined(binop.left); - this.ret++; - var op = binop.op, - left = this.visit(binop.left), - right = "||" == op || "&&" == op ? binop.right : this.visit(binop.right); - var val = binop.val ? this.visit(binop.val) : null; - this.ret--; - try {return this.visit(left.operate(op, right, val))} - catch (err) { - if ("CoercionError" == err.name) { - switch (op) { - case"==": - return nodes.no; - case"!=": - return nodes.yes - } - } - throw err - } - }; - Evaluator.prototype.visitUnaryOp = function (unary) { - var op = unary.op, node = this.visit(unary.expr); - if ("!" != op) { - node = node.first.clone(); - utils.assertType(node, "unit") - } - switch (op) { - case"-": - node.val = -node.val; - break; - case"+": - node.val = +node.val; - break; - case"~": - node.val = ~node.val; - break; - case"!": - return node.toBoolean().negate() - } - return node - }; - Evaluator.prototype.visitTernary = function (ternary) { - var ok = this.visit(ternary.cond).toBoolean(); - return ok.isTrue ? this.visit(ternary.trueExpr) : this.visit(ternary.falseExpr) - }; - Evaluator.prototype.visitExpression = function (expr) { - for (var i = 0, len = expr.nodes.length; i < len; ++i) {expr.nodes[i] = this.visit(expr.nodes[i])} - if (this.castable(expr)) expr = this.cast(expr); - return expr - }; - Evaluator.prototype.visitArguments = Evaluator.prototype.visitExpression; - Evaluator.prototype.visitProperty = function (prop) { - var name = this.interpolate(prop), - fn = this.lookup(name), - call = fn && "function" == fn.first.nodeName, - literal = ~this.calling.indexOf(name), - _prop = this.property; - if (call && !literal && !prop.literal) { - var args = nodes.Arguments.fromExpression(utils.unwrap(prop.expr.clone())); - prop.name = name; - this.property = prop; - this.ret++; - this.property.expr = this.visit(prop.expr); - this.ret--; - var ret = this.visit(new nodes.Call(name, args)); - this.property = _prop; - return ret - } else { - this.ret++; - prop.name = name; - prop.literal = true; - this.property = prop; - prop.expr = this.visit(prop.expr); - this.property = _prop; - this.ret--; - return prop - } - }; - Evaluator.prototype.visitRoot = function (block) { - if (block != this.root) { - block.constructor = nodes.Block; - return this.visit(block) - } - for (var i = 0; i < block.nodes.length; ++i) { - block.index = i; - block.nodes[i] = this.visit(block.nodes[i]) - } - return block - }; - Evaluator.prototype.visitBlock = function (block) { - this.stack.push(new Frame(block)); - for (block.index = 0; block.index < block.nodes.length; ++block.index) { - try {block.nodes[block.index] = this.visit(block.nodes[block.index])} - catch (err) { - if ("return" == err.nodeName) { - if (this.ret) { - this.stack.pop(); - throw err - } else { - block.nodes[block.index] = err; - break - } - } else {throw err} - } - } - this.stack.pop(); - return block - }; - Evaluator.prototype.visitAtblock = function (atblock) { - atblock.block = this.visit(atblock.block); - return atblock - }; - Evaluator.prototype.visitAtrule = function (atrule) { - atrule.val = this.interpolate(atrule); - if (atrule.block) atrule.block = this.visit(atrule.block); - return atrule - }; - Evaluator.prototype.visitSupports = function (node) { - var condition = node.condition, val; - this.ret++; - node.condition = this.visit(condition); - this.ret--; - val = condition.first; - if (1 == condition.nodes.length && "string" == val.nodeName) {node.condition = val.string} - node.block = this.visit(node.block); - return node - }; - Evaluator.prototype.visitIf = function (node) { - var ret, block = this.currentBlock, negate = node.negate; - this.ret++; - var ok = this.visit(node.cond).first.toBoolean(); - this.ret--; - node.block.scope = node.block.hasMedia; - if (negate) {if (ok.isFalse) {ret = this.visit(node.block)}} else { - if (ok.isTrue) {ret = this.visit(node.block)} else if (node.elses.length) { - var elses = node.elses, - len = elses.length, - cond; - for (var i = 0; i < len; ++i) { - if (elses[i].cond) { - elses[i].block.scope = elses[i].block.hasMedia; - this.ret++; - cond = this.visit(elses[i].cond).first.toBoolean(); - this.ret--; - if (cond.isTrue) { - ret = this.visit(elses[i].block); - break - } - } else { - elses[i].scope = elses[i].hasMedia; - ret = this.visit(elses[i]) - } - } - } - } - if (ret && !node.postfix && block.node && ~["group", "atrule", "media", "supports", "keyframes"].indexOf(block.node.nodeName)) { - this.mixin(ret.nodes, block); - return nodes.nil - } - return ret || nodes.nil - }; - Evaluator.prototype.visitExtend = function (extend) { - var block = this.currentBlock; - if ("group" != block.node.nodeName) block = this.closestGroup; - extend.selectors.forEach(function (selector) { - block.node.extends.push({ - selector: this.interpolate(selector.clone()).trim(), optional: selector.optional, lineno: selector.lineno, - column: selector.column, - }) - }, this); - return nodes.nil - }; - Evaluator.prototype.visitImport = function (imported) { - this.ret++; - var path = this.visit(imported.path).first, nodeName = imported.once ? "require" : "import", found, literal; - this.ret--; - if ("url" == path.name) { - if (imported.once) throw new Error("You cannot @require a url"); - return imported - } - if (!path.string) throw new Error("@" + nodeName + " string expected"); - var name = path = path.string; - if (/(?:url\s*\(\s*)?['"]?(?:#|(?:https?:)?\/\/)/i.test(path)) { - if (imported.once) throw new Error("You cannot @require a url"); - return imported - } - if (/\.css(?:"|$)/.test(path)) { - literal = true; - if (!imported.once && !this.includeCSS) {return imported} - } - if (!literal && !/\.styl$/i.test(path)) path += ".styl"; - found = utils.find(path, this.paths, this.filename); - if (!found) {found = utils.lookupIndex(name, this.paths, this.filename)} - if (!found) throw new Error("failed to locate @" + nodeName + " file " + path); - var block = new nodes.Block; - for (var i = 0, len = found.length; i < len; ++i) {block.push(importFile.call(this, imported, found[i], literal))} - return block - }; - Evaluator.prototype.invokeFunction = function (fn, args, content) { - var block = new nodes.Block(fn.block.parent); - var body = fn.block.clone(block); - var mixinBlock = this.stack.currentFrame.block; - this.stack.push(new Frame(block)); - var scope = this.currentScope; - if ("arguments" != args.nodeName) { - var expr = new nodes.Expression; - expr.push(args); - args = nodes.Arguments.fromExpression(expr) - } - scope.add(new nodes.Ident("arguments", args)); - scope.add(new nodes.Ident("mixin", this.ret ? nodes.no : new nodes.String(mixinBlock.nodeName))); - if (this.property) { - var prop = this.propertyExpression(this.property, fn.name); - scope.add(new nodes.Ident("current-property", prop)) - } else {scope.add(new nodes.Ident("current-property", nodes.nil))} - var expr = new nodes.Expression; - for (var i = this.calling.length - 1; i--;) {expr.push(new nodes.Literal(this.calling[i]))} - scope.add(new nodes.Ident("called-from", expr)); - var i = 0, len = args.nodes.length; - fn.params.nodes.forEach(function (node) { - if (node.rest) { - node.val = new nodes.Expression; - for (; i < len; ++i) node.val.push(args.nodes[i]); - node.val.preserve = true; - node.val.isList = args.isList - } else { - var arg = args.map[node.name] || args.nodes[i++]; - node = node.clone(); - if (arg) {arg.isEmpty ? args.nodes[i - 1] = this.visit(node) : node.val = arg} else {args.push(node.val)} - if (node.val.isNull) {throw new Error('argument "' + node + '" required for ' + fn)} - } - scope.add(node) - }, this); - if (content) scope.add(new nodes.Ident("block", content, true)); - return this.invoke(body, true, fn.filename) - }; - Evaluator.prototype.invokeBuiltin = function (fn, args) { - if (fn.raw) {args = args.nodes} else { - args = utils.params(fn).reduce(function (ret, param) { - var arg = args.map[param] || args.nodes.shift(); - if (arg) { - arg = utils.unwrap(arg); - var len = arg.nodes.length; - if (len > 1) {for (var i = 0; i < len; ++i) {ret.push(utils.unwrap(arg.nodes[i].first))}} else {ret.push(arg.first)} - } - return ret - }, []) - } - var body = utils.coerce(fn.apply(this, args)); - var expr = new nodes.Expression; - expr.push(body); - body = expr; - return this.invoke(body) - }; - Evaluator.prototype.invoke = function (body, stack, filename) { - var self = this, ret; - if (filename) this.paths.push(dirname(filename)); - if (this.ret) { - ret = this.eval(body.nodes); - if (stack) this.stack.pop() - } else { - body = this.visit(body); - if (stack) this.stack.pop(); - this.mixin(body.nodes, this.currentBlock); - ret = nodes.nil - } - if (filename) this.paths.pop(); - return ret - }; - Evaluator.prototype.mixin = function (nodes, block) { - if (!nodes.length) return; - var len = block.nodes.length, - head = block.nodes.slice(0, block.index), - tail = block.nodes.slice(block.index + 1, len); - this._mixin(nodes, head, block); - block.index = 0; - block.nodes = head.concat(tail) - }; - Evaluator.prototype._mixin = function (items, dest, block) { - var node, len = items.length; - for (var i = 0; i < len; ++i) { - switch ((node = items[i]).nodeName) { - case"return": - return; - case"block": - this._mixin(node.nodes, dest, block); - break; - case"media": - var parentNode = node.block.parent.node; - if (parentNode && "call" != parentNode.nodeName) {node.block.parent = block} - case"property": - var val = node.expr; - if (node.literal && "block" == val.first.name) { - val = utils.unwrap(val); - val.nodes[0] = new nodes.Literal("block") - } - default: - dest.push(node) - } - } - }; - Evaluator.prototype.mixinNode = function (node) { - node = this.visit(node.first); - switch (node.nodeName) { - case"object": - this.mixinObject(node); - return nodes.nil; - case"block": - case"atblock": - this.mixin(node.nodes, this.currentBlock); - return nodes.nil - } - }; - Evaluator.prototype.mixinObject = function (object) { - var Parser = require("../parser"), - root = this.root, - str = "$block " + object.toBlock(), - parser = new Parser(str, utils.merge({root: block}, this.options)), - block; - try {block = parser.parse()} - catch (err) { - err.filename = this.filename; - err.lineno = parser.lexer.lineno; - err.column = parser.lexer.column; - err.input = str; - throw err - } - block.parent = root; - block.scope = false; - var ret = this.visit(block), vals = ret.first.nodes; - for (var i = 0, len = vals.length; i < len; ++i) { - if (vals[i].block) { - this.mixin(vals[i].block.nodes, this.currentBlock); - break - } - } - }; - Evaluator.prototype.eval = function (vals) { - if (!vals) return nodes.nil; - var len = vals.length, node = nodes.nil; - try { - for (var i = 0; i < len; ++i) { - node = vals[i]; - switch (node.nodeName) { - case"if": - if ("block" != node.block.nodeName) { - node = this.visit(node); - break - } - case"each": - case"block": - node = this.visit(node); - if (node.nodes) node = this.eval(node.nodes); - break; - default: - node = this.visit(node) - } - } - } - catch (err) {if ("return" == err.nodeName) {return err.expr} else {throw err}} - return node - }; - Evaluator.prototype.literalCall = function (call) { - call.args = this.visit(call.args); - return call - }; - Evaluator.prototype.lookupProperty = function (name) { - var i = this.stack.length, index = this.currentBlock.index, top = i, nodes, block, len, other; - while (i--) { - block = this.stack[i].block; - if (!block.node) continue; - switch (block.node.nodeName) { - case"group": - case"function": - case"if": - case"each": - case"atrule": - case"media": - case"atblock": - case"call": - nodes = block.nodes; - if (i + 1 == top) { - while (index--) { - if (this.property == nodes[index]) continue; - other = this.interpolate(nodes[index]); - if (name == other) return nodes[index].clone() - } - } else { - len = nodes.length; - while (len--) { - if ("property" != nodes[len].nodeName || this.property == nodes[len]) continue; - other = this.interpolate(nodes[len]); - if (name == other) return nodes[len].clone() - } - } - break - } - } - return nodes.nil - }; - Evaluator.prototype.__defineGetter__("closestBlock", function () { - var i = this.stack.length, block; - while (i--) { - block = this.stack[i].block; - if (block.node) { - switch (block.node.nodeName) { - case"group": - case"keyframes": - case"atrule": - case"atblock": - case"media": - case"call": - return block - } - } - } - }); - Evaluator.prototype.__defineGetter__("closestGroup", function () { - var i = this.stack.length, block; - while (i--) { - block = this.stack[i].block; - if (block.node && "group" == block.node.nodeName) {return block} - } - }); - Evaluator.prototype.__defineGetter__("selectorStack", function () { - var block, stack = []; - for (var i = 0, len = this.stack.length; i < len; ++i) { - block = this.stack[i].block; - if (block.node && "group" == block.node.nodeName) { - block.node.nodes.forEach(function (selector) { - if (!selector.val) selector.val = this.interpolate(selector) - }, this); - stack.push(block.node.nodes) - } - } - return stack - }); - Evaluator.prototype.lookup = function (name) { - var val; - if (this.ignoreColors && name in colors) return; - if (val = this.stack.lookup(name)) {return utils.unwrap(val)} else {return this.lookupFunction(name)} - }; - Evaluator.prototype.interpolate = function (node) { - var self = this, isSelector = "selector" == node.nodeName; - - function toString(node) { - switch (node.nodeName) { - case"function": - case"ident": - return node.name; - case"literal": - case"string": - if (self.prefix && !node.prefixed && !node.val.nodeName) { - node.val = node.val.replace(/\./g, "." + self.prefix); - node.prefixed = true - } - return node.val; - case"unit": - return "%" == node.type ? node.val + "%" : node.val; - case"member": - return toString(self.visit(node)); - case"expression": - if (self.calling && ~self.calling.indexOf("selector") && self._selector) return self._selector; - self.ret++; - var ret = toString(self.visit(node).first); - self.ret--; - if (isSelector) self._selector = ret; - return ret - } - } - - if (node.segments) {return node.segments.map(toString).join("")} else {return toString(node)} - }; - Evaluator.prototype.lookupFunction = function (name) { - var fn = this.functions[name] || bifs[name]; - if (fn) return new nodes.Function(name, fn) - }; - Evaluator.prototype.isDefined = function (node) { - if ("ident" == node.nodeName) {return nodes.Boolean(this.lookup(node.name))} else {throw new Error('invalid "is defined" check on non-variable ' + node)} - }; - Evaluator.prototype.propertyExpression = function (prop, name) { - var expr = new nodes.Expression, val = prop.expr.clone(); - expr.push(new nodes.String(prop.name)); - - function replace(node) { - if ("call" == node.nodeName && name == node.name) {return new nodes.Literal("__CALL__")} - if (node.nodes) node.nodes = node.nodes.map(replace); - return node - } - - replace(val); - expr.push(val); - return expr - }; - Evaluator.prototype.cast = function (expr) { - return new nodes.Unit(expr.first.val, expr.nodes[1].name) - }; - Evaluator.prototype.castable = function (expr) { - return 2 == expr.nodes.length && "unit" == expr.first.nodeName && ~units.indexOf(expr.nodes[1].name) - }; - Evaluator.prototype.warn = function (msg) { - if (!this.warnings) return; - console.warn("Warning: " + msg) - }; - Evaluator.prototype.__defineGetter__("currentBlock", function () { - return this.stack.currentFrame.block - }); - Evaluator.prototype.__defineGetter__("vendors", function () { - return this.lookup("vendors").nodes.map(function (node) { - return node.string - }) - }); - Evaluator.prototype.unvendorize = function (prop) { - for (var i = 0, len = this.vendors.length; i < len; i++) { - if ("official" != this.vendors[i]) { - var vendor = "-" + this.vendors[i] + "-"; - if (~prop.indexOf(vendor)) return prop.replace(vendor, "") - } - } - return prop - }; - Evaluator.prototype.__defineGetter__("currentScope", function () { - return this.stack.currentFrame.scope - }); - Evaluator.prototype.__defineGetter__("currentFrame", function () { - return this.stack.currentFrame - }) - }); - require.register("visitor/normalizer.js", function (module, exports, require) { - var Visitor = require("./index"), nodes = require("../nodes/index"), utils = require("../utils"); - var Normalizer = module.exports = function Normalizer(root, options) { - options = options || {}; - Visitor.call(this, root); - this.hoist = options["hoist atrules"]; - this.stack = []; - this.map = {}; - this.imports = [] - }; - Normalizer.prototype.__proto__ = Visitor.prototype; - Normalizer.prototype.normalize = function () { - var ret = this.visit(this.root); - if (this.hoist) { - if (this.imports.length) ret.nodes = this.imports.concat(ret.nodes); - if (this.charset) ret.nodes = [this.charset].concat(ret.nodes) - } - return ret - }; - Normalizer.prototype.bubble = function (node) { - var props = [], other = [], self = this; - - function filterProps(block) { - block.nodes.forEach(function (node) { - node = self.visit(node); - switch (node.nodeName) { - case"property": - props.push(node); - break; - case"block": - filterProps(node); - break; - default: - other.push(node) - } - }) - } - - filterProps(node.block); - if (props.length) { - var selector = new nodes.Selector([new nodes.Literal("&")]); - selector.lineno = node.lineno; - selector.column = node.column; - selector.filename = node.filename; - selector.val = "&"; - var group = new nodes.Group; - group.lineno = node.lineno; - group.column = node.column; - group.filename = node.filename; - var block = new nodes.Block(node.block, group); - block.lineno = node.lineno; - block.column = node.column; - block.filename = node.filename; - props.forEach(function (prop) { - block.push(prop) - }); - group.push(selector); - group.block = block; - node.block.nodes = []; - node.block.push(group); - other.forEach(function (n) { - node.block.push(n) - }); - var group = this.closestGroup(node.block); - if (group) node.group = group.clone(); - node.bubbled = true - } - }; - Normalizer.prototype.closestGroup = function (block) { - var parent = block.parent, node; - while (parent && (node = parent.node)) { - if ("group" == node.nodeName) return node; - parent = node.block && node.block.parent - } - }; - Normalizer.prototype.visitRoot = function (block) { - var ret = new nodes.Root, node; - for (var i = 0; i < block.nodes.length; ++i) { - node = block.nodes[i]; - switch (node.nodeName) { - case"null": - case"expression": - case"function": - case"unit": - case"atblock": - continue; - default: - this.rootIndex = i; - ret.push(this.visit(node)) - } - } - return ret - }; - Normalizer.prototype.visitProperty = function (prop) { - this.visit(prop.expr); - return prop - }; - Normalizer.prototype.visitExpression = function (expr) { - expr.nodes = expr.nodes.map(function (node) { - if ("block" == node.nodeName) { - var literal = new nodes.Literal("block"); - literal.lineno = expr.lineno; - literal.column = expr.column; - return literal - } - return node - }); - return expr - }; - Normalizer.prototype.visitBlock = function (block) { - var node; - if (block.hasProperties) { - for (var i = 0, len = block.nodes.length; i < len; ++i) { - node = block.nodes[i]; - switch (node.nodeName) { - case"null": - case"expression": - case"function": - case"group": - case"unit": - case"atblock": - continue; - default: - block.nodes[i] = this.visit(node) - } - } - } - for (var i = 0, len = block.nodes.length; i < len; ++i) { - node = block.nodes[i]; - block.nodes[i] = this.visit(node) - } - return block - }; - Normalizer.prototype.visitGroup = function (group) { - var stack = this.stack, map = this.map, parts; - group.nodes.forEach(function (selector, i) { - if (!~selector.val.indexOf(",")) return; - if (~selector.val.indexOf("\\,")) { - selector.val = selector.val.replace(/\\,/g, ","); - return - } - parts = selector.val.split(","); - var root = "/" == selector.val.charAt(0), part, s; - for (var k = 0, len = parts.length; k < len; ++k) { - part = parts[k].trim(); - if (root && k > 0 && !~part.indexOf("&")) {part = "/" + part} - s = new nodes.Selector([new nodes.Literal(part)]); - s.val = part; - s.block = group.block; - group.nodes[i++] = s - } - }); - stack.push(group.nodes); - var selectors = utils.compileSelectors(stack, true); - selectors.forEach(function (selector) { - map[selector] = map[selector] || []; - map[selector].push(group) - }); - this.extend(group, selectors); - stack.pop(); - return group - }; - Normalizer.prototype.visitFunction = function () { - return nodes.nil - }; - Normalizer.prototype.visitMedia = function (media) { - var medias = [], group = this.closestGroup(media.block), parent; - - function mergeQueries(block) { - block.nodes.forEach(function (node, i) { - switch (node.nodeName) { - case"media": - node.val = media.val.merge(node.val); - medias.push(node); - block.nodes[i] = nodes.nil; - break; - case"block": - mergeQueries(node); - break; - default: - if (node.block && node.block.nodes) mergeQueries(node.block) - } - }) - } - - mergeQueries(media.block); - this.bubble(media); - if (medias.length) { - medias.forEach(function (node) { - if (group) {group.block.push(node)} else {this.root.nodes.splice(++this.rootIndex, 0, node)} - node = this.visit(node); - parent = node.block.parent; - if (node.bubbled && (!group || "group" == parent.node.nodeName)) { - node.group.block = node.block.nodes[0].block; - node.block.nodes[0] = node.group - } - }, this) - } - return media - }; - Normalizer.prototype.visitSupports = function (node) { - this.bubble(node); - return node - }; - Normalizer.prototype.visitAtrule = function (node) { - if (node.block) node.block = this.visit(node.block); - return node - }; - Normalizer.prototype.visitKeyframes = function (node) { - var frames = node.block.nodes.filter(function (frame) { - return frame.block && frame.block.hasProperties - }); - node.frames = frames.length; - return node - }; - Normalizer.prototype.visitImport = function (node) { - this.imports.push(node); - return this.hoist ? nodes.nil : node - }; - Normalizer.prototype.visitCharset = function (node) { - this.charset = node; - return this.hoist ? nodes.nil : node - }; - Normalizer.prototype.extend = function (group, selectors) { - var map = this.map, self = this, parent = this.closestGroup(group.block); - group.extends.forEach(function (extend) { - var groups = map[extend.selector]; - if (!groups) { - if (extend.optional) return; - var err = new Error('Failed to @extend "' + extend.selector + '"'); - err.lineno = extend.lineno; - err.column = extend.column; - throw err - } - selectors.forEach(function (selector) { - var node = new nodes.Selector; - node.val = selector; - node.inherits = false; - groups.forEach(function (group) { - if (!parent || parent != group) self.extend(group, selectors); - group.push(node) - }) - }) - }); - group.block = this.visit(group.block) - } - }); - return require("stylus") -}(); +if(Function.prototype.name===undefined&&Object.defineProperty!==undefined){Object.defineProperty(Function.prototype,"name",{get:function(){var regex=/function\s([^(]{1,})\(/,match=regex.exec(this.toString());return match&&match.length>1?match[1].trim():""}})}if(String.prototype.trimRight===undefined){String.prototype.trimRight=function(){return String(this).replace(/\s+$/,"")}}var stylus=function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');if(!mod.exports){mod.exports={};mod.call(mod.exports,mod,mod.exports,require.relative(path))}return mod.exports}var bifs="called-from = ()\n\nvendors = moz webkit o ms official\n\n// stringify the given arg\n\n-string(arg)\n type(arg) + ' ' + arg\n\n// require a color\n\nrequire-color(color)\n unless color is a 'color'\n error('RGB or HSL value expected, got a ' + -string(color))\n\n// require a unit\n\nrequire-unit(n)\n unless n is a 'unit'\n error('unit expected, got a ' + -string(n))\n\n// require a string\n\nrequire-string(str)\n unless str is a 'string' or str is a 'ident'\n error('string expected, got a ' + -string(str))\n\n// Math functions\n\nabs(n) { math(n, 'abs') }\nmin(a, b) { a < b ? a : b }\nmax(a, b) { a > b ? a : b }\n\n// Trigonometrics\nPI = -math-prop('PI')\n\nradians-to-degrees(angle)\n angle * (180 / PI)\n\ndegrees-to-radians(angle)\n unit(angle * (PI / 180),'')\n\nsin(n)\n n = degrees-to-radians(n) if unit(n) == 'deg'\n round(math(n, 'sin'), 9)\n\ncos(n)\n n = degrees-to-radians(n) if unit(n) == 'deg'\n round(math(n, 'cos'), 9)\n\n// Rounding Math functions\n\nceil(n, precision = 0)\n multiplier = 10 ** precision\n math(n * multiplier, 'ceil') / multiplier\n\nfloor(n, precision = 0)\n multiplier = 10 ** precision\n math(n * multiplier, 'floor') / multiplier\n\nround(n, precision = 0)\n multiplier = 10 ** precision\n math(n * multiplier, 'round') / multiplier\n\n// return the sum of the given numbers\n\nsum(nums)\n sum = 0\n sum += n for n in nums\n\n// return the average of the given numbers\n\navg(nums)\n sum(nums) / length(nums)\n\n// return a unitless number, or pass through\n\nremove-unit(n)\n if typeof(n) is 'unit'\n unit(n, '')\n else\n n\n\n// convert a percent to a decimal, or pass through\n\npercent-to-decimal(n)\n if unit(n) is '%'\n remove-unit(n) / 100\n else\n n\n\n// check if n is an odd number\n\nodd(n)\n 1 == n % 2\n\n// check if n is an even number\n\neven(n)\n 0 == n % 2\n\n// check if color is light\n\nlight(color)\n lightness(color) >= 50%\n\n// check if color is dark\n\ndark(color)\n lightness(color) < 50%\n\n// desaturate color by amount\n\ndesaturate(color, amount)\n adjust(color, 'saturation', - amount)\n\n// saturate color by amount\n\nsaturate(color = '', amount = 100%)\n if color is a 'color'\n adjust(color, 'saturation', amount)\n else\n unquote( 'saturate(' + color + ')' )\n\n// darken by the given amount\n\ndarken(color, amount)\n adjust(color, 'lightness', - amount)\n\n// lighten by the given amount\n\nlighten(color, amount)\n adjust(color, 'lightness', amount)\n\n// decrease opacity by amount\n\nfade-out(color, amount)\n color - rgba(black, percent-to-decimal(amount))\n\n// increase opacity by amount\n\nfade-in(color, amount)\n color + rgba(black, percent-to-decimal(amount))\n\n// spin hue by a given amount\n\nspin(color, amount)\n color + unit(amount, deg)\n\n// mix two colors by a given amount\n\nmix(color1, color2, weight = 50%)\n unless weight in 0..100\n error('Weight must be between 0% and 100%')\n\n if length(color1) == 2\n weight = color1[0]\n color1 = color1[1]\n\n else if length(color2) == 2\n weight = 100 - color2[0]\n color2 = color2[1]\n\n require-color(color1)\n require-color(color2)\n\n p = unit(weight / 100, '')\n w = p * 2 - 1\n\n a = alpha(color1) - alpha(color2)\n\n w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2\n w2 = 1 - w1\n\n channels = (red(color1) red(color2)) (green(color1) green(color2)) (blue(color1) blue(color2))\n rgb = ()\n\n for pair in channels\n push(rgb, floor(pair[0] * w1 + pair[1] * w2))\n\n a1 = alpha(color1) * p\n a2 = alpha(color2) * (1 - p)\n alpha = a1 + a2\n\n rgba(rgb[0], rgb[1], rgb[2], alpha)\n\n// invert colors, leave alpha intact\n\ninvert(color = '')\n if color is a 'color'\n rgba(#fff - color, alpha(color))\n else\n unquote( 'invert(' + color + ')' )\n\n// give complement of the given color\n\ncomplement( color )\n spin( color, 180 )\n\n// give grayscale of the given color\n\ngrayscale( color = '' )\n if color is a 'color'\n desaturate( color, 100% )\n else\n unquote( 'grayscale(' + color + ')' )\n\n// mix the given color with white\n\ntint( color, percent )\n mix( white, color, percent )\n\n// mix the given color with black\n\nshade( color, percent )\n mix( black, color, percent )\n\n// return the last value in the given expr\n\nlast(expr)\n expr[length(expr) - 1]\n\n// return keys in the given pairs or object\n\nkeys(pairs)\n ret = ()\n if type(pairs) == 'object'\n for key in pairs\n push(ret, key)\n else\n for pair in pairs\n push(ret, pair[0]);\n ret\n\n// return values in the given pairs or object\n\nvalues(pairs)\n ret = ()\n if type(pairs) == 'object'\n for key, val in pairs\n push(ret, val)\n else\n for pair in pairs\n push(ret, pair[1]);\n ret\n\n// join values with the given delimiter\n\njoin(delim, vals...)\n buf = ''\n vals = vals[0] if length(vals) == 1\n for val, i in vals\n buf += i ? delim + val : val\n\n// add a CSS rule to the containing block\n\n// - This definition allows add-property to be used as a mixin\n// - It has the same effect as interpolation but allows users\n// to opt for a functional style\n\nadd-property-function = add-property\nadd-property(name, expr)\n if mixin\n {name} expr\n else\n add-property-function(name, expr)\n\nprefix-classes(prefix)\n -prefix-classes(prefix, block)\n\n// Caching mixin, use inside your functions to enable caching by extending.\n\n$stylus_mixin_cache = {}\ncache()\n $key = (current-media() or 'no-media') + '__' + called-from[0] + '__' + arguments\n if $key in $stylus_mixin_cache\n @extend {'$cache_placeholder_for_' + $stylus_mixin_cache[$key]}\n else if 'cache' in called-from\n {block}\n else\n $id = length($stylus_mixin_cache)\n\n &,\n /$cache_placeholder_for_{$id}\n $stylus_mixin_cache[$key] = $id\n {block}\n\n// Percentage function to convert a number, e.g. '.45', into a percentage, e.g. '45%'\n\npercentage(num)\n return unit(num * 100, '%')\n\n// Returns the position of a `value` within a `list`\n\nindex(list, value)\n for val, i in list\n return i if val == value\n";require.modules={};require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&®||require.modules[index]&&index||orig};require.register=function(path,fn){require.modules[path]=fn};require.relative=function(parent){return function(p){if("."!=p[0])return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i=0;i--){var last=parts[i];if(last=="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^([\s\S]+\/(?!$)|\/)?((?:[\s\S]+?)?(\.[^.]*)?)$/;exports.normalize=function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.slice(-1)==="/";path=normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(paths.filter(function(p,index){return p&&typeof p==="string"}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;isizeLimit)return literal;if(enc&&"utf8"==enc.first.val.toLowerCase()){encoding=encodingTypes.UTF8;result=buf.toString("utf8").replace(/\s+/g," ").replace(/[{}\|\\\^~\[\]`"<>#%]/g,function(match){return"%"+match[0].charCodeAt(0).toString(16).toUpperCase()}).trim()}else{result=buf.toString(encoding)+hash}return new nodes.Literal('url("data:'+mime+";"+encoding+","+result+'")')}fn.raw=true;return fn};module.exports.mimes=defaultMimes});require.register("functions/add-property.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function addProperty(name,expr){utils.assertType(name,"expression","name");name=utils.unwrap(name).first;utils.assertString(name,"name");utils.assertType(expr,"expression","expr");var prop=new nodes.Property([name],expr);var block=this.closestBlock;var len=block.nodes.length,head=block.nodes.slice(0,block.index),tail=block.nodes.slice(block.index++,len);head.push(prop);block.nodes=head.concat(tail);return prop}).raw=true});require.register("functions/adjust.js",function(module,exports,require){var utils=require("../utils");module.exports=function adjust(color,prop,amount){utils.assertColor(color,"color");utils.assertString(prop,"prop");utils.assertType(amount,"unit","amount");var hsl=color.hsla.clone();prop={hue:"h",saturation:"s",lightness:"l"}[prop.string];if(!prop)throw new Error("invalid adjustment property");var val=amount.val;if("%"==amount.type){val="l"==prop&&val>0?(100-hsl[prop])*val/100:hsl[prop]*(val/100)}hsl[prop]+=val;return hsl.rgba}});require.register("functions/alpha.js",function(module,exports,require){var nodes=require("../nodes"),rgba=require("./rgba");module.exports=function alpha(color,value){color=color.rgba;if(value){return rgba(new nodes.Unit(color.r),new nodes.Unit(color.g),new nodes.Unit(color.b),value)}return new nodes.Unit(color.a,"")}});require.register("functions/base-convert.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function(num,base,width){utils.assertPresent(num,"number");utils.assertPresent(base,"base");num=utils.unwrap(num).nodes[0].val;base=utils.unwrap(base).nodes[0].val;width=width&&utils.unwrap(width).nodes[0].val||2;var result=Number(num).toString(base);while(result.lengthtop.a){top=blend(top,bottom)}var l1=luminosity(bottom).val+.05,l2=luminosity(top).val+.05,ratio=l1/l2;if(l2>l1){ratio=1/ratio}return Math.round(ratio*10)/10}if(1<=bottom.a){var resultRatio=new nodes.Unit(contrast(top,bottom));result.set("ratio",resultRatio);result.set("error",new nodes.Unit(0));result.set("min",resultRatio);result.set("max",resultRatio)}else{var onBlack=contrast(top,blend(bottom,new nodes.RGBA(0,0,0,1))),onWhite=contrast(top,blend(bottom,new nodes.RGBA(255,255,255,1))),max=Math.max(onBlack,onWhite);function processChannel(topChannel,bottomChannel){return Math.min(Math.max(0,(topChannel-bottomChannel*bottom.a)/(1-bottom.a)),255)}var closest=new nodes.RGBA(processChannel(top.r,bottom.r),processChannel(top.g,bottom.g),processChannel(top.b,bottom.b),1);var min=contrast(top,blend(bottom,closest));result.set("ratio",new nodes.Unit(Math.round((min+max)*50)/100));result.set("error",new nodes.Unit(Math.round((max-min)*50)/100));result.set("min",new nodes.Unit(min));result.set("max",new nodes.Unit(max))}return result}});require.register("functions/convert.js",function(module,exports,require){var utils=require("../utils");module.exports=function convert(str){utils.assertString(str,"str");return utils.parseString(str.string)}});require.register("functions/current-media.js",function(module,exports,require){var nodes=require("../nodes");module.exports=function currentMedia(){var self=this;return new nodes.String(lookForMedia(this.closestBlock.node)||"");function lookForMedia(node){if("media"==node.nodeName){node.val=self.visit(node.val);return node.toString()}else if(node.block.parent.node){return lookForMedia(node.block.parent.node)}}}});require.register("functions/define.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function define(name,expr,global){utils.assertType(name,"string","name");expr=utils.unwrap(expr);var scope=this.currentScope;if(global&&global.toBoolean().isTrue){scope=this.global.scope}var node=new nodes.Ident(name.val,expr);scope.add(node);return nodes.nil}});require.register("functions/dirname.js",function(module,exports,require){var utils=require("../utils"),path=require("../path");module.exports=function dirname(p){utils.assertString(p,"path");return path.dirname(p.val).replace(/\\/g,"/")}});require.register("functions/error.js",function(module,exports,require){var utils=require("../utils");module.exports=function error(msg){utils.assertType(msg,"string","msg");var err=new Error(msg.val);err.fromStylus=true;throw err}});require.register("functions/extname.js",function(module,exports,require){var utils=require("../utils"),path=require("../path");module.exports=function extname(p){utils.assertString(p,"path");return path.extname(p.val)}});require.register("functions/green.js",function(module,exports,require){var nodes=require("../nodes"),rgba=require("./rgba");module.exports=function green(color,value){color=color.rgba;if(value){return rgba(new nodes.Unit(color.r),value,new nodes.Unit(color.b),new nodes.Unit(color.a))}return new nodes.Unit(color.g,"")}});require.register("functions/hsl.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes"),hsla=require("./hsla");module.exports=function hsl(hue,saturation,lightness){if(1==arguments.length){utils.assertColor(hue,"color");return hue.hsla}else{return hsla(hue,saturation,lightness,new nodes.Unit(1))}}});require.register("functions/hsla.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function hsla(hue,saturation,lightness,alpha){switch(arguments.length){case 1:utils.assertColor(hue);return hue.hsla;case 2:utils.assertColor(hue);var color=hue.hsla;utils.assertType(saturation,"unit","alpha");var alpha=saturation.clone();if("%"==alpha.type)alpha.val/=100;return new nodes.HSLA(color.h,color.s,color.l,alpha.val);default:utils.assertType(hue,"unit","hue");utils.assertType(saturation,"unit","saturation");utils.assertType(lightness,"unit","lightness");utils.assertType(alpha,"unit","alpha");var alpha=alpha.clone();if(alpha&&"%"==alpha.type)alpha.val/=100;return new nodes.HSLA(hue.val,saturation.val,lightness.val,alpha.val)}}});require.register("functions/hue.js",function(module,exports,require){var nodes=require("../nodes"),hsla=require("./hsla"),component=require("./component");module.exports=function hue(color,value){if(value){var hslaColor=color.hsla;return hsla(value,new nodes.Unit(hslaColor.s),new nodes.Unit(hslaColor.l),new nodes.Unit(hslaColor.a))}return component(color,new nodes.String("hue"))}});require.register("functions/length.js",function(module,exports,require){var utils=require("../utils");(module.exports=function length(expr){if(expr){if(expr.nodes){var nodes=utils.unwrap(expr).nodes;if(1==nodes.length&&"object"==nodes[0].nodeName){return nodes[0].length}else{return nodes.length}}else{return 1}}return 0}).raw=true});require.register("functions/lightness.js",function(module,exports,require){var nodes=require("../nodes"),hsla=require("./hsla"),component=require("./component");module.exports=function lightness(color,value){if(value){var hslaColor=color.hsla;return hsla(new nodes.Unit(hslaColor.h),new nodes.Unit(hslaColor.s),value,new nodes.Unit(hslaColor.a))}return component(color,new nodes.String("lightness"))}});require.register("functions/list-separator.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function listSeparator(list){list=utils.unwrap(list);return new nodes.String(list.isList?",":" ")}).raw=true});require.register("functions/lookup.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function lookup(name){utils.assertType(name,"string","name");var node=this.lookup(name.val);if(!node)return nodes.nil;return this.visit(node)}});require.register("functions/luminosity.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function luminosity(color){utils.assertColor(color);color=color.rgba;function processChannel(channel){channel=channel/255;return.03928>channel?channel/12.92:Math.pow((channel+.055)/1.055,2.4)}return new nodes.Unit(.2126*processChannel(color.r)+.7152*processChannel(color.g)+.0722*processChannel(color.b))}});require.register("functions/match.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");var VALID_FLAGS="igm";module.exports=function match(pattern,val,flags){utils.assertType(pattern,"string","pattern");utils.assertString(val,"val");var re=new RegExp(pattern.val,validateFlags(flags)?flags.string:"");return val.string.match(re)};function validateFlags(flags){flags=flags&&flags.string;if(flags){return flags.split("").every(function(flag){return~VALID_FLAGS.indexOf(flag)})}return false}});require.register("functions/math-prop.js",function(module,exports,require){var nodes=require("../nodes");module.exports=function math(prop){return new nodes.Unit(Math[prop.string])}});require.register("functions/math.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function math(n,fn){utils.assertType(n,"unit","n");utils.assertString(fn,"fn");return new nodes.Unit(Math[fn.string](n.val),n.type)}});require.register("functions/merge.js",function(module,exports,require){var utils=require("../utils");(module.exports=function merge(dest){utils.assertPresent(dest,"dest");dest=utils.unwrap(dest).first;utils.assertType(dest,"object","dest");var last=utils.unwrap(arguments[arguments.length-1]).first,deep=true===last.val;for(var i=1,len=arguments.length-deep;i1){if(expr.isList){pushToStack(expr.nodes,stack)}else{stack.push(parse(expr.nodes.map(function(node){utils.assertString(node,"selector");return node.string}).join(" ")))}}}else if(args.length>1){pushToStack(args,stack)}return stack.length?utils.compileSelectors(stack).join(","):"&"}).raw=true;function pushToStack(selectors,stack){selectors.forEach(function(sel){sel=sel.first;utils.assertString(sel,"selector");stack.push(parse(sel.string))})}function parse(selector){var Parser=new require("../parser"),parser=new Parser(selector),nodes;parser.state.push("selector-parts");nodes=parser.selector();nodes.forEach(function(node){node.val=node.segments.map(function(seg){return seg.toString()}).join("")});return nodes}});require.register("functions/selectors.js",function(module,exports,require){var nodes=require("../nodes"),Parser=require("../selector-parser");module.exports=function selectors(){var stack=this.selectorStack,expr=new nodes.Expression(true);if(stack.length){for(var i=0;i1){expr.push(new nodes.String(group.map(function(selector){nested=new Parser(selector.val).parse().nested;return(nested&&i?"& ":"")+selector.val}).join(",")))}else{var selector=group[0].val;nested=new Parser(selector).parse().nested;expr.push(new nodes.String((nested&&i?"& ":"")+selector))}}}else{expr.push(new nodes.String("&"))}return expr}});require.register("functions/shift.js",function(module,exports,require){var utils=require("../utils");(module.exports=function(expr){expr=utils.unwrap(expr);return expr.nodes.shift()}).raw=true});require.register("functions/split.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function split(delim,val){utils.assertString(delim,"delimiter");utils.assertString(val,"val");var splitted=val.string.split(delim.string);var expr=new nodes.Expression;var ItemNode=val instanceof nodes.Ident?nodes.Ident:nodes.String;for(var i=0,len=splitted.length;i1){return utils.coerce(val.slice(start,end),true)}var result=val[0].string.slice(start,end);return val[0]instanceof nodes.Ident?new nodes.Ident(result):new nodes.String(result)}).raw=true});require.register("functions/substr.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function substr(val,start,length){utils.assertString(val,"val");utils.assertType(start,"unit","start");length=length&&length.val;var res=val.string.substr(start.val,length);return val instanceof nodes.Ident?new nodes.Ident(res):new nodes.String(res)}});require.register("functions/tan.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function tan(angle){utils.assertType(angle,"unit","angle");var radians=angle.val;if(angle.type==="deg"){radians*=Math.PI/180}var m=Math.pow(10,9);var sin=Math.round(Math.sin(radians)*m)/m,cos=Math.round(Math.cos(radians)*m)/m,tan=Math.round(m*sin/cos)/m;return new nodes.Unit(tan,"")}});require.register("functions/trace.js",function(module,exports,require){var nodes=require("../nodes");module.exports=function trace(){console.log(this.stack);return nodes.nil}});require.register("functions/transparentify.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function transparentify(top,bottom,alpha){utils.assertColor(top);top=top.rgba;bottom=bottom||new nodes.RGBA(255,255,255,1);if(!alpha&&bottom&&!bottom.rgba){alpha=bottom;bottom=new nodes.RGBA(255,255,255,1)}utils.assertColor(bottom);bottom=bottom.rgba;var bestAlpha=["r","g","b"].map(function(channel){return(top[channel]-bottom[channel])/((0s.lastIndexOf("*/",offset),commentIdx=s.lastIndexOf("//",offset),i=s.lastIndexOf("\n",offset),double=0,single=0;if(~commentIdx&&commentIdx>i){while(i!=offset){if("'"==s[i])single?single--:single++;if('"'==s[i])double?double--:double++;if("/"==s[i]&&"/"==s[i+1]){inComment=!single&&!double;break}++i}}return inComment?str:val+"\r"}if("\ufeff"==str.charAt(0))str=str.slice(1);this.str=str.replace(/\s+$/,"\n").replace(/\r\n?/g,"\n").replace(/\\ *\n/g,"\r").replace(/([,(:](?!\/\/[^ ])) *(?:\/\/[^\n]*|\/\*.*?\*\/)?\n\s*/g,comment).replace(/\s*\n[ \t]*([,)])/g,comment)}Lexer.prototype={inspect:function(){var tok,tmp=this.str,buf=[];while("eos"!=(tok=this.next()).type){buf.push(tok.inspect())}this.str=tmp;return buf.concat(tok.inspect()).join("\n")},lookahead:function(n){var fetch=n-this.stash.length;while(fetch-- >0)this.stash.push(this.advance());return this.stash[--n]},skip:function(len){var chunk=len[0];len=chunk?chunk.length:len;this.str=this.str.substr(len);if(chunk){this.move(chunk)}else{this.column+=len}},move:function(str){var lines=str.match(/\n/g),idx=str.lastIndexOf("\n");if(lines)this.lineno+=lines.length;this.column=~idx?str.length-idx:this.column+str.length},next:function(){var tok=this.stashed()||this.advance();this.prev=tok;return tok},isPartOfSelector:function(){var tok=this.stash[this.stash.length-1]||this.prev;switch(tok&&tok.type){case"color":return 2==tok.val.raw.length;case".":case"[":return true}return false},advance:function(){var column=this.column,line=this.lineno,tok=this.eos()||this.nil()||this.sep()||this.keyword()||this.urlchars()||this.comment()||this.newline()||this.escaped()||this.important()||this.literal()||this.fun()||this.anonFunc()||this.atrule()||this.brace()||this.paren()||this.color()||this.string()||this.unit()||this.namedop()||this.boolean()||this.unicode()||this.ident()||this.op()||this.eol()||this.space()||this.selector();tok.lineno=line;tok.column=column;return tok},peek:function(){return this.lookahead(1)},stashed:function(){return this.stash.shift()},eos:function(){if(this.str.length)return;if(this.indentStack.length){this.indentStack.shift();return new Token("outdent")}else{return new Token("eos")}},urlchars:function(){var captures;if(!this.isURL)return;if(captures=/^[\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)){this.skip(captures);return new Token("literal",new nodes.Literal(captures[0]))}},sep:function(){var captures;if(captures=/^;[ \t]*/.exec(this.str)){this.skip(captures);return new Token(";")}},eol:function(){if("\r"==this.str[0]){++this.lineno;this.skip(1);return this.advance()}},space:function(){var captures;if(captures=/^([ \t]+)/.exec(this.str)){this.skip(captures);return new Token("space")}},escaped:function(){var captures;if(captures=/^\\(.)[ \t]*/.exec(this.str)){var c=captures[1];this.skip(captures);return new Token("ident",new nodes.Literal(c))}},literal:function(){var captures;if(captures=/^@css[ \t]*\{/.exec(this.str)){this.skip(captures);var c,braces=1,css="",node;while(c=this.str[0]){this.str=this.str.substr(1);switch(c){case"{":++braces;break;case"}":--braces;break;case"\n":case"\r":++this.lineno;break}css+=c;if(!braces)break}css=css.replace(/\s*}$/,"");node=new nodes.Literal(css);node.css=true;return new Token("literal",node)}},important:function(){var captures;if(captures=/^!important[ \t]*/.exec(this.str)){this.skip(captures);return new Token("ident",new nodes.Literal("!important"))}},brace:function(){var captures;if(captures=/^([{}])/.exec(this.str)){this.skip(1);var brace=captures[1];return new Token(brace,brace)}},paren:function(){var captures;if(captures=/^([()])([ \t]*)/.exec(this.str)){var paren=captures[1];this.skip(captures);if(")"==paren)this.isURL=false;var tok=new Token(paren,paren);tok.space=captures[2];return tok}},nil:function(){var captures,tok;if(captures=/^(null)\b[ \t]*/.exec(this.str)){this.skip(captures);if(this.isPartOfSelector()){tok=new Token("ident",new nodes.Ident(captures[0]))}else{tok=new Token("null",nodes.nil)}return tok}},keyword:function(){var captures,tok;if(captures=/^(return|if|else|unless|for|in)\b[ \t]*/.exec(this.str)){var keyword=captures[1];this.skip(captures);if(this.isPartOfSelector()){tok=new Token("ident",new nodes.Ident(captures[0]))}else{tok=new Token(keyword,keyword)}return tok}},namedop:function(){var captures,tok;if(captures=/^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\b([ \t]*)/.exec(this.str)){var op=captures[1];this.skip(captures);if(this.isPartOfSelector()){tok=new Token("ident",new nodes.Ident(captures[0]))}else{op=alias[op]||op;tok=new Token(op,op)}tok.space=captures[2];return tok}},op:function(){var captures;if(captures=/^([.]{1,3}|&&|\|\||[!<>=?:]=|\*\*|[-+*\/%]=?|[,=?:!~<>&\[\]])([ \t]*)/.exec(this.str)){var op=captures[1];this.skip(captures);op=alias[op]||op;var tok=new Token(op,op);tok.space=captures[2];this.isURL=false;return tok}},anonFunc:function(){var tok;if("@"==this.str[0]&&"("==this.str[1]){this.skip(2);tok=new Token("function",new nodes.Ident("anonymous"));tok.anonymous=true;return tok}},atrule:function(){var captures;if(captures=/^@(?:-(\w+)-)?([a-zA-Z0-9-_]+)[ \t]*/.exec(this.str)){this.skip(captures);var vendor=captures[1],type=captures[2],tok;switch(type){case"require":case"import":case"charset":case"namespace":case"media":case"scope":case"supports":return new Token(type);case"document":return new Token("-moz-document");case"block":return new Token("atblock");case"extend":case"extends":return new Token("extend");case"keyframes":return new Token(type,vendor);default:return new Token("atrule",vendor?"-"+vendor+"-"+type:type)}}},comment:function(){if("/"==this.str[0]&&"/"==this.str[1]){var end=this.str.indexOf("\n");if(-1==end)end=this.str.length;this.skip(end);return this.advance()}if("/"==this.str[0]&&"*"==this.str[1]){var end=this.str.indexOf("*/");if(-1==end)end=this.str.length;var str=this.str.substr(0,end+2),lines=str.split(/\n|\r/).length-1,suppress=true,inline=false;this.lineno+=lines;this.skip(end+2);if("!"==str[2]){str=str.replace("*!","*");suppress=false}if(this.prev&&";"==this.prev.type)inline=true;return new Token("comment",new nodes.Comment(str,suppress,inline))}},"boolean":function(){var captures;if(captures=/^(true|false)\b([ \t]*)/.exec(this.str)){var val=nodes.Boolean("true"==captures[1]);this.skip(captures);var tok=new Token("boolean",val);tok.space=captures[2];return tok}},unicode:function(){var captures;if(captures=/^u\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)){this.skip(captures);return new Token("literal",new nodes.Literal(captures[0]))}},fun:function(){var captures;if(captures=/^(-*[_a-zA-Z$][-\w\d$]*)\(([ \t]*)/.exec(this.str)){var name=captures[1];this.skip(captures);this.isURL="url"==name;var tok=new Token("function",new nodes.Ident(name));tok.space=captures[2];return tok}},ident:function(){var captures;if(captures=/^-*[_a-zA-Z$][-\w\d$]*/.exec(this.str)){this.skip(captures);return new Token("ident",new nodes.Ident(captures[0]))}},newline:function(){var captures,re;if(this.indentRe){captures=this.indentRe.exec(this.str)}else{re=/^\n([\t]*)[ \t]*/;captures=re.exec(this.str);if(captures&&!captures[1].length){re=/^\n([ \t]*)/;captures=re.exec(this.str)}if(captures&&captures[1].length)this.indentRe=re}if(captures){var tok,indents=captures[1].length;this.skip(captures);if(this.str[0]===" "||this.str[0]===" "){throw new errors.SyntaxError("Invalid indentation. You can use tabs or spaces to indent, but not both.")}if("\n"==this.str[0])return this.advance();if(this.indentStack.length&&indentsindents){this.stash.push(new Token("outdent"));this.indentStack.shift()}tok=this.stash.pop()}else if(indents&&indents!=this.indentStack[0]){this.indentStack.unshift(indents);tok=new Token("indent")}else{tok=new Token("newline")}return tok}},unit:function(){var captures;if(captures=/^(-)?(\d+\.\d+|\d+|\.\d+)(%|[a-zA-Z]+)?[ \t]*/.exec(this.str)){this.skip(captures);var n=parseFloat(captures[2]);if("-"==captures[1])n=-n;var node=new nodes.Unit(n,captures[3]);node.raw=captures[0];return new Token("unit",node)}},string:function(){var captures;if(captures=/^("[^"]*"|'[^']*')[ \t]*/.exec(this.str)){var str=captures[1],quote=captures[0][0];this.skip(captures);str=str.slice(1,-1).replace(/\\n/g,"\n");return new Token("string",new nodes.String(str,quote))}},color:function(){return this.rrggbbaa()||this.rrggbb()||this.rgba()||this.rgb()||this.nn()||this.n()},n:function(){var captures;if(captures=/^#([a-fA-F0-9]{1})[ \t]*/.exec(this.str)){this.skip(captures);var n=parseInt(captures[1]+captures[1],16),color=new nodes.RGBA(n,n,n,1);color.raw=captures[0];return new Token("color",color)}},nn:function(){var captures;if(captures=/^#([a-fA-F0-9]{2})[ \t]*/.exec(this.str)){this.skip(captures);var n=parseInt(captures[1],16),color=new nodes.RGBA(n,n,n,1);color.raw=captures[0];return new Token("color",color)}},rgb:function(){var captures;if(captures=/^#([a-fA-F0-9]{3})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb[0]+rgb[0],16),g=parseInt(rgb[1]+rgb[1],16),b=parseInt(rgb[2]+rgb[2],16),color=new nodes.RGBA(r,g,b,1);color.raw=captures[0];return new Token("color",color)}},rgba:function(){var captures;if(captures=/^#([a-fA-F0-9]{4})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb[0]+rgb[0],16),g=parseInt(rgb[1]+rgb[1],16),b=parseInt(rgb[2]+rgb[2],16),a=parseInt(rgb[3]+rgb[3],16),color=new nodes.RGBA(r,g,b,a/255);color.raw=captures[0];return new Token("color",color)}},rrggbb:function(){var captures;if(captures=/^#([a-fA-F0-9]{6})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb.substr(0,2),16),g=parseInt(rgb.substr(2,2),16),b=parseInt(rgb.substr(4,2),16),color=new nodes.RGBA(r,g,b,1);color.raw=captures[0];return new Token("color",color)}},rrggbbaa:function(){var captures;if(captures=/^#([a-fA-F0-9]{8})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb.substr(0,2),16),g=parseInt(rgb.substr(2,2),16),b=parseInt(rgb.substr(4,2),16),a=parseInt(rgb.substr(6,2),16),color=new nodes.RGBA(r,g,b,a/255);color.raw=captures[0];return new Token("color",color)}},selector:function(){var captures;if(captures=/^\^|.*?(?=\/\/(?![^\[]*\])|[,\n{])/.exec(this.str)){var selector=captures[0];this.skip(captures);return new Token("selector",selector)}}}});require.register("nodes/arguments.js",function(module,exports,require){var Node=require("./node"),nodes=require("../nodes"),utils=require("../utils");var Arguments=module.exports=function Arguments(){nodes.Expression.call(this);this.map={}};Arguments.prototype.__proto__=nodes.Expression.prototype;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;ilen)self.nodes[i]=nodes.nil;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.nil: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.no;for(var i=0;i1)return nodes.yes;return this.first.toBoolean()};Expression.prototype.toString=function(){return"("+this.nodes.map(function(node){return node.toString()}).join(this.isList?", ":" ")+")"};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}}});require.register("nodes/function.js",function(module,exports,require){var Node=require("./node");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};Function.prototype.__defineGetter__("arity",function(){return this.params.length});Function.prototype.__proto__=Node.prototype;Function.prototype.__defineGetter__("hash",function(){return"function "+this.name});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};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(", ")+")"}};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}});require.register("nodes/group.js",function(module,exports,require){var Node=require("./node");var Group=module.exports=function Group(){Node.call(this);this.nodes=[];this.extends=[]};Group.prototype.__proto__=Node.prototype;Group.prototype.push=function(selector){this.nodes.push(selector)};Group.prototype.__defineGetter__("block",function(){return this.nodes[0].block});Group.prototype.__defineSetter__("block",function(block){for(var i=0,len=this.nodes.length;i=":case"<":case">":case"is a":case"||":case"&&":return this.rgba.operate(op,right);default:return this.rgba.operate(op,right).hsla}};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)};HSLA.prototype.adjustLightness=function(percent){this.l=clampPercentage(this.l+this.l*(percent/100));return this};HSLA.prototype.adjustHue=function(deg){this.h=clampDegrees(this.h+deg);return this};function clampDegrees(n){n=n%360;return n>=0?n:360+n}function clampPercentage(n){return Math.max(0,Math.min(n,100))}function clampAlpha(n){return Math.max(0,Math.min(n,1))}});require.register("nodes/ident.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Ident=module.exports=function Ident(name,val,mixin){Node.call(this);this.name=name;this.string=name;this.val=val||nodes.nil;this.mixin=!!mixin};Ident.prototype.__defineGetter__("isEmpty",function(){return undefined==this.val});Ident.prototype.__defineGetter__("hash",function(){return this.name});Ident.prototype.__proto__=Node.prototype;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};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}};Ident.prototype.toString=function(){return this.name};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)}};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)}});require.register("nodes/if.js",function(module,exports,require){var Node=require("./node");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}};If.prototype.__proto__=Node.prototype;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};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}}});require.register("nodes/import.js",function(module,exports,require){var Node=require("./node");var Import=module.exports=function Import(expr,once){Node.call(this);this.path=expr;this.once=once||false};Import.prototype.__proto__=Node.prototype;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};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}}});require.register("nodes/extend.js",function(module,exports,require){var Node=require("./node");var Extend=module.exports=function Extend(selectors){Node.call(this);this.selectors=selectors};Extend.prototype.__proto__=Node.prototype;Extend.prototype.clone=function(){return new Extend(this.selectors)};Extend.prototype.toString=function(){return"@extend "+this.selectors.join(", ")};Extend.prototype.toJSON=function(){return{__type:"Extend",selectors:this.selectors,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/index.js",function(module,exports,require){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");exports.yes=new exports.Boolean(true);exports.no=new exports.Boolean(false);exports.nil=new exports.Null});require.register("nodes/keyframes.js",function(module,exports,require){var Atrule=require("./atrule");var Keyframes=module.exports=function Keyframes(segs,prefix){Atrule.call(this,"keyframes");this.segments=segs;this.prefix=prefix||"official"};Keyframes.prototype.__proto__=Atrule.prototype;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};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}};Keyframes.prototype.toString=function(){return"@keyframes "+this.segments.join("")}});require.register("nodes/literal.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Literal=module.exports=function Literal(str){Node.call(this);this.val=str;this.string=str;this.prefixed=false};Literal.prototype.__proto__=Node.prototype;Literal.prototype.__defineGetter__("hash",function(){return this.val});Literal.prototype.toString=function(){return this.val};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)}};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)}};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}}});require.register("nodes/media.js",function(module,exports,require){var Atrule=require("./atrule");var Media=module.exports=function Media(val){Atrule.call(this,"media");this.val=val};Media.prototype.__proto__=Atrule.prototype;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};Media.prototype.toJSON=function(){return{__type:"Media",val:this.val,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}};Media.prototype.toString=function(){return"@media "+this.val}});require.register("nodes/query-list.js",function(module,exports,require){var Node=require("./node");var QueryList=module.exports=function QueryList(){Node.call(this);this.nodes=[]};QueryList.prototype.__proto__=Node.prototype;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=":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.hash1)--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)};function clamp(n){return Math.max(0,Math.min(n.toFixed(0),255))}function clampAlpha(n){return Math.max(0,Math.min(n,1))}});require.register("nodes/root.js",function(module,exports,require){var Node=require("./node");var Root=module.exports=function Root(){this.nodes=[]};Root.prototype.__proto__=Node.prototype;Root.prototype.push=function(node){this.nodes.push(node)};Root.prototype.unshift=function(node){this.nodes.unshift(node)};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};Root.prototype.toString=function(){return"[Root]"};Root.prototype.toJSON=function(){return{__type:"Root",nodes:this.nodes,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/selector.js",function(module,exports,require){var Block=require("./block"),Node=require("./node");var Selector=module.exports=function Selector(segs){Node.call(this);this.inherits=true;this.segments=segs;this.optional=false};Selector.prototype.__proto__=Node.prototype;Selector.prototype.toString=function(){return this.segments.join("")+(this.optional?" !optional":"")};Selector.prototype.__defineGetter__("isPlaceholder",function(){return this.val&&~this.val.substr(0,2).indexOf("$")});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};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}}});require.register("nodes/string.js",function(module,exports,require){var Node=require("./node"),sprintf=require("../functions").s,utils=require("../utils"),nodes=require("./index");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}};String.prototype.__proto__=Node.prototype;String.prototype.toString=function(){return this.quote+this.val+this.quote};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};String.prototype.toJSON=function(){return{__type:"String",val:this.val,quote:this.quote,lineno:this.lineno,column:this.column,filename:this.filename}};String.prototype.toBoolean=function(){return nodes.Boolean(this.val.length)};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())}};String.prototype.operate=function(op,right){switch(op){case"%":var expr=new nodes.Expression;expr.push(this);var args="expression"==right.nodeName?utils.unwrap(right).nodes:[right];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)}}});require.register("nodes/ternary.js",function(module,exports,require){var Node=require("./node");var Ternary=module.exports=function Ternary(cond,trueExpr,falseExpr){Node.call(this);this.cond=cond;this.trueExpr=trueExpr;this.falseExpr=falseExpr};Ternary.prototype.__proto__=Node.prototype;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};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}}});require.register("nodes/unaryop.js",function(module,exports,require){var Node=require("./node");var UnaryOp=module.exports=function UnaryOp(op,expr){Node.call(this);this.op=op;this.expr=expr};UnaryOp.prototype.__proto__=Node.prototype;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};UnaryOp.prototype.toJSON=function(){return{__type:"UnaryOp",op:this.op,expr:this.expr,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/unit.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");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:1e3,label:"ms"},Hz:{val:1,label:"Hz"},kHz:{val:1e3,label:"Hz"}};var Unit=module.exports=function Unit(val,type){Node.call(this);this.val=val;this.type=type};Unit.prototype.__proto__=Node.prototype;Unit.prototype.toBoolean=function(){return nodes.Boolean(this.type?true:this.val)};Unit.prototype.toString=function(){return this.val+(this.type||"")};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};Unit.prototype.toJSON=function(){return{__type:"Unit",val:this.val,type:this.type,lineno:this.lineno,column:this.column,filename:this.filename}};Unit.prototype.operate=function(op,right){var type=this.type||right.first.type;if("rgba"==right.nodeName||"hsla"==right.nodeName){return right.operate(op,this)}if(this.shouldCoerce(op)){right=right.first;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"+":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:--start>end)}return expr}}return Node.prototype.operate.call(this,op,right)};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){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)}}});require.register("nodes/object.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index"),nativeObj={}.constructor;var Object=module.exports=function Object(){Node.call(this);this.vals={}};Object.prototype.__proto__=Node.prototype;Object.prototype.set=function(key,val){this.vals[key]=val;return this};Object.prototype.__defineGetter__("length",function(){return nativeObj.keys(this.vals).length});Object.prototype.get=function(key){return this.vals[key]||nodes.nil};Object.prototype.has=function(key){return key in this.vals};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.no;for(var key in vals){a=vals[key];b=right.vals[key];if(a.operate(op,b).isFalse)return nodes.no; +}return nodes.yes;case"!=":return this.operate("==",right).negate();default:return Node.prototype.operate.call(this,op,right)}};Object.prototype.toBoolean=function(){return nodes.Boolean(this.length)};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()}};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};Object.prototype.toJSON=function(){return{__type:"Object",vals:this.vals,lineno:this.lineno,column:this.column,filename:this.filename}};Object.prototype.toString=function(){var obj={};for(var prop in this.vals){obj[prop]=this.vals[prop].toString()}return JSON.stringify(obj)}});require.register("nodes/supports.js",function(module,exports,require){var Atrule=require("./atrule");var Supports=module.exports=function Supports(condition){Atrule.call(this,"supports");this.condition=condition};Supports.prototype.__proto__=Atrule.prototype;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};Supports.prototype.toJSON=function(){return{__type:"Supports",condition:this.condition,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}};Supports.prototype.toString=function(){return"@supports "+this.condition}});require.register("nodes/member.js",function(module,exports,require){var Node=require("./node");var Member=module.exports=function Member(left,right){Node.call(this);this.left=left;this.right=right};Member.prototype.__proto__=Node.prototype;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};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};Member.prototype.toString=function(){return this.left.toString()+"."+this.right.toString()}});require.register("nodes/atblock.js",function(module,exports,require){var Node=require("./node");var Atblock=module.exports=function Atblock(){Node.call(this)};Atblock.prototype.__defineGetter__("nodes",function(){return this.block.nodes});Atblock.prototype.__proto__=Node.prototype;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};Atblock.prototype.toString=function(){return"@block"};Atblock.prototype.toJSON=function(){return{__type:"Atblock",block:this.block,lineno:this.lineno,column:this.column,fileno:this.fileno}}});require.register("nodes/atrule.js",function(module,exports,require){var Node=require("./node");var Atrule=module.exports=function Atrule(type){Node.call(this);this.type=type};Atrule.prototype.__proto__=Node.prototype;Atrule.prototype.__defineGetter__("hasOnlyProperties",function(){if(!this.block)return false;var nodes=this.block.nodes;for(var i=0,len=nodes.length;i","=",":","&","&&","~","{","}",".","..","/"];var pseudoSelectors=["matches","not","dir","lang","any-link","link","visited","local-link","target","scope","hover","active","focus","drop","current","past","future","enabled","disabled","read-only","read-write","placeholder-shown","checked","indeterminate","valid","invalid","in-range","out-of-range","required","optional","user-error","root","empty","blank","nth-child","nth-last-child","first-child","last-child","only-child","nth-of-type","nth-last-of-type","first-of-type","last-of-type","only-of-type","nth-match","nth-last-match","nth-column","nth-last-column","first-line","first-letter","before","after","selection"];var Parser=module.exports=function Parser(str,options){var self=this;options=options||{};this.lexer=new Lexer(str,options);this.prefix=options.prefix||"";this.root=options.root||new nodes.Root;this.state=["root"];this.stash=[];this.parens=0;this.css=0;this.state.pop=function(){self.prevState=[].pop.call(this)}};Parser.prototype={constructor:Parser,currentState:function(){return this.state[this.state.length-1]},previousState:function(){return this.state[this.state.length-2]},parse:function(){var block=this.parent=this.root;while("eos"!=this.peek().type){this.skipWhitespace();if("eos"==this.peek().type)break;var stmt=this.statement();this.accept(";");if(!stmt)this.error("unexpected token {peek}, not allowed at the root level");block.push(stmt)}return block},error:function(msg){var type=this.peek().type,val=undefined==this.peek().val?"":" "+this.peek().toString();if(val.trim()==type.trim())val="";throw new errors.ParseError(msg.replace("{peek}",'"'+type+val+'"'))},accept:function(type){if(type==this.peek().type){return this.next()}},expect:function(type){if(type!=this.peek().type){this.error('expected "'+type+'", got {peek}')}return this.next()},next:function(){var tok=this.stash.length?this.stash.pop():this.lexer.next(),line=tok.lineno,column=tok.column||1;if(tok.val&&tok.val.nodeName){tok.val.lineno=line;tok.val.column=column}nodes.lineno=line;nodes.column=column;return tok},peek:function(){return this.lexer.peek()},lookahead:function(n){return this.lexer.lookahead(n)},isSelectorToken:function(n){var la=this.lookahead(n).type;switch(la){case"for":return this.bracketed;case"[":this.bracketed=true;return true;case"]":this.bracketed=false;return true;default:return~selectorTokens.indexOf(la)}},isPseudoSelector:function(n){var val=this.lookahead(n).val;return val&&~pseudoSelectors.indexOf(val.name)},lineContains:function(type){var i=1,la;while(la=this.lookahead(i++)){if(~["indent","outdent","newline","eos"].indexOf(la.type))return;if(type==la.type)return true}},selectorToken:function(){if(this.isSelectorToken(1)){if("{"==this.peek().type){if(!this.lineContains("}"))return;var i=0,la;while(la=this.lookahead(++i)){if("}"==la.type){if(i==2||i==3&&this.lookahead(i-1).type=="space")return;break}if(":"==la.type)return}}return this.next()}},skip:function(tokens){while(~tokens.indexOf(this.peek().type))this.next()},skipWhitespace:function(){this.skip(["space","indent","outdent","newline"])},skipNewlines:function(){while("newline"==this.peek().type)this.next()},skipSpaces:function(){while("space"==this.peek().type)this.next()},skipSpacesAndComments:function(){while("space"==this.peek().type||"comment"==this.peek().type)this.next()},looksLikeFunctionDefinition:function(i){return"indent"==this.lookahead(i).type||"{"==this.lookahead(i).type},looksLikeSelector:function(fromProperty){var i=1,brace;if(fromProperty&&":"==this.lookahead(i+1).type&&(this.lookahead(i+1).space||"indent"==this.lookahead(i+2).type))return false;while("ident"==this.lookahead(i).type&&("newline"==this.lookahead(i+1).type||","==this.lookahead(i+1).type))i+=2;while(this.isSelectorToken(i)||","==this.lookahead(i).type){if("selector"==this.lookahead(i).type)return true;if("&"==this.lookahead(i+1).type)return true;if("."==this.lookahead(i).type&&"ident"==this.lookahead(i+1).type)return true;if("*"==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true;if(":"==this.lookahead(i).type&&":"==this.lookahead(i+1).type)return true;if("color"==this.lookahead(i).type&&"newline"==this.lookahead(i-1).type)return true;if(this.looksLikeAttributeSelector(i))return true;if(("="==this.lookahead(i).type||"function"==this.lookahead(i).type)&&"{"==this.lookahead(i+1).type)return false;if(":"==this.lookahead(i).type&&!this.isPseudoSelector(i+1)&&this.lineContains("."))return false;if("{"==this.lookahead(i).type)brace=true;else if("}"==this.lookahead(i).type)brace=false;if(brace&&":"==this.lookahead(i).type)return true;if("space"==this.lookahead(i).type&&"{"==this.lookahead(i+1).type)return true;if(":"==this.lookahead(i++).type&&!this.lookahead(i-1).space&&this.isPseudoSelector(i))return true;if("space"==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type&&"{"==this.lookahead(i+2).type)return true;if(","==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true}if(","==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true;if("{"==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true;if(this.css){if(";"==this.lookahead(i).type||"}"==this.lookahead(i-1).type)return false}while(!~["indent","outdent","newline","for","if",";","}","eos"].indexOf(this.lookahead(i).type))++i;if("indent"==this.lookahead(i).type)return true},looksLikeAttributeSelector:function(n){var type=this.lookahead(n).type;if("="==type&&this.bracketed)return true;return("ident"==type||"string"==type)&&"]"==this.lookahead(n+1).type&&("newline"==this.lookahead(n+2).type||this.isSelectorToken(n+2))&&!this.lineContains(":")&&!this.lineContains("=")},looksLikeKeyframe:function(){var i=2,type;switch(this.lookahead(i).type){case"{":case"indent":case",":return true;case"newline":while("unit"==this.lookahead(++i).type||"newline"==this.lookahead(i).type);type=this.lookahead(i).type;return"indent"==type||"{"==type}},stateAllowsSelector:function(){switch(this.currentState()){case"root":case"atblock":case"selector":case"conditional":case"function":case"atrule":case"for":return true}},assignAtblock:function(expr){try{expr.push(this.atblock(expr))}catch(err){this.error("invalid right-hand side operand in assignment, got {peek}")}},statement:function(){var stmt=this.stmt(),state=this.prevState,block,op;if(this.allowPostfix){this.allowPostfix=false;state="expression"}switch(state){case"assignment":case"expression":case"function arguments":while(op=this.accept("if")||this.accept("unless")||this.accept("for")){switch(op.type){case"if":case"unless":stmt=new nodes.If(this.expression(),stmt);stmt.postfix=true;stmt.negate="unless"==op.type;this.accept(";");break;case"for":var key,val=this.id().name;if(this.accept(","))key=this.id().name;this.expect("in");var each=new nodes.Each(val,key,this.expression());block=new nodes.Block(this.parent,each);block.push(stmt);each.block=block;stmt=each}}}return stmt},stmt:function(){var type=this.peek().type;switch(type){case"keyframes":return this.keyframes();case"-moz-document":return this.mozdocument();case"comment":case"selector":case"extend":case"literal":case"charset":case"namespace":case"require":case"extend":case"media":case"atrule":case"ident":case"scope":case"supports":case"unless":return this[type]();case"function":return this.fun();case"import":return this.atimport();case"if":return this.ifstmt();case"for":return this.forin();case"return":return this.ret();case"{":return this.property();default:if(this.stateAllowsSelector()){switch(type){case"color":case"~":case">":case"<":case":":case"&":case"&&":case"[":case".":case"/":return this.selector();case"..":if("/"==this.lookahead(2).type)return this.selector();case"+":return"function"==this.lookahead(2).type?this.functionCall():this.selector();case"*":return this.property();case"unit":if(this.looksLikeKeyframe())return this.selector();case"-":if("{"==this.lookahead(2).type)return this.property()}}var expr=this.expression();if(expr.isEmpty)this.error("unexpected {peek}");return expr}},block:function(node,scope){var delim,stmt,next,block=this.parent=new nodes.Block(this.parent,node);if(false===scope)block.scope=false;this.accept("newline");if(this.accept("{")){this.css++;delim="}";this.skipWhitespace()}else{delim="outdent";this.expect("indent")}while(delim!=this.peek().type){if(this.css){if(this.accept("newline")||this.accept("indent"))continue;stmt=this.statement();this.accept(";");this.skipWhitespace()}else{if(this.accept("newline"))continue;next=this.lookahead(2).type;if("indent"==this.peek().type&&~["outdent","newline","comment"].indexOf(next)){this.skip(["indent","outdent"]);continue}if("eos"==this.peek().type)return block;stmt=this.statement();this.accept(";")}if(!stmt)this.error("unexpected token {peek} in block");block.push(stmt)}if(this.css){this.skipWhitespace();this.expect("}");this.skipSpaces();this.css--}else{this.expect("outdent")}this.parent=block.parent;return block},comment:function(){var node=this.next().val;this.skipSpaces();return node},forin:function(){this.expect("for");var key,val=this.id().name;if(this.accept(","))key=this.id().name;this.expect("in");this.state.push("for");this.cond=true;var each=new nodes.Each(val,key,this.expression());this.cond=false;each.block=this.block(each,false);this.state.pop();return each},ret:function(){this.expect("return");var expr=this.expression();return expr.isEmpty?new nodes.Return:new nodes.Return(expr)},unless:function(){this.expect("unless");this.state.push("conditional");this.cond=true;var node=new nodes.If(this.expression(),true);this.cond=false;node.block=this.block(node,false);this.state.pop();return node},ifstmt:function(){this.expect("if");this.state.push("conditional");this.cond=true;var node=new nodes.If(this.expression()),cond,block;this.cond=false;node.block=this.block(node,false);this.skip(["newline","comment"]);while(this.accept("else")){if(this.accept("if")){this.cond=true;cond=this.expression();this.cond=false;block=this.block(node,false);node.elses.push(new nodes.If(cond,block))}else{node.elses.push(this.block(node,false));break}this.skip(["newline","comment"])}this.state.pop();return node},atblock:function(node){if(!node)this.expect("atblock");node=new nodes.Atblock;this.state.push("atblock");node.block=this.block(node,false);this.state.pop();return node},atrule:function(){var type=this.expect("atrule").val,node=new nodes.Atrule(type),tok;this.skipSpacesAndComments();node.segments=this.selectorParts();this.skipSpacesAndComments();tok=this.peek().type;if("indent"==tok||"{"==tok||"newline"==tok&&"{"==this.lookahead(2).type){this.state.push("atrule");node.block=this.block(node);this.state.pop()}return node},scope:function(){this.expect("scope");var selector=this.selectorParts().map(function(selector){return selector.val}).join("");this.selectorScope=selector.trim();return nodes.nil},supports:function(){this.expect("supports");var node=new nodes.Supports(this.supportsCondition());this.state.push("atrule");node.block=this.block(node);this.state.pop();return node},supportsCondition:function(){var node=this.supportsNegation()||this.supportsOp();if(!node){this.cond=true;node=this.expression();this.cond=false}return node},supportsNegation:function(){if(this.accept("not")){var node=new nodes.Expression;node.push(new nodes.Literal("not"));node.push(this.supportsFeature());return node}},supportsOp:function(){var feature=this.supportsFeature(),op,expr;if(feature){expr=new nodes.Expression;expr.push(feature);while(op=this.accept("&&")||this.accept("||")){expr.push(new nodes.Literal("&&"==op.val?"and":"or"));expr.push(this.supportsFeature())}return expr}},supportsFeature:function(){this.skipSpacesAndComments();if("("==this.peek().type){var la=this.lookahead(2).type;if("ident"==la||"{"==la){return this.feature()}else{this.expect("(");var node=new nodes.Expression;node.push(new nodes.Literal("("));node.push(this.supportsCondition());this.expect(")");node.push(new nodes.Literal(")"));this.skipSpacesAndComments();return node}}},extend:function(){var tok=this.expect("extend"),selectors=[],sel,node,arr;do{arr=this.selectorParts();if(!arr.length)continue;sel=new nodes.Selector(arr);selectors.push(sel);if("!"!==this.peek().type)continue;tok=this.lookahead(2);if("ident"!==tok.type||"optional"!==tok.val.name)continue;this.skip(["!","ident"]);sel.optional=true}while(this.accept(","));node=new nodes.Extend(selectors);node.lineno=tok.lineno;node.column=tok.column;return node},media:function(){this.expect("media");this.state.push("atrule");var media=new nodes.Media(this.queries());media.block=this.block(media);this.state.pop();return media},queries:function(){var queries=new nodes.QueryList,skip=["comment","newline","space"];do{this.skip(skip);queries.push(this.query());this.skip(skip)}while(this.accept(","));return queries},query:function(){var query=new nodes.Query,expr,pred,id;if("ident"==this.peek().type&&("."==this.lookahead(2).type||"["==this.lookahead(2).type)){this.cond=true;expr=this.expression();this.cond=false;query.push(new nodes.Feature(expr.nodes));return query}if(pred=this.accept("ident")||this.accept("not")){pred=new nodes.Literal(pred.val.string||pred.val);this.skipSpacesAndComments();if(id=this.accept("ident")){query.type=id.val;query.predicate=pred}else{query.type=pred}this.skipSpacesAndComments();if(!this.accept("&&"))return query}do{query.push(this.feature())}while(this.accept("&&"));return query},feature:function(){this.skipSpacesAndComments();this.expect("(");this.skipSpacesAndComments();var node=new nodes.Feature(this.interpolate());this.skipSpacesAndComments();this.accept(":");this.skipSpacesAndComments();this.inProperty=true;node.expr=this.list();this.inProperty=false;this.skipSpacesAndComments();this.expect(")");this.skipSpacesAndComments();return node},mozdocument:function(){this.expect("-moz-document");var mozdocument=new nodes.Atrule("-moz-document"),calls=[];do{this.skipSpacesAndComments();calls.push(this.functionCall());this.skipSpacesAndComments()}while(this.accept(","));mozdocument.segments=[new nodes.Literal(calls.join(", "))];this.state.push("atrule");mozdocument.block=this.block(mozdocument,false);this.state.pop();return mozdocument},atimport:function(){this.expect("import");this.allowPostfix=true;return new nodes.Import(this.expression(),false)},require:function(){this.expect("require");this.allowPostfix=true;return new nodes.Import(this.expression(),true)},charset:function(){this.expect("charset");var str=this.expect("string").val;this.allowPostfix=true;return new nodes.Charset(str)},namespace:function(){var str,prefix;this.expect("namespace");this.skipSpacesAndComments();if(prefix=this.accept("ident")){prefix=prefix.val}this.skipSpacesAndComments();str=this.accept("string")||this.url();this.allowPostfix=true;return new nodes.Namespace(str,prefix)},keyframes:function(){var tok=this.expect("keyframes"),keyframes;this.skipSpacesAndComments();keyframes=new nodes.Keyframes(this.selectorParts(),tok.val);this.skipSpacesAndComments();this.state.push("atrule");keyframes.block=this.block(keyframes);this.state.pop();return keyframes},literal:function(){return this.expect("literal").val},id:function(){var tok=this.expect("ident");this.accept("space");return tok.val},ident:function(){var i=2,la=this.lookahead(i).type;while("space"==la)la=this.lookahead(++i).type;switch(la){case"=":case"?=":case"-=":case"+=":case"*=":case"/=":case"%=":return this.assignment();case".":if("space"==this.lookahead(i-1).type)return this.selector();if(this._ident==this.peek())return this.id();while("="!=this.lookahead(++i).type&&!~["[",",","newline","indent","eos"].indexOf(this.lookahead(i).type));if("="==this.lookahead(i).type){this._ident=this.peek();return this.expression()}else if(this.looksLikeSelector()&&this.stateAllowsSelector()){return this.selector()}case"[":if(this._ident==this.peek())return this.id();while("]"!=this.lookahead(i++).type&&"selector"!=this.lookahead(i).type&&"eos"!=this.lookahead(i).type);if("="==this.lookahead(i).type){this._ident=this.peek();return this.expression()}else if(this.looksLikeSelector()&&this.stateAllowsSelector()){return this.selector()}case"-":case"+":case"/":case"*":case"%":case"**":case"&&":case"||":case">":case"<":case">=":case"<=":case"!=":case"==":case"?":case"in":case"is a":case"is defined":if(this._ident==this.peek()){return this.id()}else{this._ident=this.peek();switch(this.currentState()){case"for":case"selector":return this.property();case"root":case"atblock":case"atrule":return"["==la?this.subscript():this.selector();case"function":case"conditional":return this.looksLikeSelector()?this.selector():this.expression();default:return this.operand?this.id():this.expression()}}default:switch(this.currentState()){case"root":return this.selector();case"for":case"selector":case"function":case"conditional":case"atblock":case"atrule":return this.property();default:var id=this.id();if("interpolation"==this.previousState())id.mixin=true;return id}}},interpolate:function(){var node,segs=[],star;star=this.accept("*");if(star)segs.push(new nodes.Literal("*"));while(true){if(this.accept("{")){this.state.push("interpolation");segs.push(this.expression());this.expect("}");this.state.pop()}else if(node=this.accept("-")){segs.push(new nodes.Literal("-"))}else if(node=this.accept("ident")){segs.push(node.val)}else{break}}if(!segs.length)this.expect("ident");return segs},property:function(){if(this.looksLikeSelector(true))return this.selector();var ident=this.interpolate(),prop=new nodes.Property(ident),ret=prop;this.accept("space");if(this.accept(":"))this.accept("space");this.state.push("property");this.inProperty=true;prop.expr=this.list();if(prop.expr.isEmpty)ret=ident[0];this.inProperty=false;this.allowPostfix=true;this.state.pop();this.accept(";");return ret},selector:function(){var arr,group=new nodes.Group,scope=this.selectorScope,isRoot="root"==this.currentState(),selector;do{this.accept("newline");arr=this.selectorParts();if(isRoot&&scope)arr.unshift(new nodes.Literal(scope+" "));if(arr.length){selector=new nodes.Selector(arr);selector.lineno=arr[0].lineno;selector.column=arr[0].column;group.push(selector)}}while(this.accept(",")||this.accept("newline"));if("selector-parts"==this.currentState())return group.nodes;this.state.push("selector");group.block=this.block(group);this.state.pop();return group},selectorParts:function(){var tok,arr=[];while(tok=this.selectorToken()){switch(tok.type){case"{":this.skipSpaces();var expr=this.expression();this.skipSpaces();this.expect("}");arr.push(expr);break;case this.prefix&&".":var literal=new nodes.Literal(tok.val+this.prefix);literal.prefixed=true;arr.push(literal);break;case"comment":break;case"color":case"unit":arr.push(new nodes.Literal(tok.val.raw));break;case"space":arr.push(new nodes.Literal(" "));break;case"function":arr.push(new nodes.Literal(tok.val.name+"("));break;case"ident":arr.push(new nodes.Literal(tok.val.name||tok.val.string));break;default:arr.push(new nodes.Literal(tok.val));if(tok.space)arr.push(new nodes.Literal(" "))}}return arr},assignment:function(){var op,node,name=this.id().name;if(op=this.accept("=")||this.accept("?=")||this.accept("+=")||this.accept("-=")||this.accept("*=")||this.accept("/=")||this.accept("%=")){this.state.push("assignment");var expr=this.list();if(expr.isEmpty)this.assignAtblock(expr);node=new nodes.Ident(name,expr);this.state.pop();switch(op.type){case"?=":var defined=new nodes.BinOp("is defined",node),lookup=new nodes.Expression;lookup.push(new nodes.Ident(name));node=new nodes.Ternary(defined,lookup,node);break;case"+=":case"-=":case"*=":case"/=":case"%=":node.val=new nodes.BinOp(op.type[0],new nodes.Ident(name),expr);break}}return node},fun:function(){var parens=1,i=2,tok;out:while(tok=this.lookahead(i++)){switch(tok.type){case"function":case"(":++parens;break;case")":if(!--parens)break out;break;case"eos":this.error('failed to find closing paren ")"')}}switch(this.currentState()){case"expression":return this.functionCall();default:return this.looksLikeFunctionDefinition(i)?this.functionDefinition():this.expression()}},url:function(){this.expect("function");this.state.push("function arguments");var args=this.args();this.expect(")");this.state.pop();return new nodes.Call("url",args)},functionCall:function(){var withBlock=this.accept("+");if("url"==this.peek().val.name)return this.url();var name=this.expect("function").val.name;this.state.push("function arguments");this.parens++;var args=this.args();this.expect(")");this.parens--;this.state.pop();var call=new nodes.Call(name,args);if(withBlock){this.state.push("function");call.block=this.block(call);this.state.pop()}return call},functionDefinition:function(){var name=this.expect("function").val.name;this.state.push("function params");this.skipWhitespace();var params=this.params();this.skipWhitespace();this.expect(")");this.state.pop();this.state.push("function");var fn=new nodes.Function(name,params);fn.block=this.block(fn);this.state.pop();return new nodes.Ident(name,fn)},params:function(){var tok,node,params=new nodes.Params;while(tok=this.accept("ident")){this.accept("space");params.push(node=tok.val);if(this.accept("...")){node.rest=true}else if(this.accept("=")){node.val=this.expression()}this.skipWhitespace();this.accept(",");this.skipWhitespace()}return params},args:function(){var args=new nodes.Arguments,keyword;do{if("ident"==this.peek().type&&":"==this.lookahead(2).type){keyword=this.next().val.string;this.expect(":");args.map[keyword]=this.expression()}else{args.push(this.expression())}}while(this.accept(","));return args},list:function(){var node=this.expression();while(this.accept(",")){if(node.isList){list.push(this.expression())}else{var list=new nodes.Expression(true);list.push(node);list.push(this.expression());node=list}}return node},expression:function(){var node,expr=new nodes.Expression;this.state.push("expression");while(node=this.negation()){if(!node)this.error("unexpected token {peek} in expression");expr.push(node)}this.state.pop();if(expr.nodes.length){expr.lineno=expr.nodes[0].lineno;expr.column=expr.nodes[0].column}return expr},negation:function(){if(this.accept("not")){return new nodes.UnaryOp("!",this.negation())}return this.ternary()},ternary:function(){var node=this.logical();if(this.accept("?")){var trueExpr=this.expression();this.expect(":");var falseExpr=this.expression();node=new nodes.Ternary(node,trueExpr,falseExpr)}return node},logical:function(){var op,node=this.typecheck();while(op=this.accept("&&")||this.accept("||")){node=new nodes.BinOp(op.type,node,this.typecheck())}return node},typecheck:function(){var op,node=this.equality();while(op=this.accept("is a")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.equality());this.operand=false}return node},equality:function(){var op,node=this.inop();while(op=this.accept("==")||this.accept("!=")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.inop());this.operand=false}return node},inop:function(){var node=this.relational();while(this.accept("in")){this.operand=true;if(!node)this.error('illegal unary "in", missing left-hand operand');node=new nodes.BinOp("in",node,this.relational());this.operand=false}return node},relational:function(){var op,node=this.range();while(op=this.accept(">=")||this.accept("<=")||this.accept("<")||this.accept(">")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.range());this.operand=false}return node},range:function(){var op,node=this.additive();if(op=this.accept("...")||this.accept("..")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.val,node,this.additive());this.operand=false}return node},additive:function(){var op,node=this.multiplicative();while(op=this.accept("+")||this.accept("-")){this.operand=true;node=new nodes.BinOp(op.type,node,this.multiplicative());this.operand=false}return node},multiplicative:function(){var op,node=this.defined();while(op=this.accept("**")||this.accept("*")||this.accept("/")||this.accept("%")){this.operand=true;if("/"==op&&this.inProperty&&!this.parens){this.stash.push(new Token("literal",new nodes.Literal("/")));this.operand=false;return node}else{if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.defined());this.operand=false}}return node},defined:function(){var node=this.unary();if(this.accept("is defined")){if(!node)this.error('illegal unary "is defined", missing left-hand operand');node=new nodes.BinOp("is defined",node)}return node},unary:function(){var op,node;if(op=this.accept("!")||this.accept("~")||this.accept("+")||this.accept("-")){this.operand=true;node=this.unary();if(!node)this.error('illegal unary "'+op+'"');node=new nodes.UnaryOp(op.type,node);this.operand=false;return node}return this.subscript()},subscript:function(){var node=this.member(),id;while(this.accept("[")){node=new nodes.BinOp("[]",node,this.expression());this.expect("]")}if(this.accept("=")){node.op+="=";node.val=this.list();if(node.val.isEmpty)this.assignAtblock(node.val)}return node},member:function(){var node=this.primary();if(node){while(this.accept(".")){var id=new nodes.Ident(this.expect("ident").val.string);node=new nodes.Member(node,id)}this.skipSpaces();if(this.accept("=")){node.val=this.list();if(node.val.isEmpty)this.assignAtblock(node.val)}}return node},object:function(){var obj=new nodes.Object,id,val,comma;this.expect("{");this.skipWhitespace();while(!this.accept("}")){if(this.accept("comment")||this.accept("newline"))continue;if(!comma)this.accept(",");id=this.accept("ident")||this.accept("string");if(!id)this.error('expected "ident" or "string", got {peek}');id=id.val.hash;this.skipSpacesAndComments();this.expect(":");val=this.expression();obj.set(id,val);comma=this.accept(",");this.skipWhitespace()}return obj},primary:function(){var tok;this.skipSpaces();if(this.accept("(")){++this.parens;var expr=this.expression(),paren=this.expect(")");--this.parens;if(this.accept("%"))expr.push(new nodes.Ident("%"));tok=this.peek();if(!paren.space&&"ident"==tok.type&&~units.indexOf(tok.val.string)){expr.push(new nodes.Ident(tok.val.string));this.next()}return expr}tok=this.peek();switch(tok.type){case"null":case"unit":case"color":case"string":case"literal":case"boolean":case"comment":return this.next().val;case!this.cond&&"{":return this.object();case"atblock":return this.atblock();case"atrule":var id=new nodes.Ident(this.next().val);id.property=true; +return id;case"ident":return this.ident();case"function":return tok.anonymous?this.functionDefinition():this.functionCall()}}}});require.register("renderer.js",function(module,exports,require){var Parser=require("./parser"),Evaluator=require("./visitor/evaluator"),Normalizer=require("./visitor/normalizer"),utils=require("./utils"),nodes=require("./nodes"),join=require("./path").join;module.exports=Renderer;function Renderer(str,options){options=options||{};options.globals=options.globals||{};options.functions=options.functions||{};options.use=options.use||[];options.use=Array.isArray(options.use)?options.use:[options.use];options.imports=[];options.paths=options.paths||[];options.filename=options.filename||"stylus";options.Evaluator=options.Evaluator||Evaluator;this.options=options;this.str=str}Renderer.prototype.render=function(fn){var parser=this.parser=new Parser(this.str,this.options);for(var i=0,len=this.options.use.length;i","+","~"];var SelectorParser=module.exports=function SelectorParser(str,stack,parts){this.str=str;this.stack=stack||[];this.parts=parts||[];this.pos=0;this.level=2;this.nested=true;this.ignore=false};SelectorParser.prototype.skip=function(len){this.str=this.str.substr(len);this.pos+=len};SelectorParser.prototype.skipSpaces=function(){while(" "==this.str[0])this.skip(1)};SelectorParser.prototype.advance=function(){return this.root()||this.relative()||this.initial()||this.escaped()||this.parent()||this.partial()||this.char()};SelectorParser.prototype.root=function(){if(!this.pos&&"/"==this.str[0]&&"deep"!=this.str.slice(1,5)){this.nested=false;this.skip(1)}};SelectorParser.prototype.relative=function(multi){if((!this.pos||multi)&&"../"==this.str.slice(0,3)){this.nested=false;this.skip(3);while(this.relative(true))this.level++;if(!this.raw){var ret=this.stack[this.stack.length-this.level];if(ret){return ret}else{this.ignore=true}}}};SelectorParser.prototype.initial=function(){if(!this.pos&&"~"==this.str[0]&&"/"==this.str[1]){this.nested=false;this.skip(2);return this.stack[0]}};SelectorParser.prototype.escaped=function(){if("\\"==this.str[0]){var char=this.str[1];if("&"==char||"^"==char){this.skip(2);return char}}};SelectorParser.prototype.parent=function(){if("&"==this.str[0]){this.nested=false;if(!this.pos&&(!this.stack.length||this.raw)){var i=0;while(" "==this.str[++i]);if(~COMBINATORS.indexOf(this.str[i])){this.skip(i+1);return}}this.skip(1);if(!this.raw)return this.stack[this.stack.length-1]}};SelectorParser.prototype.partial=function(){if("^"==this.str[0]&&"["==this.str[1]){this.skip(2);this.skipSpaces();var ret=this.range();this.skipSpaces();if("]"!=this.str[0])return"^[";this.nested=false;this.skip(1);if(ret){return ret}else{this.ignore=true}}};SelectorParser.prototype.number=function(){var i=0,ret="";if("-"==this.str[i])ret+=this.str[i++];while(this.str.charCodeAt(i)>=48&&this.str.charCodeAt(i)<=57)ret+=this.str[i++];if(ret){this.skip(i);return Number(ret)}};SelectorParser.prototype.range=function(){var start=this.number(),ret;if(".."==this.str.slice(0,2)){this.skip(2);var end=this.number(),len=this.parts.length;if(start<0)start=len+start-1;if(end<0)end=len+end-1;if(start>end){var tmp=start;start=end;end=tmp}if(end-1){return n.toString().replace("0.",".")+type}}return(float?parseFloat(n.toFixed(15)):n).toString()+type};Compiler.prototype.visitGroup=function(group){var stack=this.keyframe?[]:this.stack,comma=this.compress?",":",\n";stack.push(group.nodes);if(group.block.hasProperties){var selectors=utils.compileSelectors.call(this,stack),len=selectors.length;if(len){if(this.keyframe)comma=this.compress?",":", ";for(var i=0;i200){throw new RangeError("Maximum stylus call stack size exceeded")}if("expression"==fn.nodeName)fn=fn.first;this.ret++;var args=this.visit(call.args);for(var key in args.map){args.map[key]=this.visit(args.map[key].clone())}this.ret--;if(fn.fn){ret=this.invokeBuiltin(fn.fn,args)}else if("function"==fn.nodeName){if(call.block)call.block=this.visit(call.block);ret=this.invokeFunction(fn,args,call.block)}this.calling.pop();this.ignoreColors=false;return ret};Evaluator.prototype.visitIdent=function(ident){var prop;if(ident.property){if(prop=this.lookupProperty(ident.name)){return this.visit(prop.expr.clone())}return nodes.nil}else if(ident.val.isNull){var val=this.lookup(ident.name);if(val&&ident.mixin)this.mixinNode(val);return val?this.visit(val):ident}else{this.ret++;ident.val=this.visit(ident.val);this.ret--;this.currentScope.add(ident);return ident.val}};Evaluator.prototype.visitBinOp=function(binop){if("is defined"==binop.op)return this.isDefined(binop.left); +this.ret++;var op=binop.op,left=this.visit(binop.left),right="||"==op||"&&"==op?binop.right:this.visit(binop.right);var val=binop.val?this.visit(binop.val):null;this.ret--;try{return this.visit(left.operate(op,right,val))}catch(err){if("CoercionError"==err.name){switch(op){case"==":return nodes.no;case"!=":return nodes.yes}}throw err}};Evaluator.prototype.visitUnaryOp=function(unary){var op=unary.op,node=this.visit(unary.expr);if("!"!=op){node=node.first.clone();utils.assertType(node,"unit")}switch(op){case"-":node.val=-node.val;break;case"+":node.val=+node.val;break;case"~":node.val=~node.val;break;case"!":return node.toBoolean().negate()}return node};Evaluator.prototype.visitTernary=function(ternary){var ok=this.visit(ternary.cond).toBoolean();return ok.isTrue?this.visit(ternary.trueExpr):this.visit(ternary.falseExpr)};Evaluator.prototype.visitExpression=function(expr){for(var i=0,len=expr.nodes.length;i1){for(var i=0;i0&&!~part.indexOf("&")){part="/"+part}s=new nodes.Selector([new nodes.Literal(part)]);s.val=part;s.block=group.block;group.nodes[i++]=s}});stack.push(group.nodes);var selectors=utils.compileSelectors(stack,true);selectors.forEach(function(selector){map[selector]=map[selector]||[];map[selector].push(group)});this.extend(group,selectors);stack.pop();return group};Normalizer.prototype.visitFunction=function(){return nodes.nil};Normalizer.prototype.visitMedia=function(media){var medias=[],group=this.closestGroup(media.block),parent;function mergeQueries(block){block.nodes.forEach(function(node,i){switch(node.nodeName){case"media":node.val=media.val.merge(node.val);medias.push(node);block.nodes[i]=nodes.nil;break;case"block":mergeQueries(node);break;default:if(node.block&&node.block.nodes)mergeQueries(node.block)}})}mergeQueries(media.block);this.bubble(media);if(medias.length){medias.forEach(function(node){if(group){group.block.push(node)}else{this.root.nodes.splice(++this.rootIndex,0,node)}node=this.visit(node);parent=node.block.parent;if(node.bubbled&&(!group||"group"==parent.node.nodeName)){node.group.block=node.block.nodes[0].block;node.block.nodes[0]=node.group}},this)}return media};Normalizer.prototype.visitSupports=function(node){this.bubble(node);return node};Normalizer.prototype.visitAtrule=function(node){if(node.block)node.block=this.visit(node.block);return node};Normalizer.prototype.visitKeyframes=function(node){var frames=node.block.nodes.filter(function(frame){return frame.block&&frame.block.hasProperties});node.frames=frames.length;return node};Normalizer.prototype.visitImport=function(node){this.imports.push(node);return this.hoist?nodes.nil:node};Normalizer.prototype.visitCharset=function(node){this.charset=node;return this.hoist?nodes.nil:node};Normalizer.prototype.extend=function(group,selectors){var map=this.map,self=this,parent=this.closestGroup(group.block);group.extends.forEach(function(extend){var groups=map[extend.selector];if(!groups){if(extend.optional)return;var err=new Error('Failed to @extend "'+extend.selector+'"');err.lineno=extend.lineno;err.column=extend.column;throw err}selectors.forEach(function(selector){var node=new nodes.Selector;node.val=selector;node.inherits=false;groups.forEach(function(group){if(!parent||parent!=group)self.extend(group,selectors);group.push(node)})})});group.block=this.visit(group.block)}});return require("stylus")}();