2018-03-12 16:15:09 +00:00
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
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" , f unction ( 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 ( " [90minspect: [0m %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 + " " + " [32m" + this . type + " [0m" + " [33m" + ( this . val ? val : "" ) + " [0m" + "]"
} ;
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 ( " [33mWarning: [0m " + 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" )
} ( ) ;