Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 710531 Details for
Bug 921932
Update lessjs and expose for other Node.js modules
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Update to upstream release 1.3.3
0001-Update-to-upstream-release-1.3.3.patch (text/plain), 2.04 MB, created by
Jamie Nguyen
on 2013-03-15 09:59:50 UTC
(
hide
)
Description:
Update to upstream release 1.3.3
Filename:
MIME Type:
Creator:
Jamie Nguyen
Created:
2013-03-15 09:59:50 UTC
Size:
2.04 MB
patch
obsolete
>From c94169994e536c6640bbc49dd991c0d2a7ee2065 Mon Sep 17 00:00:00 2001 >From: Jamie Nguyen <j@jamielinux.com> >Date: Fri, 15 Mar 2013 09:39:35 +0000 >Subject: [PATCH 1/2] Update to upstream release 1.3.3 > >--- > .gitignore | 2 +- > 0001-Disable-YUI-compression.patch | 421 - > 0002-Fix-version-number.patch | 25 - > ...paths-to-use-usr-share-instead-of-usr-lib.patch | 43 - > 0004-Remove-pre-builds.patch | 45901 ------------------- > ...paths-to-use-usr-share-instead-of-usr-lib.patch | 43 + > lessjs.spec | 39 +- > sources | 2 +- > 8 files changed, 57 insertions(+), 46419 deletions(-) > delete mode 100644 0001-Disable-YUI-compression.patch > delete mode 100644 0002-Fix-version-number.patch > delete mode 100644 0003-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch > delete mode 100644 0004-Remove-pre-builds.patch > create mode 100644 lessjs-1.3.1-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch > >diff --git a/.gitignore b/.gitignore >index 5c5b3de..aa0bb9f 100644 >--- a/.gitignore >+++ b/.gitignore >@@ -1 +1 @@ >-/less.js-1.3.1.tar.gz >+/less-1.3.3.tar.gz >diff --git a/0001-Disable-YUI-compression.patch b/0001-Disable-YUI-compression.patch >deleted file mode 100644 >index 1cd30c1..0000000 >--- a/0001-Disable-YUI-compression.patch >+++ /dev/null >@@ -1,421 +0,0 @@ >-From d3a4f14a3c795e5873663fbb876617d517c307f5 Mon Sep 17 00:00:00 2001 >-From: Stephen Gallagher <sgallagh@redhat.com> >-Date: Wed, 19 Dec 2012 08:57:24 -0500 >-Subject: [PATCH 1/4] Disable YUI compression >- >-This is necessary to avoid bundling cssmin.js in Fedora/EPEL. >- >-Also remove cssmin.js from the sources. >---- >- bin/lessc | 3 + >- lib/less/cssmin.js | 355 ----------------------------------------------- >- lib/less/lessc_helper.js | 1 - >- lib/less/parser.js | 4 +- >- 4 files changed, 4 insertions(+), 359 deletions(-) >- delete mode 100644 lib/less/cssmin.js >- >-diff --git a/bin/lessc b/bin/lessc >-index 690535febd2f011cd079e4e7a2c771f1dfff04b6..af96ea237b3fb82284b38babf6562b7c5849f668 100755 >---- a/bin/lessc >-+++ b/bin/lessc >-@@ -59,6 +59,9 @@ args = args.filter(function (arg) { >- break; >- case 'yui-compress': >- options.yuicompress = true; >-+ sys.puts("ERROR: YUI compression is not available on this platform."); >-+ currentErrorcode = 3; >-+ continueProcessing = false; >- break; >- case 'no-color': >- options.color = false; >-diff --git a/lib/less/cssmin.js b/lib/less/cssmin.js >-deleted file mode 100644 >-index 427de71c06fdd9c98c604b47eb5a036fd26b66aa..0000000000000000000000000000000000000000 >---- a/lib/less/cssmin.js >-+++ /dev/null >-@@ -1,355 +0,0 @@ >--/** >-- * cssmin.js >-- * Author: Stoyan Stefanov - http://phpied.com/ >-- * This is a JavaScript port of the CSS minification tool >-- * distributed with YUICompressor, itself a port >-- * of the cssmin utility by Isaac Schlueter - http://foohack.com/ >-- * Permission is hereby granted to use the JavaScript version under the same >-- * conditions as the YUICompressor (original YUICompressor note below). >-- */ >-- >--/* >--* YUI Compressor >--* http://developer.yahoo.com/yui/compressor/ >--* Author: Julien Lecomte - http://www.julienlecomte.net/ >--* Copyright (c) 2011 Yahoo! Inc. All rights reserved. >--* The copyrights embodied in the content of this file are licensed >--* by Yahoo! Inc. under the BSD (revised) open source license. >--*/ >--var YAHOO = YAHOO || {}; >--YAHOO.compressor = YAHOO.compressor || {}; >-- >--/** >-- * Utility method to replace all data urls with tokens before we start >-- * compressing, to avoid performance issues running some of the subsequent >-- * regexes against large strings chunks. >-- * >-- * @private >-- * @method _extractDataUrls >-- * @param {String} css The input css >-- * @param {Array} The global array of tokens to preserve >-- * @returns String The processed css >-- */ >--YAHOO.compressor._extractDataUrls = function (css, preservedTokens) { >-- >-- // Leave data urls alone to increase parse performance. >-- var maxIndex = css.length - 1, >-- appendIndex = 0, >-- startIndex, >-- endIndex, >-- terminator, >-- foundTerminator, >-- sb = [], >-- m, >-- preserver, >-- token, >-- pattern = /url\(\s*(["']?)data\:/g; >-- >-- // Since we need to account for non-base64 data urls, we need to handle >-- // ' and ) being part of the data string. Hence switching to indexOf, >-- // to determine whether or not we have matching string terminators and >-- // handling sb appends directly, instead of using matcher.append* methods. >-- >-- while ((m = pattern.exec(css)) !== null) { >-- >-- startIndex = m.index + 4; // "url(".length() >-- terminator = m[1]; // ', " or empty (not quoted) >-- >-- if (terminator.length === 0) { >-- terminator = ")"; >-- } >-- >-- foundTerminator = false; >-- >-- endIndex = pattern.lastIndex - 1; >-- >-- while(foundTerminator === false && endIndex+1 <= maxIndex) { >-- endIndex = css.indexOf(terminator, endIndex + 1); >-- >-- // endIndex == 0 doesn't really apply here >-- if ((endIndex > 0) && (css.charAt(endIndex - 1) !== '\\')) { >-- foundTerminator = true; >-- if (")" != terminator) { >-- endIndex = css.indexOf(")", endIndex); >-- } >-- } >-- } >-- >-- // Enough searching, start moving stuff over to the buffer >-- sb.push(css.substring(appendIndex, m.index)); >-- >-- if (foundTerminator) { >-- token = css.substring(startIndex, endIndex); >-- token = token.replace(/\s+/g, ""); >-- preservedTokens.push(token); >-- >-- preserver = "url(___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___)"; >-- sb.push(preserver); >-- >-- appendIndex = endIndex + 1; >-- } else { >-- // No end terminator found, re-add the whole match. Should we throw/warn here? >-- sb.push(css.substring(m.index, pattern.lastIndex)); >-- appendIndex = pattern.lastIndex; >-- } >-- } >-- >-- sb.push(css.substring(appendIndex)); >-- >-- return sb.join(""); >--}; >-- >--/** >-- * Utility method to compress hex color values of the form #AABBCC to #ABC. >-- * >-- * DOES NOT compress CSS ID selectors which match the above pattern (which would break things). >-- * e.g. #AddressForm { ... } >-- * >-- * DOES NOT compress IE filters, which have hex color values (which would break things). >-- * e.g. filter: chroma(color="#FFFFFF"); >-- * >-- * DOES NOT compress invalid hex values. >-- * e.g. background-color: #aabbccdd >-- * >-- * @private >-- * @method _compressHexColors >-- * @param {String} css The input css >-- * @returns String The processed css >-- */ >--YAHOO.compressor._compressHexColors = function(css) { >-- >-- // Look for hex colors inside { ... } (to avoid IDs) and which don't have a =, or a " in front of them (to avoid filters) >-- var pattern = /(\=\s*?["']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\}|[^0-9a-f{][^{]*?\})/gi, >-- m, >-- index = 0, >-- isFilter, >-- sb = []; >-- >-- while ((m = pattern.exec(css)) !== null) { >-- >-- sb.push(css.substring(index, m.index)); >-- >-- isFilter = m[1]; >-- >-- if (isFilter) { >-- // Restore, maintain case, otherwise filter will break >-- sb.push(m[1] + "#" + (m[2] + m[3] + m[4] + m[5] + m[6] + m[7])); >-- } else { >-- if (m[2].toLowerCase() == m[3].toLowerCase() && >-- m[4].toLowerCase() == m[5].toLowerCase() && >-- m[6].toLowerCase() == m[7].toLowerCase()) { >-- >-- // Compress. >-- sb.push("#" + (m[3] + m[5] + m[7]).toLowerCase()); >-- } else { >-- // Non compressible color, restore but lower case. >-- sb.push("#" + (m[2] + m[3] + m[4] + m[5] + m[6] + m[7]).toLowerCase()); >-- } >-- } >-- >-- index = pattern.lastIndex = pattern.lastIndex - m[8].length; >-- } >-- >-- sb.push(css.substring(index)); >-- >-- return sb.join(""); >--}; >-- >--YAHOO.compressor.cssmin = function (css, linebreakpos) { >-- >-- var startIndex = 0, >-- endIndex = 0, >-- i = 0, max = 0, >-- preservedTokens = [], >-- comments = [], >-- token = '', >-- totallen = css.length, >-- placeholder = ''; >-- >-- css = this._extractDataUrls(css, preservedTokens); >-- >-- // collect all comment blocks... >-- while ((startIndex = css.indexOf("/*", startIndex)) >= 0) { >-- endIndex = css.indexOf("*/", startIndex + 2); >-- if (endIndex < 0) { >-- endIndex = totallen; >-- } >-- token = css.slice(startIndex + 2, endIndex); >-- comments.push(token); >-- css = css.slice(0, startIndex + 2) + "___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + (comments.length - 1) + "___" + css.slice(endIndex); >-- startIndex += 2; >-- } >-- >-- // preserve strings so their content doesn't get accidentally minified >-- css = css.replace(/("([^\\"]|\\.|\\)*")|('([^\\']|\\.|\\)*')/g, function (match) { >-- var i, max, quote = match.substring(0, 1); >-- >-- match = match.slice(1, -1); >-- >-- // maybe the string contains a comment-like substring? >-- // one, maybe more? put'em back then >-- if (match.indexOf("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_") >= 0) { >-- for (i = 0, max = comments.length; i < max; i = i + 1) { >-- match = match.replace("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___", comments[i]); >-- } >-- } >-- >-- // minify alpha opacity in filter strings >-- match = match.replace(/progid:DXImageTransform\.Microsoft\.Alpha\(Opacity=/gi, "alpha(opacity="); >-- >-- preservedTokens.push(match); >-- return quote + "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___" + quote; >-- }); >-- >-- // strings are safe, now wrestle the comments >-- for (i = 0, max = comments.length; i < max; i = i + 1) { >-- >-- token = comments[i]; >-- placeholder = "___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___"; >-- >-- // ! in the first position of the comment means preserve >-- // so push to the preserved tokens keeping the ! >-- if (token.charAt(0) === "!") { >-- preservedTokens.push(token); >-- css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); >-- continue; >-- } >-- >-- // \ in the last position looks like hack for Mac/IE5 >-- // shorten that to /*\*/ and the next one to /**/ >-- if (token.charAt(token.length - 1) === "\\") { >-- preservedTokens.push("\\"); >-- css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); >-- i = i + 1; // attn: advancing the loop >-- preservedTokens.push(""); >-- css = css.replace("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___", "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); >-- continue; >-- } >-- >-- // keep empty comments after child selectors (IE7 hack) >-- // e.g. html >/**/ body >-- if (token.length === 0) { >-- startIndex = css.indexOf(placeholder); >-- if (startIndex > 2) { >-- if (css.charAt(startIndex - 3) === '>') { >-- preservedTokens.push(""); >-- css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.length - 1) + "___"); >-- } >-- } >-- } >-- >-- // in all other cases kill the comment >-- css = css.replace("/*" + placeholder + "*/", ""); >-- } >-- >-- >-- // Normalize all whitespace strings to single spaces. Easier to work with that way. >-- css = css.replace(/\s+/g, " "); >-- >-- // Remove the spaces before the things that should not have spaces before them. >-- // But, be careful not to turn "p :link {...}" into "p:link{...}" >-- // Swap out any pseudo-class colons with the token, and then swap back. >-- css = css.replace(/(^|\})(([^\{:])+:)+([^\{]*\{)/g, function (m) { >-- return m.replace(":", "___YUICSSMIN_PSEUDOCLASSCOLON___"); >-- }); >-- css = css.replace(/\s+([!{};:>+\(\)\],])/g, '$1'); >-- css = css.replace(/___YUICSSMIN_PSEUDOCLASSCOLON___/g, ":"); >-- >-- // retain space for special IE6 cases >-- css = css.replace(/:first-(line|letter)(\{|,)/g, ":first-$1 $2"); >-- >-- // no space after the end of a preserved comment >-- css = css.replace(/\*\/ /g, '*/'); >-- >-- >-- // If there is a @charset, then only allow one, and push to the top of the file. >-- css = css.replace(/^(.*)(@charset "[^"]*";)/gi, '$2$1'); >-- css = css.replace(/^(\s*@charset [^;]+;\s*)+/gi, '$1'); >-- >-- // Put the space back in some cases, to support stuff like >-- // @media screen and (-webkit-min-device-pixel-ratio:0){ >-- css = css.replace(/\band\(/gi, "and ("); >-- >-- >-- // Remove the spaces after the things that should not have spaces after them. >-- css = css.replace(/([!{}:;>+\(\[,])\s+/g, '$1'); >-- >-- // remove unnecessary semicolons >-- css = css.replace(/;+\}/g, "}"); >-- >-- // Replace 0(px,em,%) with 0. >-- css = css.replace(/([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)/gi, "$1$2"); >-- >-- // Replace 0 0 0 0; with 0. >-- css = css.replace(/:0 0 0 0(;|\})/g, ":0$1"); >-- css = css.replace(/:0 0 0(;|\})/g, ":0$1"); >-- css = css.replace(/:0 0(;|\})/g, ":0$1"); >-- >-- // Replace background-position:0; with background-position:0 0; >-- // same for transform-origin >-- css = css.replace(/(background-position|transform-origin|webkit-transform-origin|moz-transform-origin|o-transform-origin|ms-transform-origin):0(;|\})/gi, function(all, prop, tail) { >-- return prop.toLowerCase() + ":0 0" + tail; >-- }); >-- >-- // Replace 0.6 to .6, but only when preceded by : or a white-space >-- css = css.replace(/(:|\s)0+\.(\d+)/g, "$1.$2"); >-- >-- // Shorten colors from rgb(51,102,153) to #336699 >-- // This makes it more likely that it'll get further compressed in the next step. >-- css = css.replace(/rgb\s*\(\s*([0-9,\s]+)\s*\)/gi, function () { >-- var i, rgbcolors = arguments[1].split(','); >-- for (i = 0; i < rgbcolors.length; i = i + 1) { >-- rgbcolors[i] = parseInt(rgbcolors[i], 10).toString(16); >-- if (rgbcolors[i].length === 1) { >-- rgbcolors[i] = '0' + rgbcolors[i]; >-- } >-- } >-- return '#' + rgbcolors.join(''); >-- }); >-- >-- // Shorten colors from #AABBCC to #ABC. >-- css = this._compressHexColors(css); >-- >-- // border: none -> border:0 >-- css = css.replace(/(border|border-top|border-right|border-bottom|border-right|outline|background):none(;|\})/gi, function(all, prop, tail) { >-- return prop.toLowerCase() + ":0" + tail; >-- }); >-- >-- // shorter opacity IE filter >-- css = css.replace(/progid:DXImageTransform\.Microsoft\.Alpha\(Opacity=/gi, "alpha(opacity="); >-- >-- // Remove empty rules. >-- css = css.replace(/[^\};\{\/]+\{\}/g, ""); >-- >-- if (linebreakpos >= 0) { >-- // Some source control tools don't like it when files containing lines longer >-- // than, say 8000 characters, are checked in. The linebreak option is used in >-- // that case to split long lines after a specific column. >-- startIndex = 0; >-- i = 0; >-- while (i < css.length) { >-- i = i + 1; >-- if (css[i - 1] === '}' && i - startIndex > linebreakpos) { >-- css = css.slice(0, i) + '\n' + css.slice(i); >-- startIndex = i; >-- } >-- } >-- } >-- >-- // Replace multiple semi-colons in a row by a single one >-- // See SF bug #1980989 >-- css = css.replace(/;;+/g, ";"); >-- >-- // restore preserved comments and strings >-- for (i = 0, max = preservedTokens.length; i < max; i = i + 1) { >-- css = css.replace("___YUICSSMIN_PRESERVED_TOKEN_" + i + "___", preservedTokens[i]); >-- } >-- >-- // Trim the final string (for any leading or trailing white spaces) >-- css = css.replace(/^\s+|\s+$/g, ""); >-- >-- return css; >-- >--}; >-- >--exports.compressor = YAHOO.compressor; >-diff --git a/lib/less/lessc_helper.js b/lib/less/lessc_helper.js >-index 7c051be5e70150336b2a1c33971ccdccacd91dfa..dbee896a26f1fca7d5d27c5a24251a4d4cea0725 100644 >---- a/lib/less/lessc_helper.js >-+++ b/lib/less/lessc_helper.js >-@@ -36,7 +36,6 @@ var lessc_helper = { >- sys.puts(" --verbose Be verbose."); >- sys.puts(" -v, --version Print version number and exit."); >- sys.puts(" -x, --compress Compress output by removing some whitespaces."); >-- sys.puts(" --yui-compress Compress output using cssmin.js."); >- sys.puts(" -O0, -O1, -O2 Set the parser's optimization level. The lower"); >- sys.puts(" the number, the less nodes it will create in the"); >- sys.puts(" tree. This could matter for debugging, or if you"); >-diff --git a/lib/less/parser.js b/lib/less/parser.js >-index 6bb90cd60a841d3a1657ce3c84fa9f00d07e3be5..a71a2f52b521ee343a9bb5c7239d265cbc05e5f7 100644 >---- a/lib/less/parser.js >-+++ b/lib/less/parser.js >-@@ -418,9 +418,7 @@ less.Parser = function Parser(env) { >- else throw new(LessError)(importError, env); >- } >- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-+ if (options.compress) { >- return css.replace(/(\s)+/g, "$1"); >- } else { >- return css; >--- >-1.8.0.1 >- >diff --git a/0002-Fix-version-number.patch b/0002-Fix-version-number.patch >deleted file mode 100644 >index cba8d1e..0000000 >--- a/0002-Fix-version-number.patch >+++ /dev/null >@@ -1,25 +0,0 @@ >-From 682c7f601c89ed0a8ee274730da33d961a50e16d Mon Sep 17 00:00:00 2001 >-From: Stephen Gallagher <sgallagh@redhat.com> >-Date: Wed, 19 Dec 2012 09:04:38 -0500 >-Subject: [PATCH 2/4] Fix version number >- >---- >- lib/less/index.js | 2 +- >- 1 file changed, 1 insertion(+), 1 deletion(-) >- >-diff --git a/lib/less/index.js b/lib/less/index.js >-index 7ffbbcf64bed40e0d5012c4da35e3183f971082d..295c9d59f11cf7586d46774c5a02441d42d75b25 100644 >---- a/lib/less/index.js >-+++ b/lib/less/index.js >-@@ -3,7 +3,7 @@ var path = require('path'), >- fs = require('fs'); >- >- var less = { >-- version: [1, 3, 0], >-+ version: [1, 3, 1], >- Parser: require('./parser').Parser, >- importer: require('./parser').importer, >- tree: require('./tree'), >--- >-1.8.0.1 >- >diff --git a/0003-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch b/0003-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch >deleted file mode 100644 >index ce60ebe..0000000 >--- a/0003-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch >+++ /dev/null >@@ -1,43 +0,0 @@ >-From ea94b55d0b71b79d80ce80cc964983f20e7054d1 Mon Sep 17 00:00:00 2001 >-From: Stephen Gallagher <sgallagh@redhat.com> >-Date: Wed, 19 Dec 2012 09:06:24 -0500 >-Subject: [PATCH 3/4] substitute paths to use /usr/share instead of /usr/lib >- >---- >- bin/lessc | 6 +++--- >- 1 file changed, 3 insertions(+), 3 deletions(-) >- >-diff --git a/bin/lessc b/bin/lessc >-index af96ea237b3fb82284b38babf6562b7c5849f668..231298719ed0b9f745281f71e4cf374aec13c04c 100755 >---- a/bin/lessc >-+++ b/bin/lessc >-@@ -5,7 +5,7 @@ var path = require('path'), >- sys = require('util'), >- os = require('os'); >- >--var less = require('../lib/less'); >-+var less = require('../share/less'); >- var args = process.argv.slice(1); >- var options = { >- compress: false, >-@@ -51,7 +51,7 @@ args = args.filter(function (arg) { >- break; >- case 'h': >- case 'help': >-- require('../lib/less/lessc_helper').printUsage(); >-+ require('../share/less/lessc_helper').printUsage(); >- continueProcessing = false; >- case 'x': >- case 'compress': >-@@ -99,7 +99,7 @@ if (output) { >- if (! input) { >- sys.puts("lessc: no input files"); >- sys.puts(""); >-- require('../lib/less/lessc_helper').printUsage(); >-+ require('../share/less/lessc_helper').printUsage(); >- currentErrorcode = 1; >- return; >- } >--- >-1.8.0.1 >- >diff --git a/0004-Remove-pre-builds.patch b/0004-Remove-pre-builds.patch >deleted file mode 100644 >index d810ca9..0000000 >--- a/0004-Remove-pre-builds.patch >+++ /dev/null >@@ -1,45901 +0,0 @@ >-From 4318e8a28b00689551c9cb23eddaebe6b47ac20a Mon Sep 17 00:00:00 2001 >-From: Stephen Gallagher <sgallagh@redhat.com> >-Date: Wed, 19 Dec 2012 09:07:00 -0500 >-Subject: [PATCH 4/4] Remove pre-builds >- >---- >- dist/less-1.1.0.js | 2695 ------------------------------- >- dist/less-1.1.0.min.js | 16 - >- dist/less-1.1.1.js | 2710 ------------------------------- >- dist/less-1.1.1.min.js | 16 - >- dist/less-1.1.2.js | 2712 ------------------------------- >- dist/less-1.1.2.min.js | 16 - >- dist/less-1.1.3.js | 2721 ------------------------------- >- dist/less-1.1.3.min.js | 16 - >- dist/less-1.1.4.js | 2769 -------------------------------- >- dist/less-1.1.4.min.js | 16 - >- dist/less-1.1.5.js | 2805 -------------------------------- >- dist/less-1.1.5.min.js | 9 - >- dist/less-1.1.6.js | 3004 ---------------------------------- >- dist/less-1.1.6.min.js | 9 - >- dist/less-1.2.0.js | 3293 ------------------------------------- >- dist/less-1.2.0.min.js | 9 - >- dist/less-1.2.1.js | 3318 -------------------------------------- >- dist/less-1.2.1.min.js | 9 - >- dist/less-1.2.2.js | 3337 -------------------------------------- >- dist/less-1.2.2.min.js | 9 - >- dist/less-1.3.0.js | 3478 ---------------------------------------- >- dist/less-1.3.0.min.js | 9 - >- dist/less-1.3.1.js | 4011 ---------------------------------------------- >- dist/less-1.3.1.min.js | 9 - >- dist/less-rhino-1.1.3.js | 2460 ---------------------------- >- dist/less-rhino-1.1.5.js | 2481 ---------------------------- >- dist/less-rhino-1.3.1.js | 3725 ------------------------------------------ >- 27 files changed, 45662 deletions(-) >- delete mode 100644 dist/less-1.1.0.js >- delete mode 100644 dist/less-1.1.0.min.js >- delete mode 100644 dist/less-1.1.1.js >- delete mode 100644 dist/less-1.1.1.min.js >- delete mode 100644 dist/less-1.1.2.js >- delete mode 100644 dist/less-1.1.2.min.js >- delete mode 100644 dist/less-1.1.3.js >- delete mode 100644 dist/less-1.1.3.min.js >- delete mode 100644 dist/less-1.1.4.js >- delete mode 100644 dist/less-1.1.4.min.js >- delete mode 100644 dist/less-1.1.5.js >- delete mode 100644 dist/less-1.1.5.min.js >- delete mode 100644 dist/less-1.1.6.js >- delete mode 100644 dist/less-1.1.6.min.js >- delete mode 100644 dist/less-1.2.0.js >- delete mode 100644 dist/less-1.2.0.min.js >- delete mode 100644 dist/less-1.2.1.js >- delete mode 100644 dist/less-1.2.1.min.js >- delete mode 100644 dist/less-1.2.2.js >- delete mode 100644 dist/less-1.2.2.min.js >- delete mode 100644 dist/less-1.3.0.js >- delete mode 100644 dist/less-1.3.0.min.js >- delete mode 100644 dist/less-1.3.1.js >- delete mode 100644 dist/less-1.3.1.min.js >- delete mode 100644 dist/less-rhino-1.1.3.js >- delete mode 100644 dist/less-rhino-1.1.5.js >- delete mode 100644 dist/less-rhino-1.3.1.js >- >-diff --git a/dist/less-1.1.0.js b/dist/less-1.1.0.js >-deleted file mode 100644 >-index 487c06acd2913ba4111d52ea8f1a7246717ae950..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.0.js >-+++ /dev/null >-@@ -1,2695 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof(window) === 'undefined') { >-- less = exports, >-- tree = require('less/tree'); >--} else { >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[A-Za-z-]+/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e) } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '&' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- if (match = /^([.#: \w-]+)[\s\n]*\{/.exec(chunks[j])) { >-- i += match[0].length - 1; >-- selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])]; >-- } else { >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page|@-[-a-z]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (typeof(window) !== 'undefined') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args) { >-- this.name = name; >-- this.args = args; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- return tree.functions[this.name].apply(tree.functions, args); >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else if (rgb.length == 8) { >-- this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0; >-- this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- } >--}; >-- >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value.trim(); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else { >-- return this.value[0].eval(env); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.evaluated; >-- } else { >-- return JSON.stringify(this.evaluated); >-- } >-- }, >-- eval: function (env) { >-- var result, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return new(tree.Variable)('@' + name).eval(env).value; >-- }); >-- >-- expression = new(Function)('return (' + expression + ')'); >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- this.evaluated = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- return this; >-- } >--}; >-- >--})(require('less/tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(this.arguments, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- this.value = this.value.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return new(tree.Variable)('@' + name).eval(env).value; >-- }).replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, this.index, true).eval(env).toCSS(); >-- }); >-- return this; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > 1) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- for (var s = 0; s < this.selectors.length; s++) { >-- for (var c = 0; c < context.length; c++) { >-- paths.push(context[c].concat([this.selectors[s]])); >-- } >-- } >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- } >--}; >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- if (this.elements[0].value === other.elements[0].value) { >-- return true; >-- } else { >-- return false; >-- } >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/|file:\/|data:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--require('less/tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- styles[i].type = 'text/css'; >-- styles[i].innerHTML = tree.toCSS(); >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.0.min.js b/dist/less-1.1.0.min.js >-deleted file mode 100644 >-index ede454e103cc2b123a5a46dffdc8f3e38557efc7..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.0.min.js >-+++ /dev/null >-@@ -1,16 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--// >--// LESS - Leaner CSS v1.1.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function v(a,b){var c="less-error-message:"+p(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,q([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}function u(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function t(a){return a&&a.parentNode.removeChild(a)}function s(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){u("browser doesn't support AJAX.");return null}}function r(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=s(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function q(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||p(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(u("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function p(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i),r(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())q(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return v(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),t(document.getElementById("less-error-message:"+p(i)))}catch(a){v(a,i)}})}catch(h){v(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){a[b].type="text/css",a[b].innerHTML=d.toCSS()})}function c(b){return a.less[b.split("/")[1]]}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else for(;;){if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof a=="undefined"?(d=exports,e=c("less/tree")):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={}),d.Parser=function(a){function t(a){return typeof a=="string"?b.charAt(c)===a:a.test(j[f])?!0:!1}function s(a){var d,e,g,h,i,m,n,o;if(a instanceof Function)return a.call(l.parsers);if(typeof a=="string")d=b.charAt(c)===a?a:null,g=1,r();else{r();if(d=a.exec(j[f]))g=d[0].length;else return null}if(d){o=c+=g,m=c+j[f].length-g;while(c<m){h=b.charCodeAt(c);if(h!==32&&h!==10&&h!==9)break;c++}j[f]=j[f].slice(g+(c-o)),k=c,j[f].length===0&&f<j.length-1&&f++;return typeof d=="string"?d:d.length===1?d[0]:d}}function r(){c>k&&(j[f]=j[f].slice(c-k),k=c)}function q(){j[f]=g,c=h,k=c}function p(){g=j[f],h=c,k=c}var b,c,f,g,h,i,j,k,l,m=this,n=function(){},o=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&n()},a)}};this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null;return l={imports:o,parse:function(d,g){var h,l,m,o,p,q,r=[],t,u=null;c=f=k=i=0,j=[],b=d.replace(/\r\n/g,"\n"),j=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),h=new e.Ruleset([],s(this.parsers.primary)),h.root=!0,h.toCSS=function(c){var d,f,g;return function(g,h){function n(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var i=[];g=g||{},typeof h=="object"&&!Array.isArray(h)&&(h=Object.keys(h).map(function(a){var b=h[a];b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b]));return new e.Rule("@"+a,b,!1,0)}),i=[new e.Ruleset(null,h)]);try{var j=c.call(this,{frames:i}).toCSS([],{compress:g.compress||!1})}catch(k){f=b.split("\n"),d=n(k.index);for(var l=k.index,m=-1;l>=0&&b.charAt(l)!=="\n";l--)m++;throw{type:k.type,message:k.message,filename:a.filename,index:k.index,line:typeof d=="number"?d+1:null,callLine:k.call&&n(k.call)+1,callExtract:f[n(k.call)],stack:k.stack,column:m,extract:[f[d-1],f[d],f[d+1]]}}return g.compress?j.replace(/(\s)+/g,"$1"):j}}(h.eval);if(c<b.length-1){c=i,q=b.split("\n"),p=(b.slice(0,c).match(/\n/g)||"").length+1;for(var v=c,w=-1;v>=0&&b.charAt(v)!=="\n";v--)w++;u={name:"ParseError",message:"Syntax Error on line "+p,index:c,filename:a.filename,line:p,column:w,extract:[q[p-2],q[p-1],q[p]]}}this.imports.queue.length>0?n=function(){g(u,h)}:g(u,h)},parsers:{primary:function(){var a,b=[];while((a=s(this.mixin.definition)||s(this.rule)||s(this.ruleset)||s(this.mixin.call)||s(this.comment)||s(this.directive))||s(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(c)==="/"){if(b.charAt(c+1)==="/")return new e.Comment(s(/^\/\/.*/),!0);if(a=s(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)}},entities:{quoted:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==='"'||b.charAt(d)==="'"){f&&s("~");if(a=s(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],f)}},keyword:function(){var a;if(a=s(/^[A-Za-z-]+/))return new e.Keyword(a)},call:function(){var a,b;if(!!(a=/^([\w-]+|%)\(/.exec(j[f]))){a=a[1].toLowerCase();if(a==="url")return null;c+=a.length;if(a==="alpha")return s(this.alpha);s("("),b=s(this.entities.arguments);if(!s(")"))return;if(a)return new e.Call(a,b)}},arguments:function(){var a=[],b;while(b=s(this.expression)){a.push(b);if(!s(","))break}return a},literal:function(){return s(this.entities.dimension)||s(this.entities.color)||s(this.entities.quoted)},url:function(){var a;if(b.charAt(c)==="u"&&!!s(/^url\(/)){a=s(this.entities.quoted)||s(this.entities.variable)||s(this.entities.dataURI)||s(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!s(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),o.paths)}},dataURI:function(){var a;if(s(/^data:/)){a={},a.mime=s(/^[^\/]+\/[^,;)]+/)||"",a.charset=s(/^;\s*charset=[^,;)]+/)||"",a.base64=s(/^;\s*base64/)||"",a.data=s(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,d=c;if(b.charAt(c)==="@"&&(a=s(/^@@?[\w-]+/)))return new e.Variable(a,d)},color:function(){var a;if(b.charAt(c)==="#"&&(a=s(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,d=b.charCodeAt(c);if(!(d>57||d<45||d===47))if(a=s(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==="`"){f&&s("~");if(a=s(/^`([^`]*)`/))return new e.JavaScript(a[1],c,f)}}},variable:function(){var a;if(b.charAt(c)==="@"&&(a=s(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!!t(/^[@\w.%-]+\/[@\w.-]+/)&&(a=s(this.entity))&&s("/")&&(b=s(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],d,f,g,h=c,i=b.charAt(c);if(i==="."||i==="#"){while(d=s(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(f,d)),f=s(">");s("(")&&(g=s(this.entities.arguments))&&s(")");if(a.length>0&&(s(";")||t("}")))return new e.mixin.Call(a,g,h)}},definition:function(){var a,d=[],f,g,h,i;if(!(b.charAt(c)!=="."&&b.charAt(c)!=="#"||t(/^[^{]*(;|})/)))if(f=s(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=f[1];while(h=s(this.entities.variable)||s(this.entities.literal)||s(this.entities.keyword)){if(h instanceof e.Variable)if(s(":"))if(i=s(this.expression))d.push({name:h.name,value:i});else throw new Error("Expected value");else d.push({name:h.name});else d.push({value:h});if(!s(","))break}if(!s(")"))throw new Error("Expected )");g=s(this.block);if(g)return new e.mixin.Definition(a,d,g)}}},entity:function(){return s(this.entities.literal)||s(this.entities.variable)||s(this.entities.url)||s(this.entities.call)||s(this.entities.keyword)||s(this.entities.javascript)||s(this.comment)},end:function(){return s(";")||t("}")},alpha:function(){var a;if(!!s(/^opacity=/i))if(a=s(/^\d+/)||s(this.entities.variable)){if(!s(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,c;c=s(this.combinator),a=s(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||s("*")||s(this.attribute)||s(/^\([^)@]+\)/);if(a)return new e.Element(c,a)},combinator:function(){var a,d=b.charAt(c);if(d===">"||d==="&"||d==="+"||d==="~"){c++;while(b.charAt(c)===" ")c++;return new e.Combinator(d)}if(d===":"&&b.charAt(c+1)===":"){c+=2;while(b.charAt(c)===" ")c++;return new e.Combinator("::")}return b.charAt(c-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,d,f=[],g,h;while(d=s(this.element)){g=b.charAt(c),f.push(d);if(g==="{"||g==="}"||g===";"||g===",")break}if(f.length>0)return new e.Selector(f)},tag:function(){return s(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||s("*")},attribute:function(){var a="",b,c,d;if(!!s("[")){if(b=s(/^[a-zA-Z-]+/)||s(this.entities.quoted))(d=s(/^[|~*$^]?=/))&&(c=s(this.entities.quoted)||s(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!s("]"))return;if(a)return"["+a+"]"}},block:function(){var a;if(s("{")&&(a=s(this.primary))&&s("}"))return a},ruleset:function(){var a=[],b,d,g;p();if(g=/^([.#: \w-]+)[\s\n]*\{/.exec(j[f]))c+=g[0].length-1,a=[new e.Selector([new e.Element(null,g[1])])];else while(b=s(this.selector)){a.push(b),s(this.comment);if(!s(","))break;s(this.comment)}if(a.length>0&&(d=s(this.block)))return new e.Ruleset(a,d);i=c,q()},rule:function(){var a,d,g=b.charAt(c),k,l;p();if(g!=="."&&g!=="#"&&g!=="&")if(a=s(this.variable)||s(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(j[f]))?(c+=l[0].length-1,d=new e.Anonymous(l[1])):a==="font"?d=s(this.font):d=s(this.value),k=s(this.important);if(d&&s(this.end))return new e.Rule(a,d,k,h);i=c,q()}},"import":function(){var a;if(s(/^@import\s+/)&&(a=s(this.entities.quoted)||s(this.entities.url))&&s(";"))return new e.Import(a,o)},directive:function(){var a,d,f,g;if(b.charAt(c)==="@"){if(d=s(this["import"]))return d;if(a=s(/^@media|@page|@-[-a-z]+/)){g=(s(/^[^{]+/)||"").trim();if(f=s(this.block))return new e.Directive(a+" "+g,f)}else if(a=s(/^@[-a-z]+/))if(a==="@font-face"){if(f=s(this.block))return new e.Directive(a,f)}else if((d=s(this.entity))&&s(";"))return new e.Directive(a,d)}},font:function(){var a=[],b=[],c,d,f,g;while(g=s(this.shorthand)||s(this.entity))b.push(g);a.push(new e.Expression(b));if(s(","))while(g=s(this.expression)){a.push(g);if(!s(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=s(this.expression)){b.push(a);if(!s(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(c)==="!")return s(/^! *important/)},sub:function(){var a;if(s("(")&&(a=s(this.expression))&&s(")"))return a},multiplication:function(){var a,b,c,d;if(a=s(this.operand)){while((c=s("/")||s("*"))&&(b=s(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,d,f,g;if(a=s(this.multiplication)){while((f=s(/^[-+]\s+/)||b.charAt(c-1)!=" "&&(s("+")||s("-")))&&(d=s(this.multiplication)))g=new e.Operation(f,[g||a,d]);return g||a}},operand:function(){var a,d=b.charAt(c+1);b.charAt(c)==="-"&&(d==="@"||d==="(")&&(a=s("-"));var f=s(this.sub)||s(this.entities.dimension)||s(this.entities.color)||s(this.entities.variable)||s(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),f]):f},expression:function(){var a,b,c=[],d;while(a=s(this.addition)||s(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=s(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}},typeof a!="undefined"&&(d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)}),function(a){function d(a){return Math.min(1,Math.max(0,a))}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){a=a<0?a+1:a>1?a-1:a;return a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();e.s+=c.value/100,e.s=d(e.s);return b(e)},desaturate:function(a,c){var e=a.toHSL();e.s-=c.value/100,e.s=d(e.s);return b(e)},lighten:function(a,c){var e=a.toHSL();e.l+=c.value/100,e.l=d(e.l);return b(e)},darken:function(a,c){var e=a.toHSL();e.l-=c.value/100,e.l=d(e.l);return b(e)},fadein:function(a,c){var e=a.toHSL();e.a+=c.value/100,e.a=d(e.a);return b(e)},fadeout:function(a,c){var e=a.toHSL();e.a-=c.value/100,e.a=d(e.a);return b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;d.h=e<0?360+e:e;return b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});d=d.replace(/%%/g,"%");return new a.Quoted('"'+d+'"',d)},round:function(b){if(b instanceof a.Dimension)return new a.Dimension(Math.round(c(b)),b.unit);if(typeof b=="number")return Math.round(b);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}}}}(c("less/tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(){return this}}}(c("less/tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Call=function(a,b){this.name=a,this.args=b},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});return this.name in a.functions?a.functions[this.name].apply(a.functions,c):new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")")},toCSS:function(a){return this.eval(a).toCSS()}}}(c("less/tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):a.length==8?(this.alpha=parseInt(a.substring(0,2),16)/255,this.rgb=a.substr(2).match(/.{2}/g).map(function(a){return parseInt(a,16)})):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16);return a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}}}}(c("less/tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("less/tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){if(this.ruleset){this.ruleset.root=!0;return this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")}return this.name+" "+this.value.toCSS()+";\n"},eval:function(a){a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift();return this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("less/tree")),function(a){a.Element=function(b,c){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c.trim()},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("less/tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value[0].eval(b)},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("less/tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("less/tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={toCSS:function(){return this.escaped?this.evaluated:JSON.stringify(this.evaluated)},eval:function(b){var c,d={},e=this.expression.replace(/@\{([\w-]+)\}/g,function(c,d){return(new a.Variable("@"+d)).eval(b).value});e=new Function("return ("+e+")");for(var f in b.frames[0].variables())d[f.slice(1)]={value:b.frames[0].variables()[f].value,toJS:function(){return this.value.eval(b).toCSS()}};try{this.evaluated=e.call(d)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return this}}}(c("less/tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("less/tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c=[],d=!1;for(var e=0;e<a.frames.length;e++)if((b=a.frames[e].find(this.selector)).length>0){for(var f=0;f<b.length;f++)if(b[f].match(this.arguments,a))try{Array.prototype.push.apply(c,b[f].eval(a,this.arguments).rules),d=!0}catch(g){throw{message:g.message,index:g.index,stack:g.stack,call:this.index}}if(d)return c;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);d.rules.unshift(new a.Rule("@arguments",new a.Expression(f)));return(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("less/tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("less/tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){this.value=this.value.replace(/@\{([\w-]+)\}/g,function(c,d){return(new a.Variable("@"+d)).eval(b).value}).replace(/`([^`]+)`/g,function(c,d){return(new a.JavaScript(d,this.index,!0)).eval(b).toCSS()});return this}}}(c("less/tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("less/tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);b.frames.shift();return c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c);return b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();if(g in this._lookups)return this._lookups[g];this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>1?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}});return this._lookups[g]=d},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;if(!this.root)if(b.length===0)g=this.selectors.map(function(a){return[a]});else for(var j=0;j<this.selectors.length;j++)for(var k=0;k<b.length;k++)g.push(b[k].concat([this.selectors[j]]));for(var l=0;l<this.rules.length;l++)i=this.rules[l],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f);return d.join("")+(c.compress?"\n":"")}}}(c("less/tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){return this.elements[0].value===a.elements[0].value?!0:!1},a.Selector.prototype.toCSS=function(a){if(this._css)return this._css;return this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("less/tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(!/^(?:https?:\/|file:\/|data:\/)?\//.test(b.value)&&c.length>0&&typeof a!="undefined"&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("less/tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("less/tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("less/tree")),c("less/tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null};var g=location.protocol==="file:"||location.protocol==="chrome:"||location. >--protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c){a&&q(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e){e.local?u("loading "+d.href+" from cache."):(u("parsed "+d.href+" successfully."),q(a.toCSS(),d,e.lastModified)),u("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&u("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window) >-\ No newline at end of file >-diff --git a/dist/less-1.1.1.js b/dist/less-1.1.1.js >-deleted file mode 100644 >-index 3261620fb54c3f7e3f765b7f1d4c17d860e1410a..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.1.js >-+++ /dev/null >-@@ -1,2710 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof(window) === 'undefined') { >-- less = exports, >-- tree = require('less/tree'); >--} else { >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[A-Za-z-]+/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e) } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '&' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- if (match = /^([.#: \w-]+)[\s\n]*\{/.exec(chunks[j])) { >-- i += match[0].length - 1; >-- selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])]; >-- } else { >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page|@-[-a-z]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (typeof(window) !== 'undefined') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args) { >-- this.name = name; >-- this.args = args; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- return tree.functions[this.name].apply(tree.functions, args); >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else if (rgb.length == 8) { >-- this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0; >-- this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- } >--}; >-- >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value.trim(); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('less/tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(this.arguments, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- this.value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return new(tree.Variable)('@' + name, that.index).eval(env).value; >-- }); >-- return this; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > 1) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- for (var s = 0; s < this.selectors.length; s++) { >-- for (var c = 0; c < context.length; c++) { >-- paths.push(context[c].concat([this.selectors[s]])); >-- } >-- } >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- } >--}; >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- if (this.elements[0].value === other.elements[0].value) { >-- return true; >-- } else { >-- return false; >-- } >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/|file:\/|data:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--require('less/tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('less/tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- styles[i].type = 'text/css'; >-- styles[i].innerHTML = tree.toCSS(); >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.1.min.js b/dist/less-1.1.1.min.js >-deleted file mode 100644 >-index c204123ec74a6b0b9e5119b4591528e140402157..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.1.min.js >-+++ /dev/null >-@@ -1,16 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--// >--// LESS - Leaner CSS v1.1.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function v(a,b){var c="less-error-message:"+p(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,q([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}function u(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function t(a){return a&&a.parentNode.removeChild(a)}function s(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){u("browser doesn't support AJAX.");return null}}function r(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=s(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function q(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||p(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(u("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function p(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i),r(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())q(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return v(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),t(document.getElementById("less-error-message:"+p(i)))}catch(a){v(a,i)}})}catch(h){v(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){a[b].type="text/css",a[b].innerHTML=d.toCSS()})}function c(b){return a.less[b.split("/")[1]]}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else for(;;){if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof a=="undefined"?(d=exports,e=c("less/tree")):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={}),d.Parser=function(a){function t(a){return typeof a=="string"?b.charAt(c)===a:a.test(j[f])?!0:!1}function s(a){var d,e,g,h,i,m,n,o;if(a instanceof Function)return a.call(l.parsers);if(typeof a=="string")d=b.charAt(c)===a?a:null,g=1,r();else{r();if(d=a.exec(j[f]))g=d[0].length;else return null}if(d){o=c+=g,m=c+j[f].length-g;while(c<m){h=b.charCodeAt(c);if(h!==32&&h!==10&&h!==9)break;c++}j[f]=j[f].slice(g+(c-o)),k=c,j[f].length===0&&f<j.length-1&&f++;return typeof d=="string"?d:d.length===1?d[0]:d}}function r(){c>k&&(j[f]=j[f].slice(c-k),k=c)}function q(){j[f]=g,c=h,k=c}function p(){g=j[f],h=c,k=c}var b,c,f,g,h,i,j,k,l,m=this,n=function(){},o=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&n()},a)}};this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null;return l={imports:o,parse:function(d,g){var h,l,m,o,p,q,r=[],t,u=null;c=f=k=i=0,j=[],b=d.replace(/\r\n/g,"\n"),j=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),h=new e.Ruleset([],s(this.parsers.primary)),h.root=!0,h.toCSS=function(c){var d,f,g;return function(g,h){function n(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var i=[];g=g||{},typeof h=="object"&&!Array.isArray(h)&&(h=Object.keys(h).map(function(a){var b=h[a];b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b]));return new e.Rule("@"+a,b,!1,0)}),i=[new e.Ruleset(null,h)]);try{var j=c.call(this,{frames:i}).toCSS([],{compress:g.compress||!1})}catch(k){f=b.split("\n"),d=n(k.index);for(var l=k.index,m=-1;l>=0&&b.charAt(l)!=="\n";l--)m++;throw{type:k.type,message:k.message,filename:a.filename,index:k.index,line:typeof d=="number"?d+1:null,callLine:k.call&&n(k.call)+1,callExtract:f[n(k.call)],stack:k.stack,column:m,extract:[f[d-1],f[d],f[d+1]]}}return g.compress?j.replace(/(\s)+/g,"$1"):j}}(h.eval);if(c<b.length-1){c=i,q=b.split("\n"),p=(b.slice(0,c).match(/\n/g)||"").length+1;for(var v=c,w=-1;v>=0&&b.charAt(v)!=="\n";v--)w++;u={name:"ParseError",message:"Syntax Error on line "+p,index:c,filename:a.filename,line:p,column:w,extract:[q[p-2],q[p-1],q[p]]}}this.imports.queue.length>0?n=function(){g(u,h)}:g(u,h)},parsers:{primary:function(){var a,b=[];while((a=s(this.mixin.definition)||s(this.rule)||s(this.ruleset)||s(this.mixin.call)||s(this.comment)||s(this.directive))||s(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(c)==="/"){if(b.charAt(c+1)==="/")return new e.Comment(s(/^\/\/.*/),!0);if(a=s(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)}},entities:{quoted:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==='"'||b.charAt(d)==="'"){f&&s("~");if(a=s(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],f)}},keyword:function(){var a;if(a=s(/^[A-Za-z-]+/))return new e.Keyword(a)},call:function(){var a,b;if(!!(a=/^([\w-]+|%)\(/.exec(j[f]))){a=a[1].toLowerCase();if(a==="url")return null;c+=a.length;if(a==="alpha")return s(this.alpha);s("("),b=s(this.entities.arguments);if(!s(")"))return;if(a)return new e.Call(a,b)}},arguments:function(){var a=[],b;while(b=s(this.expression)){a.push(b);if(!s(","))break}return a},literal:function(){return s(this.entities.dimension)||s(this.entities.color)||s(this.entities.quoted)},url:function(){var a;if(b.charAt(c)==="u"&&!!s(/^url\(/)){a=s(this.entities.quoted)||s(this.entities.variable)||s(this.entities.dataURI)||s(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!s(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),o.paths)}},dataURI:function(){var a;if(s(/^data:/)){a={},a.mime=s(/^[^\/]+\/[^,;)]+/)||"",a.charset=s(/^;\s*charset=[^,;)]+/)||"",a.base64=s(/^;\s*base64/)||"",a.data=s(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,d=c;if(b.charAt(c)==="@"&&(a=s(/^@@?[\w-]+/)))return new e.Variable(a,d)},color:function(){var a;if(b.charAt(c)==="#"&&(a=s(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,d=b.charCodeAt(c);if(!(d>57||d<45||d===47))if(a=s(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==="`"){f&&s("~");if(a=s(/^`([^`]*)`/))return new e.JavaScript(a[1],c,f)}}},variable:function(){var a;if(b.charAt(c)==="@"&&(a=s(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!!t(/^[@\w.%-]+\/[@\w.-]+/)&&(a=s(this.entity))&&s("/")&&(b=s(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],d,f,g,h=c,i=b.charAt(c);if(i==="."||i==="#"){while(d=s(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(f,d)),f=s(">");s("(")&&(g=s(this.entities.arguments))&&s(")");if(a.length>0&&(s(";")||t("}")))return new e.mixin.Call(a,g,h)}},definition:function(){var a,d=[],f,g,h,i;if(!(b.charAt(c)!=="."&&b.charAt(c)!=="#"||t(/^[^{]*(;|})/)))if(f=s(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=f[1];while(h=s(this.entities.variable)||s(this.entities.literal)||s(this.entities.keyword)){if(h instanceof e.Variable)if(s(":"))if(i=s(this.expression))d.push({name:h.name,value:i});else throw new Error("Expected value");else d.push({name:h.name});else d.push({value:h});if(!s(","))break}if(!s(")"))throw new Error("Expected )");g=s(this.block);if(g)return new e.mixin.Definition(a,d,g)}}},entity:function(){return s(this.entities.literal)||s(this.entities.variable)||s(this.entities.url)||s(this.entities.call)||s(this.entities.keyword)||s(this.entities.javascript)||s(this.comment)},end:function(){return s(";")||t("}")},alpha:function(){var a;if(!!s(/^opacity=/i))if(a=s(/^\d+/)||s(this.entities.variable)){if(!s(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,c;c=s(this.combinator),a=s(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||s("*")||s(this.attribute)||s(/^\([^)@]+\)/);if(a)return new e.Element(c,a)},combinator:function(){var a,d=b.charAt(c);if(d===">"||d==="&"||d==="+"||d==="~"){c++;while(b.charAt(c)===" ")c++;return new e.Combinator(d)}if(d===":"&&b.charAt(c+1)===":"){c+=2;while(b.charAt(c)===" ")c++;return new e.Combinator("::")}return b.charAt(c-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,d,f=[],g,h;while(d=s(this.element)){g=b.charAt(c),f.push(d);if(g==="{"||g==="}"||g===";"||g===",")break}if(f.length>0)return new e.Selector(f)},tag:function(){return s(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||s("*")},attribute:function(){var a="",b,c,d;if(!!s("[")){if(b=s(/^[a-zA-Z-]+/)||s(this.entities.quoted))(d=s(/^[|~*$^]?=/))&&(c=s(this.entities.quoted)||s(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!s("]"))return;if(a)return"["+a+"]"}},block:function(){var a;if(s("{")&&(a=s(this.primary))&&s("}"))return a},ruleset:function(){var a=[],b,d,g;p();if(g=/^([.#: \w-]+)[\s\n]*\{/.exec(j[f]))c+=g[0].length-1,a=[new e.Selector([new e.Element(null,g[1])])];else while(b=s(this.selector)){a.push(b),s(this.comment);if(!s(","))break;s(this.comment)}if(a.length>0&&(d=s(this.block)))return new e.Ruleset(a,d);i=c,q()},rule:function(){var a,d,g=b.charAt(c),k,l;p();if(g!=="."&&g!=="#"&&g!=="&")if(a=s(this.variable)||s(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(j[f]))?(c+=l[0].length-1,d=new e.Anonymous(l[1])):a==="font"?d=s(this.font):d=s(this.value),k=s(this.important);if(d&&s(this.end))return new e.Rule(a,d,k,h);i=c,q()}},"import":function(){var a;if(s(/^@import\s+/)&&(a=s(this.entities.quoted)||s(this.entities.url))&&s(";"))return new e.Import(a,o)},directive:function(){var a,d,f,g;if(b.charAt(c)==="@"){if(d=s(this["import"]))return d;if(a=s(/^@media|@page|@-[-a-z]+/)){g=(s(/^[^{]+/)||"").trim();if(f=s(this.block))return new e.Directive(a+" "+g,f)}else if(a=s(/^@[-a-z]+/))if(a==="@font-face"){if(f=s(this.block))return new e.Directive(a,f)}else if((d=s(this.entity))&&s(";"))return new e.Directive(a,d)}},font:function(){var a=[],b=[],c,d,f,g;while(g=s(this.shorthand)||s(this.entity))b.push(g);a.push(new e.Expression(b));if(s(","))while(g=s(this.expression)){a.push(g);if(!s(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=s(this.expression)){b.push(a);if(!s(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(c)==="!")return s(/^! *important/)},sub:function(){var a;if(s("(")&&(a=s(this.expression))&&s(")"))return a},multiplication:function(){var a,b,c,d;if(a=s(this.operand)){while((c=s("/")||s("*"))&&(b=s(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,d,f,g;if(a=s(this.multiplication)){while((f=s(/^[-+]\s+/)||b.charAt(c-1)!=" "&&(s("+")||s("-")))&&(d=s(this.multiplication)))g=new e.Operation(f,[g||a,d]);return g||a}},operand:function(){var a,d=b.charAt(c+1);b.charAt(c)==="-"&&(d==="@"||d==="(")&&(a=s("-"));var f=s(this.sub)||s(this.entities.dimension)||s(this.entities.color)||s(this.entities.variable)||s(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),f]):f},expression:function(){var a,b,c=[],d;while(a=s(this.addition)||s(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=s(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}},typeof a!="undefined"&&(d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)}),function(a){function d(a){return Math.min(1,Math.max(0,a))}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){a=a<0?a+1:a>1?a-1:a;return a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();e.s+=c.value/100,e.s=d(e.s);return b(e)},desaturate:function(a,c){var e=a.toHSL();e.s-=c.value/100,e.s=d(e.s);return b(e)},lighten:function(a,c){var e=a.toHSL();e.l+=c.value/100,e.l=d(e.l);return b(e)},darken:function(a,c){var e=a.toHSL();e.l-=c.value/100,e.l=d(e.l);return b(e)},fadein:function(a,c){var e=a.toHSL();e.a+=c.value/100,e.a=d(e.a);return b(e)},fadeout:function(a,c){var e=a.toHSL();e.a-=c.value/100,e.a=d(e.a);return b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;d.h=e<0?360+e:e;return b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});d=d.replace(/%%/g,"%");return new a.Quoted('"'+d+'"',d)},round:function(b){if(b instanceof a.Dimension)return new a.Dimension(Math.round(c(b)),b.unit);if(typeof b=="number")return Math.round(b);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}}}}(c("less/tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(){return this}}}(c("less/tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Call=function(a,b){this.name=a,this.args=b},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});return this.name in a.functions?a.functions[this.name].apply(a.functions,c):new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")")},toCSS:function(a){return this.eval(a).toCSS()}}}(c("less/tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):a.length==8?(this.alpha=parseInt(a.substring(0,2),16)/255,this.rgb=a.substr(2).match(/.{2}/g).map(function(a){return parseInt(a,16)})):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16);return a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}}}}(c("less/tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("less/tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){if(this.ruleset){this.ruleset.root=!0;return this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")}return this.name+" "+this.value.toCSS()+";\n"},eval:function(a){a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift();return this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("less/tree")),function(a){a.Element=function(b,c){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c.trim()},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("less/tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("less/tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("less/tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("less/tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("less/tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c=[],d=!1;for(var e=0;e<a.frames.length;e++)if((b=a.frames[e].find(this.selector)).length>0){for(var f=0;f<b.length;f++)if(b[f].match(this.arguments,a))try{Array.prototype.push.apply(c,b[f].eval(a,this.arguments).rules),d=!0}catch(g){throw{message:g.message,index:g.index,stack:g.stack,call:this.index}}if(d)return c;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);d.rules.unshift(new a.Rule("@arguments",(new a.Expression(f)).eval(b)));return(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("less/tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("less/tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this;this.value=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){return(new a.Variable("@"+e,c.index)).eval(b).value});return this}}}(c("less/tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("less/tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);b.frames.shift();return c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c);return b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();if(g in this._lookups)return this._lookups[g];this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>1?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}});return this._lookups[g]=d},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;if(!this.root)if(b.length===0)g=this.selectors.map(function(a){return[a]});else for(var j=0;j<this.selectors.length;j++)for(var k=0;k<b.length;k++)g.push(b[k].concat([this.selectors[j]]));for(var l=0;l<this.rules.length;l++)i=this.rules[l],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f);return d.join("")+(c.compress?"\n":"")}}}(c("less/tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){return this.elements[0].value===a.elements[0].value?!0:!1},a.Selector.prototype.toCSS=function(a){if(this._css)return this._css;return this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("less/tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(!/^(?:https?:\/|file:\/|data:\/)?\//.test(b.value)&&c.length>0&&typeof a!="undefined"&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("less/tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("less/tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("less/tree" >--)),c("less/tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},c("less/tree").jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)};var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c){a&&q(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e){e.local?u("loading "+d.href+" from cache."):(u("parsed "+d.href+" successfully."),q(a.toCSS(),d,e.lastModified)),u("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&u("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window) >-\ No newline at end of file >-diff --git a/dist/less-1.1.2.js b/dist/less-1.1.2.js >-deleted file mode 100644 >-index 32a5e053c05ad19a94e71fd6390d8117597cbdd4..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.2.js >-+++ /dev/null >-@@ -1,2712 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.2 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof(window) === 'undefined') { >-- less = exports, >-- tree = require('less/tree'); >--} else { >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[A-Za-z-]+/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e) } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '&' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- if (match = /^([.#: \w-]+)[\s\n]*\{/.exec(chunks[j])) { >-- i += match[0].length - 1; >-- selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])]; >-- } else { >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page|@-[-a-z]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (typeof(window) !== 'undefined') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args) { >-- this.name = name; >-- this.args = args; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- return tree.functions[this.name].apply(tree.functions, args); >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else if (rgb.length == 8) { >-- this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0; >-- this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- } >--}; >-- >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value.trim(); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('less/tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > 1) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- for (var s = 0; s < this.selectors.length; s++) { >-- for (var c = 0; c < context.length; c++) { >-- paths.push(context[c].concat([this.selectors[s]])); >-- } >-- } >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- } >--}; >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- if (this.elements[0].value === other.elements[0].value) { >-- return true; >-- } else { >-- return false; >-- } >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/|file:\/|data:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--require('less/tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('less/tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- styles[i].type = 'text/css'; >-- styles[i].innerHTML = tree.toCSS(); >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.2.min.js b/dist/less-1.1.2.min.js >-deleted file mode 100644 >-index 9b2fc8a43b49f4ca70aa04254807640d97f39fb5..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.2.min.js >-+++ /dev/null >-@@ -1,16 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.2 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--// >--// LESS - Leaner CSS v1.1.2 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function v(a,b){var c="less-error-message:"+p(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,q([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}function u(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function t(a){return a&&a.parentNode.removeChild(a)}function s(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){u("browser doesn't support AJAX.");return null}}function r(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=s(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function q(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||p(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(u("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function p(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i),r(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())q(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return v(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),t(document.getElementById("less-error-message:"+p(i)))}catch(a){v(a,i)}})}catch(h){v(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){a[b].type="text/css",a[b].innerHTML=d.toCSS()})}function c(b){return a.less[b.split("/")[1]]}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else for(;;){if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof a=="undefined"?(d=exports,e=c("less/tree")):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={}),d.Parser=function(a){function t(a){return typeof a=="string"?b.charAt(c)===a:a.test(j[f])?!0:!1}function s(a){var d,e,g,h,i,m,n,o;if(a instanceof Function)return a.call(l.parsers);if(typeof a=="string")d=b.charAt(c)===a?a:null,g=1,r();else{r();if(d=a.exec(j[f]))g=d[0].length;else return null}if(d){o=c+=g,m=c+j[f].length-g;while(c<m){h=b.charCodeAt(c);if(h!==32&&h!==10&&h!==9)break;c++}j[f]=j[f].slice(g+(c-o)),k=c,j[f].length===0&&f<j.length-1&&f++;return typeof d=="string"?d:d.length===1?d[0]:d}}function r(){c>k&&(j[f]=j[f].slice(c-k),k=c)}function q(){j[f]=g,c=h,k=c}function p(){g=j[f],h=c,k=c}var b,c,f,g,h,i,j,k,l,m=this,n=function(){},o=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&n()},a)}};this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null;return l={imports:o,parse:function(d,g){var h,l,m,o,p,q,r=[],t,u=null;c=f=k=i=0,j=[],b=d.replace(/\r\n/g,"\n"),j=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),h=new e.Ruleset([],s(this.parsers.primary)),h.root=!0,h.toCSS=function(c){var d,f,g;return function(g,h){function n(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var i=[];g=g||{},typeof h=="object"&&!Array.isArray(h)&&(h=Object.keys(h).map(function(a){var b=h[a];b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b]));return new e.Rule("@"+a,b,!1,0)}),i=[new e.Ruleset(null,h)]);try{var j=c.call(this,{frames:i}).toCSS([],{compress:g.compress||!1})}catch(k){f=b.split("\n"),d=n(k.index);for(var l=k.index,m=-1;l>=0&&b.charAt(l)!=="\n";l--)m++;throw{type:k.type,message:k.message,filename:a.filename,index:k.index,line:typeof d=="number"?d+1:null,callLine:k.call&&n(k.call)+1,callExtract:f[n(k.call)],stack:k.stack,column:m,extract:[f[d-1],f[d],f[d+1]]}}return g.compress?j.replace(/(\s)+/g,"$1"):j}}(h.eval);if(c<b.length-1){c=i,q=b.split("\n"),p=(b.slice(0,c).match(/\n/g)||"").length+1;for(var v=c,w=-1;v>=0&&b.charAt(v)!=="\n";v--)w++;u={name:"ParseError",message:"Syntax Error on line "+p,index:c,filename:a.filename,line:p,column:w,extract:[q[p-2],q[p-1],q[p]]}}this.imports.queue.length>0?n=function(){g(u,h)}:g(u,h)},parsers:{primary:function(){var a,b=[];while((a=s(this.mixin.definition)||s(this.rule)||s(this.ruleset)||s(this.mixin.call)||s(this.comment)||s(this.directive))||s(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(c)==="/"){if(b.charAt(c+1)==="/")return new e.Comment(s(/^\/\/.*/),!0);if(a=s(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)}},entities:{quoted:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==='"'||b.charAt(d)==="'"){f&&s("~");if(a=s(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],f)}},keyword:function(){var a;if(a=s(/^[A-Za-z-]+/))return new e.Keyword(a)},call:function(){var a,b;if(!!(a=/^([\w-]+|%)\(/.exec(j[f]))){a=a[1].toLowerCase();if(a==="url")return null;c+=a.length;if(a==="alpha")return s(this.alpha);s("("),b=s(this.entities.arguments);if(!s(")"))return;if(a)return new e.Call(a,b)}},arguments:function(){var a=[],b;while(b=s(this.expression)){a.push(b);if(!s(","))break}return a},literal:function(){return s(this.entities.dimension)||s(this.entities.color)||s(this.entities.quoted)},url:function(){var a;if(b.charAt(c)==="u"&&!!s(/^url\(/)){a=s(this.entities.quoted)||s(this.entities.variable)||s(this.entities.dataURI)||s(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!s(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),o.paths)}},dataURI:function(){var a;if(s(/^data:/)){a={},a.mime=s(/^[^\/]+\/[^,;)]+/)||"",a.charset=s(/^;\s*charset=[^,;)]+/)||"",a.base64=s(/^;\s*base64/)||"",a.data=s(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,d=c;if(b.charAt(c)==="@"&&(a=s(/^@@?[\w-]+/)))return new e.Variable(a,d)},color:function(){var a;if(b.charAt(c)==="#"&&(a=s(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,d=b.charCodeAt(c);if(!(d>57||d<45||d===47))if(a=s(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==="`"){f&&s("~");if(a=s(/^`([^`]*)`/))return new e.JavaScript(a[1],c,f)}}},variable:function(){var a;if(b.charAt(c)==="@"&&(a=s(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!!t(/^[@\w.%-]+\/[@\w.-]+/)&&(a=s(this.entity))&&s("/")&&(b=s(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],d,f,g,h=c,i=b.charAt(c);if(i==="."||i==="#"){while(d=s(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(f,d)),f=s(">");s("(")&&(g=s(this.entities.arguments))&&s(")");if(a.length>0&&(s(";")||t("}")))return new e.mixin.Call(a,g,h)}},definition:function(){var a,d=[],f,g,h,i;if(!(b.charAt(c)!=="."&&b.charAt(c)!=="#"||t(/^[^{]*(;|})/)))if(f=s(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=f[1];while(h=s(this.entities.variable)||s(this.entities.literal)||s(this.entities.keyword)){if(h instanceof e.Variable)if(s(":"))if(i=s(this.expression))d.push({name:h.name,value:i});else throw new Error("Expected value");else d.push({name:h.name});else d.push({value:h});if(!s(","))break}if(!s(")"))throw new Error("Expected )");g=s(this.block);if(g)return new e.mixin.Definition(a,d,g)}}},entity:function(){return s(this.entities.literal)||s(this.entities.variable)||s(this.entities.url)||s(this.entities.call)||s(this.entities.keyword)||s(this.entities.javascript)||s(this.comment)},end:function(){return s(";")||t("}")},alpha:function(){var a;if(!!s(/^opacity=/i))if(a=s(/^\d+/)||s(this.entities.variable)){if(!s(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,c;c=s(this.combinator),a=s(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||s("*")||s(this.attribute)||s(/^\([^)@]+\)/);if(a)return new e.Element(c,a)},combinator:function(){var a,d=b.charAt(c);if(d===">"||d==="&"||d==="+"||d==="~"){c++;while(b.charAt(c)===" ")c++;return new e.Combinator(d)}if(d===":"&&b.charAt(c+1)===":"){c+=2;while(b.charAt(c)===" ")c++;return new e.Combinator("::")}return b.charAt(c-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,d,f=[],g,h;while(d=s(this.element)){g=b.charAt(c),f.push(d);if(g==="{"||g==="}"||g===";"||g===",")break}if(f.length>0)return new e.Selector(f)},tag:function(){return s(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||s("*")},attribute:function(){var a="",b,c,d;if(!!s("[")){if(b=s(/^[a-zA-Z-]+/)||s(this.entities.quoted))(d=s(/^[|~*$^]?=/))&&(c=s(this.entities.quoted)||s(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!s("]"))return;if(a)return"["+a+"]"}},block:function(){var a;if(s("{")&&(a=s(this.primary))&&s("}"))return a},ruleset:function(){var a=[],b,d,g;p();if(g=/^([.#: \w-]+)[\s\n]*\{/.exec(j[f]))c+=g[0].length-1,a=[new e.Selector([new e.Element(null,g[1])])];else while(b=s(this.selector)){a.push(b),s(this.comment);if(!s(","))break;s(this.comment)}if(a.length>0&&(d=s(this.block)))return new e.Ruleset(a,d);i=c,q()},rule:function(){var a,d,g=b.charAt(c),k,l;p();if(g!=="."&&g!=="#"&&g!=="&")if(a=s(this.variable)||s(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(j[f]))?(c+=l[0].length-1,d=new e.Anonymous(l[1])):a==="font"?d=s(this.font):d=s(this.value),k=s(this.important);if(d&&s(this.end))return new e.Rule(a,d,k,h);i=c,q()}},"import":function(){var a;if(s(/^@import\s+/)&&(a=s(this.entities.quoted)||s(this.entities.url))&&s(";"))return new e.Import(a,o)},directive:function(){var a,d,f,g;if(b.charAt(c)==="@"){if(d=s(this["import"]))return d;if(a=s(/^@media|@page|@-[-a-z]+/)){g=(s(/^[^{]+/)||"").trim();if(f=s(this.block))return new e.Directive(a+" "+g,f)}else if(a=s(/^@[-a-z]+/))if(a==="@font-face"){if(f=s(this.block))return new e.Directive(a,f)}else if((d=s(this.entity))&&s(";"))return new e.Directive(a,d)}},font:function(){var a=[],b=[],c,d,f,g;while(g=s(this.shorthand)||s(this.entity))b.push(g);a.push(new e.Expression(b));if(s(","))while(g=s(this.expression)){a.push(g);if(!s(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=s(this.expression)){b.push(a);if(!s(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(c)==="!")return s(/^! *important/)},sub:function(){var a;if(s("(")&&(a=s(this.expression))&&s(")"))return a},multiplication:function(){var a,b,c,d;if(a=s(this.operand)){while((c=s("/")||s("*"))&&(b=s(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,d,f,g;if(a=s(this.multiplication)){while((f=s(/^[-+]\s+/)||b.charAt(c-1)!=" "&&(s("+")||s("-")))&&(d=s(this.multiplication)))g=new e.Operation(f,[g||a,d]);return g||a}},operand:function(){var a,d=b.charAt(c+1);b.charAt(c)==="-"&&(d==="@"||d==="(")&&(a=s("-"));var f=s(this.sub)||s(this.entities.dimension)||s(this.entities.color)||s(this.entities.variable)||s(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),f]):f},expression:function(){var a,b,c=[],d;while(a=s(this.addition)||s(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=s(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}},typeof a!="undefined"&&(d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)}),function(a){function d(a){return Math.min(1,Math.max(0,a))}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){a=a<0?a+1:a>1?a-1:a;return a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();e.s+=c.value/100,e.s=d(e.s);return b(e)},desaturate:function(a,c){var e=a.toHSL();e.s-=c.value/100,e.s=d(e.s);return b(e)},lighten:function(a,c){var e=a.toHSL();e.l+=c.value/100,e.l=d(e.l);return b(e)},darken:function(a,c){var e=a.toHSL();e.l-=c.value/100,e.l=d(e.l);return b(e)},fadein:function(a,c){var e=a.toHSL();e.a+=c.value/100,e.a=d(e.a);return b(e)},fadeout:function(a,c){var e=a.toHSL();e.a-=c.value/100,e.a=d(e.a);return b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;d.h=e<0?360+e:e;return b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});d=d.replace(/%%/g,"%");return new a.Quoted('"'+d+'"',d)},round:function(b){if(b instanceof a.Dimension)return new a.Dimension(Math.round(c(b)),b.unit);if(typeof b=="number")return Math.round(b);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}}}}(c("less/tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(){return this}}}(c("less/tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Call=function(a,b){this.name=a,this.args=b},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});return this.name in a.functions?a.functions[this.name].apply(a.functions,c):new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")")},toCSS:function(a){return this.eval(a).toCSS()}}}(c("less/tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):a.length==8?(this.alpha=parseInt(a.substring(0,2),16)/255,this.rgb=a.substr(2).match(/.{2}/g).map(function(a){return parseInt(a,16)})):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16);return a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}}}}(c("less/tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("less/tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){if(this.ruleset){this.ruleset.root=!0;return this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")}return this.name+" "+this.value.toCSS()+";\n"},eval:function(a){a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift();return this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("less/tree")),function(a){a.Element=function(b,c){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c.trim()},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("less/tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("less/tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("less/tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("less/tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("less/tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments).rules),e=!0}catch(h){throw{message:h.message,index:h.index,stack:h.stack,call:this.index}}if(e)return d;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);d.rules.unshift(new a.Rule("@arguments",(new a.Expression(f)).eval(b)));return(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("less/tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("less/tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return f.value||f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("less/tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("less/tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);b.frames.shift();return c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c);return b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();if(g in this._lookups)return this._lookups[g];this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>1?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}});return this._lookups[g]=d},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;if(!this.root)if(b.length===0)g=this.selectors.map(function(a){return[a]});else for(var j=0;j<this.selectors.length;j++)for(var k=0;k<b.length;k++)g.push(b[k].concat([this.selectors[j]]));for(var l=0;l<this.rules.length;l++)i=this.rules[l],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f);return d.join("")+(c.compress?"\n":"")}}}(c("less/tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){return this.elements[0].value===a.elements[0].value?!0:!1},a.Selector.prototype.toCSS=function(a){if(this._css)return this._css;return this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("less/tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(!/^(?:https?:\/|file:\/|data:\/)?\//.test(b.value)&&c.length>0&&typeof a!="undefined"&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("less/tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("less/tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){ >--if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("less/tree")),c("less/tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},c("less/tree").jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)};var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c){a&&q(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e){e.local?u("loading "+d.href+" from cache."):(u("parsed "+d.href+" successfully."),q(a.toCSS(),d,e.lastModified)),u("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&u("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window) >-\ No newline at end of file >-diff --git a/dist/less-1.1.3.js b/dist/less-1.1.3.js >-deleted file mode 100644 >-index cc80101d9e5b774b695cfb628a198617a0ebe5f8..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.3.js >-+++ /dev/null >-@@ -1,2721 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.3 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof(window) === 'undefined') { >-- less = exports, >-- tree = require('less/tree'); >--} else { >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[A-Za-z-]+/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e) } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '&' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- if (match = /^([.#: \w-]+)[\s\n]*\{/.exec(chunks[j])) { >-- i += match[0].length - 1; >-- selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])]; >-- } else { >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page|@-[-a-z]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (typeof(window) !== 'undefined') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { message: "error evaluating function `" + this.name + "`", >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else if (rgb.length == 8) { >-- this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0; >-- this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- } >--}; >-- >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value.trim(); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('less/tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > 1) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- for (var s = 0; s < this.selectors.length; s++) { >-- for (var c = 0; c < context.length; c++) { >-- paths.push(context[c].concat([this.selectors[s]])); >-- } >-- } >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- } >--}; >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- if (this.elements[0].value === other.elements[0].value) { >-- return true; >-- } else { >-- return false; >-- } >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/|file:\/|data:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--require('less/tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('less/tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- styles[i].type = 'text/css'; >-- styles[i].innerHTML = tree.toCSS(); >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.3.min.js b/dist/less-1.1.3.min.js >-deleted file mode 100644 >-index 6e4d5cff5465586717cfcc8d4a1d9dc5cdbda9dd..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.3.min.js >-+++ /dev/null >-@@ -1,16 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.3 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--// >--// LESS - Leaner CSS v1.1.3 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function v(a,b){var c="less-error-message:"+p(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,q([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}function u(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function t(a){return a&&a.parentNode.removeChild(a)}function s(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){u("browser doesn't support AJAX.");return null}}function r(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=s(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function q(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||p(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(u("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function p(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i),r(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())q(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return v(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),t(document.getElementById("less-error-message:"+p(i)))}catch(a){v(a,i)}})}catch(h){v(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){a[b].type="text/css",a[b].innerHTML=d.toCSS()})}function c(b){return a.less[b.split("/")[1]]}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else for(;;){if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof a=="undefined"?(d=exports,e=c("less/tree")):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={}),d.Parser=function(a){function t(a){return typeof a=="string"?b.charAt(c)===a:a.test(j[f])?!0:!1}function s(a){var d,e,g,h,i,m,n,o;if(a instanceof Function)return a.call(l.parsers);if(typeof a=="string")d=b.charAt(c)===a?a:null,g=1,r();else{r();if(d=a.exec(j[f]))g=d[0].length;else return null}if(d){o=c+=g,m=c+j[f].length-g;while(c<m){h=b.charCodeAt(c);if(h!==32&&h!==10&&h!==9)break;c++}j[f]=j[f].slice(g+(c-o)),k=c,j[f].length===0&&f<j.length-1&&f++;return typeof d=="string"?d:d.length===1?d[0]:d}}function r(){c>k&&(j[f]=j[f].slice(c-k),k=c)}function q(){j[f]=g,c=h,k=c}function p(){g=j[f],h=c,k=c}var b,c,f,g,h,i,j,k,l,m=this,n=function(){},o=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&n()},a)}};this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null;return l={imports:o,parse:function(d,g){var h,l,m,o,p,q,r=[],t,u=null;c=f=k=i=0,j=[],b=d.replace(/\r\n/g,"\n"),j=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),h=new e.Ruleset([],s(this.parsers.primary)),h.root=!0,h.toCSS=function(c){var d,f,g;return function(g,h){function n(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var i=[];g=g||{},typeof h=="object"&&!Array.isArray(h)&&(h=Object.keys(h).map(function(a){var b=h[a];b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b]));return new e.Rule("@"+a,b,!1,0)}),i=[new e.Ruleset(null,h)]);try{var j=c.call(this,{frames:i}).toCSS([],{compress:g.compress||!1})}catch(k){f=b.split("\n"),d=n(k.index);for(var l=k.index,m=-1;l>=0&&b.charAt(l)!=="\n";l--)m++;throw{type:k.type,message:k.message,filename:a.filename,index:k.index,line:typeof d=="number"?d+1:null,callLine:k.call&&n(k.call)+1,callExtract:f[n(k.call)],stack:k.stack,column:m,extract:[f[d-1],f[d],f[d+1]]}}return g.compress?j.replace(/(\s)+/g,"$1"):j}}(h.eval);if(c<b.length-1){c=i,q=b.split("\n"),p=(b.slice(0,c).match(/\n/g)||"").length+1;for(var v=c,w=-1;v>=0&&b.charAt(v)!=="\n";v--)w++;u={name:"ParseError",message:"Syntax Error on line "+p,index:c,filename:a.filename,line:p,column:w,extract:[q[p-2],q[p-1],q[p]]}}this.imports.queue.length>0?n=function(){g(u,h)}:g(u,h)},parsers:{primary:function(){var a,b=[];while((a=s(this.mixin.definition)||s(this.rule)||s(this.ruleset)||s(this.mixin.call)||s(this.comment)||s(this.directive))||s(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(c)==="/"){if(b.charAt(c+1)==="/")return new e.Comment(s(/^\/\/.*/),!0);if(a=s(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)}},entities:{quoted:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==='"'||b.charAt(d)==="'"){f&&s("~");if(a=s(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],f)}},keyword:function(){var a;if(a=s(/^[A-Za-z-]+/))return new e.Keyword(a)},call:function(){var a,b,d=c;if(!!(a=/^([\w-]+|%)\(/.exec(j[f]))){a=a[1].toLowerCase();if(a==="url")return null;c+=a.length;if(a==="alpha")return s(this.alpha);s("("),b=s(this.entities.arguments);if(!s(")"))return;if(a)return new e.Call(a,b,d)}},arguments:function(){var a=[],b;while(b=s(this.expression)){a.push(b);if(!s(","))break}return a},literal:function(){return s(this.entities.dimension)||s(this.entities.color)||s(this.entities.quoted)},url:function(){var a;if(b.charAt(c)==="u"&&!!s(/^url\(/)){a=s(this.entities.quoted)||s(this.entities.variable)||s(this.entities.dataURI)||s(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!s(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),o.paths)}},dataURI:function(){var a;if(s(/^data:/)){a={},a.mime=s(/^[^\/]+\/[^,;)]+/)||"",a.charset=s(/^;\s*charset=[^,;)]+/)||"",a.base64=s(/^;\s*base64/)||"",a.data=s(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,d=c;if(b.charAt(c)==="@"&&(a=s(/^@@?[\w-]+/)))return new e.Variable(a,d)},color:function(){var a;if(b.charAt(c)==="#"&&(a=s(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,d=b.charCodeAt(c);if(!(d>57||d<45||d===47))if(a=s(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==="`"){f&&s("~");if(a=s(/^`([^`]*)`/))return new e.JavaScript(a[1],c,f)}}},variable:function(){var a;if(b.charAt(c)==="@"&&(a=s(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!!t(/^[@\w.%-]+\/[@\w.-]+/)&&(a=s(this.entity))&&s("/")&&(b=s(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],d,f,g,h=c,i=b.charAt(c);if(i==="."||i==="#"){while(d=s(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(f,d)),f=s(">");s("(")&&(g=s(this.entities.arguments))&&s(")");if(a.length>0&&(s(";")||t("}")))return new e.mixin.Call(a,g,h)}},definition:function(){var a,d=[],f,g,h,i;if(!(b.charAt(c)!=="."&&b.charAt(c)!=="#"||t(/^[^{]*(;|})/)))if(f=s(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=f[1];while(h=s(this.entities.variable)||s(this.entities.literal)||s(this.entities.keyword)){if(h instanceof e.Variable)if(s(":"))if(i=s(this.expression))d.push({name:h.name,value:i});else throw new Error("Expected value");else d.push({name:h.name});else d.push({value:h});if(!s(","))break}if(!s(")"))throw new Error("Expected )");g=s(this.block);if(g)return new e.mixin.Definition(a,d,g)}}},entity:function(){return s(this.entities.literal)||s(this.entities.variable)||s(this.entities.url)||s(this.entities.call)||s(this.entities.keyword)||s(this.entities.javascript)||s(this.comment)},end:function(){return s(";")||t("}")},alpha:function(){var a;if(!!s(/^\(opacity=/i))if(a=s(/^\d+/)||s(this.entities.variable)){if(!s(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,c;c=s(this.combinator),a=s(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||s("*")||s(this.attribute)||s(/^\([^)@]+\)/);if(a)return new e.Element(c,a)},combinator:function(){var a,d=b.charAt(c);if(d===">"||d==="&"||d==="+"||d==="~"){c++;while(b.charAt(c)===" ")c++;return new e.Combinator(d)}if(d===":"&&b.charAt(c+1)===":"){c+=2;while(b.charAt(c)===" ")c++;return new e.Combinator("::")}return b.charAt(c-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,d,f=[],g,h;while(d=s(this.element)){g=b.charAt(c),f.push(d);if(g==="{"||g==="}"||g===";"||g===",")break}if(f.length>0)return new e.Selector(f)},tag:function(){return s(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||s("*")},attribute:function(){var a="",b,c,d;if(!!s("[")){if(b=s(/^[a-zA-Z-]+/)||s(this.entities.quoted))(d=s(/^[|~*$^]?=/))&&(c=s(this.entities.quoted)||s(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!s("]"))return;if(a)return"["+a+"]"}},block:function(){var a;if(s("{")&&(a=s(this.primary))&&s("}"))return a},ruleset:function(){var a=[],b,d,g;p();if(g=/^([.#: \w-]+)[\s\n]*\{/.exec(j[f]))c+=g[0].length-1,a=[new e.Selector([new e.Element(null,g[1])])];else while(b=s(this.selector)){a.push(b),s(this.comment);if(!s(","))break;s(this.comment)}if(a.length>0&&(d=s(this.block)))return new e.Ruleset(a,d);i=c,q()},rule:function(){var a,d,g=b.charAt(c),k,l;p();if(g!=="."&&g!=="#"&&g!=="&")if(a=s(this.variable)||s(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(j[f]))?(c+=l[0].length-1,d=new e.Anonymous(l[1])):a==="font"?d=s(this.font):d=s(this.value),k=s(this.important);if(d&&s(this.end))return new e.Rule(a,d,k,h);i=c,q()}},"import":function(){var a;if(s(/^@import\s+/)&&(a=s(this.entities.quoted)||s(this.entities.url))&&s(";"))return new e.Import(a,o)},directive:function(){var a,d,f,g;if(b.charAt(c)==="@"){if(d=s(this["import"]))return d;if(a=s(/^@media|@page|@-[-a-z]+/)){g=(s(/^[^{]+/)||"").trim();if(f=s(this.block))return new e.Directive(a+" "+g,f)}else if(a=s(/^@[-a-z]+/))if(a==="@font-face"){if(f=s(this.block))return new e.Directive(a,f)}else if((d=s(this.entity))&&s(";"))return new e.Directive(a,d)}},font:function(){var a=[],b=[],c,d,f,g;while(g=s(this.shorthand)||s(this.entity))b.push(g);a.push(new e.Expression(b));if(s(","))while(g=s(this.expression)){a.push(g);if(!s(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=s(this.expression)){b.push(a);if(!s(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(c)==="!")return s(/^! *important/)},sub:function(){var a;if(s("(")&&(a=s(this.expression))&&s(")"))return a},multiplication:function(){var a,b,c,d;if(a=s(this.operand)){while((c=s("/")||s("*"))&&(b=s(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,d,f,g;if(a=s(this.multiplication)){while((f=s(/^[-+]\s+/)||b.charAt(c-1)!=" "&&(s("+")||s("-")))&&(d=s(this.multiplication)))g=new e.Operation(f,[g||a,d]);return g||a}},operand:function(){var a,d=b.charAt(c+1);b.charAt(c)==="-"&&(d==="@"||d==="(")&&(a=s("-"));var f=s(this.sub)||s(this.entities.dimension)||s(this.entities.color)||s(this.entities.variable)||s(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),f]):f},expression:function(){var a,b,c=[],d;while(a=s(this.addition)||s(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=s(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}},typeof a!="undefined"&&(d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)}),function(a){function d(a){return Math.min(1,Math.max(0,a))}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){a=a<0?a+1:a>1?a-1:a;return a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();e.s+=c.value/100,e.s=d(e.s);return b(e)},desaturate:function(a,c){var e=a.toHSL();e.s-=c.value/100,e.s=d(e.s);return b(e)},lighten:function(a,c){var e=a.toHSL();e.l+=c.value/100,e.l=d(e.l);return b(e)},darken:function(a,c){var e=a.toHSL();e.l-=c.value/100,e.l=d(e.l);return b(e)},fadein:function(a,c){var e=a.toHSL();e.a+=c.value/100,e.a=d(e.a);return b(e)},fadeout:function(a,c){var e=a.toHSL();e.a-=c.value/100,e.a=d(e.a);return b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;d.h=e<0?360+e:e;return b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});d=d.replace(/%%/g,"%");return new a.Quoted('"'+d+'"',d)},round:function(b){if(b instanceof a.Dimension)return new a.Dimension(Math.round(c(b)),b.unit);if(typeof b=="number")return Math.round(b);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}}}}(c("less/tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){this.value.eval&&(this.value=this.value.eval(a));return this}}}(c("less/tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Call=function(a,b,c){this.name=a,this.args=b,this.index=c},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{message:"error evaluating function `"+this.name+"`",index:this.index}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("less/tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):a.length==8?(this.alpha=parseInt(a.substring(0,2),16)/255,this.rgb=a.substr(2).match(/.{2}/g).map(function(a){return parseInt(a,16)})):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16);return a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}}}}(c("less/tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("less/tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){if(this.ruleset){this.ruleset.root=!0;return this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")}return this.name+" "+this.value.toCSS()+";\n"},eval:function(a){a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift();return this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("less/tree")),function(a){a.Element=function(b,c){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c.trim()},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("less/tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("less/tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("less/tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("less/tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("less/tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments).rules),e=!0}catch(h){throw{message:h.message,index:h.index,stack:h.stack,call:this.index}}if(e)return d;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);d.rules.unshift(new a.Rule("@arguments",(new a.Expression(f)).eval(b)));return(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("less/tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("less/tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return f.value||f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("less/tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("less/tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);b.frames.shift();return c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c);return b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();if(g in this._lookups)return this._lookups[g];this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>1?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}});return this._lookups[g]=d},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;if(!this.root)if(b.length===0)g=this.selectors.map(function(a){return[a]});else for(var j=0;j<this.selectors.length;j++)for(var k=0;k<b.length;k++)g.push(b[k].concat([this.selectors[j]]));for(var l=0;l<this.rules.length;l++)i=this.rules[l],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f);return d.join("")+(c.compress?"\n":"")}}}(c("less/tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){return this.elements[0].value===a.elements[0].value?!0:!1},a.Selector.prototype.toCSS=function(a){if(this._css)return this._css;return this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("less/tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(!/^(?:https?:\/|file:\/|data:\/)?\//.test(b.value)&&c.length>0&&typeof a!="undefined"&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("less/tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("less/tree")),function(a){a.Variable=function(a,b){this.name=a,this >--.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("less/tree")),c("less/tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},c("less/tree").jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)};var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c){a&&q(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e){e.local?u("loading "+d.href+" from cache."):(u("parsed "+d.href+" successfully."),q(a.toCSS(),d,e.lastModified)),u("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&u("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window) >-\ No newline at end of file >-diff --git a/dist/less-1.1.4.js b/dist/less-1.1.4.js >-deleted file mode 100644 >-index cb27c431255456f32181430eadf25d54edef3913..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.4.js >-+++ /dev/null >-@@ -1,2769 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.4 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof(window) === 'undefined') { >-- less = exports, >-- tree = require('less/tree'); >--} else { >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[A-Za-z-]+/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/) || $(/^(?:\d*\.)?\d+%/); >-- >-- if (e) { return new(tree.Element)(c, e) } >-- >-- if (c.value && c.value[0] === '&') { >-- return new(tree.Element)(c, null); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- if (match = /^([.#:% \w-]+)[\s\n]*\{/.exec(chunks[j])) { >-- i += match[0].length - 1; >-- selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])]; >-- } else { >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page/) || $(/^@(?:-webkit-)?keyframes/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (typeof(window) !== 'undefined') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { message: "error evaluating function `" + this.name + "`", >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else if (rgb.length == 8) { >-- this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0; >-- this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- } >--}; >-- >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value ? value.trim() : ""; >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('less/tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > 1) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors( paths, context, this.selectors ); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value[0] === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- if (this.elements[0].value === other.elements[0].value) { >-- return true; >-- } else { >-- return false; >-- } >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/|file:\/|data:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--require('less/tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('less/tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- styles[i].type = 'text/css'; >-- styles[i].innerHTML = tree.toCSS(); >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.4.min.js b/dist/less-1.1.4.min.js >-deleted file mode 100644 >-index 182b526fbd896e3e09d6e66569633469d0e74745..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.4.min.js >-+++ /dev/null >-@@ -1,16 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.4 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--// >--// LESS - Leaner CSS v1.1.4 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function u(a,b){var c="less-error-message:"+o(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,p([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}function t(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function s(a){return a&&a.parentNode.removeChild(a)}function r(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){t("browser doesn't support AJAX.");return null}}function q(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var g=r(),h=f?!1:d.async;typeof g.overrideMimeType=="function"&&g.overrideMimeType("text/css"),g.open("GET",a,h),g.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),g.send(null),f?g.status===0?c(g.responseText):e(g.status,a):h?g.onreadystatechange=function(){g.readyState==4&&i(g,c,e)}:i(g,c,e)}function p(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||o(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(h){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&g&&(t("saving "+e+" to cache."),g.setItem(e,a),g.setItem(e+":timestamp",c))}function o(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function n(b,c,e,f){var h=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=g&&g.getItem(i),k=g&&g.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=h.slice(0,h.lastIndexOf("/")+1)+i),q(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())p(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return u(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),s(document.getElementById("less-error-message:"+o(i)))}catch(a){u(a,i)}})}catch(h){u(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function m(a,b){for(var c=0;c<d.sheets.length;c++)n(d.sheets[c],a,b,d.sheets.length-(c+1))}function l(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(j)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){a[b].type="text/css",a[b].innerHTML=d.toCSS()})}function c(b){return a.less[b.split("/")[1]]}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof a=="undefined"?(d=exports,e=c("less/tree")):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={}),d.Parser=function(a){function t(a){return typeof a=="string"?b.charAt(c)===a:a.test(j[f])?!0:!1}function s(a){var d,e,g,h,i,m,n,o;if(a instanceof Function)return a.call(l.parsers);if(typeof a=="string")d=b.charAt(c)===a?a:null,g=1,r();else{r();if(d=a.exec(j[f]))g=d[0].length;else return null}if(d){o=c+=g,m=c+j[f].length-g;while(c<m){h=b.charCodeAt(c);if(h!==32&&h!==10&&h!==9)break;c++}j[f]=j[f].slice(g+(c-o)),k=c,j[f].length===0&&f<j.length-1&&f++;return typeof d=="string"?d:d.length===1?d[0]:d}}function r(){c>k&&(j[f]=j[f].slice(c-k),k=c)}function q(){j[f]=g,c=h,k=c}function p(){g=j[f],h=c,k=c}var b,c,f,g,h,i,j,k,l,m=this,n=function(){},o=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&n()},a)}};this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null;return l={imports:o,parse:function(d,g){var h,l,m,o,p,q,r=[],t,u=null;c=f=k=i=0,j=[],b=d.replace(/\r\n/g,"\n"),j=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),h=new e.Ruleset([],s(this.parsers.primary)),h.root=!0,h.toCSS=function(c){var d,f,g;return function(g,h){function n(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var i=[];g=g||{},typeof h=="object"&&!Array.isArray(h)&&(h=Object.keys(h).map(function(a){var b=h[a];b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b]));return new e.Rule("@"+a,b,!1,0)}),i=[new e.Ruleset(null,h)]);try{var j=c.call(this,{frames:i}).toCSS([],{compress:g.compress||!1})}catch(k){f=b.split("\n"),d=n(k.index);for(var l=k.index,m=-1;l>=0&&b.charAt(l)!=="\n";l--)m++;throw{type:k.type,message:k.message,filename:a.filename,index:k.index,line:typeof d=="number"?d+1:null,callLine:k.call&&n(k.call)+1,callExtract:f[n(k.call)],stack:k.stack,column:m,extract:[f[d-1],f[d],f[d+1]]}}return g.compress?j.replace(/(\s)+/g,"$1"):j}}(h.eval);if(c<b.length-1){c=i,q=b.split("\n"),p=(b.slice(0,c).match(/\n/g)||"").length+1;for(var v=c,w=-1;v>=0&&b.charAt(v)!=="\n";v--)w++;u={name:"ParseError",message:"Syntax Error on line "+p,index:c,filename:a.filename,line:p,column:w,extract:[q[p-2],q[p-1],q[p]]}}this.imports.queue.length>0?n=function(){g(u,h)}:g(u,h)},parsers:{primary:function(){var a,b=[];while((a=s(this.mixin.definition)||s(this.rule)||s(this.ruleset)||s(this.mixin.call)||s(this.comment)||s(this.directive))||s(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(c)==="/"){if(b.charAt(c+1)==="/")return new e.Comment(s(/^\/\/.*/),!0);if(a=s(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)}},entities:{quoted:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==='"'||b.charAt(d)==="'"){f&&s("~");if(a=s(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],f)}},keyword:function(){var a;if(a=s(/^[A-Za-z-]+/))return new e.Keyword(a)},call:function(){var a,b,d=c;if(!!(a=/^([\w-]+|%)\(/.exec(j[f]))){a=a[1].toLowerCase();if(a==="url")return null;c+=a.length;if(a==="alpha")return s(this.alpha);s("("),b=s(this.entities.arguments);if(!s(")"))return;if(a)return new e.Call(a,b,d)}},arguments:function(){var a=[],b;while(b=s(this.expression)){a.push(b);if(!s(","))break}return a},literal:function(){return s(this.entities.dimension)||s(this.entities.color)||s(this.entities.quoted)},url:function(){var a;if(b.charAt(c)==="u"&&!!s(/^url\(/)){a=s(this.entities.quoted)||s(this.entities.variable)||s(this.entities.dataURI)||s(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!s(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),o.paths)}},dataURI:function(){var a;if(s(/^data:/)){a={},a.mime=s(/^[^\/]+\/[^,;)]+/)||"",a.charset=s(/^;\s*charset=[^,;)]+/)||"",a.base64=s(/^;\s*base64/)||"",a.data=s(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,d=c;if(b.charAt(c)==="@"&&(a=s(/^@@?[\w-]+/)))return new e.Variable(a,d)},color:function(){var a;if(b.charAt(c)==="#"&&(a=s(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,d=b.charCodeAt(c);if(!(d>57||d<45||d===47))if(a=s(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)==="`"){f&&s("~");if(a=s(/^`([^`]*)`/))return new e.JavaScript(a[1],c,f)}}},variable:function(){var a;if(b.charAt(c)==="@"&&(a=s(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!!t(/^[@\w.%-]+\/[@\w.-]+/)&&(a=s(this.entity))&&s("/")&&(b=s(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],d,f,g,h=c,i=b.charAt(c);if(i==="."||i==="#"){while(d=s(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(f,d)),f=s(">");s("(")&&(g=s(this.entities.arguments))&&s(")");if(a.length>0&&(s(";")||t("}")))return new e.mixin.Call(a,g,h)}},definition:function(){var a,d=[],f,g,h,i;if(!(b.charAt(c)!=="."&&b.charAt(c)!=="#"||t(/^[^{]*(;|})/)))if(f=s(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=f[1];while(h=s(this.entities.variable)||s(this.entities.literal)||s(this.entities.keyword)){if(h instanceof e.Variable)if(s(":"))if(i=s(this.expression))d.push({name:h.name,value:i});else throw new Error("Expected value");else d.push({name:h.name});else d.push({value:h});if(!s(","))break}if(!s(")"))throw new Error("Expected )");g=s(this.block);if(g)return new e.mixin.Definition(a,d,g)}}},entity:function(){return s(this.entities.literal)||s(this.entities.variable)||s(this.entities.url)||s(this.entities.call)||s(this.entities.keyword)||s(this.entities.javascript)||s(this.comment)},end:function(){return s(";")||t("}")},alpha:function(){var a;if(!!s(/^\(opacity=/i))if(a=s(/^\d+/)||s(this.entities.variable)){if(!s(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,c;c=s(this.combinator),a=s(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||s("*")||s(this.attribute)||s(/^\([^)@]+\)/)||s(/^(?:\d*\.)?\d+%/);if(a)return new e.Element(c,a);if(c.value&&c.value[0]==="&")return new e.Element(c,null)},combinator:function(){var a,d=b.charAt(c);if(d===">"||d==="+"||d==="~"){c++;while(b.charAt(c)===" ")c++;return new e.Combinator(d)}if(d==="&"){a="&",c++,b.charAt(c)===" "&&(a="& ");while(b.charAt(c)===" ")c++;return new e.Combinator(a)}if(d===":"&&b.charAt(c+1)===":"){c+=2;while(b.charAt(c)===" ")c++;return new e.Combinator("::")}return b.charAt(c-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,d,f=[],g,h;while(d=s(this.element)){g=b.charAt(c),f.push(d);if(g==="{"||g==="}"||g===";"||g===",")break}if(f.length>0)return new e.Selector(f)},tag:function(){return s(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||s("*")},attribute:function(){var a="",b,c,d;if(!!s("[")){if(b=s(/^[a-zA-Z-]+/)||s(this.entities.quoted))(d=s(/^[|~*$^]?=/))&&(c=s(this.entities.quoted)||s(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!s("]"))return;if(a)return"["+a+"]"}},block:function(){var a;if(s("{")&&(a=s(this.primary))&&s("}"))return a},ruleset:function(){var a=[],b,d,g;p();if(g=/^([.#:% \w-]+)[\s\n]*\{/.exec(j[f]))c+=g[0].length-1,a=[new e.Selector([new e.Element(null,g[1])])];else while(b=s(this.selector)){a.push(b),s(this.comment);if(!s(","))break;s(this.comment)}if(a.length>0&&(d=s(this.block)))return new e.Ruleset(a,d);i=c,q()},rule:function(){var a,d,g=b.charAt(c),k,l;p();if(g!=="."&&g!=="#"&&g!=="&")if(a=s(this.variable)||s(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(j[f]))?(c+=l[0].length-1,d=new e.Anonymous(l[1])):a==="font"?d=s(this.font):d=s(this.value),k=s(this.important);if(d&&s(this.end))return new e.Rule(a,d,k,h);i=c,q()}},"import":function(){var a;if(s(/^@import\s+/)&&(a=s(this.entities.quoted)||s(this.entities.url))&&s(";"))return new e.Import(a,o)},directive:function(){var a,d,f,g;if(b.charAt(c)==="@"){if(d=s(this["import"]))return d;if(a=s(/^@media|@page/)||s(/^@(?:-webkit-)?keyframes/)){g=(s(/^[^{]+/)||"").trim();if(f=s(this.block))return new e.Directive(a+" "+g,f)}else if(a=s(/^@[-a-z]+/))if(a==="@font-face"){if(f=s(this.block))return new e.Directive(a,f)}else if((d=s(this.entity))&&s(";"))return new e.Directive(a,d)}},font:function(){var a=[],b=[],c,d,f,g;while(g=s(this.shorthand)||s(this.entity))b.push(g);a.push(new e.Expression(b));if(s(","))while(g=s(this.expression)){a.push(g);if(!s(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=s(this.expression)){b.push(a);if(!s(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(c)==="!")return s(/^! *important/)},sub:function(){var a;if(s("(")&&(a=s(this.expression))&&s(")"))return a},multiplication:function(){var a,b,c,d;if(a=s(this.operand)){while((c=s("/")||s("*"))&&(b=s(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,d,f,g;if(a=s(this.multiplication)){while((f=s(/^[-+]\s+/)||b.charAt(c-1)!=" "&&(s("+")||s("-")))&&(d=s(this.multiplication)))g=new e.Operation(f,[g||a,d]);return g||a}},operand:function(){var a,d=b.charAt(c+1);b.charAt(c)==="-"&&(d==="@"||d==="(")&&(a=s("-"));var f=s(this.sub)||s(this.entities.dimension)||s(this.entities.color)||s(this.entities.variable)||s(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),f]):f},expression:function(){var a,b,c=[],d;while(a=s(this.addition)||s(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=s(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}},typeof a!="undefined"&&(d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),n({href:a,title:a,type:d.mime},c,!0)}),function(a){function d(a){return Math.min(1,Math.max(0,a))}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){a=a<0?a+1:a>1?a-1:a;return a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();e.s+=c.value/100,e.s=d(e.s);return b(e)},desaturate:function(a,c){var e=a.toHSL();e.s-=c.value/100,e.s=d(e.s);return b(e)},lighten:function(a,c){var e=a.toHSL();e.l+=c.value/100,e.l=d(e.l);return b(e)},darken:function(a,c){var e=a.toHSL();e.l-=c.value/100,e.l=d(e.l);return b(e)},fadein:function(a,c){var e=a.toHSL();e.a+=c.value/100,e.a=d(e.a);return b(e)},fadeout:function(a,c){var e=a.toHSL();e.a-=c.value/100,e.a=d(e.a);return b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;d.h=e<0?360+e:e;return b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});d=d.replace(/%%/g,"%");return new a.Quoted('"'+d+'"',d)},round:function(b){if(b instanceof a.Dimension)return new a.Dimension(Math.round(c(b)),b.unit);if(typeof b=="number")return Math.round(b);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}}}}(c("less/tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){this.value.eval&&(this.value=this.value.eval(a));return this}}}(c("less/tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Call=function(a,b,c){this.name=a,this.args=b,this.index=c},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{message:"error evaluating function `"+this.name+"`",index:this.index}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("less/tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):a.length==8?(this.alpha=parseInt(a.substring(0,2),16)/255,this.rgb=a.substr(2).match(/.{2}/g).map(function(a){return parseInt(a,16)})):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16);return a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}}}}(c("less/tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("less/tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("less/tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){if(this.ruleset){this.ruleset.root=!0;return this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")}return this.name+" "+this.value.toCSS()+";\n"},eval:function(a){a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift();return this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("less/tree")),function(a){a.Element=function(b,c){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c?c.trim():""},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("less/tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("less/tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("less/tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("less/tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("less/tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments).rules),e=!0}catch(h){throw{message:h.message,index:h.index,stack:h.stack,call:this.index}}if(e)return d;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);d.rules.unshift(new a.Rule("@arguments",(new a.Expression(f)).eval(b)));return(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("less/tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("less/tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return f.value||f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("less/tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("less/tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);b.frames.shift();return c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c);return b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();if(g in this._lookups)return this._lookups[g];this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>1?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}});return this._lookups[g]=d},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f);return d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value[0]==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("less/tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){return this.elements[0].value===a.elements[0].value?!0:!1},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("less/tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(!/^(?:https?:\/|file:\/|data:\/)?\//.test(b.value)&&c.length>0&&typeof a!="undefined"&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs >--.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("less/tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("less/tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("less/tree")),c("less/tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},c("less/tree").jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)};var f=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||f?"development":"production"),d.async=!1,d.poll=d.poll||(f?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&m(function(a,b,c){a&&p(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var g;try{g=typeof a.localStorage=="undefined"?null:a.localStorage}catch(h){g=null}var i=document.getElementsByTagName("link"),j=/^text\/(x-)?less$/;d.sheets=[];for(var k=0;k<i.length;k++)(i[k].rel==="stylesheet/less"||i[k].rel.match(/stylesheet/)&&i[k].type.match(j))&&d.sheets.push(i[k]);d.refresh=function(a){var b,c;b=c=new Date,m(function(a,d,e){e.local?t("loading "+d.href+" from cache."):(t("parsed "+d.href+" successfully."),p(a.toCSS(),d,e.lastModified)),t("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&t("css generated in "+(new Date-b)+"ms"),c=new Date},a),l()},d.refreshStyles=l,d.refresh(d.env==="development")})(window) >-\ No newline at end of file >-diff --git a/dist/less-1.1.5.js b/dist/less-1.1.5.js >-deleted file mode 100644 >-index 0f375d70d717e171d4fb1565d1957195f0b5b7c6..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.5.js >-+++ /dev/null >-@@ -1,2805 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.5 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- less = {}; >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page/) || $(/^@(?:-webkit-|-moz-)?keyframes/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { message: "error evaluating function `" + this.name + "`", >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value ? value.trim() : ""; >-- this.index = index; >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors( paths, context, this.selectors ); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (less.mode === 'browser' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--require('./tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('./tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- try { >-- style.innerHTML = css; >-- } catch (_) { >-- style.styleSheets.cssText = css; >-- } >-- style.type = 'text/css'; >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.5.min.js b/dist/less-1.1.5.min.js >-deleted file mode 100644 >-index 49949fbea515608d6c286993fb3b4e5d10935d2d..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.5.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.5 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function c(b){return a.less[b.split("/")[1]]}function l(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(j)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];try{f.innerHTML=e}catch(g){f.styleSheets.cssText=e}f.type="text/css"})}function m(a,b){for(var c=0;c<d.sheets.length;c++)n(d.sheets[c],a,b,d.sheets.length-(c+1))}function n(b,c,e,f){var h=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=g&&g.getItem(i),k=g&&g.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=h.slice(0,h.lastIndexOf("/")+1)+i),q(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())p(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return u(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),s(document.getElementById("less-error-message:"+o(i)))}catch(a){u(a,i)}})}catch(h){u(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function o(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function p(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||o(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(h){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&g&&(t("saving "+e+" to cache."),g.setItem(e,a),g.setItem(e+":timestamp",c))}function q(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var g=r(),h=f?!1:d.async;typeof g.overrideMimeType=="function"&&g.overrideMimeType("text/css"),g.open("GET",a,h),g.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),g.send(null),f?g.status===0?c(g.responseText):e(g.status,a):h?g.onreadystatechange=function(){g.readyState==4&&i(g,c,e)}:i(g,c,e)}function r(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return t("browser doesn't support AJAX."),null}}function s(a){return a&&a.parentNode.removeChild(a)}function t(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function u(a,b){var c="less-error-message:"+o(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,p([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(d={},e=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,e=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={},d.mode="browser"),d.Parser=function(a){function p(){g=j[f],h=c,k=c}function q(){j[f]=g,c=h,k=c}function r(){c>k&&(j[f]=j[f].slice(c-k),k=c)}function s(a){var d,e,g,h,i,m,n,o;if(a instanceof Function)return a.call(l.parsers);if(typeof a=="string")d=b.charAt(c)===a?a:null,g=1,r();else{r();if(d=a.exec(j[f]))g=d[0].length;else return null}if(d){o=c+=g,m=c+j[f].length-g;while(c<m){h=b.charCodeAt(c);if(h!==32&&h!==10&&h!==9)break;c++}return j[f]=j[f].slice(g+(c-o)),k=c,j[f].length===0&&f<j.length-1&&f++,typeof d=="string"?d:d.length===1?d[0]:d}}function t(a){return typeof a=="string"?b.charAt(c)===a:a.test(j[f])?!0:!1}var b,c,f,g,h,i,j,k,l,m=this,n=function(){},o=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&n()},a)}};return this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,l={imports:o,parse:function(d,g){var h,l,m,o,p,q,r=[],t,u=null;c=f=k=i=0,j=[],b=d.replace(/\r\n/g,"\n"),j=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),h=new e.Ruleset([],s(this.parsers.primary)),h.root=!0,h.toCSS=function(c){var d,f,g;return function(g,h){function n(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var i=[];g=g||{},typeof h=="object"&&!Array.isArray(h)&&(h=Object.keys(h).map(function(a){var b=h[a];return b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b])),new e.Rule("@"+a,b,!1,0)}),i=[new e.Ruleset(null,h)]);try{var j=c.call(this,{frames:i}).toCSS([],{compress:g.compress||!1})}catch(k){f=b.split("\n"),d=n(k.index);for(var l=k.index,m=-1;l>=0&&b.charAt(l)!=="\n";l--)m++;throw{type:k.type,message:k.message,filename:a.filename,index:k.index,line:typeof d=="number"?d+1:null,callLine:k.call&&n(k.call)+1,callExtract:f[n(k.call)],stack:k.stack,column:m,extract:[f[d-1],f[d],f[d+1]]}}return g.compress?j.replace(/(\s)+/g,"$1"):j}}(h.eval);if(c<b.length-1){c=i,q=b.split("\n"),p=(b.slice(0,c).match(/\n/g)||"").length+1;for(var v=c,w=-1;v>=0&&b.charAt(v)!=="\n";v--)w++;u={name:"ParseError",message:"Syntax Error on line "+p,index:c,filename:a.filename,line:p,column:w,extract:[q[p-2],q[p-1],q[p]]}}this.imports.queue.length>0?n=function(){g(u,h)}:g(u,h)},parsers:{primary:function(){var a,b=[];while((a=s(this.mixin.definition)||s(this.rule)||s(this.ruleset)||s(this.mixin.call)||s(this.comment)||s(this.directive))||s(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(c)!=="/")return;if(b.charAt(c+1)==="/")return new e.Comment(s(/^\/\/.*/),!0);if(a=s(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)},entities:{quoted:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)!=='"'&&b.charAt(d)!=="'")return;f&&s("~");if(a=s(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],f)},keyword:function(){var a;if(a=s(/^[_A-Za-z-][_A-Za-z0-9-]*/))return new e.Keyword(a)},call:function(){var a,b,d=c;if(!(a=/^([\w-]+|%)\(/.exec(j[f])))return;a=a[1].toLowerCase();if(a==="url")return null;c+=a.length;if(a==="alpha")return s(this.alpha);s("("),b=s(this.entities.arguments);if(!s(")"))return;if(a)return new e.Call(a,b,d)},arguments:function(){var a=[],b;while(b=s(this.expression)){a.push(b);if(!s(","))break}return a},literal:function(){return s(this.entities.dimension)||s(this.entities.color)||s(this.entities.quoted)},url:function(){var a;if(b.charAt(c)!=="u"||!s(/^url\(/))return;a=s(this.entities.quoted)||s(this.entities.variable)||s(this.entities.dataURI)||s(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!s(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),o.paths)},dataURI:function(){var a;if(s(/^data:/)){a={},a.mime=s(/^[^\/]+\/[^,;)]+/)||"",a.charset=s(/^;\s*charset=[^,;)]+/)||"",a.base64=s(/^;\s*base64/)||"",a.data=s(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,d=c;if(b.charAt(c)==="@"&&(a=s(/^@@?[\w-]+/)))return new e.Variable(a,d)},color:function(){var a;if(b.charAt(c)==="#"&&(a=s(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,d=b.charCodeAt(c);if(d>57||d<45||d===47)return;if(a=s(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,d=c,f;b.charAt(d)==="~"&&(d++,f=!0);if(b.charAt(d)!=="`")return;f&&s("~");if(a=s(/^`([^`]*)`/))return new e.JavaScript(a[1],c,f)}},variable:function(){var a;if(b.charAt(c)==="@"&&(a=s(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!t(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=s(this.entity))&&s("/")&&(b=s(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],d,f,g,h=c,i=b.charAt(c);if(i!=="."&&i!=="#")return;while(d=s(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(f,d,c)),f=s(">");s("(")&&(g=s(this.entities.arguments))&&s(")");if(a.length>0&&(s(";")||t("}")))return new e.mixin.Call(a,g,h)},definition:function(){var a,d=[],f,g,h,i;if(b.charAt(c)!=="."&&b.charAt(c)!=="#"||t(/^[^{]*(;|})/))return;if(f=s(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=f[1];while(h=s(this.entities.variable)||s(this.entities.literal)||s(this.entities.keyword)){if(h instanceof e.Variable)if(s(":"))if(i=s(this.expression))d.push({name:h.name,value:i});else throw new Error("Expected value");else d.push({name:h.name});else d.push({value:h});if(!s(","))break}if(!s(")"))throw new Error("Expected )");g=s(this.block);if(g)return new e.mixin.Definition(a,d,g)}}},entity:function(){return s(this.entities.literal)||s(this.entities.variable)||s(this.entities.url)||s(this.entities.call)||s(this.entities.keyword)||s(this.entities.javascript)||s(this.comment)},end:function(){return s(";")||t("}")},alpha:function(){var a;if(!s(/^\(opacity=/i))return;if(a=s(/^\d+/)||s(this.entities.variable)){if(!s(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,d;d=s(this.combinator),a=s(/^(?:\d+\.\d+|\d+)%/)||s(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||s("*")||s(this.attribute)||s(/^\([^)@]+\)/);if(a)return new e.Element(d,a,c);if(d.value&&d.value.charAt(0)==="&")return new e.Element(d,null,c)},combinator:function(){var a,d=b.charAt(c);if(d===">"||d==="+"||d==="~"){c++;while(b.charAt(c)===" ")c++;return new e.Combinator(d)}if(d==="&"){a="&",c++,b.charAt(c)===" "&&(a="& ");while(b.charAt(c)===" ")c++;return new e.Combinator(a)}if(d===":"&&b.charAt(c+1)===":"){c+=2;while(b.charAt(c)===" ")c++;return new e.Combinator("::")}return b.charAt(c-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,d,f=[],g,h;while(d=s(this.element)){g=b.charAt(c),f.push(d);if(g==="{"||g==="}"||g===";"||g===",")break}if(f.length>0)return new e.Selector(f)},tag:function(){return s(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||s("*")},attribute:function(){var a="",b,c,d;if(!s("["))return;if(b=s(/^[a-zA-Z-]+/)||s(this.entities.quoted))(d=s(/^[|~*$^]?=/))&&(c=s(this.entities.quoted)||s(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!s("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(s("{")&&(a=s(this.primary))&&s("}"))return a},ruleset:function(){var a=[],b,d,f;p();while(b=s(this.selector)){a.push(b),s(this.comment);if(!s(","))break;s(this.comment)}if(a.length>0&&(d=s(this.block)))return new e.Ruleset(a,d);i=c,q()},rule:function(){var a,d,g=b.charAt(c),k,l;p();if(g==="."||g==="#"||g==="&")return;if(a=s(this.variable)||s(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(j[f]))?(c+=l[0].length-1,d=new e.Anonymous(l[1])):a==="font"?d=s(this.font):d=s(this.value),k=s(this.important);if(d&&s(this.end))return new e.Rule(a,d,k,h);i=c,q()}},"import":function(){var a;if(s(/^@import\s+/)&&(a=s(this.entities.quoted)||s(this.entities.url))&&s(";"))return new e.Import(a,o)},directive:function(){var a,d,f,g;if(b.charAt(c)!=="@")return;if(d=s(this["import"]))return d;if(a=s(/^@media|@page/)||s(/^@(?:-webkit-|-moz-)?keyframes/)){g=(s(/^[^{]+/)||"").trim();if(f=s(this.block))return new e.Directive(a+" "+g,f)}else if(a=s(/^@[-a-z]+/))if(a==="@font-face"){if(f=s(this.block))return new e.Directive(a,f)}else if((d=s(this.entity))&&s(";"))return new e.Directive(a,d)},font:function(){var a=[],b=[],c,d,f,g;while(g=s(this.shorthand)||s(this.entity))b.push(g);a.push(new e.Expression(b));if(s(","))while(g=s(this.expression)){a.push(g);if(!s(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=s(this.expression)){b.push(a);if(!s(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(c)==="!")return s(/^! *important/)},sub:function(){var a;if(s("(")&&(a=s(this.expression))&&s(")"))return a},multiplication:function(){var a,b,c,d;if(a=s(this.operand)){while((c=s("/")||s("*"))&&(b=s(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,d,f,g;if(a=s(this.multiplication)){while((f=s(/^[-+]\s+/)||b.charAt(c-1)!=" "&&(s("+")||s("-")))&&(d=s(this.multiplication)))g=new e.Operation(f,[g||a,d]);return g||a}},operand:function(){var a,d=b.charAt(c+1);b.charAt(c)==="-"&&(d==="@"||d==="(")&&(a=s("-"));var f=s(this.sub)||s(this.entities.dimension)||s(this.entities.color)||s(this.entities.variable)||s(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),f]):f},expression:function(){var a,b,c=[],d;while(a=s(this.addition)||s(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=s(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),n({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(b){if(b instanceof a.Dimension)return new a.Dimension(Math.round(c(b)),b.unit);if(typeof b=="number")return Math.round(b);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}},argb:function(b){return new a.Anonymous(b.toARGB())}}})(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Call=function(a,b,c){this.name=a,this.args=b,this.index=c},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{message:"error evaluating function `"+this.name+"`",index:this.index}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("../tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){return this.ruleset?(this.ruleset.root=!0,this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c?c.trim():"",this.index=d},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments).rules),e=!0}catch(h){throw{message:h.message,index:h.index,stack:h.stack,call:this.index}}if(e)return d;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);return d.rules.unshift(new a.Rule("@arguments",(new a.Expression(f)).eval(b))),(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return f.value||f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);return b.frames.shift(),c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1 >--;return!0},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(a){a.URL=function(a,b){a.data?this.attrs=a:(d.mode==="browser"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(a.value)&&b.length>0&&(a.value=b[0]+(a.value.charAt(0)==="/"?a.value.slice(1):a.value)),this.value=a,this.paths=b)},a.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(b){return this.attrs?this:new a.URL(this.value.eval(b),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("../tree")),c("./tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},c("./tree").jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)};var f=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||f?"development":"production"),d.async=!1,d.poll=d.poll||(f?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&m(function(a,b,c){a&&p(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var g;try{g=typeof a.localStorage=="undefined"?null:a.localStorage}catch(h){g=null}var i=document.getElementsByTagName("link"),j=/^text\/(x-)?less$/;d.sheets=[];for(var k=0;k<i.length;k++)(i[k].rel==="stylesheet/less"||i[k].rel.match(/stylesheet/)&&i[k].type.match(j))&&d.sheets.push(i[k]);d.refresh=function(a){var b,c;b=c=new Date,m(function(a,d,e){e.local?t("loading "+d.href+" from cache."):(t("parsed "+d.href+" successfully."),p(a.toCSS(),d,e.lastModified)),t("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&t("css generated in "+(new Date-b)+"ms"),c=new Date},a),l()},d.refreshStyles=l,d.refresh(d.env==="development")})(window); >-diff --git a/dist/less-1.1.6.js b/dist/less-1.1.6.js >-deleted file mode 100644 >-index 93014eedbd0785d069641a1875f994ef24734fb1..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.6.js >-+++ /dev/null >-@@ -1,3004 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.6 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- less = {}; >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k) >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/) || $('keyframes')) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- return this._math('round', n); >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { message: "error evaluating function `" + this.name + "`", >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value ? value.trim() : ""; >-- this.index = index; >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors( paths, context, this.selectors ); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--require('./tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('./tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- try { >-- style.innerHTML = css; >-- } catch (_) { >-- style.styleSheets.cssText = css; >-- } >-- style.type = 'text/css'; >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.1.6.min.js b/dist/less-1.1.6.min.js >-deleted file mode 100644 >-index a30623b993a18b4959d33f0ce5700383fe8b0631..0000000000000000000000000000000000000000 >---- a/dist/less-1.1.6.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.1.6 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function c(b){return a.less[b.split("/")[1]]}function l(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(j)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];try{f.innerHTML=e}catch(g){f.styleSheets.cssText=e}f.type="text/css"})}function m(a,b){for(var c=0;c<d.sheets.length;c++)n(d.sheets[c],a,b,d.sheets.length-(c+1))}function n(b,c,e,f){var h=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=g&&g.getItem(i),k=g&&g.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=h.slice(0,h.lastIndexOf("/")+1)+i),q(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())p(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return u(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),s(document.getElementById("less-error-message:"+o(i)))}catch(a){u(a,i)}})}catch(h){u(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function o(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function p(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||o(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(h){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&g&&(t("saving "+e+" to cache."),g.setItem(e,a),g.setItem(e+":timestamp",c))}function q(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var g=r(),h=f?!1:d.async;typeof g.overrideMimeType=="function"&&g.overrideMimeType("text/css"),g.open("GET",a,h),g.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),g.send(null),f?g.status===0||g.status>=200&&g.status<300?c(g.responseText):e(g.status,a):h?g.onreadystatechange=function(){g.readyState==4&&i(g,c,e)}:i(g,c,e)}function r(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return t("browser doesn't support AJAX."),null}}function s(a){return a&&a.parentNode.removeChild(a)}function t(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function u(a,b){var c="less-error-message:"+o(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,p([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(d={},e=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,e=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={},d.mode="browser"),d.Parser=function(a){function q(){h=k[g],i=f,l=f}function r(){k[g]=h,f=i,l=f}function s(){f>l&&(k[g]=k[g].slice(f-l),l=f)}function t(a){var c,d,e,h,i,j,n,o;if(a instanceof Function)return a.call(m.parsers);if(typeof a=="string")c=b.charAt(f)===a?a:null,e=1,s();else{s();if(c=a.exec(k[g]))e=c[0].length;else return null}if(c){o=f+=e,j=f+k[g].length-e;while(f<j){h=b.charCodeAt(f);if(h!==32&&h!==10&&h!==9)break;f++}return k[g]=k[g].slice(e+(f-o)),l=f,k[g].length===0&&g<k.length-1&&g++,typeof c=="string"?c:c.length===1?c[0]:c}}function u(a){return typeof a=="string"?b.charAt(f)===a:a.test(k[g])?!0:!1}var b,f,g,h,i,j,k,l,m,n=this,o=function(){},p=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=a,c(a),e.queue.length===0&&o()},a)}};return this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,m={imports:p,parse:function(h,i){var m,n,p,q,r,s,u=[],v,w=null;f=g=l=j=0,k=[],b=h.replace(/\r\n/g,"\n"),k=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]),m=new e.Ruleset([],t(this.parsers.primary)),m.root=!0,m.toCSS=function(f){var g,h,i;return function(i,j){function p(a){return a?(b.slice(0,a).match(/\n/g)||"").length:null}var k=[];i=i||{},typeof j=="object"&&!Array.isArray(j)&&(j=Object.keys(j).map(function(a){var b=j[a];return b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b])),new e.Rule("@"+a,b,!1,0)}),k=[new e.Ruleset(null,j)]);try{var l=f.call(this,{frames:k}).toCSS([],{compress:i.compress||!1})}catch(m){h=b.split("\n"),g=p(m.index);for(var n=m.index,o=-1;n>=0&&b.charAt(n)!=="\n";n--)o++;throw{type:m.type,message:m.message,filename:a.filename,index:m.index,line:typeof g=="number"?g+1:null,callLine:m.call&&p(m.call)+1,callExtract:h[p(m.call)],stack:m.stack,column:o,extract:[h[g-1],h[g],h[g+1]]}}return i.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(l):i.compress?l.replace(/(\s)+/g,"$1"):l}}(m.eval);if(f<b.length-1){f=j,s=b.split("\n"),r=(b.slice(0,f).match(/\n/g)||"").length+1;for(var x=f,y=-1;x>=0&&b.charAt(x)!=="\n";x--)y++;w={name:"ParseError",message:"Syntax Error on line "+r,index:f,filename:a.filename,line:r,column:y,extract:[s[r-2],s[r-1],s[r]]}}this.imports.queue.length>0?o=function(){i(w,m)}:i(w,m)},parsers:{primary:function(){var a,b=[];while((a=t(this.mixin.definition)||t(this.rule)||t(this.ruleset)||t(this.mixin.call)||t(this.comment)||t(this.directive))||t(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(f)!=="/")return;if(b.charAt(f+1)==="/")return new e.Comment(t(/^\/\/.*/),!0);if(a=t(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)},entities:{quoted:function(){var a,c=f,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=='"'&&b.charAt(c)!=="'")return;d&&t("~");if(a=t(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],d)},keyword:function(){var a;if(a=t(/^[_A-Za-z-][_A-Za-z0-9-]*/))return e.colors.hasOwnProperty(a)?new e.Color(e.colors[a].slice(1)):new e.Keyword(a)},call:function(){var a,b,c=f;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(k[g])))return;a=a[1].toLowerCase();if(a==="url")return null;f+=a.length;if(a==="alpha")return t(this.alpha);t("("),b=t(this.entities.arguments);if(!t(")"))return;if(a)return new e.Call(a,b,c)},arguments:function(){var a=[],b;while(b=t(this.entities.assignment)||t(this.expression)){a.push(b);if(!t(","))break}return a},literal:function(){return t(this.entities.dimension)||t(this.entities.color)||t(this.entities.quoted)},assignment:function(){var a,b;if((a=t(/^\w+(?=\s?=)/i))&&t("=")&&(b=t(this.entity)))return new e.Assignment(a,b)},url:function(){var a;if(b.charAt(f)!=="u"||!t(/^url\(/))return;a=t(this.entities.quoted)||t(this.entities.variable)||t(this.entities.dataURI)||t(/^[-\w%@$\/.&=:;#+?~]+/)||"";if(!t(")"))throw new Error("missing closing ) for url()");return new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),p.paths)},dataURI:function(){var a;if(t(/^data:/)){a={},a.mime=t(/^[^\/]+\/[^,;)]+/)||"",a.charset=t(/^;\s*charset=[^,;)]+/)||"",a.base64=t(/^;\s*base64/)||"",a.data=t(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=f;if(b.charAt(f)==="@"&&(a=t(/^@@?[\w-]+/)))return new e.Variable(a,c)},color:function(){var a;if(b.charAt(f)==="#"&&(a=t(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,c=b.charCodeAt(f);if(c>57||c<45||c===47)return;if(a=t(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,c=f,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=="`")return;d&&t("~");if(a=t(/^`([^`]*)`/))return new e.JavaScript(a[1],f,d)}},variable:function(){var a;if(b.charAt(f)==="@"&&(a=t(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!u(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=t(this.entity))&&t("/")&&(b=t(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,g,h=f,i=b.charAt(f);if(i!=="."&&i!=="#")return;while(c=t(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new e.Element(d,c,f)),d=t(">");t("(")&&(g=t(this.entities.arguments))&&t(")");if(a.length>0&&(t(";")||u("}")))return new e.mixin.Call(a,g,h)},definition:function(){var a,c=[],d,g,h,i;if(b.charAt(f)!=="."&&b.charAt(f)!=="#"||u(/^[^{]*(;|})/))return;if(d=t(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=d[1];while(h=t(this.entities.variable)||t(this.entities.literal)||t(this.entities.keyword)){if(h instanceof e.Variable)if(t(":"))if(i=t(this.expression))c.push({name:h.name,value:i});else throw new Error("Expected value");else c.push({name:h.name});else c.push({value:h});if(!t(","))break}if(!t(")"))throw new Error("Expected )");g=t(this.block);if(g)return new e.mixin.Definition(a,c,g)}}},entity:function(){return t(this.entities.literal)||t(this.entities.variable)||t(this.entities.url)||t(this.entities.call)||t(this.entities.keyword)||t(this.entities.javascript)||t(this.comment)},end:function(){return t(";")||u("}")},alpha:function(){var a;if(!t(/^\(opacity=/i))return;if(a=t(/^\d+/)||t(this.entities.variable)){if(!t(")"))throw new Error("missing closing ) for alpha()");return new e.Alpha(a)}},element:function(){var a,b,c;c=t(this.combinator),a=t(/^(?:\d+\.\d+|\d+)%/)||t(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||t("*")||t(this.attribute)||t(/^\([^)@]+\)/);if(a)return new e.Element(c,a,f);if(c.value&&c.value.charAt(0)==="&")return new e.Element(c,null,f)},combinator:function(){var a,c=b.charAt(f);if(c===">"||c==="+"||c==="~"){f++;while(b.charAt(f)===" ")f++;return new e.Combinator(c)}if(c==="&"){a="&",f++,b.charAt(f)===" "&&(a="& ");while(b.charAt(f)===" ")f++;return new e.Combinator(a)}if(c===":"&&b.charAt(f+1)===":"){f+=2;while(b.charAt(f)===" ")f++;return new e.Combinator("::")}return b.charAt(f-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,c,d=[],g,h;while(c=t(this.element)){g=b.charAt(f),d.push(c);if(g==="{"||g==="}"||g===";"||g===",")break}if(d.length>0)return new e.Selector(d)},tag:function(){return t(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||t("*")},attribute:function(){var a="",b,c,d;if(!t("["))return;if(b=t(/^[a-zA-Z-]+/)||t(this.entities.quoted))(d=t(/^[|~*$^]?=/))&&(c=t(this.entities.quoted)||t(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!t("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(t("{")&&(a=t(this.primary))&&t("}"))return a},ruleset:function(){var a=[],b,c,d;q();while(b=t(this.selector)){a.push(b),t(this.comment);if(!t(","))break;t(this.comment)}if(a.length>0&&(c=t(this.block)))return new e.Ruleset(a,c);j=f,r()},rule:function(){var a,c,d=b.charAt(f),h,l;q();if(d==="."||d==="#"||d==="&")return;if(a=t(this.variable)||t(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(k[g]))?(f+=l[0].length-1,c=new e.Anonymous(l[1])):a==="font"?c=t(this.font):c=t(this.value),h=t(this.important);if(c&&t(this.end))return new e.Rule(a,c,h,i);j=f,r()}},"import":function(){var a;if(t(/^@import\s+/)&&(a=t(this.entities.quoted)||t(this.entities.url))&&t(";"))return new e.Import(a,p)},directive:function(){var a,c,d,g;if(b.charAt(f)!=="@")return;if(c=t(this["import"]))return c;if(a=t(/^@media|@page/)||t(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)||t("keyframes")){g=(t(/^[^{]+/)||"").trim();if(d=t(this.block))return new e.Directive(a+" "+g,d)}else if(a=t(/^@[-a-z]+/))if(a==="@font-face"){if(d=t(this.block))return new e.Directive(a,d)}else if((c=t(this.entity))&&t(";"))return new e.Directive(a,c)},font:function(){var a=[],b=[],c,d,f,g;while(g=t(this.shorthand)||t(this.entity))b.push(g);a.push(new e.Expression(b));if(t(","))while(g=t(this.expression)){a.push(g);if(!t(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=t(this.expression)){b.push(a);if(!t(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(f)==="!")return t(/^! *important/)},sub:function(){var a;if(t("(")&&(a=t(this.expression))&&t(")"))return a},multiplication:function(){var a,b,c,d;if(a=t(this.operand)){while(!u(/^\/\*/)&&(c=t("/")||t("*"))&&(b=t(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,c,d,g;if(a=t(this.multiplication)){while((d=t(/^[-+]\s+/)||b.charAt(f-1)!=" "&&(t("+")||t("-")))&&(c=t(this.multiplication)))g=new e.Operation(d,[g||a,c]);return g||a}},operand:function(){var a,c=b.charAt(f+1);b.charAt(f)==="-"&&(c==="@"||c==="(")&&(a=t("-"));var d=t(this.sub)||t(this.entities.dimension)||t(this.entities.color)||t(this.entities.variable)||t(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),d]):d},expression:function(){var a,b,c=[],d;while(a=t(this.addition)||t(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=t(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),n({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{error:"RuntimeError",message:"math functions take numbers as parameters"}},argb:function(b){return new a.Anonymous(b.toARGB())}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c){this.name=a,this.args=b,this.index=c},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{message:"error evaluating function `"+this.name+"`",index:this.index}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)}}}(c("../tree")),function(a){a.Directive=function(b,c){this.name=b,Array.isArray(c)?this.ruleset=new a.Ruleset([],c):this.value=c},a.Directive.prototype={toCSS:function(a,b){return this.ruleset?(this.ruleset.root=!0,this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value=c?c.trim():"",this.index=d},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+this.value},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c){var d=this;this._path=b,b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(a){if(!a)throw new Error("Error parsing "+d.path);d.root=a})},a.Import.prototype={toCSS:function(){return this.css?"@import "+this._path.toCSS()+";\n":""},eval:function(b){var c;if(this.css)return this;c=new a.Ruleset(null,this.root.rules.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));return c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value}}}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d){this.selector=new a.Selector(b),this.arguments=c,this.index=d},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments).rules),e=!0}catch(h){throw{message:h.message,index:h.index,stack:h.stack,call:this.index}}if(e)return d;throw{message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},eval:function(b,c){var d=new a.Ruleset(null,[]),e,f=[];for(var g=0,h;g<this.params.length;g++)if(this.params[g].name)if(h=c&&c[g]||this.params[g].value)d.rules.unshift(new a.Rule(this.params[g].name,h.eval(b)));else throw{message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};for(var g=0;g<Math.max(this.params.length,c&&c.length);g++)f.push(c[g]||this.params[g].value);return d.rules.unshift(new a.Rule("@arguments",(new a.Expression(f)).eval(b))),(new a.Ruleset(null,this.rules.slice(0))).eval({frames:[this,d].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;d=Math.min(c,this.arity);for(var e=0;e<d;e++)if(!this.params[e].name&&a[e].eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return f.value||f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index >--)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+";"},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=new a.Ruleset(this.selectors,this.rules.slice(0));c.root=this.root,b.frames.unshift(c);if(c.root)for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Definition&&(c.rules[d].frames=b.frames.slice(0));for(var d=0;d<c.rules.length;d++)c.rules[d]instanceof a.mixin.Call&&Array.prototype.splice.apply(c.rules,[d,1].concat(c.rules[d].eval(b)));for(var d=0,e;d<c.rules.length;d++)e=c.rules[d],e instanceof a.mixin.Definition||(c.rules[d]=e.eval?e.eval(b):e);return b.frames.shift(),c},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("../tree")),c("./tree").find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},c("./tree").jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)};var f=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||f?"development":"production"),d.async=!1,d.poll=d.poll||(f?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&m(function(a,b,c){a&&p(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var g;try{g=typeof a.localStorage=="undefined"?null:a.localStorage}catch(h){g=null}var i=document.getElementsByTagName("link"),j=/^text\/(x-)?less$/;d.sheets=[];for(var k=0;k<i.length;k++)(i[k].rel==="stylesheet/less"||i[k].rel.match(/stylesheet/)&&i[k].type.match(j))&&d.sheets.push(i[k]);d.refresh=function(a){var b,c;b=c=new Date,m(function(a,d,e){e.local?t("loading "+d.href+" from cache."):(t("parsed "+d.href+" successfully."),p(a.toCSS(),d,e.lastModified)),t("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&t("css generated in "+(new Date-b)+"ms"),c=new Date},a),l()},d.refreshStyles=l,d.refresh(d.env==="development")})(window); >-\ No newline at end of file >-diff --git a/dist/less-1.2.0.js b/dist/less-1.2.0.js >-deleted file mode 100644 >-index df376ae7ecd026c7940e62114595f1c9624e7c87..0000000000000000000000000000000000000000 >---- a/dist/less-1.2.0.js >-+++ /dev/null >-@@ -1,3293 +0,0 @@ >--// >--// LESS - Leaner CSS v1.2.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- if (typeof(window) === 'undefined') { less = {} } >-- else { less = window.less = {} } >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- error: null, // Error in parsing/evaluating an import >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (e, root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- if (e && !that.error) { that.error = e } >-- callback(e, root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- function expect(arg, msg) { >-- var result = $(arg); >-- if (! result) { >-- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" >-- : "unexpected token")); >-- } else { >-- return result; >-- } >-- } >-- >-- function error(msg, type) { >-- throw { index: i, type: type || 'Syntax', message: msg }; >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- function getLocation(index) { >-- for (var n = index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- return { line: index ? (input.slice(0, index).match(/\n/g) || "").length : null, >-- column: column }; >-- } >-- >-- function LessError(e, env) { >-- var lines = input.split('\n'), >-- loc = getLocation(e.index), >-- line = loc.line, >-- col = loc.column; >-- >-- this.type = e.type || 'SyntaxError'; >-- this.message = e.message; >-- this.filename = e.filename || env.filename; >-- this.index = e.index; >-- this.line = typeof(line) === 'number' ? line + 1 : null; >-- this.callLine = e.call && (getLocation(e.call) + 1); >-- this.callExtract = lines[getLocation(e.call)]; >-- this.stack = e.stack; >-- this.column = col; >-- this.extract = [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ]; >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- try { >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- } catch (e) { >-- return callback(new(LessError)(e, env)); >-- } >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- throw new(LessError)(e, env); >-- } >-- >-- if (parser.imports.error) { throw parser.imports.error } >-- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- type: "Parse", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k); >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- >-- expect(')'); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i), important = false; >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if ($(this.important)) { >-- important = true; >-- } >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index, important); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value, cond; >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- save(); >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- value = expect(this.expression, 'expected expression'); >-- params.push({ name: param.name, value: value }); >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- expect(')'); >-- >-- if ($(/^when/)) { // Guard >-- cond = expect(this.conditions, 'expected condition'); >-- } >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset, cond); >-- } else { >-- restore(); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- expect(')'); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c, v; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (! e) { >-- $('(') && (v = $(this.entities.variable)) && $(')') && (e = new(tree.Paren)(v)); >-- } >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path, features; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url))) { >-- features = $(this.mediaFeatures); >-- if ($(';')) { >-- return new(tree.Import)(path, imports, features); >-- } >-- } >-- }, >-- >-- mediaFeature: function () { >-- var nodes = []; >-- >-- do { >-- if (e = $(this.entities.keyword)) { >-- nodes.push(e); >-- } else if ($('(')) { >-- p = $(this.property); >-- e = $(this.entity); >-- if ($(')')) { >-- if (p && e) { >-- nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); >-- } else if (e) { >-- nodes.push(new(tree.Paren)(e)); >-- } else { >-- return null; >-- } >-- } else { return null } >-- } >-- } while (e); >-- >-- if (nodes.length > 0) { >-- return new(tree.Expression)(nodes); >-- } >-- }, >-- >-- mediaFeatures: function () { >-- var f, features = []; >-- while (f = $(this.mediaFeature)) { >-- features.push(f); >-- if (! $(',')) { break } >-- } >-- return features.length > 0 ? features : null; >-- }, >-- >-- media: function () { >-- var features; >-- >-- if ($(/^@media/)) { >-- features = $(this.mediaFeatures); >-- >-- if (rules = $(this.block)) { >-- return new(tree.Directive)('@media', rules, features); >-- } >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types, e, nodes; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import']) || $(this.media)) { >-- return value; >-- } else if (name = $(/^@page|@keyframes/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- conditions: function () { >-- var a, b, index = i, condition; >-- >-- if (a = $(this.condition)) { >-- while ($(',') && (b = $(this.condition))) { >-- condition = new(tree.Condition)('or', condition || a, b, index); >-- } >-- return condition || a; >-- } >-- }, >-- condition: function () { >-- var a, b, c, op, index = i, negate = false; >-- >-- if ($(/^not/)) { negate = true } >-- expect('('); >-- if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- if (op = $(/^(?:>=|=<|[<=>])/)) { >-- if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- c = new(tree.Condition)(op, a, b, index, negate); >-- } else { >-- error('expected expression'); >-- } >-- } else { >-- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); >-- } >-- expect(')'); >-- return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- return this._math('round', n); >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- }, >-- percentage: function (n) { >-- return new(tree.Dimension)(n.value * 100, '%'); >-- }, >-- color: function (n) { >-- if (n instanceof tree.Quoted) { >-- return new(tree.Color)(n.value.slice(1)); >-- } else { >-- throw { type: "Argument", message: "argument must be a string" }; >-- } >-- }, >-- iscolor: function (n) { >-- return this._isa(n, tree.Color); >-- }, >-- isnumber: function (n) { >-- return this._isa(n, tree.Dimension); >-- }, >-- isstring: function (n) { >-- return this._isa(n, tree.Quoted); >-- }, >-- iskeyword: function (n) { >-- return this._isa(n, tree.Keyword); >-- }, >-- isurl: function (n) { >-- return this._isa(n, tree.URL); >-- }, >-- ispixel: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; >-- }, >-- ispercentage: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; >-- }, >-- isem: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; >-- }, >-- _isa: function (n, Type) { >-- return (n instanceof Type) ? tree.True : tree.False; >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { type: e.type || "Runtime", >-- message: "error evaluating function `" + this.name + "`" + >-- (e.message ? ': ' + e.message : ''), >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Condition = function (op, l, r, i, negate) { >-- this.op = op.trim(); >-- this.lvalue = l; >-- this.rvalue = r; >-- this.index = i; >-- this.negate = negate; >--}; >--tree.Condition.prototype.eval = function (env) { >-- var a = this.lvalue.eval(env), >-- b = this.rvalue.eval(env); >-- >-- var i = this.index, result >-- >-- var result = (function (op) { >-- switch (op) { >-- case 'and': >-- return a && b; >-- case 'or': >-- return a || b; >-- default: >-- if (a.compare) { >-- result = a.compare(b); >-- } else if (b.compare) { >-- result = b.compare(a); >-- } else { >-- throw { type: "Type", >-- message: "Unable to perform comparison", >-- index: i }; >-- } >-- switch (result) { >-- case -1: return op === '<' || op === '=<'; >-- case 0: return op === '=' || op === '>=' || op === '=<'; >-- case 1: return op === '>' || op === '>='; >-- } >-- } >-- })(this.op); >-- return this.negate ? !result : result; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- }, >-- >-- // TODO: Perform unit conversion before comparing >-- compare: function (other) { >-- if (other instanceof tree.Dimension) { >-- if (other.value > this.value) { >-- return -1; >-- } else if (other.value < this.value) { >-- return 1; >-- } else { >-- return 0; >-- } >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value, features) { >-- this.name = name; >-- this.features = features && new(tree.Value)(features); >-- >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- this.ruleset.allowImports = true; >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + features + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- this.features = this.features && this.features.eval(env); >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- >-- if (typeof(value) === 'string') { >-- this.value = value.trim(); >-- } else if (value) { >-- this.value = value; >-- } else { >-- this.value = ""; >-- } >-- this.index = index; >--}; >--tree.Element.prototype.eval = function (env) { >-- return new(tree.Element)(this.combinator, >-- this.value.eval ? this.value.eval(env) : this.value, >-- this.index); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + (this.value.toCSS ? this.value.toCSS(env) : this.value); >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS ? e.toCSS(env) : ''; >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports, features) { >-- var that = this; >-- >-- this._path = path; >-- this.features = features && new(tree.Value)(features); >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (e, root) { >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function (env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.css) { >-- return "@import " + this._path.toCSS() + features + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset, features = this.features && this.features.eval(env); >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return this.features ? new(tree.Directive)('@media', ruleset.rules, this.features.value) : ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value }, >-- compare: function (other) { >-- if (other instanceof tree.Keyword) { >-- return other.value === this.value ? 0 : 1; >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--tree.True = new(tree.Keyword)('true'); >--tree.False = new(tree.Keyword)('false'); >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index, important) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >-- this.important = important; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments, this.important).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { type: 'Runtime', >-- message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { type: 'Name', >-- message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules, condition) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.condition = condition; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- evalParams: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []); >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- return frame; >-- }, >-- eval: function (env, args, important) { >-- var frame = this.evalParams(env, args), context, _arguments = [], rules; >-- >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- rules = important ? >-- this.rules.map(function (r) { >-- return new(tree.Rule)(r.name, r.value, '!important', r.index); >-- }) : this.rules.slice(0); >-- >-- return new(tree.Ruleset)(null, rules).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len, frame; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- if (this.condition && !this.condition.eval({ >-- frames: [this.evalParams(env, args)].concat(env.frames) >-- })) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Paren = function (node) { >-- this.value = node; >--}; >--tree.Paren.prototype = { >-- toCSS: function (env) { >-- return '(' + this.value.toCSS(env) + ')'; >-- }, >-- eval: function (env) { >-- return new(tree.Paren)(this.value.eval(env)); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return ('value' in v) ? v.value : v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index, inline) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- this.inline = inline || false; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + (this.inline ? "" : ";"); >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, >-- this.value.eval(context), >-- this.important, >-- this.index, this.inline); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); >-- var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- ruleset.allowImports = this.allowImports; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root || ruleset.allowImports) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors(paths, context, this.selectors); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.eval = function (env) { >-- return new(tree.Selector)(this.elements.map(function (e) { >-- return e.eval(env); >-- })); >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--tree.jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >-- >--})(require('./tree')); >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (root, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (root, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- style.type = 'text/css'; >-- if (style.styleSheet) { >-- style.styleSheet.cssText = css; >-- } else { >-- style.innerHTML = css; >-- } >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(root, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- >-- var template = ['<ul>', >-- '<li><label>[-1]</label><pre class="ctx">{0}</pre></li>', >-- '<li><label>[0]</label><pre>{current}</pre></li>', >-- '<li><label>[1]</label><pre class="ctx">{2}</pre></li>', >-- '</ul>'].join('\n'); >-- >-- var elem = document.createElement('div'), timer, content; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p><a href="' + href + '">' + href + "</a> "; >-- >-- if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- template.replace(/\[(-?\d)\]/g, function (_, i) { >-- return (parseInt(e.line) + parseInt(i)) || ''; >-- }).replace(/\{(\d)\}/g, function (_, i) { >-- return e.extract[parseInt(i)] || ''; >-- }).replace(/\{current\}/, e.extract[1].slice(0, e.column) + '<span class="error">' + >-- e.extract[1].slice(e.column) + '</span>'); >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #ee4444;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.ctx {', >-- 'color: #dd4444;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.2.0.min.js b/dist/less-1.2.0.min.js >-deleted file mode 100644 >-index 84e90475aa66aac789a88eab62bffb6f190545a5..0000000000000000000000000000000000000000 >---- a/dist/less-1.2.0.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.2.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i),s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type})).parse(a,function(a,d){if(a)return w(a,i);try{c(d,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(a){w(a,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e=["<ul>",'<li><label>[-1]</label><pre class="ctx">{0}</pre></li>',"<li><label>[0]</label><pre>{current}</pre></li>",'<li><label>[1]</label><pre class="ctx">{2}</pre></li>',"</ul>"].join("\n"),f=document.createElement("div"),g,h;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p><a href="'+b+'">'+b+"</a> ",a.extract&&(h+="on line "+a.line+", column "+(a.column+1)+":</p>"+e.replace(/\[(-?\d)\]/g,function(b,c){return parseInt(a.line)+parseInt(c)||""}).replace(/\{(\d)\}/g,function(b,c){return a.extract[parseInt(c)]||""}).replace(/\{current\}/,a.extract[1].slice(0,a.column)+'<span class="error">'+a.extract[1].slice(a.column)+"</span>")),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #ee4444;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.ctx {","color: #dd4444;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function x(a){function s(){i=l[h],j=g,m=g}function t(){l[h]=i,g=j,m=g}function u(){g>m&&(l[h]=l[h].slice(g-m),m=g)}function v(a){var c,d,e,f,i,j,k,o;if(a instanceof Function)return a.call(n.parsers);if(typeof a=="string")c=b.charAt(g)===a?a:null,e=1,u();else{u();if(c=a.exec(l[h]))e=c[0].length;else return null}if(c){o=g+=e,j=g+l[h].length-e;while(g<j){f=b.charCodeAt(g);if(f!==32&&f!==10&&f!==9)break;g++}return l[h]=l[h].slice(e+(g-o)),m=g,l[h].length===0&&h<l.length-1&&h++,typeof c=="string"?c:c.length===1?c[0]:c}}function w(a,c){var d=v(a);if(!d)x(c||(typeof a=="string"?"expected '"+a+"' got '"+b.charAt(g)+"'":"unexpected token"));else return d}function x(a,b){throw{index:g,type:b||"Syntax",message:a}}function y(a){return typeof a=="string"?b.charAt(g)===a:a.test(l[h])?!0:!1}function z(a){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:a?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function A(a,c){var d=b.split("\n"),e=z(a.index),f=e.line,g=e.column;this.type=a.type||"SyntaxError",this.message=a.message,this.filename=a.filename||c.filename,this.index=a.index,this.line=typeof f=="number"?f+1:null,this.callLine=a.call&&z(a.call)+1,this.callExtract=d[z(a.call)],this.stack=a.stack,this.column=g,this.extract=[d[f-1],d[f],d[f+1]]}var b,g,h,i,j,k,l,m,n,o=this,q=function(){},r=this.imports={paths:a&&a.paths||[],queue:[],files:{},mime:a&&a.mime,error:null,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a,d){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=d,a&&!e.error&&(e.error=a),c(a,d),e.queue.length===0&&q()},a)}};return this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,n={imports:r,parse:function(e,i){var j,o,p,r,s,t,u=[],w,x=null;g=h=m=k=0,l=[],b=e.replace(/\r\n/g,"\n"),l=function(c){var d=0,e=/[^"'`\{\}\/\(\)]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=0,h,i=c[0],j,k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(h=e.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=b.charAt(l),f.lastIndex=l,!k&&!j&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(h=f.exec(b))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=b.charAt(l)));if(m==="{"&&!k&&!j)g++,i.push(m);else if(m==="}"&&!k&&!j)g--,i.push(m),c[++d]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(g>0)throw{type:"Syntax",message:"Missing closing `}`",filename:a.filename};return c.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],v(this.parsers.primary)),j.root=!0}catch(y){return i(new A(y,a))}j.toCSS=function(b){var e,g,h;return function(e,g){var h=[];e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var i=b.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(j){throw new A(j,a)}if(n.imports.error)throw n.imports.error;return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(i):e.compress?i.replace(/(\s)+/g,"$1"):i}}(j.eval);if(g<b.length-1){g=k,t=b.split("\n"),s=(b.slice(0,g).match(/\n/g)||"").length+1;for(var z=g,B=-1;z>=0&&b.charAt(z)!=="\n";z--)B++;x={type:"Parse",message:"Syntax Error on line "+s,index:g,filename:a.filename,line:s,column:B,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?q=function(){i(x,j)}:i(x,j)},parsers:{primary:function(){var a,b=[];while((a=v(this.mixin.definition)||v(this.rule)||v(this.ruleset)||v(this.mixin.call)||v(this.comment)||v(this.directive))||v(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(g)!=="/")return;if(b.charAt(g+1)==="/")return new f.Comment(v(/^\/\/.*/),!0);if(a=v(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,c=g,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=='"'&&b.charAt(c)!=="'")return;d&&v("~");if(a=v(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],d)},keyword:function(){var a;if(a=v(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,b,c=g;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(l[h])))return;a=a[1].toLowerCase();if(a==="url")return null;g+=a.length;if(a==="alpha")return v(this.alpha);v("("),b=v(this.entities.arguments);if(!v(")"))return;if(a)return new f.Call(a,b,c)},arguments:function(){var a=[],b;while(b=v(this.entities.assignment)||v(this.expression)){a.push(b);if(!v(","))break}return a},literal:function(){return v(this.entities.dimension)||v(this.entities.color)||v(this.entities.quoted)},assignment:function(){var a,b;if((a=v(/^\w+(?=\s?=)/i))&&v("=")&&(b=v(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(b.charAt(g)!=="u"||!v(/^url\(/))return;return a=v(this.entities.quoted)||v(this.entities.variable)||v(this.entities.dataURI)||v(/^[-\w%@$\/.&=:;#+?~]+/)||"",w(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),r.paths)},dataURI:function(){var a;if(v(/^data:/)){a={},a.mime=v(/^[^\/]+\/[^,;)]+/)||"",a.charset=v(/^;\s*charset=[^,;)]+/)||"",a.base64=v(/^;\s*base64/)||"",a.data=v(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=g;if(b.charAt(g)==="@"&&(a=v(/^@@?[\w-]+/)))return new f.Variable(a,c)},color:function(){var a;if(b.charAt(g)==="#"&&(a=v(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,c=b.charCodeAt(g);if(c>57||c<45||c===47)return;if(a=v(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,c=g,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=="`")return;d&&v("~");if(a=v(/^`([^`]*)`/))return new f.JavaScript(a[1],g,d)}},variable:function(){var a;if(b.charAt(g)==="@"&&(a=v(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!y(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=v(this.entity))&&v("/")&&(b=v(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,h=g,i=b.charAt(g),j=!1;if(i!=="."&&i!=="#")return;while(c=v(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,g)),d=v(">");v("(")&&(e=v(this.entities.arguments))&&v(")"),v(this.important)&&(j=!0);if(a.length>0&&(v(";")||y("}")))return new f.mixin.Call(a,e,h,j)},definition:function(){var a,c=[],d,e,h,i,j;if(b.charAt(g)!=="."&&b.charAt(g)!=="#"||y(/^[^{]*(;|})/))return;s();if(d=v(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=d[1];while(h=v(this.entities.variable)||v(this.entities.literal)||v(this.entities.keyword)){h instanceof f.Variable?v(":")?(i=w(this.expression,"expected expression"),c.push({name:h.name,value:i})):c.push({name:h.name}):c.push({value:h});if(!v(","))break}w(")"),v(/^when/)&&(j=w(this.conditions,"expected condition")),e=v(this.block);if(e)return new f.mixin.Definition(a,c,e,j);t()}}},entity:function(){return v(this.entities.literal)||v(this.entities.variable)||v(this.entities.url)||v(this.entities.call)||v(this.entities.keyword)||v(this.entities.javascript)||v(this.comment)},end:function(){return v(";")||y("}")},alpha:function(){var a;if(!v(/^\(opacity=/i))return;if(a=v(/^\d+/)||v(this.entities.variable))return w(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=v(this.combinator),a=v(/^(?:\d+\.\d+|\d+)%/)||v(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||v("*")||v(this.attribute)||v(/^\([^)@]+\)/),a||v("(")&&(d=v(this.entities.variable))&&v(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,g);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,g)},combinator:function(){var a,c=b.charAt(g);if(c===">"||c==="+"||c==="~"){g++;while(b.charAt(g)===" ")g++;return new f.Combinator(c)}if(c==="&"){a="&",g++,b.charAt(g)===" "&&(a="& ");while(b.charAt(g)===" ")g++;return new f.Combinator(a)}if(c===":"&&b.charAt(g+1)===":"){g+=2;while(b.charAt(g)===" ")g++;return new f.Combinator("::")}return b.charAt(g-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,c,d=[],e,h;while(c=v(this.element)){e=b.charAt(g),d.push(c);if(e==="{"||e==="}"||e===";"||e===",")break}if(d.length>0)return new f.Selector(d)},tag:function(){return v(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||v("*")},attribute:function(){var a="",b,c,d;if(!v("["))return;if(b=v(/^[a-zA-Z-]+/)||v(this.entities.quoted))(d=v(/^[|~*$^]?=/))&&(c=v(this.entities.quoted)||v(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!v("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(v("{")&&(a=v(this.primary))&&v("}"))return a},ruleset:function(){var a=[],b,c,d;s();while(b=v(this.selector)){a.push(b),v(this.comment);if(!v(","))break;v(this.comment)}if(a.length>0&&(c=v(this.block)))return new f.Ruleset(a,c);k=g,t()},rule:function(){var a,c,d=b.charAt(g),e,i;s();if(d==="."||d==="#"||d==="&")return;if(a=v(this.variable)||v(this.property)){a.charAt(0)!="@"&&(i=/^([^@+\/'"*`(;{}-]*);/.exec(l[h]))?(g+=i[0].length-1,c=new f.Anonymous(i[1])):a==="font"?c=v(this.font):c=v(this.value),e=v(this.important);if(c&&v(this.end))return new f.Rule(a,c,e,j);k=g,t()}},"import":function(){var a,b;if(v(/^@import\s+/)&&(a=v(this.entities.quoted)||v(this.entities.url))){b=v(this.mediaFeatures);if(v(";"))return new f.Import(a,r,b)}},mediaFeature:function(){var a=[];do if(e=v(this.entities.keyword))a.push(e);else if(v("(")){p=v(this.property),e=v(this.entity);if(!v(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,g,!0)));else if(e)a.push(new f.Paren(e));else return null}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=v(this.mediaFeature)){b.push(a);if(!v(","))break}return b.length>0?b:null},media:function(){var a;if(v(/^@media/)){a=v(this.mediaFeatures);if(rules=v(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,c,d,e,h,i;if(b.charAt(g)!=="@")return;if(c=v(this["import"])||v(this.media))return c;if(a=v(/^@page|@keyframes/)||v(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){e=(v(/^[^{]+/)||"").trim();if(d=v(this.block))return new f.Directive(a+" "+e,d)}else if(a=v(/^@[-a-z]+/))if(a==="@font-face"){if(d=v(this.block))return new f.Directive(a,d)}else if((c=v(this.entity))&&v(";"))return new f.Directive(a,c)},font:function(){var a=[],b=[],c,d,e,g;while(g=v(this.shorthand)||v(this.entity))b.push(g);a.push(new f.Expression(b));if(v(","))while(g=v(this.expression)){a.push(g);if(!v(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=v(this.expression)){b.push(a);if(!v(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(b.charAt(g)==="!")return v(/^! *important/)},sub:function(){var a;if(v("(")&&(a=v(this.expression))&&v(")"))return a},multiplication:function(){var a,b,c,d;if(a=v(this.operand)){while(!y(/^\/\*/)&&(c=v("/")||v("*"))&&(b=v(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,c,d,e;if(a=v(this.multiplication)){while((d=v(/^[-+]\s+/)||b.charAt(g-1)!=" "&&(v("+")||v("-")))&&(c=v(this.multiplication)))e=new f.Operation(d,[e||a,c]);return e||a}},conditions:function(){var a,b,c=g,d;if(a=v(this.condition)){while(v(",")&&(b=v(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=g,h=!1;v(/^not/)&&(h=!0),w("(");if(a=v(this.addition)||v(this.entities.keyword)||v(this.entities.quoted))return(d=v(/^(?:>=|=<|[<=>])/))?(b=v(this.addition)||v(this.entities.keyword)||v(this.entities.quoted))?c=new f.Condition(d,a,b,e,h):x("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,h),w(")"),v(/^and/)?new f.Condition("and",c,v(this.condition)):c},operand:function(){var a,c=b.charAt(g+1);b.charAt(g)==="-"&&(c==="@"||c==="(")&&(a=v("-"));var d=v(this.sub)||v(this.entities.dimension)||v(this.entities.color)||v(this.entities.variable)||v(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),d]):d},expression:function(){var a,b,c=[],d;while(a=v(this.addition)||v(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=v(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c){this.name=a,this.args=b,this.index=c},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else if(c.compare)e=c.compare(b);else throw{type:"Type",message:"Unable to perform comparison",index:d};switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d){var e=this;this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(a,b){e.root=b})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+ >--g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.important=e},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name)if(f=c&&c[e]||this.params[e].value)d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)));else throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b){this.name=a,this.index=b},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{message:"variable "+e+" is undefined",index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c){a&&r(a.toCSS(),b,c.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e){e.local?v("loading "+d.href+" from cache."):(v("parsed "+d.href+" successfully."),r(a.toCSS(),d,e.lastModified)),v("css for "+d.href+" generated in "+(new Date-c)+"ms"),e.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window); >-\ No newline at end of file >-diff --git a/dist/less-1.2.1.js b/dist/less-1.2.1.js >-deleted file mode 100644 >-index 3b33bc656bc516496ee065fecd6a4ec5b8a59ab1..0000000000000000000000000000000000000000 >---- a/dist/less-1.2.1.js >-+++ /dev/null >-@@ -1,3318 +0,0 @@ >--// >--// LESS - Leaner CSS v1.2.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- if (typeof(window) === 'undefined') { less = {} } >-- else { less = window.less = {} } >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- contents: {}, // Holds the imported file contents >-- mime: env && env.mime, // MIME type of .less files >-- error: null, // Error in parsing/evaluating an import >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (e, root, contents) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- that.contents[path] = contents; >-- >-- if (e && !that.error) { that.error = e } >-- callback(e, root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- function expect(arg, msg) { >-- var result = $(arg); >-- if (! result) { >-- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" >-- : "unexpected token")); >-- } else { >-- return result; >-- } >-- } >-- >-- function error(msg, type) { >-- throw { index: i, type: type || 'Syntax', message: msg }; >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- function getInput(e, env) { >-- if (e.filename && env.filename && (e.filename !== env.filename)) { >-- return parser.imports.contents[e.filename]; >-- } else { >-- return input; >-- } >-- } >-- >-- function getLocation(index, input) { >-- for (var n = index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null, >-- column: column }; >-- } >-- >-- function LessError(e, env) { >-- var input = getInput(e, env), >-- loc = getLocation(e.index, input), >-- line = loc.line, >-- col = loc.column, >-- lines = input.split('\n'); >-- >-- this.type = e.type || 'Syntax'; >-- this.message = e.message; >-- this.filename = e.filename || env.filename; >-- this.index = e.index; >-- this.line = typeof(line) === 'number' ? line + 1 : null; >-- this.callLine = e.call && (getLocation(e.call, input) + 1); >-- this.callExtract = lines[getLocation(e.call, input)]; >-- this.stack = e.stack; >-- this.column = col; >-- this.extract = [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ]; >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- try { >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- } catch (e) { >-- return callback(new(LessError)(e, env)); >-- } >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = [], importError; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- throw new(LessError)(e, env); >-- } >-- >-- if ((importError = parser.imports.error)) { // Check if there was an error during importing >-- if (importError instanceof LessError) throw importError; >-- else throw new(LessError)(importError, env); >-- } >-- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- type: "Parse", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k); >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index, env.filename) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- >-- expect(')'); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index, env.filename); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i), important = false; >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if ($(this.important)) { >-- important = true; >-- } >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index, env.filename, important); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value, cond; >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- save(); >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- value = expect(this.expression, 'expected expression'); >-- params.push({ name: param.name, value: value }); >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- expect(')'); >-- >-- if ($(/^when/)) { // Guard >-- cond = expect(this.conditions, 'expected condition'); >-- } >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset, cond); >-- } else { >-- restore(); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- expect(')'); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c, v; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (! e) { >-- $('(') && (v = $(this.entities.variable)) && $(')') && (e = new(tree.Paren)(v)); >-- } >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path, features, index = i; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url))) { >-- features = $(this.mediaFeatures); >-- if ($(';')) { >-- return new(tree.Import)(path, imports, features, index); >-- } >-- } >-- }, >-- >-- mediaFeature: function () { >-- var nodes = []; >-- >-- do { >-- if (e = $(this.entities.keyword)) { >-- nodes.push(e); >-- } else if ($('(')) { >-- p = $(this.property); >-- e = $(this.entity); >-- if ($(')')) { >-- if (p && e) { >-- nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); >-- } else if (e) { >-- nodes.push(new(tree.Paren)(e)); >-- } else { >-- return null; >-- } >-- } else { return null } >-- } >-- } while (e); >-- >-- if (nodes.length > 0) { >-- return new(tree.Expression)(nodes); >-- } >-- }, >-- >-- mediaFeatures: function () { >-- var f, features = []; >-- while (f = $(this.mediaFeature)) { >-- features.push(f); >-- if (! $(',')) { break } >-- } >-- return features.length > 0 ? features : null; >-- }, >-- >-- media: function () { >-- var features; >-- >-- if ($(/^@media/)) { >-- features = $(this.mediaFeatures); >-- >-- if (rules = $(this.block)) { >-- return new(tree.Directive)('@media', rules, features); >-- } >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types, e, nodes; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import']) || $(this.media)) { >-- return value; >-- } else if (name = $(/^@page|@keyframes/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- conditions: function () { >-- var a, b, index = i, condition; >-- >-- if (a = $(this.condition)) { >-- while ($(',') && (b = $(this.condition))) { >-- condition = new(tree.Condition)('or', condition || a, b, index); >-- } >-- return condition || a; >-- } >-- }, >-- condition: function () { >-- var a, b, c, op, index = i, negate = false; >-- >-- if ($(/^not/)) { negate = true } >-- expect('('); >-- if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- if (op = $(/^(?:>=|=<|[<=>])/)) { >-- if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- c = new(tree.Condition)(op, a, b, index, negate); >-- } else { >-- error('expected expression'); >-- } >-- } else { >-- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); >-- } >-- expect(')'); >-- return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- return this._math('round', n); >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- }, >-- percentage: function (n) { >-- return new(tree.Dimension)(n.value * 100, '%'); >-- }, >-- color: function (n) { >-- if (n instanceof tree.Quoted) { >-- return new(tree.Color)(n.value.slice(1)); >-- } else { >-- throw { type: "Argument", message: "argument must be a string" }; >-- } >-- }, >-- iscolor: function (n) { >-- return this._isa(n, tree.Color); >-- }, >-- isnumber: function (n) { >-- return this._isa(n, tree.Dimension); >-- }, >-- isstring: function (n) { >-- return this._isa(n, tree.Quoted); >-- }, >-- iskeyword: function (n) { >-- return this._isa(n, tree.Keyword); >-- }, >-- isurl: function (n) { >-- return this._isa(n, tree.URL); >-- }, >-- ispixel: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; >-- }, >-- ispercentage: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; >-- }, >-- isem: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; >-- }, >-- _isa: function (n, Type) { >-- return (n instanceof Type) ? tree.True : tree.False; >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index, filename) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >-- this.filename = filename; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { type: e.type || "Runtime", >-- message: "error evaluating function `" + this.name + "`" + >-- (e.message ? ': ' + e.message : ''), >-- index: this.index, filename: this.filename }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Condition = function (op, l, r, i, negate) { >-- this.op = op.trim(); >-- this.lvalue = l; >-- this.rvalue = r; >-- this.index = i; >-- this.negate = negate; >--}; >--tree.Condition.prototype.eval = function (env) { >-- var a = this.lvalue.eval(env), >-- b = this.rvalue.eval(env); >-- >-- var i = this.index, result >-- >-- var result = (function (op) { >-- switch (op) { >-- case 'and': >-- return a && b; >-- case 'or': >-- return a || b; >-- default: >-- if (a.compare) { >-- result = a.compare(b); >-- } else if (b.compare) { >-- result = b.compare(a); >-- } else { >-- throw { type: "Type", >-- message: "Unable to perform comparison", >-- index: i }; >-- } >-- switch (result) { >-- case -1: return op === '<' || op === '=<'; >-- case 0: return op === '=' || op === '>=' || op === '=<'; >-- case 1: return op === '>' || op === '>='; >-- } >-- } >-- })(this.op); >-- return this.negate ? !result : result; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- }, >-- >-- // TODO: Perform unit conversion before comparing >-- compare: function (other) { >-- if (other instanceof tree.Dimension) { >-- if (other.value > this.value) { >-- return -1; >-- } else if (other.value < this.value) { >-- return 1; >-- } else { >-- return 0; >-- } >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value, features) { >-- this.name = name; >-- this.features = features && new(tree.Value)(features); >-- >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- this.ruleset.allowImports = true; >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + features + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- this.features = this.features && this.features.eval(env); >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- >-- if (typeof(value) === 'string') { >-- this.value = value.trim(); >-- } else if (value) { >-- this.value = value; >-- } else { >-- this.value = ""; >-- } >-- this.index = index; >--}; >--tree.Element.prototype.eval = function (env) { >-- return new(tree.Element)(this.combinator, >-- this.value.eval ? this.value.eval(env) : this.value, >-- this.index); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + (this.value.toCSS ? this.value.toCSS(env) : this.value); >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS ? e.toCSS(env) : ''; >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports, features, index) { >-- var that = this; >-- >-- this.index = index; >-- this._path = path; >-- this.features = features && new(tree.Value)(features); >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (e, root) { >-- if (e) { e.index = index } >-- that.root = root || new(tree.Ruleset)([], []); >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function (env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.css) { >-- return "@import " + this._path.toCSS() + features + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset, features = this.features && this.features.eval(env); >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return this.features ? new(tree.Directive)('@media', ruleset.rules, this.features.value) : ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value }, >-- compare: function (other) { >-- if (other instanceof tree.Keyword) { >-- return other.value === this.value ? 0 : 1; >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--tree.True = new(tree.Keyword)('true'); >--tree.False = new(tree.Keyword)('false'); >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index, filename, important) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >-- this.filename = filename; >-- this.important = important; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments, this.important).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, filename: this.filename, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { type: 'Runtime', >-- message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index, filename: this.filename }; >-- } >-- } >-- } >-- throw { type: 'Name', >-- message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index, filename: this.filename }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules, condition) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.condition = condition; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- evalParams: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []); >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- return frame; >-- }, >-- eval: function (env, args, important) { >-- var frame = this.evalParams(env, args), context, _arguments = [], rules; >-- >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- rules = important ? >-- this.rules.map(function (r) { >-- return new(tree.Rule)(r.name, r.value, '!important', r.index); >-- }) : this.rules.slice(0); >-- >-- return new(tree.Ruleset)(null, rules).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len, frame; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- if (this.condition && !this.condition.eval({ >-- frames: [this.evalParams(env, args)].concat(env.frames) >-- })) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Paren = function (node) { >-- this.value = node; >--}; >--tree.Paren.prototype = { >-- toCSS: function (env) { >-- return '(' + this.value.toCSS(env) + ')'; >-- }, >-- eval: function (env) { >-- return new(tree.Paren)(this.value.eval(env)); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return ('value' in v) ? v.value : v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index, inline) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- this.inline = inline || false; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + (this.inline ? "" : ";"); >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, >-- this.value.eval(context), >-- this.important, >-- this.index, this.inline); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); >-- var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- ruleset.allowImports = this.allowImports; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root || ruleset.allowImports) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors(paths, context, this.selectors); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.eval = function (env) { >-- return new(tree.Selector)(this.elements.map(function (e) { >-- return e.eval(env); >-- })); >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { type: 'Name', >-- message: "variable " + name + " is undefined", >-- filename: this.file, >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--tree.jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >-- >--})(require('./tree')); >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- style.type = 'text/css'; >-- if (style.styleSheet) { >-- style.styleSheet.cssText = css; >-- } else { >-- style.innerHTML = css; >-- } >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- var filename = href.match(/([^\/]+)$/)[1]; >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type, >-- filename: filename >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(e, root, data, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- var template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>'; >-- var elem = document.createElement('div'), timer, content, error = []; >-- var filename = e.filename || href; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p>in <a href="' + filename + '">' + filename + "</a> "; >-- >-- var errorline = function (e, i, classname) { >-- if (e.extract[i]) { >-- error.push(template.replace(/\{line\}/, parseInt(e.line) + (i - 1)) >-- .replace(/\{class\}/, classname) >-- .replace(/\{content\}/, e.extract[i])); >-- } >-- }; >-- >-- if (e.stack) { >-- content += '<br/>' + e.stack.split('\n').slice(1).join('<br/>'); >-- } else if (e.extract) { >-- errorline(e, 0, ''); >-- errorline(e, 1, 'line'); >-- errorline(e, 2, ''); >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- '<ul>' + error.join('') + '</ul>'; >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #dd6666;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.line {', >-- 'color: #ff0000;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.2.1.min.js b/dist/less-1.2.1.min.js >-deleted file mode 100644 >-index 89b76377c32d01c8cb38bc447e5e6d435b109cd2..0000000000000000000000000000000000000000 >---- a/dist/less-1.2.1.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.2.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[a.filename]:g}function B(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function C(a,b){var c=A(a,b),d=B(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&B(a.call,c)+1,this.callExtract=g[B(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,m=[],g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=0,h,i=a[0],j,k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(h=d.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=g.charAt(l),e.lastIndex=l,!k&&!j&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(h=e.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=g.charAt(l)));if(m==="{"&&!k&&!j)f++,i.push(m);else if(m==="}"&&!k&&!j)f--,i.push(m),a[++c]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(f>0)throw{type:"Syntax",message:"Missing closing `}`",filename:b.filename};return a.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new C(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new C(k,b)}if(i=o.imports.error)throw i instanceof C?i:new C(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^@media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+ >--f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window); >-\ No newline at end of file >-diff --git a/dist/less-1.2.2.js b/dist/less-1.2.2.js >-deleted file mode 100644 >-index 4db265285f96746386af87f2a8e19d16488fa1f2..0000000000000000000000000000000000000000 >---- a/dist/less-1.2.2.js >-+++ /dev/null >-@@ -1,3337 +0,0 @@ >--// >--// LESS - Leaner CSS v1.2.2 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >--// amd.js >--// >--// Define Less as an AMD module. >--if (typeof define === "function" && define.amd) { >-- define("less", [], function () { return less; } ); >--} >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- if (typeof(window) === 'undefined') { less = {} } >-- else { less = window.less = {} } >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- contents: {}, // Holds the imported file contents >-- mime: env && env.mime, // MIME type of .less files >-- error: null, // Error in parsing/evaluating an import >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (e, root, contents) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- that.contents[path] = contents; >-- >-- if (e && !that.error) { that.error = e } >-- callback(e, root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- function expect(arg, msg) { >-- var result = $(arg); >-- if (! result) { >-- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" >-- : "unexpected token")); >-- } else { >-- return result; >-- } >-- } >-- >-- function error(msg, type) { >-- throw { index: i, type: type || 'Syntax', message: msg }; >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- function basename(pathname) { >-- if (less.mode === 'node') { >-- return require('path').basename(pathname); >-- } else { >-- return pathname.match(/[^\/]+$/)[0]; >-- } >-- } >-- >-- function getInput(e, env) { >-- if (e.filename && env.filename && (e.filename !== env.filename)) { >-- return parser.imports.contents[basename(e.filename)]; >-- } else { >-- return input; >-- } >-- } >-- >-- function getLocation(index, input) { >-- for (var n = index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null, >-- column: column }; >-- } >-- >-- function LessError(e, env) { >-- var input = getInput(e, env), >-- loc = getLocation(e.index, input), >-- line = loc.line, >-- col = loc.column, >-- lines = input.split('\n'); >-- >-- this.type = e.type || 'Syntax'; >-- this.message = e.message; >-- this.filename = e.filename || env.filename; >-- this.index = e.index; >-- this.line = typeof(line) === 'number' ? line + 1 : null; >-- this.callLine = e.call && (getLocation(e.call, input) + 1); >-- this.callExtract = lines[getLocation(e.call, input)]; >-- this.stack = e.stack; >-- this.column = col; >-- this.extract = [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ]; >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)\\]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = string.lastIndex = i; >-- >-- if (match = string.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- >-- if (!inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- switch (c) { >-- case '{': if (! inParam) { level ++; chunk.push(c); break } >-- case '}': if (! inParam) { level --; chunk.push(c); chunks[++j] = chunk = []; break } >-- case '(': if (! inParam) { inParam = true; chunk.push(c); break } >-- case ')': if ( inParam) { inParam = false; chunk.push(c); break } >-- default: chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- error = new(LessError)({ >-- index: i, >-- type: 'Parse', >-- message: "missing closing `}`", >-- filename: env.filename >-- }, env); >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- if (error) { >-- return callback(error); >-- } >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- try { >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- } catch (e) { >-- return callback(new(LessError)(e, env)); >-- } >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = [], importError; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- throw new(LessError)(e, env); >-- } >-- >-- if ((importError = parser.imports.error)) { // Check if there was an error during importing >-- if (importError instanceof LessError) throw importError; >-- else throw new(LessError)(importError, env); >-- } >-- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- type: "Parse", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k); >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index, env.filename) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- >-- expect(')'); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index, env.filename); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i), important = false; >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if ($(this.important)) { >-- important = true; >-- } >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index, env.filename, important); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value, cond; >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- save(); >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- value = expect(this.expression, 'expected expression'); >-- params.push({ name: param.name, value: value }); >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- expect(')'); >-- >-- if ($(/^when/)) { // Guard >-- cond = expect(this.conditions, 'expected condition'); >-- } >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset, cond); >-- } else { >-- restore(); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- expect(')'); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c, v; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (! e) { >-- $('(') && (v = $(this.entities.variable)) && $(')') && (e = new(tree.Paren)(v)); >-- } >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path, features, index = i; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url))) { >-- features = $(this.mediaFeatures); >-- if ($(';')) { >-- return new(tree.Import)(path, imports, features, index); >-- } >-- } >-- }, >-- >-- mediaFeature: function () { >-- var nodes = []; >-- >-- do { >-- if (e = $(this.entities.keyword)) { >-- nodes.push(e); >-- } else if ($('(')) { >-- p = $(this.property); >-- e = $(this.entity); >-- if ($(')')) { >-- if (p && e) { >-- nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); >-- } else if (e) { >-- nodes.push(new(tree.Paren)(e)); >-- } else { >-- return null; >-- } >-- } else { return null } >-- } >-- } while (e); >-- >-- if (nodes.length > 0) { >-- return new(tree.Expression)(nodes); >-- } >-- }, >-- >-- mediaFeatures: function () { >-- var f, features = []; >-- while (f = $(this.mediaFeature)) { >-- features.push(f); >-- if (! $(',')) { break } >-- } >-- return features.length > 0 ? features : null; >-- }, >-- >-- media: function () { >-- var features; >-- >-- if ($(/^@media/)) { >-- features = $(this.mediaFeatures); >-- >-- if (rules = $(this.block)) { >-- return new(tree.Directive)('@media', rules, features); >-- } >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types, e, nodes; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import']) || $(this.media)) { >-- return value; >-- } else if (name = $(/^@page|@keyframes/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- conditions: function () { >-- var a, b, index = i, condition; >-- >-- if (a = $(this.condition)) { >-- while ($(',') && (b = $(this.condition))) { >-- condition = new(tree.Condition)('or', condition || a, b, index); >-- } >-- return condition || a; >-- } >-- }, >-- condition: function () { >-- var a, b, c, op, index = i, negate = false; >-- >-- if ($(/^not/)) { negate = true } >-- expect('('); >-- if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- if (op = $(/^(?:>=|=<|[<=>])/)) { >-- if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- c = new(tree.Condition)(op, a, b, index, negate); >-- } else { >-- error('expected expression'); >-- } >-- } else { >-- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); >-- } >-- expect(')'); >-- return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (!/^([a-z]+:)?\//.test(path) && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, function (e) { >-- if (e && typeof(env.errback) === "function") { >-- env.errback.call(null, path, paths, callback, env); >-- } else { >-- callback.apply(null, arguments); >-- } >-- }, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- return this._math('round', n); >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- }, >-- percentage: function (n) { >-- return new(tree.Dimension)(n.value * 100, '%'); >-- }, >-- color: function (n) { >-- if (n instanceof tree.Quoted) { >-- return new(tree.Color)(n.value.slice(1)); >-- } else { >-- throw { type: "Argument", message: "argument must be a string" }; >-- } >-- }, >-- iscolor: function (n) { >-- return this._isa(n, tree.Color); >-- }, >-- isnumber: function (n) { >-- return this._isa(n, tree.Dimension); >-- }, >-- isstring: function (n) { >-- return this._isa(n, tree.Quoted); >-- }, >-- iskeyword: function (n) { >-- return this._isa(n, tree.Keyword); >-- }, >-- isurl: function (n) { >-- return this._isa(n, tree.URL); >-- }, >-- ispixel: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; >-- }, >-- ispercentage: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; >-- }, >-- isem: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; >-- }, >-- _isa: function (n, Type) { >-- return (n instanceof Type) ? tree.True : tree.False; >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index, filename) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >-- this.filename = filename; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { type: e.type || "Runtime", >-- message: "error evaluating function `" + this.name + "`" + >-- (e.message ? ': ' + e.message : ''), >-- index: this.index, filename: this.filename }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Condition = function (op, l, r, i, negate) { >-- this.op = op.trim(); >-- this.lvalue = l; >-- this.rvalue = r; >-- this.index = i; >-- this.negate = negate; >--}; >--tree.Condition.prototype.eval = function (env) { >-- var a = this.lvalue.eval(env), >-- b = this.rvalue.eval(env); >-- >-- var i = this.index, result; >-- >-- var result = (function (op) { >-- switch (op) { >-- case 'and': >-- return a && b; >-- case 'or': >-- return a || b; >-- default: >-- if (a.compare) { >-- result = a.compare(b); >-- } else if (b.compare) { >-- result = b.compare(a); >-- } else { >-- throw { type: "Type", >-- message: "Unable to perform comparison", >-- index: i }; >-- } >-- switch (result) { >-- case -1: return op === '<' || op === '=<'; >-- case 0: return op === '=' || op === '>=' || op === '=<'; >-- case 1: return op === '>' || op === '>='; >-- } >-- } >-- })(this.op); >-- return this.negate ? !result : result; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- }, >-- >-- // TODO: Perform unit conversion before comparing >-- compare: function (other) { >-- if (other instanceof tree.Dimension) { >-- if (other.value > this.value) { >-- return -1; >-- } else if (other.value < this.value) { >-- return 1; >-- } else { >-- return 0; >-- } >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value, features) { >-- this.name = name; >-- this.features = features && new(tree.Value)(features); >-- >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- this.ruleset.allowImports = true; >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + features + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- this.features = this.features && this.features.eval(env); >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- >-- if (typeof(value) === 'string') { >-- this.value = value.trim(); >-- } else if (value) { >-- this.value = value; >-- } else { >-- this.value = ""; >-- } >-- this.index = index; >--}; >--tree.Element.prototype.eval = function (env) { >-- return new(tree.Element)(this.combinator, >-- this.value.eval ? this.value.eval(env) : this.value, >-- this.index); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + (this.value.toCSS ? this.value.toCSS(env) : this.value); >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS ? e.toCSS(env) : ''; >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports, features, index) { >-- var that = this; >-- >-- this.index = index; >-- this._path = path; >-- this.features = features && new(tree.Value)(features); >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (e, root) { >-- if (e) { e.index = index } >-- that.root = root || new(tree.Ruleset)([], []); >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function (env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.css) { >-- return "@import " + this._path.toCSS() + features + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset, features = this.features && this.features.eval(env); >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return this.features ? new(tree.Directive)('@media', ruleset.rules, this.features.value) : ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value }, >-- compare: function (other) { >-- if (other instanceof tree.Keyword) { >-- return other.value === this.value ? 0 : 1; >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--tree.True = new(tree.Keyword)('true'); >--tree.False = new(tree.Keyword)('false'); >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index, filename, important) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >-- this.filename = filename; >-- this.important = important; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments, this.important).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, filename: this.filename, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { type: 'Runtime', >-- message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index, filename: this.filename }; >-- } >-- } >-- } >-- throw { type: 'Name', >-- message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index, filename: this.filename }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules, condition) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.condition = condition; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- evalParams: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []); >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- return frame; >-- }, >-- eval: function (env, args, important) { >-- var frame = this.evalParams(env, args), context, _arguments = [], rules; >-- >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- rules = important ? >-- this.rules.map(function (r) { >-- return new(tree.Rule)(r.name, r.value, '!important', r.index); >-- }) : this.rules.slice(0); >-- >-- return new(tree.Ruleset)(null, rules).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len, frame; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- if (this.condition && !this.condition.eval({ >-- frames: [this.evalParams(env, args)].concat(env.frames) >-- })) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Paren = function (node) { >-- this.value = node; >--}; >--tree.Paren.prototype = { >-- toCSS: function (env) { >-- return '(' + this.value.toCSS(env) + ')'; >-- }, >-- eval: function (env) { >-- return new(tree.Paren)(this.value.eval(env)); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return ('value' in v) ? v.value : v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index, inline) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- this.inline = inline || false; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + (this.inline ? "" : ";"); >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, >-- this.value.eval(context), >-- this.important, >-- this.index, this.inline); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); >-- var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- ruleset.allowImports = this.allowImports; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root || ruleset.allowImports) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors(paths, context, this.selectors); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join( env.compress ? ',' : ',\n'); >-- >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.eval = function (env) { >-- return new(tree.Selector)(this.elements.map(function (e) { >-- return e.eval(env); >-- })); >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { type: 'Name', >-- message: "variable " + name + " is undefined", >-- filename: this.file, >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--tree.jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >-- >--})(require('./tree')); >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- style.type = 'text/css'; >-- if (style.styleSheet) { >-- style.styleSheet.cssText = css; >-- } else { >-- style.innerHTML = css; >-- } >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- var filename = href.match(/([^\/]+)$/)[1]; >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, null, data, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type, >-- filename: filename >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(e, root, data, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- var template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>'; >-- var elem = document.createElement('div'), timer, content, error = []; >-- var filename = e.filename || href; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p>in <a href="' + filename + '">' + filename + "</a> "; >-- >-- var errorline = function (e, i, classname) { >-- if (e.extract[i]) { >-- error.push(template.replace(/\{line\}/, parseInt(e.line) + (i - 1)) >-- .replace(/\{class\}/, classname) >-- .replace(/\{content\}/, e.extract[i])); >-- } >-- }; >-- >-- if (e.stack) { >-- content += '<br/>' + e.stack.split('\n').slice(1).join('<br/>'); >-- } else if (e.extract) { >-- errorline(e, 0, ''); >-- errorline(e, 1, 'line'); >-- errorline(e, 2, ''); >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- '<ul>' + error.join('') + '</ul>'; >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #dd6666;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.line {', >-- 'color: #ff0000;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.2.2.min.js b/dist/less-1.2.2.min.js >-deleted file mode 100644 >-index 55042ecb8f9e42d938c7a3ae4232bd97a17a9805..0000000000000000000000000000000000000000 >---- a/dist/less-1.2.2.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.2.2 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,null,a,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}typeof define=="function"&&define.amd&&define("less",[],function(){return d}),Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a){return d.mode==="node"?c("path").basename(a):a.match(/[^\/]+$/)[0]}function B(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[A(a.filename)]:g}function C(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function D(a,b){var c=B(a,b),d=C(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&C(a.call,c)+1,this.callExtract=g[C(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)\\]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g,h=0,i,j=a[0],k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(i=d.exec(g))&&i.index===l&&(l+=i[0].length,j.push(i[0])),m=g.charAt(l),e.lastIndex=f.lastIndex=l,(i=f.exec(g))&&i.index===l&&(l+=i[0].length,j.push(i[0]),m=g.charAt(l)),!k&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(i=e.exec(g))&&i.index===l&&(l+=i[0].length,j.push(i[0]),m=g.charAt(l)));switch(m){case"{":if(!k){h++,j.push(m);break};case"}":if(!k){h--,j.push(m),a[++c]=j=[];break};case"(":if(!k){k=!0,j.push(m);break};case")":if(k){k=!1,j.push(m);break};default:j.push(m)}}return h>0&&(x=new D({index:l,type:"Parse",message:"missing closing `}`",filename:b.filename},b)),a.map(function(a){return a.join("")})}([[]]);if(x)return e(x);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new D(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new D(k,b)}if(i=o.imports.error)throw i instanceof D?i:new D(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^@media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){!/^([a-z]+:)?\//.test(a)&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},function(e){e&&typeof d.errback=="function"?d.errback.call(null,a,b,c,d):c.apply(null,arguments)},!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new >--a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":",\n"),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window); >-\ No newline at end of file >-diff --git a/dist/less-1.3.0.js b/dist/less-1.3.0.js >-deleted file mode 100644 >-index fce5fb590dd8c13afe7977df00b3ad14ec208526..0000000000000000000000000000000000000000 >---- a/dist/less-1.3.0.js >-+++ /dev/null >-@@ -1,3478 +0,0 @@ >--// >--// LESS - Leaner CSS v1.3.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >--// amd.js >--// >--// Define Less as an AMD module. >--if (typeof define === "function" && define.amd) { >-- define("less", [], function () { return less; } ); >--} >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- if (typeof(window) === 'undefined') { less = {} } >-- else { less = window.less = {} } >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- contents: {}, // Holds the imported file contents >-- mime: env && env.mime, // MIME type of .less files >-- error: null, // Error in parsing/evaluating an import >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (e, root, contents) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- that.contents[path] = contents; >-- >-- if (e && !that.error) { that.error = e } >-- callback(e, root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- function expect(arg, msg) { >-- var result = $(arg); >-- if (! result) { >-- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" >-- : "unexpected token")); >-- } else { >-- return result; >-- } >-- } >-- >-- function error(msg, type) { >-- throw { index: i, type: type || 'Syntax', message: msg }; >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- function basename(pathname) { >-- if (less.mode === 'node') { >-- return require('path').basename(pathname); >-- } else { >-- return pathname.match(/[^\/]+$/)[0]; >-- } >-- } >-- >-- function getInput(e, env) { >-- if (e.filename && env.filename && (e.filename !== env.filename)) { >-- return parser.imports.contents[basename(e.filename)]; >-- } else { >-- return input; >-- } >-- } >-- >-- function getLocation(index, input) { >-- for (var n = index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null, >-- column: column }; >-- } >-- >-- function LessError(e, env) { >-- var input = getInput(e, env), >-- loc = getLocation(e.index, input), >-- line = loc.line, >-- col = loc.column, >-- lines = input.split('\n'); >-- >-- this.type = e.type || 'Syntax'; >-- this.message = e.message; >-- this.filename = e.filename || env.filename; >-- this.index = e.index; >-- this.line = typeof(line) === 'number' ? line + 1 : null; >-- this.callLine = e.call && (getLocation(e.call, input).line + 1); >-- this.callExtract = lines[getLocation(e.call, input).line]; >-- this.stack = e.stack; >-- this.column = col; >-- this.extract = [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ]; >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)\\]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = string.lastIndex = i; >-- >-- if (match = string.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- >-- if (!inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- switch (c) { >-- case '{': if (! inParam) { level ++; chunk.push(c); break } >-- case '}': if (! inParam) { level --; chunk.push(c); chunks[++j] = chunk = []; break } >-- case '(': if (! inParam) { inParam = true; chunk.push(c); break } >-- case ')': if ( inParam) { inParam = false; chunk.push(c); break } >-- default: chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- error = new(LessError)({ >-- index: i, >-- type: 'Parse', >-- message: "missing closing `}`", >-- filename: env.filename >-- }, env); >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- if (error) { >-- return callback(error); >-- } >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- try { >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- } catch (e) { >-- return callback(new(LessError)(e, env)); >-- } >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = [], importError; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- throw new(LessError)(e, env); >-- } >-- >-- if ((importError = parser.imports.error)) { // Check if there was an error during importing >-- if (importError instanceof LessError) throw importError; >-- else throw new(LessError)(importError, env); >-- } >-- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- type: "Parse", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k); >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index, env.filename) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- >-- expect(')'); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index, env.filename); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i), important = false; >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if ($(this.important)) { >-- important = true; >-- } >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args || [], index, env.filename, important); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value, cond, variadic = false; >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- save(); >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- do { >-- if (input.charAt(i) === '.' && $(/^\.{3}/)) { >-- variadic = true; >-- break; >-- } else if (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- value = expect(this.expression, 'expected expression'); >-- params.push({ name: param.name, value: value }); >-- } else if ($(/^\.{3}/)) { >-- params.push({ name: param.name, variadic: true }); >-- variadic = true; >-- break; >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- } else { >-- break; >-- } >-- } while ($(',')) >-- >-- expect(')'); >-- >-- if ($(/^when/)) { // Guard >-- cond = expect(this.conditions, 'expected condition'); >-- } >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic); >-- } else { >-- restore(); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- expect(')'); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c, v; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (! e) { >-- $('(') && (v = $(this.entities.variable)) && $(')') && (e = new(tree.Paren)(v)); >-- } >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- if ($('(')) { >-- sel = $(this.entity); >-- expect(')'); >-- return new(tree.Selector)([new(tree.Element)('', sel, i)]); >-- } >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules, env.strictImports); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path, features, index = i; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url))) { >-- features = $(this.mediaFeatures); >-- if ($(';')) { >-- return new(tree.Import)(path, imports, features, index); >-- } >-- } >-- }, >-- >-- mediaFeature: function () { >-- var e, p, nodes = []; >-- >-- do { >-- if (e = $(this.entities.keyword)) { >-- nodes.push(e); >-- } else if ($('(')) { >-- p = $(this.property); >-- e = $(this.entity); >-- if ($(')')) { >-- if (p && e) { >-- nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); >-- } else if (e) { >-- nodes.push(new(tree.Paren)(e)); >-- } else { >-- return null; >-- } >-- } else { return null } >-- } >-- } while (e); >-- >-- if (nodes.length > 0) { >-- return new(tree.Expression)(nodes); >-- } >-- }, >-- >-- mediaFeatures: function () { >-- var e, features = []; >-- >-- do { >-- if (e = $(this.mediaFeature)) { >-- features.push(e); >-- if (! $(',')) { break } >-- } else if (e = $(this.entities.variable)) { >-- features.push(e); >-- if (! $(',')) { break } >-- } >-- } while (e); >-- >-- return features.length > 0 ? features : null; >-- }, >-- >-- media: function () { >-- var features, rules; >-- >-- if ($(/^@media/)) { >-- features = $(this.mediaFeatures); >-- >-- if (rules = $(this.block)) { >-- return new(tree.Media)(rules, features); >-- } >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types, e, nodes; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import']) || $(this.media)) { >-- return value; >-- } else if (name = $(/^@page|@keyframes/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- conditions: function () { >-- var a, b, index = i, condition; >-- >-- if (a = $(this.condition)) { >-- while ($(',') && (b = $(this.condition))) { >-- condition = new(tree.Condition)('or', condition || a, b, index); >-- } >-- return condition || a; >-- } >-- }, >-- condition: function () { >-- var a, b, c, op, index = i, negate = false; >-- >-- if ($(/^not/)) { negate = true } >-- expect('('); >-- if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- if (op = $(/^(?:>=|=<|[<=>])/)) { >-- if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- c = new(tree.Condition)(op, a, b, index, negate); >-- } else { >-- error('expected expression'); >-- } >-- } else { >-- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); >-- } >-- expect(')'); >-- return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (!/^([a-z]+:)?\//.test(path) && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, function (e) { >-- if (e && typeof(env.errback) === "function") { >-- env.errback.call(null, path, paths, callback, env); >-- } else { >-- callback.apply(null, arguments); >-- } >-- }, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- return this._math('round', n); >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- }, >-- percentage: function (n) { >-- return new(tree.Dimension)(n.value * 100, '%'); >-- }, >-- color: function (n) { >-- if (n instanceof tree.Quoted) { >-- return new(tree.Color)(n.value.slice(1)); >-- } else { >-- throw { type: "Argument", message: "argument must be a string" }; >-- } >-- }, >-- iscolor: function (n) { >-- return this._isa(n, tree.Color); >-- }, >-- isnumber: function (n) { >-- return this._isa(n, tree.Dimension); >-- }, >-- isstring: function (n) { >-- return this._isa(n, tree.Quoted); >-- }, >-- iskeyword: function (n) { >-- return this._isa(n, tree.Keyword); >-- }, >-- isurl: function (n) { >-- return this._isa(n, tree.URL); >-- }, >-- ispixel: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; >-- }, >-- ispercentage: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; >-- }, >-- isem: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; >-- }, >-- _isa: function (n, Type) { >-- return (n instanceof Type) ? tree.True : tree.False; >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index, filename) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >-- this.filename = filename; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { type: e.type || "Runtime", >-- message: "error evaluating function `" + this.name + "`" + >-- (e.message ? ': ' + e.message : ''), >-- index: this.index, filename: this.filename }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Condition = function (op, l, r, i, negate) { >-- this.op = op.trim(); >-- this.lvalue = l; >-- this.rvalue = r; >-- this.index = i; >-- this.negate = negate; >--}; >--tree.Condition.prototype.eval = function (env) { >-- var a = this.lvalue.eval(env), >-- b = this.rvalue.eval(env); >-- >-- var i = this.index, result; >-- >-- var result = (function (op) { >-- switch (op) { >-- case 'and': >-- return a && b; >-- case 'or': >-- return a || b; >-- default: >-- if (a.compare) { >-- result = a.compare(b); >-- } else if (b.compare) { >-- result = b.compare(a); >-- } else { >-- throw { type: "Type", >-- message: "Unable to perform comparison", >-- index: i }; >-- } >-- switch (result) { >-- case -1: return op === '<' || op === '=<'; >-- case 0: return op === '=' || op === '>=' || op === '=<'; >-- case 1: return op === '>' || op === '>='; >-- } >-- } >-- })(this.op); >-- return this.negate ? !result : result; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- }, >-- >-- // TODO: Perform unit conversion before comparing >-- compare: function (other) { >-- if (other instanceof tree.Dimension) { >-- if (other.value > this.value) { >-- return -1; >-- } else if (other.value < this.value) { >-- return 1; >-- } else { >-- return 0; >-- } >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value, features) { >-- this.name = name; >-- >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- this.ruleset.allowImports = true; >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- >-- if (typeof(value) === 'string') { >-- this.value = value.trim(); >-- } else if (value) { >-- this.value = value; >-- } else { >-- this.value = ""; >-- } >-- this.index = index; >--}; >--tree.Element.prototype.eval = function (env) { >-- return new(tree.Element)(this.combinator, >-- this.value.eval ? this.value.eval(env) : this.value, >-- this.index); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + (this.value.toCSS ? this.value.toCSS(env) : this.value); >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS ? e.toCSS(env) : ''; >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports, features, index) { >-- var that = this; >-- >-- this.index = index; >-- this._path = path; >-- this.features = features && new(tree.Value)(features); >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (e, root) { >-- if (e) { e.index = index } >-- that.root = root || new(tree.Ruleset)([], []); >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function (env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.css) { >-- return "@import " + this._path.toCSS() + features + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset, features = this.features && this.features.eval(env); >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value }, >-- compare: function (other) { >-- if (other instanceof tree.Keyword) { >-- return other.value === this.value ? 0 : 1; >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--tree.True = new(tree.Keyword)('true'); >--tree.False = new(tree.Keyword)('false'); >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Media = function (value, features) { >-- var el = new(tree.Element)('&', null, 0), >-- selectors = [new(tree.Selector)([el])]; >-- >-- this.features = new(tree.Value)(features); >-- this.ruleset = new(tree.Ruleset)(selectors, value); >-- this.ruleset.allowImports = true; >--}; >--tree.Media.prototype = { >-- toCSS: function (ctx, env) { >-- var features = this.features.toCSS(env); >-- >-- this.ruleset.root = (ctx.length === 0 || ctx[0].multiMedia); >-- return '@media ' + features + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- }, >-- eval: function (env) { >-- if (!env.mediaBlocks) { >-- env.mediaBlocks = []; >-- env.mediaPath = []; >-- } >-- >-- var blockIndex = env.mediaBlocks.length; >-- env.mediaPath.push(this); >-- env.mediaBlocks.push(this); >-- >-- var media = new(tree.Media)([], []); >-- media.features = this.features.eval(env); >-- >-- env.frames.unshift(this.ruleset); >-- media.ruleset = this.ruleset.eval(env); >-- env.frames.shift(); >-- >-- env.mediaBlocks[blockIndex] = media; >-- env.mediaPath.pop(); >-- >-- return env.mediaPath.length === 0 ? media.evalTop(env) : >-- media.evalNested(env) >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) }, >-- >-- evalTop: function (env) { >-- var result = this; >-- >-- // Render all dependent Media blocks. >-- if (env.mediaBlocks.length > 1) { >-- var el = new(tree.Element)('&', null, 0); >-- var selectors = [new(tree.Selector)([el])]; >-- result = new(tree.Ruleset)(selectors, env.mediaBlocks); >-- result.multiMedia = true; >-- } >-- >-- delete env.mediaBlocks; >-- delete env.mediaPath; >-- >-- return result; >-- }, >-- evalNested: function (env) { >-- var i, value, >-- path = env.mediaPath.concat([this]); >-- >-- // Extract the media-query conditions separated with `,` (OR). >-- for (i = 0; i < path.length; i++) { >-- value = path[i].features instanceof tree.Value ? >-- path[i].features.value : path[i].features; >-- path[i] = Array.isArray(value) ? value : [value]; >-- } >-- >-- // Trace all permutations to generate the resulting media-query. >-- // >-- // (a, b and c) with nested (d, e) -> >-- // a and d >-- // a and e >-- // b and c and d >-- // b and c and e >-- this.features = new(tree.Value)(this.permute(path).map(function (path) { >-- path = path.map(function (fragment) { >-- return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment); >-- }); >-- >-- for(i = path.length - 1; i > 0; i--) { >-- path.splice(i, 0, new(tree.Anonymous)("and")); >-- } >-- >-- return new(tree.Expression)(path); >-- })); >-- >-- // Fake a tree-node that doesn't output anything. >-- return new(tree.Ruleset)([], []); >-- }, >-- permute: function (arr) { >-- if (arr.length === 0) { >-- return []; >-- } else if (arr.length === 1) { >-- return arr[0]; >-- } else { >-- var result = []; >-- var rest = this.permute(arr.slice(1)); >-- for (var i = 0; i < rest.length; i++) { >-- for (var j = 0; j < arr[0].length; j++) { >-- result.push([arr[0][j]].concat(rest[i])); >-- } >-- } >-- return result; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index, filename, important) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >-- this.filename = filename; >-- this.important = important; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments, this.important).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: this.index, filename: this.filename, stack: e.stack }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { type: 'Runtime', >-- message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index, filename: this.filename }; >-- } >-- } >-- } >-- throw { type: 'Name', >-- message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index, filename: this.filename }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules, condition, variadic) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.condition = condition; >-- this.variadic = variadic; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- evalParams: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), varargs; >-- >-- for (var i = 0, val, name; i < this.params.length; i++) { >-- if (name = this.params[i].name) { >-- if (this.params[i].variadic && args) { >-- varargs = []; >-- for (var j = i; j < args.length; j++) { >-- varargs.push(args[j].eval(env)); >-- } >-- frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env))); >-- } else if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(name, val.eval(env))); >-- } else { >-- throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- return frame; >-- }, >-- eval: function (env, args, important) { >-- var frame = this.evalParams(env, args), context, _arguments = [], rules, start; >-- >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- rules = important ? >-- this.rules.map(function (r) { >-- return new(tree.Rule)(r.name, r.value, '!important', r.index); >-- }) : this.rules.slice(0); >-- >-- return new(tree.Ruleset)(null, rules).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len, frame; >-- >-- if (! this.variadic) { >-- if (argsLength < this.required) { return false } >-- if (argsLength > this.params.length) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- } >-- >-- if (this.condition && !this.condition.eval({ >-- frames: [this.evalParams(env, args)].concat(env.frames) >-- })) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Paren = function (node) { >-- this.value = node; >--}; >--tree.Paren.prototype = { >-- toCSS: function (env) { >-- return '(' + this.value.toCSS(env) + ')'; >-- }, >-- eval: function (env) { >-- return new(tree.Paren)(this.value.eval(env)); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return ('value' in v) ? v.value : v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index, inline) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- this.inline = inline || false; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + (this.inline ? "" : ";"); >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, >-- this.value.eval(context), >-- this.important, >-- this.index, this.inline); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules, strictImports) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >-- this.strictImports = strictImports; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); >-- var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports); >-- >-- ruleset.root = this.root; >-- ruleset.allowImports = this.allowImports; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors(paths, context, this.selectors); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive) || (rule instanceof tree.Media)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join( env.compress ? ',' : ',\n'); >-- >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.eval = function (env) { >-- return new(tree.Selector)(this.elements.map(function (e) { >-- return e.eval(env); >-- })); >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { type: 'Name', >-- message: "variable " + name + " is undefined", >-- filename: this.file, >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--tree.jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >-- >--})(require('./tree')); >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = (location.protocol === 'file:' || >-- location.protocol === 'chrome:' || >-- location.protocol === 'chrome-extension:' || >-- location.protocol === 'resource:'); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- style.type = 'text/css'; >-- if (style.styleSheet) { >-- style.styleSheet.cssText = css; >-- } else { >-- style.innerHTML = css; >-- } >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^(https?|file):/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- var filename = href.match(/([^\/]+)$/)[1]; >-- >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, null, data, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type, >-- filename: filename >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(e, root, data, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- css.media = sheet.media || 'screen'; >-- css.id = id; >-- document.getElementsByTagName('head')[0].appendChild(css); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? false : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol) { >-- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- var template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>'; >-- var elem = document.createElement('div'), timer, content, error = []; >-- var filename = e.filename || href; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p>in <a href="' + filename + '">' + filename + "</a> "; >-- >-- var errorline = function (e, i, classname) { >-- if (e.extract[i]) { >-- error.push(template.replace(/\{line\}/, parseInt(e.line) + (i - 1)) >-- .replace(/\{class\}/, classname) >-- .replace(/\{content\}/, e.extract[i])); >-- } >-- }; >-- >-- if (e.stack) { >-- content += '<br/>' + e.stack.split('\n').slice(1).join('<br/>'); >-- } else if (e.extract) { >-- errorline(e, 0, ''); >-- errorline(e, 1, 'line'); >-- errorline(e, 2, ''); >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- '<ul>' + error.join('') + '</ul>'; >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #dd6666;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.line {', >-- 'color: #ff0000;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--})(window); >-diff --git a/dist/less-1.3.0.min.js b/dist/less-1.3.0.min.js >-deleted file mode 100644 >-index 309bf550db1c213499f08df78393d54c2fedbbf1..0000000000000000000000000000000000000000 >---- a/dist/less-1.3.0.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.3.0 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(a,b){function c(b){return a.less[b.split("/")[1]]}function l(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(j)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function m(a,b){for(var c=0;c<d.sheets.length;c++)n(d.sheets[c],a,b,d.sheets.length-(c+1))}function n(b,c,e,f){var h=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=g&&g.getItem(i),k=g&&g.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=h.slice(0,h.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];q(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())p(l.css,b),c(null,null,a,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return u(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),s(document.getElementById("less-error-message:"+o(i)))}catch(d){u(d,i)}})}catch(h){u(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function o(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function p(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||o(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(h){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&g&&(t("saving "+e+" to cache."),g.setItem(e,a),g.setItem(e+":timestamp",c))}function q(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var g=r(),h=f?!1:d.async;typeof g.overrideMimeType=="function"&&g.overrideMimeType("text/css"),g.open("GET",a,h),g.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),g.send(null),f?g.status===0||g.status>=200&&g.status<300?c(g.responseText):e(g.status,a):h?g.onreadystatechange=function(){g.readyState==4&&i(g,c,e)}:i(g,c,e)}function r(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return t("browser doesn't support AJAX."),null}}function s(a){return a&&a.parentNode.removeChild(a)}function t(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function u(a,b){var c="less-error-message:"+o(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,p([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}typeof define=="function"&&define.amd&&define("less",[],function(){return d}),Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,e;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},e=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,e=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,e=a.less.tree={},d.mode="browser"),d.Parser=function v(a){function q(){h=k[g],i=f,l=f}function r(){k[g]=h,f=i,l=f}function s(){f>l&&(k[g]=k[g].slice(f-l),l=f)}function t(a){var c,d,e,h,i,j,n,o;if(a instanceof Function)return a.call(m.parsers);if(typeof a=="string")c=b.charAt(f)===a?a:null,e=1,s();else{s();if(c=a.exec(k[g]))e=c[0].length;else return null}if(c){o=f+=e,j=f+k[g].length-e;while(f<j){h=b.charCodeAt(f);if(h!==32&&h!==10&&h!==9)break;f++}return k[g]=k[g].slice(e+(f-o)),l=f,k[g].length===0&&g<k.length-1&&g++,typeof c=="string"?c:c.length===1?c[0]:c}}function u(a,c){var d=t(a);if(!d)v(c||(typeof a=="string"?"expected '"+a+"' got '"+b.charAt(f)+"'":"unexpected token"));else return d}function v(a,b){throw{index:f,type:b||"Syntax",message:a}}function w(a){return typeof a=="string"?b.charAt(f)===a:a.test(k[g])?!0:!1}function x(a){return d.mode==="node"?c("path").basename(a):a.match(/[^\/]+$/)[0]}function y(a,c){return a.filename&&c.filename&&a.filename!==c.filename?m.imports.contents[x(a.filename)]:b}function z(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function A(a,b){var c=y(a,b),d=z(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&z(a.call,c).line+1,this.callExtract=g[z(a.call,c).line],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var b,f,g,h,i,j,k,l,m,n=this,o=function(){},p=this.imports={paths:a&&a.paths||[],queue:[],files:{},contents:{},mime:a&&a.mime,error:null,push:function(b,c){var e=this;this.queue.push(b),d.Parser.importer(b,this.paths,function(a,d,f){e.queue.splice(e.queue.indexOf(b),1),e.files[b]=d,e.contents[b]=f,a&&!e.error&&(e.error=a),c(a,d),e.queue.length===0&&o()},a)}};return this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,m={imports:p,parse:function(h,i){var n,p,q,r,s,u,v=[],w,x=null;f=g=l=j=0,b=h.replace(/\r\n/g,"\n"),k=function(c){var d=0,e=/[^"'`\{\}\/\(\)\\]+/g,f=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,g=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g,h=0,i,j=c[0],k;for(var l=0,m,n;l<b.length;l++){e.lastIndex=l,(i=e.exec(b))&&i.index===l&&(l+=i[0].length,j.push(i[0])),m=b.charAt(l),f.lastIndex=g.lastIndex=l,(i=g.exec(b))&&i.index===l&&(l+=i[0].length,j.push(i[0]),m=b.charAt(l)),!k&&m==="/"&&(n=b.charAt(l+1),(n==="/"||n==="*")&&(i=f.exec(b))&&i.index===l&&(l+=i[0].length,j.push(i[0]),m=b.charAt(l)));switch(m){case"{":if(!k){h++,j.push(m);break};case"}":if(!k){h--,j.push(m),c[++d]=j=[];break};case"(":if(!k){k=!0,j.push(m);break};case")":if(k){k=!1,j.push(m);break};default:j.push(m)}}return h>0&&(x=new A({index:l,type:"Parse",message:"missing closing `}`",filename:a.filename},a)),c.map(function(a){return a.join("")})}([[]]);if(x)return i(x);try{n=new e.Ruleset([],t(this.parsers.primary)),n.root=!0}catch(y){return i(new A(y,a))}n.toCSS=function(b){var f,g,h;return function(f,g){var h=[],i;f=f||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof e.Value||(b instanceof e.Expression||(b=new e.Expression([b])),b=new e.Value([b])),new e.Rule("@"+a,b,!1,0)}),h=[new e.Ruleset(null,g)]);try{var j=b.call(this,{frames:h}).toCSS([],{compress:f.compress||!1})}catch(k){throw new A(k,a)}if(i=m.imports.error)throw i instanceof A?i:new A(i,a);return f.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):f.compress?j.replace(/(\s)+/g,"$1"):j}}(n.eval);if(f<b.length-1){f=j,u=b.split("\n"),s=(b.slice(0,f).match(/\n/g)||"").length+1;for(var z=f,B=-1;z>=0&&b.charAt(z)!=="\n";z--)B++;x={type:"Parse",message:"Syntax Error on line "+s,index:f,filename:a.filename,line:s,column:B,extract:[u[s-2],u[s-1],u[s]]}}this.imports.queue.length>0?o=function(){i(x,n)}:i(x,n)},parsers:{primary:function(){var a,b=[];while((a=t(this.mixin.definition)||t(this.rule)||t(this.ruleset)||t(this.mixin.call)||t(this.comment)||t(this.directive))||t(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(b.charAt(f)!=="/")return;if(b.charAt(f+1)==="/")return new e.Comment(t(/^\/\/.*/),!0);if(a=t(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new e.Comment(a)},entities:{quoted:function(){var a,c=f,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=='"'&&b.charAt(c)!=="'")return;d&&t("~");if(a=t(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new e.Quoted(a[0],a[1]||a[2],d)},keyword:function(){var a;if(a=t(/^[_A-Za-z-][_A-Za-z0-9-]*/))return e.colors.hasOwnProperty(a)?new e.Color(e.colors[a].slice(1)):new e.Keyword(a)},call:function(){var b,c,d=f;if(!(b=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(k[g])))return;b=b[1].toLowerCase();if(b==="url")return null;f+=b.length;if(b==="alpha")return t(this.alpha);t("("),c=t(this.entities.arguments);if(!t(")"))return;if(b)return new e.Call(b,c,d,a.filename)},arguments:function(){var a=[],b;while(b=t(this.entities.assignment)||t(this.expression)){a.push(b);if(!t(","))break}return a},literal:function(){return t(this.entities.dimension)||t(this.entities.color)||t(this.entities.quoted)},assignment:function(){var a,b;if((a=t(/^\w+(?=\s?=)/i))&&t("=")&&(b=t(this.entity)))return new e.Assignment(a,b)},url:function(){var a;if(b.charAt(f)!=="u"||!t(/^url\(/))return;return a=t(this.entities.quoted)||t(this.entities.variable)||t(this.entities.dataURI)||t(/^[-\w%@$\/.&=:;#+?~]+/)||"",u(")"),new e.URL(a.value||a.data||a instanceof e.Variable?a:new e.Anonymous(a),p.paths)},dataURI:function(){var a;if(t(/^data:/)){a={},a.mime=t(/^[^\/]+\/[^,;)]+/)||"",a.charset=t(/^;\s*charset=[^,;)]+/)||"",a.base64=t(/^;\s*base64/)||"",a.data=t(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var c,d=f;if(b.charAt(f)==="@"&&(c=t(/^@@?[\w-]+/)))return new e.Variable(c,d,a.filename)},color:function(){var a;if(b.charAt(f)==="#"&&(a=t(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Color(a[1])},dimension:function(){var a,c=b.charCodeAt(f);if(c>57||c<45||c===47)return;if(a=t(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new e.Dimension(a[1],a[2])},javascript:function(){var a,c=f,d;b.charAt(c)==="~"&&(c++,d=!0);if(b.charAt(c)!=="`")return;d&&t("~");if(a=t(/^`([^`]*)`/))return new e.JavaScript(a[1],f,d)}},variable:function(){var a;if(b.charAt(f)==="@"&&(a=t(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!w(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=t(this.entity))&&t("/")&&(b=t(this.entity)))return new e.Shorthand(a,b)},mixin:{call:function(){var c=[],d,g,h,i=f,j=b.charAt(f),k=!1;if(j!=="."&&j!=="#")return;while(d=t(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))c.push(new e.Element(g,d,f)),g=t(">");t("(")&&(h=t(this.entities.arguments))&&t(")"),t(this.important)&&(k=!0);if(c.length>0&&(t(";")||w("}")))return new e.mixin.Call(c,h||[],i,a.filename,k)},definition:function(){var a,c=[],d,g,h,i,j,k=!1;if(b.charAt(f)!=="."&&b.charAt(f)!=="#"||w(/^[^{]*(;|})/))return;q();if(d=t(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=d[1];do{if(b.charAt(f)==="."&&t(/^\.{3}/)){k=!0;break}if(!(h=t(this.entities.variable)||t(this.entities.literal)||t(this.entities.keyword)))break;if(h instanceof e.Variable)if(t(":"))i=u(this.expression,"expected expression"),c.push({name:h.name,value:i});else{if(t(/^\.{3}/)){c.push({name:h.name,variadic:!0}),k=!0;break}c.push({name:h.name})}else c.push({value:h})}while(t(","));u(")"),t(/^when/)&&(j=u(this.conditions,"expected condition")),g=t(this.block);if(g)return new e.mixin.Definition(a,c,g,j,k);r()}}},entity:function(){return t(this.entities.literal)||t(this.entities.variable)||t(this.entities.url)||t(this.entities.call)||t(this.entities.keyword)||t(this.entities.javascript)||t(this.comment)},end:function(){return t(";")||w("}")},alpha:function(){var a;if(!t(/^\(opacity=/i))return;if(a=t(/^\d+/)||t(this.entities.variable))return u(")"),new e.Alpha(a)},element:function(){var a,b,c,d;c=t(this.combinator),a=t(/^(?:\d+\.\d+|\d+)%/)||t(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||t("*")||t(this.attribute)||t(/^\([^)@]+\)/),a||t("(")&&(d=t(this.entities.variable))&&t(")")&&(a=new e.Paren(d));if(a)return new e.Element(c,a,f);if(c.value&&c.value.charAt(0)==="&")return new e.Element(c,null,f)},combinator:function(){var a,c=b.charAt(f);if(c===">"||c==="+"||c==="~"){f++;while(b.charAt(f)===" ")f++;return new e.Combinator(c)}if(c==="&"){a="&",f++,b.charAt(f)===" "&&(a="& ");while(b.charAt(f)===" ")f++;return new e.Combinator(a)}return b.charAt(f-1)===" "?new e.Combinator(" "):new e.Combinator(null)},selector:function(){var a,c,d=[],g,h;if(t("("))return a=t(this.entity),u(")"),new e.Selector([new e.Element("",a,f)]);while(c=t(this.element)){g=b.charAt(f),d.push(c);if(g==="{"||g==="}"||g===";"||g===",")break}if(d.length>0)return new e.Selector(d)},tag:function(){return t(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||t("*")},attribute:function(){var a="",b,c,d;if(!t("["))return;if(b=t(/^[a-zA-Z-]+/)||t(this.entities.quoted))(d=t(/^[|~*$^]?=/))&&(c=t(this.entities.quoted)||t(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!t("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(t("{")&&(a=t(this.primary))&&t("}"))return a},ruleset:function(){var b=[],c,d,g;q();while(c=t(this.selector)){b.push(c),t(this.comment);if(!t(","))break;t(this.comment)}if(b.length>0&&(d=t(this.block)))return new e.Ruleset(b,d,a.strictImports);j=f,r()},rule:function(){var a,c,d=b.charAt(f),h,l;q();if(d==="."||d==="#"||d==="&")return;if(a=t(this.variable)||t(this.property)){a.charAt(0)!="@"&&(l=/^([^@+\/'"*`(;{}-]*);/.exec(k[g]))?(f+=l[0].length-1,c=new e.Anonymous(l[1])):a==="font"?c=t(this.font):c=t(this.value),h=t(this.important);if(c&&t(this.end))return new e.Rule(a,c,h,i);j=f,r()}},"import":function(){var a,b,c=f;if(t(/^@import\s+/)&&(a=t(this.entities.quoted)||t(this.entities.url))){b=t(this.mediaFeatures);if(t(";"))return new e.Import(a,p,b,c)}},mediaFeature:function(){var a,b,c=[];do if(a=t(this.entities.keyword))c.push(a);else if(t("(")){b=t(this.property),a=t(this.entity);if(!t(")"))return null;if(b&&a)c.push(new e.Paren(new e.Rule(b,a,null,f,!0)));else if(a)c.push(new e.Paren(a));else return null}while(a);if(c.length>0)return new e.Expression(c)},mediaFeatures:function(){var a,b=[];do if(a=t(this.mediaFeature)){b.push(a);if(!t(","))break}else if(a=t(this.entities.variable)){b.push(a);if(!t(","))break}while(a);return b.length>0?b:null},media:function(){var a,b;if(t(/^@media/)){a=t(this.mediaFeatures);if(b=t(this.block))return new e.Media(b,a)}},directive:function(){var a,c,d,g,h,i;if(b.charAt(f)!=="@")return;if(c=t(this["import"])||t(this.media))return c;if(a=t(/^@page|@keyframes/)||t(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){g=(t(/^[^{]+/)||"").trim();if(d=t(this.block))return new e.Directive(a+" "+g,d)}else if(a=t(/^@[-a-z]+/))if(a==="@font-face"){if(d=t(this.block))return new e.Directive(a,d)}else if((c=t(this.entity))&&t(";"))return new e.Directive(a,c)},font:function(){var a=[],b=[],c,d,f,g;while(g=t(this.shorthand)||t(this.entity))b.push(g);a.push(new e.Expression(b));if(t(","))while(g=t(this.expression)){a.push(g);if(!t(","))break}return new e.Value(a)},value:function(){var a,b=[],c;while(a=t(this.expression)){b.push(a);if(!t(","))break}if(b.length>0)return new e.Value(b)},important:function(){if(b.charAt(f)==="!")return t(/^! *important/)},sub:function(){var a;if(t("(")&&(a=t(this.expression))&&t(")"))return a},multiplication:function(){var a,b,c,d;if(a=t(this.operand)){while(!w(/^\/\*/)&&(c=t("/")||t("*"))&&(b=t(this.operand)))d=new e.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,c,d,g;if(a=t(this.multiplication)){while((d=t(/^[-+]\s+/)||b.charAt(f-1)!=" "&&(t("+")||t("-")))&&(c=t(this.multiplication)))g=new e.Operation(d,[g||a,c]);return g||a}},conditions:function(){var a,b,c=f,d;if(a=t(this.condition)){while(t(",")&&(b=t(this.condition)))d=new e.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,g=f,h=!1;t(/^not/)&&(h=!0),u("(");if(a=t(this.addition)||t(this.entities.keyword)||t(this.entities.quoted))return(d=t(/^(?:>=|=<|[<=>])/))?(b=t(this.addition)||t(this.entities.keyword)||t(this.entities.quoted))?c=new e.Condition(d,a,b,g,h):v("expected expression"):c=new e.Condition("=",a,new e.Keyword("true"),g,h),u(")"),t(/^and/)?new e.Condition("and",c,t(this.condition)):c},operand:function(){var a,c=b.charAt(f+1);b.charAt(f)==="-"&&(c==="@"||c==="(")&&(a=t("-"));var d=t(this.sub)||t(this.entities.dimension)||t(this.entities.color)||t(this.entities.variable)||t(this.entities.call);return a?new e.Operation("*",[new e.Dimension(-1),d]):d},expression:function(){var a,b,c=[],d;while(a=t(this.addition)||t(this.entity))c.push(a);if(c.length>0)return new e.Expression(c)},property:function(){var a;if(a=t(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){!/^([a-z]+:)?\//.test(a)&&b.length>0&&(a=b[0]+a),n({href:a,title:a,type:d.mime},function(e){e&&typeof d.errback=="function"?d.errback.call(null,a,b,c,d):c.apply(null,arguments)},!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else if(c.compare)e=c.compare(b);else throw{type:"Type",message:"Unable to perform comparison",index:d};switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){return this.ruleset?(this.ruleset.root=!0,this.name+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype >--.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Media(c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.Media=function(b,c){var d=new a.Element("&",null,0),e=[new a.Selector([d])];this.features=new a.Value(c),this.ruleset=new a.Ruleset(e,b),this.ruleset.allowImports=!0},a.Media.prototype={toCSS:function(a,b){var c=this.features.toCSS(b);return this.ruleset.root=a.length===0||a[0].multiMedia,"@media "+c+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")},eval:function(b){b.mediaBlocks||(b.mediaBlocks=[],b.mediaPath=[]);var c=b.mediaBlocks.length;b.mediaPath.push(this),b.mediaBlocks.push(this);var d=new a.Media([],[]);return d.features=this.features.eval(b),b.frames.unshift(this.ruleset),d.ruleset=this.ruleset.eval(b),b.frames.shift(),b.mediaBlocks[c]=d,b.mediaPath.pop(),b.mediaPath.length===0?d.evalTop(b):d.evalNested(b)},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)},evalTop:function(b){var c=this;if(b.mediaBlocks.length>1){var d=new a.Element("&",null,0),e=[new a.Selector([d])];c=new a.Ruleset(e,b.mediaBlocks),c.multiMedia=!0}return delete b.mediaBlocks,delete b.mediaPath,c},evalNested:function(b){var c,d,e=b.mediaPath.concat([this]);for(c=0;c<e.length;c++)d=e[c].features instanceof a.Value?e[c].features.value:e[c].features,e[c]=Array.isArray(d)?d:[d];return this.features=new a.Value(this.permute(e).map(function(b){b=b.map(function(b){return b.toCSS?b:new a.Anonymous(b)});for(c=b.length-1;c>0;c--)b.splice(c,0,new a.Anonymous("and"));return new a.Expression(b)})),new a.Ruleset([],[])},permute:function(a){if(a.length===0)return[];if(a.length===1)return a[0];var b=[],c=this.permute(a.slice(1));for(var d=0;d<c.length;d++)for(var e=0;e<a[0].length;e++)b.push([a[0][e]].concat(c[d]));return b}}}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:this.index,filename:this.filename,stack:h.stack}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e,f){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.variadic=f,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]),e;for(var f=0,g,h;f<this.params.length;f++)if(h=this.params[f].name)if(this.params[f].variadic&&c){e=[];for(var i=f;i<c.length;i++)e.push(c[i].eval(b));d.rules.unshift(new a.Rule(h,(new a.Expression(e)).eval(b)))}else if(g=c&&c[f]||this.params[f].value)d.rules.unshift(new a.Rule(h,g.eval(b)));else throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h,i;for(var j=0;j<Math.max(this.params.length,c&&c.length);j++)g.push(c[j]||this.params[j].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(!this.variadic){if(c<this.required)return!1;if(c>this.params.length)return!1;if(this.required>0&&c>this.params.length)return!1}if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color)if(this.op==="*"||this.op==="+")e=d,d=c,c=e;else throw{name:"OperationError",message:"Can't substract or divide a color from a number"};return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b,c){this.selectors=a,this.rules=b,this._lookups={},this.strictImports=c},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0),this.strictImports);d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports||!d.strictImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive||i instanceof a.Media?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":",\n"),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var f=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||f?"development":"production"),d.async=!1,d.poll=d.poll||(f?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&m(function(a,b,c,d,e){b&&p(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var g;try{g=typeof a.localStorage=="undefined"?null:a.localStorage}catch(h){g=null}var i=document.getElementsByTagName("link"),j=/^text\/(x-)?less$/;d.sheets=[];for(var k=0;k<i.length;k++)(i[k].rel==="stylesheet/less"||i[k].rel.match(/stylesheet/)&&i[k].type.match(j))&&d.sheets.push(i[k]);d.refresh=function(a){var b,c;b=c=new Date,m(function(a,d,e,f,g){g.local?t("loading "+f.href+" from cache."):(t("parsed "+f.href+" successfully."),p(d.toCSS(),f,g.lastModified)),t("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&t("css generated in "+(new Date-b)+"ms"),c=new Date},a),l()},d.refreshStyles=l,d.refresh(d.env==="development")})(window); >-\ No newline at end of file >-diff --git a/dist/less-1.3.1.js b/dist/less-1.3.1.js >-deleted file mode 100644 >-index 0d2a48c158676a7a6a7119688a6b0ec6e8156a34..0000000000000000000000000000000000000000 >---- a/dist/less-1.3.1.js >-+++ /dev/null >-@@ -1,4011 +0,0 @@ >--// >--// LESS - Leaner CSS v1.3.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function (window, undefined) { >--// >--// Stub out `require` in the browser >--// >--function require(arg) { >-- return window.less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- if (typeof(window) === 'undefined') { less = {} } >-- else { less = window.less = {} } >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // Top parser on an import tree must be sure there is one "env" >-- // which will then be passed arround by reference. >-- var env = env || { }; >-- if (!env.contents) { env.contents={}; } // env.contents must be passed arround with top env >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- contents: env.contents, // Holds the imported file contents >-- mime: env && env.mime, // MIME type of .less files >-- error: null, // Error in parsing/evaluating an import >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (e, root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- >-- var imported = path in that.files; >-- >-- that.files[path] = root; // Store the root >-- >-- if (e && !that.error) { that.error = e } >-- >-- callback(e, root, imported); >-- >-- if (that.queue.length === 0) { finish(e) } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- function isWhitespace(c) { >-- // Could change to \s? >-- var code = c.charCodeAt(0); >-- return code === 32 || code === 10 || code === 9; >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, index, k; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- skipWhitespace(length); >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- function skipWhitespace(length) { >-- var oldi = i, oldj = j, >-- endIndex = i + chunks[j].length, >-- mem = i += length; >-- >-- while (i < endIndex) { >-- if (! isWhitespace(input.charAt(i))) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- return oldi !== i || oldj !== j; >-- } >-- >-- function expect(arg, msg) { >-- var result = $(arg); >-- if (! result) { >-- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" >-- : "unexpected token")); >-- } else { >-- return result; >-- } >-- } >-- >-- function error(msg, type) { >-- throw { index: i, type: type || 'Syntax', message: msg }; >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- function getInput(e, env) { >-- if (e.filename && env.filename && (e.filename !== env.filename)) { >-- return parser.imports.contents[e.filename]; >-- } else { >-- return input; >-- } >-- } >-- >-- function getLocation(index, input) { >-- for (var n = index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null, >-- column: column }; >-- } >-- >-- function getFileName(e) { >-- if(less.mode === 'browser' || less.mode === 'rhino') >-- return e.filename; >-- else >-- return require('path').resolve(e.filename); >-- } >-- >-- function getDebugInfo(index, inputStream, e) { >-- return { >-- lineNumber: getLocation(index, inputStream).line + 1, >-- fileName: getFileName(e) >-- }; >-- } >-- >-- function LessError(e, env) { >-- var input = getInput(e, env), >-- loc = getLocation(e.index, input), >-- line = loc.line, >-- col = loc.column, >-- lines = input.split('\n'); >-- >-- this.type = e.type || 'Syntax'; >-- this.message = e.message; >-- this.filename = e.filename || env.filename; >-- this.index = e.index; >-- this.line = typeof(line) === 'number' ? line + 1 : null; >-- this.callLine = e.call && (getLocation(e.call, input).line + 1); >-- this.callExtract = lines[getLocation(e.call, input).line]; >-- this.stack = e.stack; >-- this.column = col; >-- this.extract = [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ]; >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Remove potential UTF Byte Order Mark >-- input = input.replace(/^\uFEFF/, ''); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = string.lastIndex = i; >-- >-- if (match = string.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- >-- if (!inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- switch (c) { >-- case '{': if (! inParam) { level ++; chunk.push(c); break } >-- case '}': if (! inParam) { level --; chunk.push(c); chunks[++j] = chunk = []; break } >-- case '(': if (! inParam) { inParam = true; chunk.push(c); break } >-- case ')': if ( inParam) { inParam = false; chunk.push(c); break } >-- default: chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- error = new(LessError)({ >-- index: i, >-- type: 'Parse', >-- message: "missing closing `}`", >-- filename: env.filename >-- }, env); >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- if (error) { >-- return callback(error); >-- } >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- try { >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- } catch (e) { >-- return callback(new(LessError)(e, env)); >-- } >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = [], importError; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false, dumpLineNumbers: env.dumpLineNumbers }); >-- } catch (e) { >-- throw new(LessError)(e, env); >-- } >-- >-- if ((importError = parser.imports.error)) { // Check if there was an error during importing >-- if (importError instanceof LessError) throw importError; >-- else throw new(LessError)(importError, env); >-- } >-- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- type: "Parse", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function (e) { >-- if (e) callback(e); >-- else callback(null, root); >-- }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k); >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, nameLC, args, alpha_ret, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1]; >-- nameLC = name.toLowerCase(); >-- >-- if (nameLC === 'url') { return null } >-- else { i += name.length } >-- >-- if (nameLC === 'alpha') { >-- alpha_ret = $(this.alpha); >-- if(typeof alpha_ret !== 'undefined') { >-- return alpha_ret; >-- } >-- } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index, env.filename) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.ratio) || >-- $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ""; >-- >-- expect(')'); >-- >-- return new(tree.URL)((value.value != null || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index, env.filename); >-- } >-- }, >-- >-- // A variable entity useing the protective {} e.g. @{var} >-- variableCurly: function () { >-- var name, curly, index = i; >-- >-- if (input.charAt(i) === '@' && (curly = $(/^@\{([\w-]+)\}/))) { >-- return new(tree.Variable)("@" + curly[1], index, env.filename); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|dpi|dpcm|dppx|rem|vw|vh|vmin|vm|ch)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // A Ratio >-- // >-- // 16/9 >-- // >-- ratio: function () { >-- var value, c = input.charCodeAt(i); >-- if (c > 57 || c < 48) return; >-- >-- if (value = $(/^(\d+\/\d+)/)) { >-- return new(tree.Ratio)(value[1]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- save(); >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- >-- restore(); >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args = [], arg, index = i, s = input.charAt(i), name, value, important = false; >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- save(); // stop us absorbing part of an invalid selector >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- if ($('(')) { >-- while (arg = $(this.expression)) { >-- value = arg; >-- name = null; >-- >-- // Variable >-- if (arg.value.length == 1) { >-- var val = arg.value[0]; >-- if (val instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- name = val.name; >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } >-- } >-- } >-- >-- args.push({ name: name, value: value }); >-- >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- } >-- >-- if ($(this.important)) { >-- important = true; >-- } >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index, env.filename, important); >-- } >-- >-- restore(); >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value, cond, variadic = false; >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- save(); >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- do { >-- if (input.charAt(i) === '.' && $(/^\.{3}/)) { >-- variadic = true; >-- break; >-- } else if (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- value = expect(this.expression, 'expected expression'); >-- params.push({ name: param.name, value: value }); >-- } else if ($(/^\.{3}/)) { >-- params.push({ name: param.name, variadic: true }); >-- variadic = true; >-- break; >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- } else { >-- break; >-- } >-- } while ($(',')) >-- >-- // .mixincall("@{a}"); >-- // looks a bit like a mixin definition.. so we have to be nice and restore >-- if (!$(')')) { >-- furthest = i; >-- restore(); >-- } >-- >-- if ($(/^when/)) { // Guard >-- cond = expect(this.conditions, 'expected condition'); >-- } >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic); >-- } else { >-- restore(); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- expect(')'); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c, v; >-- >-- c = $(this.combinator); >-- >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || >-- $('*') || $('&') || $(this.attribute) || $(/^\([^)@]+\)/) || $(/^[\.#](?=@)/) || $(this.entities.variableCurly); >-- >-- if (! e) { >-- if ($('(') && (v = ($(this.entities.variableCurly) || $(this.entities.variable))) && $(')')) { >-- e = new(tree.Paren)(v); >-- } >-- } >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i).match(/\s/)) { i++ } >-- return new(tree.Combinator)(c); >-- } else if (input.charAt(i - 1).match(/\s/)) { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- // depreciated, will be removed soon >-- if ($('(')) { >-- sel = $(this.entity); >-- expect(')'); >-- return new(tree.Selector)([new(tree.Element)('', sel, i)]); >-- } >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[A-Za-z][A-Za-z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^(?:[_A-Za-z0-9-]|\\.)+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match, debugInfo; >-- save(); >-- >-- if (env.dumpLineNumbers) >-- debugInfo = getDebugInfo(i, input, env); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- var ruleset = new(tree.Ruleset)(selectors, rules, env.strictImports); >-- if (env.dumpLineNumbers) >-- ruleset.debugInfo = debugInfo; >-- return ruleset; >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path, features, index = i; >-- >-- save(); >-- >-- var dir = $(/^@import(?:-(once))?\s+/); >-- >-- if (dir && (path = $(this.entities.quoted) || $(this.entities.url))) { >-- features = $(this.mediaFeatures); >-- if ($(';')) { >-- return new(tree.Import)(path, imports, features, (dir[1] === 'once'), index); >-- } >-- } >-- >-- restore(); >-- }, >-- >-- mediaFeature: function () { >-- var e, p, nodes = []; >-- >-- do { >-- if (e = $(this.entities.keyword)) { >-- nodes.push(e); >-- } else if ($('(')) { >-- p = $(this.property); >-- e = $(this.entity); >-- if ($(')')) { >-- if (p && e) { >-- nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); >-- } else if (e) { >-- nodes.push(new(tree.Paren)(e)); >-- } else { >-- return null; >-- } >-- } else { return null } >-- } >-- } while (e); >-- >-- if (nodes.length > 0) { >-- return new(tree.Expression)(nodes); >-- } >-- }, >-- >-- mediaFeatures: function () { >-- var e, features = []; >-- >-- do { >-- if (e = $(this.mediaFeature)) { >-- features.push(e); >-- if (! $(',')) { break } >-- } else if (e = $(this.entities.variable)) { >-- features.push(e); >-- if (! $(',')) { break } >-- } >-- } while (e); >-- >-- return features.length > 0 ? features : null; >-- }, >-- >-- media: function () { >-- var features, rules, media, debugInfo; >-- >-- if (env.dumpLineNumbers) >-- debugInfo = getDebugInfo(i, input, env); >-- >-- if ($(/^@media/)) { >-- features = $(this.mediaFeatures); >-- >-- if (rules = $(this.block)) { >-- media = new(tree.Media)(rules, features); >-- if(env.dumpLineNumbers) >-- media.debugInfo = debugInfo; >-- return media; >-- } >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, identifier, e, nodes, nonVendorSpecificName, >-- hasBlock, hasIdentifier; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import']) || $(this.media)) { >-- return value; >-- } >-- >-- save(); >-- >-- name = $(/^@[a-z-]+/); >-- >-- nonVendorSpecificName = name; >-- if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { >-- nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); >-- } >-- >-- switch(nonVendorSpecificName) { >-- case "@font-face": >-- hasBlock = true; >-- break; >-- case "@viewport": >-- case "@top-left": >-- case "@top-left-corner": >-- case "@top-center": >-- case "@top-right": >-- case "@top-right-corner": >-- case "@bottom-left": >-- case "@bottom-left-corner": >-- case "@bottom-center": >-- case "@bottom-right": >-- case "@bottom-right-corner": >-- case "@left-top": >-- case "@left-middle": >-- case "@left-bottom": >-- case "@right-top": >-- case "@right-middle": >-- case "@right-bottom": >-- hasBlock = true; >-- break; >-- case "@page": >-- case "@document": >-- case "@supports": >-- case "@keyframes": >-- hasBlock = true; >-- hasIdentifier = true; >-- break; >-- } >-- >-- if (hasIdentifier) { >-- name += " " + ($(/^[^{]+/) || '').trim(); >-- } >-- >-- if (hasBlock) >-- { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else { >-- if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- >-- restore(); >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (!isWhitespace(input.charAt(i - 1)) && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- conditions: function () { >-- var a, b, index = i, condition; >-- >-- if (a = $(this.condition)) { >-- while ($(',') && (b = $(this.condition))) { >-- condition = new(tree.Condition)('or', condition || a, b, index); >-- } >-- return condition || a; >-- } >-- }, >-- condition: function () { >-- var a, b, c, op, index = i, negate = false; >-- >-- if ($(/^not/)) { negate = true } >-- expect('('); >-- if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- if (op = $(/^(?:>=|=<|[<=>])/)) { >-- if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- c = new(tree.Condition)(op, a, b, index, negate); >-- } else { >-- error('expected expression'); >-- } >-- } else { >-- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); >-- } >-- expect(')'); >-- return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[_a-z0-9-]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (!/^([a-z-]+:)?\//.test(path) && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- // __ Now using the hack of passing a ref to top parser's content cache in the 1st arg. __ >-- loadStyleSheet({ href: path, title: path, type: env.mime, contents: env.contents }, function (e) { >-- if (e && typeof(env.errback) === "function") { >-- env.errback.call(null, path, paths, callback, env); >-- } else { >-- callback.apply(null, arguments); >-- } >-- }, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- red: function (color) { >-- return new(tree.Dimension)(color.rgb[0]); >-- }, >-- green: function (color) { >-- return new(tree.Dimension)(color.rgb[1]); >-- }, >-- blue: function (color) { >-- return new(tree.Dimension)(color.rgb[2]); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- luma: function (color) { >-- return new(tree.Dimension)(Math.round((0.2126 * (color.rgb[0]/255) + >-- 0.7152 * (color.rgb[1]/255) + >-- 0.0722 * (color.rgb[2]/255)) >-- * color.alpha * 100), '%'); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- if (!weight) { >-- weight = new(tree.Dimension)(50); >-- } >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- contrast: function (color, dark, light, threshold) { >-- if (typeof light === 'undefined') { >-- light = this.rgba(255, 255, 255, 1.0); >-- } >-- if (typeof dark === 'undefined') { >-- dark = this.rgba(0, 0, 0, 1.0); >-- } >-- if (typeof threshold === 'undefined') { >-- threshold = 0.43; >-- } else { >-- threshold = threshold.value; >-- } >-- if (((0.2126 * (color.rgb[0]/255) + 0.7152 * (color.rgb[1]/255) + 0.0722 * (color.rgb[2]/255)) * color.alpha) < threshold) { >-- return light; >-- } else { >-- return dark; >-- } >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n, f) { >-- var fraction = typeof(f) === "undefined" ? 0 : f.value; >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(number(n).toFixed(fraction), n.unit); >-- } else if (typeof(n) === 'number') { >-- return n.toFixed(fraction); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- }, >-- percentage: function (n) { >-- return new(tree.Dimension)(n.value * 100, '%'); >-- }, >-- color: function (n) { >-- if (n instanceof tree.Quoted) { >-- return new(tree.Color)(n.value.slice(1)); >-- } else { >-- throw { type: "Argument", message: "argument must be a string" }; >-- } >-- }, >-- iscolor: function (n) { >-- return this._isa(n, tree.Color); >-- }, >-- isnumber: function (n) { >-- return this._isa(n, tree.Dimension); >-- }, >-- isstring: function (n) { >-- return this._isa(n, tree.Quoted); >-- }, >-- iskeyword: function (n) { >-- return this._isa(n, tree.Keyword); >-- }, >-- isurl: function (n) { >-- return this._isa(n, tree.URL); >-- }, >-- ispixel: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; >-- }, >-- ispercentage: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; >-- }, >-- isem: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; >-- }, >-- _isa: function (n, Type) { >-- return (n instanceof Type) ? tree.True : tree.False; >-- }, >-- >-- /* Blending modes */ >-- >-- multiply: function(color1, color2) { >-- var r = color1.rgb[0] * color2.rgb[0] / 255; >-- var g = color1.rgb[1] * color2.rgb[1] / 255; >-- var b = color1.rgb[2] * color2.rgb[2] / 255; >-- return this.rgb(r, g, b); >-- }, >-- screen: function(color1, color2) { >-- var r = 255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255; >-- var g = 255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255; >-- var b = 255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- overlay: function(color1, color2) { >-- var r = color1.rgb[0] < 128 ? 2 * color1.rgb[0] * color2.rgb[0] / 255 : 255 - 2 * (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255; >-- var g = color1.rgb[1] < 128 ? 2 * color1.rgb[1] * color2.rgb[1] / 255 : 255 - 2 * (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255; >-- var b = color1.rgb[2] < 128 ? 2 * color1.rgb[2] * color2.rgb[2] / 255 : 255 - 2 * (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- softlight: function(color1, color2) { >-- var t = color2.rgb[0] * color1.rgb[0] / 255; >-- var r = t + color1.rgb[0] * (255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255 - t) / 255; >-- t = color2.rgb[1] * color1.rgb[1] / 255; >-- var g = t + color1.rgb[1] * (255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255 - t) / 255; >-- t = color2.rgb[2] * color1.rgb[2] / 255; >-- var b = t + color1.rgb[2] * (255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255 - t) / 255; >-- return this.rgb(r, g, b); >-- }, >-- hardlight: function(color1, color2) { >-- var r = color2.rgb[0] < 128 ? 2 * color2.rgb[0] * color1.rgb[0] / 255 : 255 - 2 * (255 - color2.rgb[0]) * (255 - color1.rgb[0]) / 255; >-- var g = color2.rgb[1] < 128 ? 2 * color2.rgb[1] * color1.rgb[1] / 255 : 255 - 2 * (255 - color2.rgb[1]) * (255 - color1.rgb[1]) / 255; >-- var b = color2.rgb[2] < 128 ? 2 * color2.rgb[2] * color1.rgb[2] / 255 : 255 - 2 * (255 - color2.rgb[2]) * (255 - color1.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- difference: function(color1, color2) { >-- var r = Math.abs(color1.rgb[0] - color2.rgb[0]); >-- var g = Math.abs(color1.rgb[1] - color2.rgb[1]); >-- var b = Math.abs(color1.rgb[2] - color2.rgb[2]); >-- return this.rgb(r, g, b); >-- }, >-- exclusion: function(color1, color2) { >-- var r = color1.rgb[0] + color2.rgb[0] * (255 - color1.rgb[0] - color1.rgb[0]) / 255; >-- var g = color1.rgb[1] + color2.rgb[1] * (255 - color1.rgb[1] - color1.rgb[1]) / 255; >-- var b = color1.rgb[2] + color2.rgb[2] * (255 - color1.rgb[2] - color1.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- average: function(color1, color2) { >-- var r = (color1.rgb[0] + color2.rgb[0]) / 2; >-- var g = (color1.rgb[1] + color2.rgb[1]) / 2; >-- var b = (color1.rgb[2] + color2.rgb[2]) / 2; >-- return this.rgb(r, g, b); >-- }, >-- negation: function(color1, color2) { >-- var r = 255 - Math.abs(255 - color2.rgb[0] - color1.rgb[0]); >-- var g = 255 - Math.abs(255 - color2.rgb[1] - color1.rgb[1]); >-- var b = 255 - Math.abs(255 - color2.rgb[2] - color1.rgb[2]); >-- return this.rgb(r, g, b); >-- }, >-- tint: function(color, amount) { >-- return this.mix(this.rgb(255,255,255), color, amount); >-- }, >-- shade: function(color, amount) { >-- return this.mix(this.rgb(0, 0, 0), color, amount); >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- // 'transparent':'rgba(0,0,0,0)', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this }, >-- compare: function (x) { >-- if (!x.toCSS) { >-- return -1; >-- } >-- >-- var left = this.toCSS(), >-- right = x.toCSS(); >-- >-- if (left === right) { >-- return 0; >-- } >-- >-- return left < right ? -1 : 1; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { >-- return new(tree.Assignment)(this.key, this.value.eval(env)); >-- } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index, filename) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >-- this.filename = filename; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { type: e.type || "Runtime", >-- message: "error evaluating function `" + this.name + "`" + >-- (e.message ? ': ' + e.message : ''), >-- index: this.index, filename: this.filename }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS(env) }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- }, >-- compare: function (x) { >-- if (!x.rgb) { >-- return -1; >-- } >-- >-- return (x.rgb[0] === this.rgb[0] && >-- x.rgb[1] === this.rgb[1] && >-- x.rgb[2] === this.rgb[2] && >-- x.alpha === this.alpha) ? 0 : -1; >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Condition = function (op, l, r, i, negate) { >-- this.op = op.trim(); >-- this.lvalue = l; >-- this.rvalue = r; >-- this.index = i; >-- this.negate = negate; >--}; >--tree.Condition.prototype.eval = function (env) { >-- var a = this.lvalue.eval(env), >-- b = this.rvalue.eval(env); >-- >-- var i = this.index, result; >-- >-- var result = (function (op) { >-- switch (op) { >-- case 'and': >-- return a && b; >-- case 'or': >-- return a || b; >-- default: >-- if (a.compare) { >-- result = a.compare(b); >-- } else if (b.compare) { >-- result = b.compare(a); >-- } else { >-- throw { type: "Type", >-- message: "Unable to perform comparison", >-- index: i }; >-- } >-- switch (result) { >-- case -1: return op === '<' || op === '=<'; >-- case 0: return op === '=' || op === '>=' || op === '=<'; >-- case 1: return op === '>' || op === '>='; >-- } >-- } >-- })(this.op); >-- return this.negate ? !result : result; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- }, >-- >-- // TODO: Perform unit conversion before comparing >-- compare: function (other) { >-- if (other instanceof tree.Dimension) { >-- if (other.value > this.value) { >-- return -1; >-- } else if (other.value < this.value) { >-- return 1; >-- } else { >-- return 0; >-- } >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- this.ruleset.allowImports = true; >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- var evaldDirective = this; >-- if (this.ruleset) { >-- env.frames.unshift(this); >-- evaldDirective = new(tree.Directive)(this.name); >-- evaldDirective.ruleset = this.ruleset.eval(env); >-- env.frames.shift(); >-- } >-- return evaldDirective; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- >-- if (typeof(value) === 'string') { >-- this.value = value.trim(); >-- } else if (value) { >-- this.value = value; >-- } else { >-- this.value = ""; >-- } >-- this.index = index; >--}; >--tree.Element.prototype.eval = function (env) { >-- return new(tree.Element)(this.combinator, >-- this.value.eval ? this.value.eval(env) : this.value, >-- this.index); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- var value = (this.value.toCSS ? this.value.toCSS(env) : this.value); >-- if (value == '' && this.combinator.value.charAt(0) == '&') { >-- return ''; >-- } else { >-- return this.combinator.toCSS(env || {}) + value; >-- } >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- ':' : ' :', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS ? e.toCSS(env) : ''; >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports, features, once, index) { >-- var that = this; >-- >-- this.once = once; >-- this.index = index; >-- this._path = path; >-- this.features = features && new(tree.Value)(features); >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (e, root, imported) { >-- if (e) { e.index = index } >-- if (imported && that.once) that.skip = imported; >-- that.root = root || new(tree.Ruleset)([], []); >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function (env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.css) { >-- return "@import " + this._path.toCSS() + features + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset, features = this.features && this.features.eval(env); >-- >-- if (this.skip) return []; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value }, >-- compare: function (other) { >-- if (other instanceof tree.Keyword) { >-- return other.value === this.value ? 0 : 1; >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--tree.True = new(tree.Keyword)('true'); >--tree.False = new(tree.Keyword)('false'); >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Media = function (value, features) { >-- var selectors = this.emptySelectors(); >-- >-- this.features = new(tree.Value)(features); >-- this.ruleset = new(tree.Ruleset)(selectors, value); >-- this.ruleset.allowImports = true; >--}; >--tree.Media.prototype = { >-- toCSS: function (ctx, env) { >-- var features = this.features.toCSS(env); >-- >-- this.ruleset.root = (ctx.length === 0 || ctx[0].multiMedia); >-- return '@media ' + features + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- }, >-- eval: function (env) { >-- if (!env.mediaBlocks) { >-- env.mediaBlocks = []; >-- env.mediaPath = []; >-- } >-- >-- var blockIndex = env.mediaBlocks.length; >-- env.mediaPath.push(this); >-- env.mediaBlocks.push(this); >-- >-- var media = new(tree.Media)([], []); >-- if(this.debugInfo) { >-- this.ruleset.debugInfo = this.debugInfo; >-- media.debugInfo = this.debugInfo; >-- } >-- media.features = this.features.eval(env); >-- >-- env.frames.unshift(this.ruleset); >-- media.ruleset = this.ruleset.eval(env); >-- env.frames.shift(); >-- >-- env.mediaBlocks[blockIndex] = media; >-- env.mediaPath.pop(); >-- >-- return env.mediaPath.length === 0 ? media.evalTop(env) : >-- media.evalNested(env) >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) }, >-- emptySelectors: function() { >-- var el = new(tree.Element)('', '&', 0); >-- return [new(tree.Selector)([el])]; >-- }, >-- >-- evalTop: function (env) { >-- var result = this; >-- >-- // Render all dependent Media blocks. >-- if (env.mediaBlocks.length > 1) { >-- var selectors = this.emptySelectors(); >-- result = new(tree.Ruleset)(selectors, env.mediaBlocks); >-- result.multiMedia = true; >-- } >-- >-- delete env.mediaBlocks; >-- delete env.mediaPath; >-- >-- return result; >-- }, >-- evalNested: function (env) { >-- var i, value, >-- path = env.mediaPath.concat([this]); >-- >-- // Extract the media-query conditions separated with `,` (OR). >-- for (i = 0; i < path.length; i++) { >-- value = path[i].features instanceof tree.Value ? >-- path[i].features.value : path[i].features; >-- path[i] = Array.isArray(value) ? value : [value]; >-- } >-- >-- // Trace all permutations to generate the resulting media-query. >-- // >-- // (a, b and c) with nested (d, e) -> >-- // a and d >-- // a and e >-- // b and c and d >-- // b and c and e >-- this.features = new(tree.Value)(this.permute(path).map(function (path) { >-- path = path.map(function (fragment) { >-- return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment); >-- }); >-- >-- for(i = path.length - 1; i > 0; i--) { >-- path.splice(i, 0, new(tree.Anonymous)("and")); >-- } >-- >-- return new(tree.Expression)(path); >-- })); >-- >-- // Fake a tree-node that doesn't output anything. >-- return new(tree.Ruleset)([], []); >-- }, >-- permute: function (arr) { >-- if (arr.length === 0) { >-- return []; >-- } else if (arr.length === 1) { >-- return arr[0]; >-- } else { >-- var result = []; >-- var rest = this.permute(arr.slice(1)); >-- for (var i = 0; i < rest.length; i++) { >-- for (var j = 0; j < arr[0].length; j++) { >-- result.push([arr[0][j]].concat(rest[i])); >-- } >-- } >-- return result; >-- } >-- }, >-- bubbleSelectors: function (selectors) { >-- this.ruleset = new(tree.Ruleset)(selectors.slice(0), [this.ruleset]); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index, filename, important) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >-- this.filename = filename; >-- this.important = important; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { >-- return { name: a.name, value: a.value.eval(env) }; >-- }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments, this.important).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: this.index, filename: this.filename, stack: e.stack }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { type: 'Runtime', >-- message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index, filename: this.filename }; >-- } >-- } >-- } >-- throw { type: 'Name', >-- message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index, filename: this.filename }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules, condition, variadic) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.condition = condition; >-- this.variadic = variadic; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- evalParams: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), varargs, arg; >-- >-- for (var i = 0, val, name; i < this.params.length; i++) { >-- arg = args && args[i] >-- >-- if (arg && arg.name) { >-- frame.rules.unshift(new(tree.Rule)(arg.name, arg.value.eval(env))); >-- args.splice(i, 1); >-- i--; >-- continue; >-- } >-- >-- if (name = this.params[i].name) { >-- if (this.params[i].variadic && args) { >-- varargs = []; >-- for (var j = i; j < args.length; j++) { >-- varargs.push(args[j].value.eval(env)); >-- } >-- frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env))); >-- } else if (val = (arg && arg.value) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(name, val.eval(env))); >-- } else { >-- throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- return frame; >-- }, >-- eval: function (env, args, important) { >-- var frame = this.evalParams(env, args), context, _arguments = [], rules, start; >-- >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push((args[i] && args[i].value) || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- rules = important ? >-- this.rules.map(function (r) { >-- return new(tree.Rule)(r.name, r.value, '!important', r.index); >-- }) : this.rules.slice(0); >-- >-- return new(tree.Ruleset)(null, rules).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len, frame; >-- >-- if (! this.variadic) { >-- if (argsLength < this.required) { return false } >-- if (argsLength > this.params.length) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- } >-- >-- if (this.condition && !this.condition.eval({ >-- frames: [this.evalParams(env, args)].concat(env.frames) >-- })) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].value.eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Paren = function (node) { >-- this.value = node; >--}; >--tree.Paren.prototype = { >-- toCSS: function (env) { >-- return '(' + this.value.toCSS(env) + ')'; >-- }, >-- eval: function (env) { >-- return new(tree.Paren)(this.value.eval(env)); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return ('value' in v) ? v.value : v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- }, >-- compare: function (x) { >-- if (!x.toCSS) { >-- return -1; >-- } >-- >-- var left = this.toCSS(), >-- right = x.toCSS(); >-- >-- if (left === right) { >-- return 0; >-- } >-- >-- return left < right ? -1 : 1; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ratio = function (value) { >-- this.value = value; >--}; >--tree.Ratio.prototype = { >-- toCSS: function (env) { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index, inline) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- this.inline = inline || false; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + (this.inline ? "" : ";"); >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, >-- this.value.eval(context), >-- this.important, >-- this.index, this.inline); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules, strictImports) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >-- this.strictImports = strictImports; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); >-- var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports); >-- var rules = []; >-- >-- ruleset.root = this.root; >-- ruleset.allowImports = this.allowImports; >-- >-- if(this.debugInfo) { >-- ruleset.debugInfo = this.debugInfo; >-- } >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- rules = rules.concat(ruleset.rules[i].eval(env)); >-- } else { >-- rules.push(ruleset.rules[i]); >-- } >-- } >-- ruleset.rules = rules; >-- rules = []; >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- var mediaBlockCount = (env.mediaBlocks && env.mediaBlocks.length) || 0; >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- rules = rules.concat(ruleset.rules[i].eval(env)); >-- } else { >-- rules.push(ruleset.rules[i]); >-- } >-- } >-- ruleset.rules = rules; >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- if (env.mediaBlocks) { >-- for(var i = mediaBlockCount; i < env.mediaBlocks.length; i++) { >-- env.mediaBlocks[i].bubbleSelectors(selectors); >-- } >-- } >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- _rules = [], // >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- debugInfo, // Line number debugging >-- rule; >-- >-- if (! this.root) { >-- this.joinSelectors(paths, context, this.selectors); >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive) || (rule instanceof tree.Media)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- debugInfo = tree.debugInfo(env, this); >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : ',\n'); >-- >-- // Remove duplicates >-- for (var i = rules.length - 1; i >= 0; i--) { >-- if (_rules.indexOf(rules[i]) === -1) { >-- _rules.unshift(rules[i]); >-- } >-- } >-- rules = _rules; >-- >-- css.push(debugInfo + selector + >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- >-- var i, j, k, >-- hasParentSelector, newSelectors, el, sel, parentSel, >-- newSelectorPath, afterParentJoin, newJoinedSelector, >-- newJoinedSelectorEmpty, lastSelector, currentElements, >-- selectorsMultiplied; >-- >-- for (i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.value === '&') { >-- hasParentSelector = true; >-- } >-- } >-- >-- if (!hasParentSelector) { >-- if (context.length > 0) { >-- for(i = 0; i < context.length; i++) { >-- paths.push(context[i].concat(selector)); >-- } >-- } >-- else { >-- paths.push([selector]); >-- } >-- return; >-- } >-- >-- // The paths are [[Selector]] >-- // The first list is a list of comma seperated selectors >-- // The inner list is a list of inheritance seperated selectors >-- // e.g. >-- // .a, .b { >-- // .c { >-- // } >-- // } >-- // == [[.a] [.c]] [[.b] [.c]] >-- // >-- >-- // the elements from the current selector so far >-- currentElements = []; >-- // the current list of new selectors to add to the path. >-- // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors >-- // by the parents >-- newSelectors = [[]]; >-- >-- for (i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- // non parent reference elements just get added >-- if (el.value !== "&") { >-- currentElements.push(el); >-- } else { >-- // the new list of selectors to add >-- selectorsMultiplied = []; >-- >-- // merge the current list of non parent selector elements >-- // on to the current list of selectors to add >-- if (currentElements.length > 0) { >-- this.mergeElementsOnToSelectors(currentElements, newSelectors); >-- } >-- >-- // loop through our current selectors >-- for(j = 0; j < newSelectors.length; j++) { >-- sel = newSelectors[j]; >-- // if we don't have any parent paths, the & might be in a mixin so that it can be used >-- // whether there are parents or not >-- if (context.length == 0) { >-- // the combinator used on el should now be applied to the next element instead so that >-- // it is not lost >-- if (sel.length > 0) { >-- sel[0].elements = sel[0].elements.slice(0); >-- sel[0].elements.push(new(tree.Element)(el.combinator, '', 0)); //new Element(el.Combinator, "")); >-- } >-- selectorsMultiplied.push(sel); >-- } >-- else { >-- // and the parent selectors >-- for(k = 0; k < context.length; k++) { >-- parentSel = context[k]; >-- // We need to put the current selectors >-- // then join the last selector's elements on to the parents selectors >-- >-- // our new selector path >-- newSelectorPath = []; >-- // selectors from the parent after the join >-- afterParentJoin = []; >-- newJoinedSelectorEmpty = true; >-- >-- //construct the joined selector - if & is the first thing this will be empty, >-- // if not newJoinedSelector will be the last set of elements in the selector >-- if (sel.length > 0) { >-- newSelectorPath = sel.slice(0); >-- lastSelector = newSelectorPath.pop(); >-- newJoinedSelector = new(tree.Selector)(lastSelector.elements.slice(0)); >-- newJoinedSelectorEmpty = false; >-- } >-- else { >-- newJoinedSelector = new(tree.Selector)([]); >-- } >-- >-- //put together the parent selectors after the join >-- if (parentSel.length > 1) { >-- afterParentJoin = afterParentJoin.concat(parentSel.slice(1)); >-- } >-- >-- if (parentSel.length > 0) { >-- newJoinedSelectorEmpty = false; >-- >-- // join the elements so far with the first part of the parent >-- newJoinedSelector.elements.push(new(tree.Element)(el.combinator, parentSel[0].elements[0].value, 0)); >-- newJoinedSelector.elements = newJoinedSelector.elements.concat(parentSel[0].elements.slice(1)); >-- } >-- >-- if (!newJoinedSelectorEmpty) { >-- // now add the joined selector >-- newSelectorPath.push(newJoinedSelector); >-- } >-- >-- // and the rest of the parent >-- newSelectorPath = newSelectorPath.concat(afterParentJoin); >-- >-- // add that to our new set of selectors >-- selectorsMultiplied.push(newSelectorPath); >-- } >-- } >-- } >-- >-- // our new selectors has been multiplied, so reset the state >-- newSelectors = selectorsMultiplied; >-- currentElements = []; >-- } >-- } >-- >-- // if we have any elements left over (e.g. .a& .b == .b) >-- // add them on to all the current selectors >-- if (currentElements.length > 0) { >-- this.mergeElementsOnToSelectors(currentElements, newSelectors); >-- } >-- >-- for(i = 0; i < newSelectors.length; i++) { >-- paths.push(newSelectors[i]); >-- } >-- }, >-- >-- mergeElementsOnToSelectors: function(elements, selectors) { >-- var i, sel; >-- >-- if (selectors.length == 0) { >-- selectors.push([ new(tree.Selector)(elements) ]); >-- return; >-- } >-- >-- for(i = 0; i < selectors.length; i++) { >-- sel = selectors[i]; >-- >-- // if the previous thing in sel is a parent this needs to join on to it >-- if (sel.length > 0) { >-- sel[sel.length - 1] = new(tree.Selector)(sel[sel.length - 1].elements.concat(elements)); >-- } >-- else { >-- sel.push(new(tree.Selector)(elements)); >-- } >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.eval = function (env) { >-- return new(tree.Selector)(this.elements.map(function (e) { >-- return e.eval(env); >-- })); >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- if (this.elements[0].combinator.value === "") { >-- this._css = ' '; >-- } else { >-- this._css = ''; >-- } >-- >-- this._css += this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >-- >-- return this._css; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- this.value = val; >-- this.paths = paths; >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + this.value.toCSS() + ")"; >-- }, >-- eval: function (ctx) { >-- var val = this.value.eval(ctx); >-- >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof window !== 'undefined' && typeof val.value === "string" && !/^(?:[a-z-]+:|\/)/.test(val.value) && this.paths.length > 0) { >-- val.value = this.paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- >-- return new(tree.URL)(val, this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { type: 'Name', >-- message: "variable " + name + " is undefined", >-- filename: this.file, >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.debugInfo = function(env, ctx) { >-- var result=""; >-- if (env.dumpLineNumbers && !env.compress) { >-- switch(env.dumpLineNumbers) { >-- case 'comments': >-- result = tree.debugInfo.asComment(ctx); >-- break; >-- case 'mediaquery': >-- result = tree.debugInfo.asMediaQuery(ctx); >-- break; >-- case 'all': >-- result = tree.debugInfo.asComment(ctx)+tree.debugInfo.asMediaQuery(ctx); >-- break; >-- } >-- } >-- return result; >--}; >-- >--tree.debugInfo.asComment = function(ctx) { >-- return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; >--}; >-- >--tree.debugInfo.asMediaQuery = function(ctx) { >-- return '@media -sass-debug-info{filename{font-family:"' + ctx.debugInfo.fileName + '";}line{font-family:"' + ctx.debugInfo.lineNumber + '";}}\n'; >--}; >-- >--tree.find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--tree.jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >-- >--})(require('./tree')); >--// >--// browser.js - client-side engine >--// >-- >--var isFileProtocol = /^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol); >-- >--less.env = less.env || (location.hostname == '127.0.0.1' || >-- location.hostname == '0.0.0.0' || >-- location.hostname == 'localhost' || >-- location.port.length > 0 || >-- isFileProtocol ? 'development' >-- : 'production'); >-- >--// Load styles asynchronously (default: false) >--// >--// This is set to `false` by default, so that the body >--// doesn't start loading before the stylesheets are parsed. >--// Setting this to `true` can result in flickering. >--// >--less.async = less.async || false; >--less.fileAsync = less.fileAsync || false; >-- >--// Interval between watch polls >--less.poll = less.poll || (isFileProtocol ? 1000 : 1500); >-- >--// >--// Watch mode >--// >--less.watch = function () { return this.watchMode = true }; >--less.unwatch = function () { return this.watchMode = false }; >-- >--if (less.env === 'development') { >-- less.optimization = 0; >-- >-- if (/!watch/.test(location.hash)) { >-- less.watch(); >-- } >-- var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash); >-- if (dumpLineNumbers) { >-- less.dumpLineNumbers = dumpLineNumbers[1]; >-- } >-- less.watchTimer = setInterval(function () { >-- if (less.watchMode) { >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (root) { >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- }); >-- } >-- }, less.poll); >--} else { >-- less.optimization = 3; >--} >-- >--var cache; >-- >--try { >-- cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage; >--} catch (_) { >-- cache = null; >--} >-- >--// >--// Get all <link> tags with the 'rel' attribute set to "stylesheet/less" >--// >--var links = document.getElementsByTagName('link'); >--var typePattern = /^text\/(x-)?less$/; >-- >--less.sheets = []; >-- >--for (var i = 0; i < links.length; i++) { >-- if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && >-- (links[i].type.match(typePattern)))) { >-- less.sheets.push(links[i]); >-- } >--} >-- >-- >--less.refresh = function (reload) { >-- var startTime, endTime; >-- startTime = endTime = new(Date); >-- >-- loadStyleSheets(function (e, root, _, sheet, env) { >-- if (env.local) { >-- log("loading " + sheet.href + " from cache."); >-- } else { >-- log("parsed " + sheet.href + " successfully."); >-- createCSS(root.toCSS(), sheet, env.lastModified); >-- } >-- log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms'); >-- (env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms'); >-- endTime = new(Date); >-- }, reload); >-- >-- loadStyles(); >--}; >--less.refreshStyles = loadStyles; >-- >--less.refresh(less.env === 'development'); >-- >--function loadStyles() { >-- var styles = document.getElementsByTagName('style'); >-- for (var i = 0; i < styles.length; i++) { >-- if (styles[i].type.match(typePattern)) { >-- new(less.Parser)({ >-- filename: document.location.href.replace(/#.*$/, ''), >-- dumpLineNumbers: less.dumpLineNumbers >-- }).parse(styles[i].innerHTML || '', function (e, tree) { >-- var css = tree.toCSS(); >-- var style = styles[i]; >-- style.type = 'text/css'; >-- if (style.styleSheet) { >-- style.styleSheet.cssText = css; >-- } else { >-- style.innerHTML = css; >-- } >-- }); >-- } >-- } >--} >-- >--function loadStyleSheets(callback, reload) { >-- for (var i = 0; i < less.sheets.length; i++) { >-- loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1)); >-- } >--} >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var contents = sheet.contents || {}; // Passing a ref to top importing parser content cache trough 'sheet' arg. >-- var url = window.location.href.replace(/[#?].*$/, ''); >-- var href = sheet.href.replace(/\?.*$/, ''); >-- var css = cache && cache.getItem(href); >-- var timestamp = cache && cache.getItem(href + ':timestamp'); >-- var styles = { css: css, timestamp: timestamp }; >-- >-- // Stylesheets in IE don't always return the full path >-- if (! /^[a-z-]+:/.test(href)) { >-- if (href.charAt(0) == "/") { >-- href = window.location.protocol + "//" + window.location.host + href; >-- } else { >-- href = url.slice(0, url.lastIndexOf('/') + 1) + href; >-- } >-- } >-- xhr(sheet.href, sheet.type, function (data, lastModified) { >-- if (!reload && styles && lastModified && >-- (new(Date)(lastModified).valueOf() === >-- new(Date)(styles.timestamp).valueOf())) { >-- // Use local copy >-- createCSS(styles.css, sheet); >-- callback(null, null, data, sheet, { local: true, remaining: remaining }); >-- } else { >-- // Use remote copy (re-parse) >-- try { >-- contents[href] = data; // Updating top importing parser content cache >-- new(less.Parser)({ >-- optimization: less.optimization, >-- paths: [href.replace(/[\w\.-]+$/, '')], >-- mime: sheet.type, >-- filename: href, >-- 'contents': contents, // Passing top importing parser content cache ref down. >-- dumpLineNumbers: less.dumpLineNumbers >-- }).parse(data, function (e, root) { >-- if (e) { return error(e, href) } >-- try { >-- callback(e, root, data, sheet, { local: false, lastModified: lastModified, remaining: remaining }); >-- removeNode(document.getElementById('less-error-message:' + extractId(href))); >-- } catch (e) { >-- error(e, href); >-- } >-- }); >-- } catch (e) { >-- error(e, href); >-- } >-- } >-- }, function (status, url) { >-- throw new(Error)("Couldn't load " + url + " (" + status + ")"); >-- }); >--} >-- >--function extractId(href) { >-- return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain >-- .replace(/^\//, '' ) // Remove root / >-- .replace(/\?.*$/, '' ) // Remove query >-- .replace(/\.[^\.\/]+$/, '' ) // Remove file extension >-- .replace(/[^\.\w-]+/g, '-') // Replace illegal characters >-- .replace(/\./g, ':'); // Replace dots with colons(for valid id) >--} >-- >--function createCSS(styles, sheet, lastModified) { >-- var css; >-- >-- // Strip the query-string >-- var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : ''; >-- >-- // If there is no title set, use the filename, minus the extension >-- var id = 'less:' + (sheet.title || extractId(href)); >-- >-- // If the stylesheet doesn't exist, create a new node >-- if ((css = document.getElementById(id)) === null) { >-- css = document.createElement('style'); >-- css.type = 'text/css'; >-- if( sheet.media ){ css.media = sheet.media; } >-- css.id = id; >-- var nextEl = sheet && sheet.nextSibling || null; >-- document.getElementsByTagName('head')[0].insertBefore(css, nextEl); >-- } >-- >-- if (css.styleSheet) { // IE >-- try { >-- css.styleSheet.cssText = styles; >-- } catch (e) { >-- throw new(Error)("Couldn't reassign styleSheet.cssText."); >-- } >-- } else { >-- (function (node) { >-- if (css.childNodes.length > 0) { >-- if (css.firstChild.nodeValue !== node.nodeValue) { >-- css.replaceChild(node, css.firstChild); >-- } >-- } else { >-- css.appendChild(node); >-- } >-- })(document.createTextNode(styles)); >-- } >-- >-- // Don't update the local store if the file wasn't modified >-- if (lastModified && cache) { >-- log('saving ' + href + ' to cache.'); >-- try { >-- cache.setItem(href, styles); >-- cache.setItem(href + ':timestamp', lastModified); >-- } catch(e) { >-- //TODO - could do with adding more robust error handling >-- log('failed to save'); >-- } >-- } >--} >-- >--function xhr(url, type, callback, errback) { >-- var xhr = getXMLHttpRequest(); >-- var async = isFileProtocol ? less.fileAsync : less.async; >-- >-- if (typeof(xhr.overrideMimeType) === 'function') { >-- xhr.overrideMimeType('text/css'); >-- } >-- xhr.open('GET', url, async); >-- xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); >-- xhr.send(null); >-- >-- if (isFileProtocol && !less.fileAsync) { >-- if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { >-- callback(xhr.responseText); >-- } else { >-- errback(xhr.status, url); >-- } >-- } else if (async) { >-- xhr.onreadystatechange = function () { >-- if (xhr.readyState == 4) { >-- handleResponse(xhr, callback, errback); >-- } >-- }; >-- } else { >-- handleResponse(xhr, callback, errback); >-- } >-- >-- function handleResponse(xhr, callback, errback) { >-- if (xhr.status >= 200 && xhr.status < 300) { >-- callback(xhr.responseText, >-- xhr.getResponseHeader("Last-Modified")); >-- } else if (typeof(errback) === 'function') { >-- errback(xhr.status, url); >-- } >-- } >--} >-- >--function getXMLHttpRequest() { >-- if (window.XMLHttpRequest) { >-- return new(XMLHttpRequest); >-- } else { >-- try { >-- return new(ActiveXObject)("MSXML2.XMLHTTP.3.0"); >-- } catch (e) { >-- log("browser doesn't support AJAX."); >-- return null; >-- } >-- } >--} >-- >--function removeNode(node) { >-- return node && node.parentNode.removeChild(node); >--} >-- >--function log(str) { >-- if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) } >--} >-- >--function error(e, href) { >-- var id = 'less-error-message:' + extractId(href); >-- var template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>'; >-- var elem = document.createElement('div'), timer, content, error = []; >-- var filename = e.filename || href; >-- var filenameNoPath = filename.match(/([^\/]+)$/)[1]; >-- >-- elem.id = id; >-- elem.className = "less-error-message"; >-- >-- content = '<h3>' + (e.message || 'There is an error in your .less file') + >-- '</h3>' + '<p>in <a href="' + filename + '">' + filenameNoPath + "</a> "; >-- >-- var errorline = function (e, i, classname) { >-- if (e.extract[i]) { >-- error.push(template.replace(/\{line\}/, parseInt(e.line) + (i - 1)) >-- .replace(/\{class\}/, classname) >-- .replace(/\{content\}/, e.extract[i])); >-- } >-- }; >-- >-- if (e.stack) { >-- content += '<br/>' + e.stack.split('\n').slice(1).join('<br/>'); >-- } else if (e.extract) { >-- errorline(e, 0, ''); >-- errorline(e, 1, 'line'); >-- errorline(e, 2, ''); >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + >-- '<ul>' + error.join('') + '</ul>'; >-- } >-- elem.innerHTML = content; >-- >-- // CSS for error messages >-- createCSS([ >-- '.less-error-message ul, .less-error-message li {', >-- 'list-style-type: none;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message label {', >-- 'font-size: 12px;', >-- 'margin-right: 15px;', >-- 'padding: 4px 0;', >-- 'color: #cc7777;', >-- '}', >-- '.less-error-message pre {', >-- 'color: #dd6666;', >-- 'padding: 4px 0;', >-- 'margin: 0;', >-- 'display: inline-block;', >-- '}', >-- '.less-error-message pre.line {', >-- 'color: #ff0000;', >-- '}', >-- '.less-error-message h3 {', >-- 'font-size: 20px;', >-- 'font-weight: bold;', >-- 'padding: 15px 0 5px 0;', >-- 'margin: 0;', >-- '}', >-- '.less-error-message a {', >-- 'color: #10a', >-- '}', >-- '.less-error-message .error {', >-- 'color: red;', >-- 'font-weight: bold;', >-- 'padding-bottom: 2px;', >-- 'border-bottom: 1px dashed red;', >-- '}' >-- ].join('\n'), { title: 'error-message' }); >-- >-- elem.style.cssText = [ >-- "font-family: Arial, sans-serif", >-- "border: 1px solid #e00", >-- "background-color: #eee", >-- "border-radius: 5px", >-- "-webkit-border-radius: 5px", >-- "-moz-border-radius: 5px", >-- "color: #e00", >-- "padding: 15px", >-- "margin-bottom: 15px" >-- ].join(';'); >-- >-- if (less.env == 'development') { >-- timer = setInterval(function () { >-- if (document.body) { >-- if (document.getElementById(id)) { >-- document.body.replaceChild(elem, document.getElementById(id)); >-- } else { >-- document.body.insertBefore(elem, document.body.firstChild); >-- } >-- clearInterval(timer); >-- } >-- }, 10); >-- } >--} >-- >--// amd.js >--// >--// Define Less as an AMD module. >--if (typeof define === "function" && define.amd) { >-- define("less", [], function () { return less; } ); >--} >--})(window); >-diff --git a/dist/less-1.3.1.min.js b/dist/less-1.3.1.min.js >-deleted file mode 100644 >-index 4043d44f365980e30a6ca552c7c44e75dd53e1e4..0000000000000000000000000000000000000000 >---- a/dist/less-1.3.1.min.js >-+++ /dev/null >-@@ -1,9 +0,0 @@ >--// >--// LESS - Leaner CSS v1.3.1 >--// http://lesscss.org >--// >--// Copyright (c) 2009-2011, Alexis Sellier >--// Licensed under the Apache 2.0 License. >--// >--(function(e,t){function n(t){return e.less[t.split("/")[1]]}function h(){var e=document.getElementsByTagName("style");for(var t=0;t<e.length;t++)e[t].type.match(l)&&(new r.Parser({filename:document.location.href.replace(/#.*$/,""),dumpLineNumbers:r.dumpLineNumbers})).parse(e[t].innerHTML||"",function(n,r){var i=r.toCSS(),s=e[t];s.type="text/css",s.styleSheet?s.styleSheet.cssText=i:s.innerHTML=i})}function p(e,t){for(var n=0;n<r.sheets.length;n++)d(r.sheets[n],e,t,r.sheets.length-(n+1))}function d(t,n,i,s){var o=t.contents||{},a=e.location.href.replace(/[#?].*$/,""),f=t.href.replace(/\?.*$/,""),l=u&&u.getItem(f),c=u&&u.getItem(f+":timestamp"),h={css:l,timestamp:c};/^[a-z-]+:/.test(f)||(f.charAt(0)=="/"?f=e.location.protocol+"//"+e.location.host+f:f=a.slice(0,a.lastIndexOf("/")+1)+f),g(t.href,t.type,function(e,u){if(!i&&h&&u&&(new Date(u)).valueOf()===(new Date(h.timestamp)).valueOf())m(h.css,t),n(null,null,e,t,{local:!0,remaining:s});else try{o[f]=e,(new r.Parser({optimization:r.optimization,paths:[f.replace(/[\w\.-]+$/,"")],mime:t.type,filename:f,contents:o,dumpLineNumbers:r.dumpLineNumbers})).parse(e,function(r,i){if(r)return E(r,f);try{n(r,i,e,t,{local:!1,lastModified:u,remaining:s}),b(document.getElementById("less-error-message:"+v(f)))}catch(r){E(r,f)}})}catch(a){E(a,f)}},function(e,t){throw new Error("Couldn't load "+t+" ("+e+")")})}function v(e){return e.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function m(e,t,n){var r,i=t.href?t.href.replace(/\?.*$/,""):"",s="less:"+(t.title||v(i));if((r=document.getElementById(s))===null){r=document.createElement("style"),r.type="text/css",t.media&&(r.media=t.media),r.id=s;var o=t&&t.nextSibling||null;document.getElementsByTagName("head")[0].insertBefore(r,o)}if(r.styleSheet)try{r.styleSheet.cssText=e}catch(a){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(e){r.childNodes.length>0?r.firstChild.nodeValue!==e.nodeValue&&r.replaceChild(e,r.firstChild):r.appendChild(e)})(document.createTextNode(e));if(n&&u){w("saving "+i+" to cache.");try{u.setItem(i,e),u.setItem(i+":timestamp",n)}catch(a){w("failed to save")}}}function g(e,t,n,i){function a(t,n,r){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):typeof r=="function"&&r(t.status,e)}var o=y(),u=s?r.fileAsync:r.async;typeof o.overrideMimeType=="function"&&o.overrideMimeType("text/css"),o.open("GET",e,u),o.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),o.send(null),s&&!r.fileAsync?o.status===0||o.status>=200&&o.status<300?n(o.responseText):i(o.status,e):u?o.onreadystatechange=function(){o.readyState==4&&a(o,n,i)}:a(o,n,i)}function y(){if(e.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(t){return w("browser doesn't support AJAX."),null}}function b(e){return e&&e.parentNode.removeChild(e)}function w(e){r.env=="development"&&typeof console!="undefined"&&console.log("less: "+e)}function E(e,t){var n="less-error-message:"+v(t),i='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',s=document.createElement("div"),o,u,a=[],f=e.filename||t,l=f.match(/([^\/]+)$/)[1];s.id=n,s.className="less-error-message",u="<h3>"+(e.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+f+'">'+l+"</a> ";var c=function(e,t,n){e.extract[t]&&a.push(i.replace(/\{line\}/,parseInt(e.line)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.stack?u+="<br/>"+e.stack.split("\n").slice(1).join("<br/>"):e.extract&&(c(e,0,""),c(e,1,"line"),c(e,2,""),u+="on line "+e.line+", column "+(e.column+1)+":</p>"+"<ul>"+a.join("")+"</ul>"),s.innerHTML=u,m([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),s.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),r.env=="development"&&(o=setInterval(function(){document.body&&(document.getElementById(n)?document.body.replaceChild(s,document.getElementById(n)):document.body.insertBefore(s,document.body.firstChild),clearInterval(o))},10))}Array.isArray||(Array.isArray=function(e){return Object.prototype.toString.call(e)==="[object Array]"||e instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(e,t){var n=this.length>>>0;for(var r=0;r<n;r++)r in this&&e.call(t,this[r],r,this)}),Array.prototype.map||(Array.prototype.map=function(e){var t=this.length>>>0,n=new Array(t),r=arguments[1];for(var i=0;i<t;i++)i in this&&(n[i]=e.call(r,this[i],i,this));return n}),Array.prototype.filter||(Array.prototype.filter=function(e){var t=[],n=arguments[1];for(var r=0;r<this.length;r++)e.call(n,this[r])&&t.push(this[r]);return t}),Array.prototype.reduce||(Array.prototype.reduce=function(e){var t=this.length>>>0,n=0;if(t===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n<t;n++)n in this&&(r=e.call(null,r,this[n],n,this));return r}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=arguments[1]||0;if(!t)return-1;if(n>=t)return-1;n<0&&(n+=t);for(;n<t;n++){if(!Object.prototype.hasOwnProperty.call(this,n))continue;if(e===this[n])return n}return-1}),Object.keys||(Object.keys=function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var r,i;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof e=="undefined"?r={}:r=e.less={},i=r.tree={},r.mode="rhino"):typeof e=="undefined"?(r=exports,i=n("./tree"),r.mode="node"):(typeof e.less=="undefined"&&(e.less={}),r=e.less,i=e.less.tree={},r.mode="browser"),r.Parser=function(t){function g(){a=c[u],f=o,h=o}function y(){c[u]=a,o=f,h=o}function b(){o>h&&(c[u]=c[u].slice(o-h),h=o)}function w(e){var t=e.charCodeAt(0);return t===32||t===10||t===9}function E(e){var t,n,r,i,a;if(e instanceof Function)return e.call(p.parsers);if(typeof e=="string")t=s.charAt(o)===e?e:null,r=1,b();else{b();if(!(t=e.exec(c[u])))return null;r=t[0].length}if(t)return S(r),typeof t=="string"?t:t.length===1?t[0]:t}function S(e){var t=o,n=u,r=o+c[u].length,i=o+=e;while(o<r){if(!w(s.charAt(o)))break;o++}return c[u]=c[u].slice(e+(o-i)),h=o,c[u].length===0&&u<c.length-1&&u++,t!==o||n!==u}function x(e,t){var n=E(e);if(!!n)return n;T(t||(typeof e=="string"?"expected '"+e+"' got '"+s.charAt(o)+"'":"unexpected token"))}function T(e,t){throw{index:o,type:t||"Syntax",message:e}}function N(e){return typeof e=="string"?s.charAt(o)===e:e.test(c[u])?!0:!1}function C(e,t){return e.filename&&t.filename&&e.filename!==t.filename?p.imports.contents[e.filename]:s}function k(e,t){for(var n=e,r=-1;n>=0&&t.charAt(n)!=="\n";n--)r++;return{line:typeof e=="number"?(t.slice(0,e).match(/\n/g)||"").length:null,column:r}}function L(e){return r.mode==="browser"||r.mode==="rhino"?e.filename:n("path").resolve(e.filename)}function A(e,t,n){return{lineNumber:k(e,t).line+1,fileName:L(n)}}function O(e,t){var n=C(e,t),r=k(e.index,n),i=r.line,s=r.column,o=n.split("\n");this.type=e.type||"Syntax",this.message=e.message,this.filename=e.filename||t.filename,this.index=e.index,this.line=typeof i=="number"?i+1:null,this.callLine=e.call&&k(e.call,n).line+1,this.callExtract=o[k(e.call,n).line],this.stack=e.stack,this.column=s,this.extract=[o[i-1],o[i],o[i+1]]}var s,o,u,a,f,l,c,h,p,d=this,t=t||{};t.contents||(t.contents={});var v=function(){},m=this.imports={paths:t&&t.paths||[],queue:[],files:{},contents:t.contents,mime:t&&t.mime,error:null,push:function(e,n){var i=this;this.queue.push(e),r.Parser.importer(e,this.paths,function(t,r){i.queue.splice(i.queue.indexOf(e),1);var s=e in i.files;i.files[e]=r,t&&!i.error&&(i.error=t),n(t,r,s),i.queue.length===0&&v(t)},t)}};return this.env=t=t||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,p={imports:m,parse:function(e,a){var f,d,m,g,y,b,w=[],S,x=null;o=u=h=l=0,s=e.replace(/\r\n/g,"\n"),s=s.replace(/^\uFEFF/,""),c=function(e){var n=0,r=/(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g,i=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,o=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g,u=0,a,f=e[0],l;for(var c=0,h,p;c<s.length;c++){r.lastIndex=c,(a=r.exec(s))&&a.index===c&&(c+=a[0].length,f.push(a[0])),h=s.charAt(c),i.lastIndex=o.lastIndex=c,(a=o.exec(s))&&a.index===c&&(c+=a[0].length,f.push(a[0]),h=s.charAt(c)),!l&&h==="/"&&(p=s.charAt(c+1),(p==="/"||p==="*")&&(a=i.exec(s))&&a.index===c&&(c+=a[0].length,f.push(a[0]),h=s.charAt(c)));switch(h){case"{":if(!l){u++,f.push(h);break};case"}":if(!l){u--,f.push(h),e[++n]=f=[];break};case"(":if(!l){l=!0,f.push(h);break};case")":if(l){l=!1,f.push(h);break};default:f.push(h)}}return u>0&&(x=new O({index:c,type:"Parse",message:"missing closing `}`",filename:t.filename},t)),e.map(function(e){return e.join("")})}([[]]);if(x)return a(x);try{f=new i.Ruleset([],E(this.parsers.primary)),f.root=!0}catch(T){return a(new O(T,t))}f.toCSS=function(e){var s,o,u;return function(s,o){var u=[],a;s=s||{},typeof o=="object"&&!Array.isArray(o)&&(o=Object.keys(o).map(function(e){var t=o[e];return t instanceof i.Value||(t instanceof i.Expression||(t=new i.Expression([t])),t=new i.Value([t])),new i.Rule("@"+e,t,!1,0)}),u=[new i.Ruleset(null,o)]);try{var f=e.call(this,{frames:u}).toCSS([],{compress:s.compress||!1,dumpLineNumbers:t.dumpLineNumbers})}catch(l){throw new O(l,t)}if(a=p.imports.error)throw a instanceof O?a:new O(a,t);return s.yuicompress&&r.mode==="node"?n("./cssmin").compressor.cssmin(f):s.compress?f.replace(/(\s)+/g,"$1"):f}}(f.eval);if(o<s.length-1){o=l,b=s.split("\n"),y=(s.slice(0,o).match(/\n/g)||"").length+1;for(var N=o,C=-1;N>=0&&s.charAt(N)!=="\n";N--)C++;x={type:"Parse",message:"Syntax Error on line "+y,index:o,filename:t.filename,line:y,column:C,extract:[b[y-2],b[y-1],b[y]]}}this.imports.queue.length>0?v=function(e){e?a(e):a(null,f)}:a(x,f)},parsers:{primary:function(){var e,t=[];while((e=E(this.mixin.definition)||E(this.rule)||E(this.ruleset)||E(this.mixin.call)||E(this.comment)||E(this.directive))||E(/^[\s\n]+/))e&&t.push(e);return t},comment:function(){var e;if(s.charAt(o)!=="/")return;if(s.charAt(o+1)==="/")return new i.Comment(E(/^\/\/.*/),!0);if(e=E(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new i.Comment(e)},entities:{quoted:function(){var e,t=o,n;s.charAt(t)==="~"&&(t++,n=!0);if(s.charAt(t)!=='"'&&s.charAt(t)!=="'")return;n&&E("~");if(e=E(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new i.Quoted(e[0],e[1]||e[2],n)},keyword:function(){var e;if(e=E(/^[_A-Za-z-][_A-Za-z0-9-]*/))return i.colors.hasOwnProperty(e)?new i.Color(i.colors[e].slice(1)):new i.Keyword(e)},call:function(){var e,n,r,s,a=o;if(!(e=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(c[u])))return;e=e[1],n=e.toLowerCase();if(n==="url")return null;o+=e.length;if(n==="alpha"){s=E(this.alpha);if(typeof s!="undefined")return s}E("("),r=E(this.entities.arguments);if(!E(")"))return;if(e)return new i.Call(e,r,a,t.filename)},arguments:function(){var e=[],t;while(t=E(this.entities.assignment)||E(this.expression)){e.push(t);if(!E(","))break}return e},literal:function(){return E(this.entities.ratio)||E(this.entities.dimension)||E(this.entities.color)||E(this.entities.quoted)},assignment:function(){var e,t;if((e=E(/^\w+(?=\s?=)/i))&&E("=")&&(t=E(this.entity)))return new i.Assignment(e,t)},url:function(){var e;if(s.charAt(o)!=="u"||!E(/^url\(/))return;return e=E(this.entities.quoted)||E(this.entities.variable)||E(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/)||"",x(")"),new i.URL(e.value!=null||e instanceof i.Variable?e:new i.Anonymous(e),m.paths)},variable:function(){var e,n=o;if(s.charAt(o)==="@"&&(e=E(/^@@?[\w-]+/)))return new i.Variable(e,n,t.filename)},variableCurly:function(){var e,n,r=o;if(s.charAt(o)==="@"&&(n=E(/^@\{([\w-]+)\}/)))return new i.Variable("@"+n[1],r,t.filename)},color:function(){var e;if(s.charAt(o)==="#"&&(e=E(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/)))return new i.Color(e[1])},dimension:function(){var e,t=s.charCodeAt(o);if(t>57||t<45||t===47)return;if(e=E(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|dpi|dpcm|dppx|rem|vw|vh|vmin|vm|ch)?/))return new i.Dimension(e[1],e[2])},ratio:function(){var e,t=s.charCodeAt(o);if(t>57||t<48)return;if(e=E(/^(\d+\/\d+)/))return new i.Ratio(e[1])},javascript:function(){var e,t=o,n;s.charAt(t)==="~"&&(t++,n=!0);if(s.charAt(t)!=="`")return;n&&E("~");if(e=E(/^`([^`]*)`/))return new i.JavaScript(e[1],o,n)}},variable:function(){var e;if(s.charAt(o)==="@"&&(e=E(/^(@[\w-]+)\s*:/)))return e[1]},shorthand:function(){var e,t;if(!N(/^[@\w.%-]+\/[@\w.-]+/))return;g();if((e=E(this.entity))&&E("/")&&(t=E(this.entity)))return new i.Shorthand(e,t);y()},mixin:{call:function(){var e=[],n,r,u=[],a,f=o,l=s.charAt(o),c,h,p=!1;if(l!=="."&&l!=="#")return;g();while(n=E(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/))e.push(new i.Element(r,n,o)),r=E(">");if(E("(")){while(a=E(this.expression)){h=a,c=null;if(a.value.length==1){var d=a.value[0];if(d instanceof i.Variable&&E(":")){if(!(h=E(this.expression)))throw new Error("Expected value");c=d.name}}u.push({name:c,value:h});if(!E(","))break}if(!E(")"))throw new Error("Expected )")}E(this.important)&&(p=!0);if(e.length>0&&(E(";")||N("}")))return new i.mixin.Call(e,u,f,t.filename,p);y()},definition:function(){var e,t=[],n,r,u,a,f,c=!1;if(s.charAt(o)!=="."&&s.charAt(o)!=="#"||N(/^[^{]*(;|})/))return;g();if(n=E(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=n[1];do{if(s.charAt(o)==="."&&E(/^\.{3}/)){c=!0;break}if(!(u=E(this.entities.variable)||E(this.entities.literal)||E(this.entities.keyword)))break;if(u instanceof i.Variable)if(E(":"))a=x(this.expression,"expected expression"),t.push({name:u.name,value:a});else{if(E(/^\.{3}/)){t.push({name:u.name,variadic:!0}),c=!0;break}t.push({name:u.name})}else t.push({value:u})}while(E(","));E(")")||(l=o,y()),E(/^when/)&&(f=x(this.conditions,"expected condition")),r=E(this.block);if(r)return new i.mixin.Definition(e,t,r,f,c);y()}}},entity:function(){return E(this.entities.literal)||E(this.entities.variable)||E(this.entities.url)||E(this.entities.call)||E(this.entities.keyword)||E(this.entities.javascript)||E(this.comment)},end:function(){return E(";")||N("}")},alpha:function(){var e;if(!E(/^\(opacity=/i))return;if(e=E(/^\d+/)||E(this.entities.variable))return x(")"),new i.Alpha(e)},element:function(){var e,t,n,r;n=E(this.combinator),e=E(/^(?:\d+\.\d+|\d+)%/)||E(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||E("*")||E("&")||E(this.attribute)||E(/^\([^)@]+\)/)||E(/^[\.#](?=@)/)||E(this.entities.variableCurly),e||E("(")&&(r=E(this.entities.variableCurly)||E(this.entities.variable))&&E(")")&&(e=new i.Paren(r));if(e)return new i.Element(n,e,o)},combinator:function(){var e,t=s.charAt(o);if(t===">"||t==="+"||t==="~"){o++;while(s.charAt(o).match(/\s/))o++;return new i.Combinator(t)}return s.charAt(o-1).match(/\s/)?new i.Combinator(" "):new i.Combinator(null)},selector:function(){var e,t,n=[],r,u;if(E("("))return e=E(this.entity),x(")"),new i.Selector([new i.Element("",e,o)]);while(t=E(this.element)){r=s.charAt(o),n.push(t);if(r==="{"||r==="}"||r===";"||r===",")break}if(n.length>0)return new i.Selector(n)},tag:function(){return E(/^[A-Za-z][A-Za-z-]*[0-9]?/)||E("*")},attribute:function(){var e="",t,n,r;if(!E("["))return;if(t=E(/^(?:[_A-Za-z0-9-]|\\.)+/)||E(this.entities.quoted))(r=E(/^[|~*$^]?=/))&&(n=E(this.entities.quoted)||E(/^[\w-]+/))?e=[t,r,n.toCSS?n.toCSS():n].join(""):e=t;if(!E("]"))return;if(e)return"["+e+"]"},block:function(){var e;if(E("{")&&(e=E(this.primary))&&E("}"))return e},ruleset:function(){var e=[],n,r,u,a;g(),t.dumpLineNumbers&&(a=A(o,s,t));while(n=E(this.selector)){e.push(n),E(this.comment);if(!E(","))break;E(this.comment)}if(e.length>0&&(r=E(this.block))){var f=new i.Ruleset(e,r,t.strictImports);return t.dumpLineNumbers&&(f.debugInfo=a),f}l=o,y()},rule:function(){var e,t,n=s.charAt(o),r,a;g();if(n==="."||n==="#"||n==="&")return;if(e=E(this.variable)||E(this.property)){e.charAt(0)!="@"&&(a=/^([^@+\/'"*`(;{}-]*);/.exec(c[u]))?(o+=a[0].length-1,t=new i.Anonymous(a[1])):e==="font"?t=E(this.font):t=E(this.value),r=E(this.important);if(t&&E(this.end))return new i.Rule(e,t,r,f);l=o,y()}},"import":function(){var e,t,n=o;g();var r=E(/^@import(?:-(once))?\s+/);if(r&&(e=E(this.entities.quoted)||E(this.entities.url))){t=E(this.mediaFeatures);if(E(";"))return new i.Import(e,m,t,r[1]==="once",n)}y()},mediaFeature:function(){var e,t,n=[];do if(e=E(this.entities.keyword))n.push(e);else if(E("(")){t=E(this.property),e=E(this.entity);if(!E(")"))return null;if(t&&e)n.push(new i.Paren(new i.Rule(t,e,null,o,!0)));else{if(!e)return null;n.push(new i.Paren(e))}}while(e);if(n.length>0)return new i.Expression(n)},mediaFeatures:function(){var e,t=[];do if(e=E(this.mediaFeature)){t.push(e);if(!E(","))break}else if(e=E(this.entities.variable)){t.push(e);if(!E(","))break}while(e);return t.length>0?t:null},media:function(){var e,n,r,u;t.dumpLineNumbers&&(u=A(o,s,t));if(E(/^@media/)){e=E(this.mediaFeatures);if(n=E(this.block))return r=new i.Media(n,e),t.dumpLineNumbers&&(r.debugInfo=u),r}},directive:function(){var e,t,n,r,u,a,f,l,c;if(s.charAt(o)!=="@")return;if(t=E(this["import"])||E(this.media))return t;g(),e=E(/^@[a-z-]+/),f=e,e.charAt(1)=="-"&&e.indexOf("-",2)>0&&(f="@"+e.slice(e.indexOf("-",2)+1));switch(f){case"@font-face":l=!0;break;case"@viewport":case"@top-left":case"@top-left-corner":case"@top-center":case"@top-right":case"@top-right-corner":case"@bottom-left":case"@bottom-left-corner":case"@bottom-center":case"@bottom-right":case"@bottom-right-corner":case"@left-top":case"@left-middle":case"@left-bottom":case"@right-top":case"@right-middle":case"@right-bottom":l=!0;break;case"@page":case"@document":case"@supports":case"@keyframes":l=!0,c=!0}c&&(e+=" "+(E(/^[^{]+/)||"").trim());if(l){if(n=E(this.block))return new i.Directive(e,n)}else if((t=E(this.entity))&&E(";"))return new i.Directive(e,t);y()},font:function(){var e=[],t=[],n,r,s,o;while(o=E(this.shorthand)||E(this.entity))t.push(o);e.push(new i.Expression(t));if(E(","))while(o=E(this.expression)){e.push(o);if(!E(","))break}return new i.Value(e)},value:function(){var e,t=[],n;while(e=E(this.expression)){t.push(e);if(!E(","))break}if(t.length>0)return new i.Value(t)},important:function(){if(s.charAt(o)==="!")return E(/^! *important/)},sub:function(){var e;if(E("(")&&(e=E(this.expression))&&E(")"))return e},multiplication:function(){var e,t,n,r;if(e=E(this.operand)){while(!N(/^\/\*/)&&(n=E("/")||E("*"))&&(t=E(this.operand)))r=new i.Operation(n,[r||e,t]);return r||e}},addition:function(){var e,t,n,r;if(e=E(this.multiplication)){while((n=E(/^[-+]\s+/)||!w(s.charAt(o-1))&&(E("+")||E("-")))&&(t=E(this.multiplication)))r=new i.Operation(n,[r||e,t]);return r||e}},conditions:function(){var e,t,n=o,r;if(e=E(this.condition)){while(E(",")&&(t=E(this.condition)))r=new i.Condition("or",r||e,t,n);return r||e}},condition:function(){var e,t,n,r,s=o,u=!1;E(/^not/)&&(u=!0),x("(");if(e=E(this.addition)||E(this.entities.keyword)||E(this.entities.quoted))return(r=E(/^(?:>=|=<|[<=>])/))?(t=E(this.addition)||E(this.entities.keyword)||E(this.entities.quoted))?n=new i.Condition(r,e,t,s,u):T("expected expression"):n=new i.Condition("=",e,new i.Keyword("true"),s,u),x(")"),E(/^and/)?new i.Condition("and",n,E(this.condition)):n},operand:function(){var e,t=s.charAt(o+1);s.charAt(o)==="-"&&(t==="@"||t==="(")&&(e=E("-"));var n=E(this.sub)||E(this.entities.dimension)||E(this.entities.color)||E(this.entities.variable)||E(this.entities.call);return e?new i.Operation("*",[new i.Dimension(-1),n]):n},expression:function(){var e,t,n=[],r;while(e=E(this.addition)||E(this.entity))n.push(e);if(n.length>0)return new i.Expression(n)},property:function(){var e;if(e=E(/^(\*?-?[_a-z0-9-]+)\s*:/))return e[1]}}}};if(r.mode==="browser"||r.mode==="rhino")r.Parser.importer=function(e,t,n,r){!/^([a-z-]+:)?\//.test(e)&&t.length>0&&(e=t[0]+e),d({href:e,title:e,type:r.mime,contents:r.contents},function(i){i&&typeof r.errback=="function"?r.errback.call(null,e,t,n,r):n.apply(null,arguments)},!0)};(function(e){function t(t){return e.functions.hsla(t.h,t.s,t.l,t.a)}function n(t){if(t instanceof e.Dimension)return parseFloat(t.unit=="%"?t.value/100:t.value);if(typeof t=="number")return t;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function r(e){return Math.min(1,Math.max(0,e))}e.functions={rgb:function(e,t,n){return this.rgba(e,t,n,1)},rgba:function(t,r,i,s){var o=[t,r,i].map(function(e){return n(e)}),s=n(s);return new e.Color(o,s)},hsl:function(e,t,n){return this.hsla(e,t,n,1)},hsla:function(e,t,r,i){function u(e){return e=e<0?e+1:e>1?e-1:e,e*6<1?o+(s-o)*e*6:e*2<1?s:e*3<2?o+(s-o)*(2/3-e)*6:o}e=n(e)%360/360,t=n(t),r=n(r),i=n(i);var s=r<=.5?r*(t+1):r+t-r*t,o=r*2-s;return this.rgba(u(e+1/3)*255,u(e)*255,u(e-1/3)*255,i)},hue:function(t){return new e.Dimension(Math.round(t.toHSL().h))},saturation:function(t){return new e.Dimension(Math.round(t.toHSL().s*100),"%")},lightness:function(t){return new e.Dimension(Math.round(t.toHSL().l*100),"%")},red:function(t){return new e.Dimension(t.rgb[0])},green:function(t){return new e.Dimension(t.rgb[1])},blue:function(t){return new e.Dimension(t.rgb[2])},alpha:function(t){return new e.Dimension(t.toHSL().a)},luma:function(t){return new e.Dimension(Math.round((.2126*(t.rgb[0]/255)+.7152*(t.rgb[1]/255)+.0722*(t.rgb[2]/255))*t.alpha*100),"%")},saturate:function(e,n){var i=e.toHSL();return i.s+=n.value/100,i.s=r(i.s),t(i)},desaturate:function(e,n){var i=e.toHSL();return i.s-=n.value/100,i.s=r(i.s),t(i)},lighten:function(e,n){var i=e.toHSL();return i.l+=n.value/100,i.l=r(i.l),t(i)},darken:function(e,n){var i=e.toHSL();return i.l-=n.value/100,i.l=r(i.l),t(i)},fadein:function(e,n){var i=e.toHSL();return i.a+=n.value/100,i.a=r(i.a),t(i)},fadeout:function(e,n){var i=e.toHSL();return i.a-=n.value/100,i.a=r(i.a),t(i)},fade:function(e,n){var i=e.toHSL();return i.a=n.value/100,i.a=r(i.a),t(i)},spin:function(e,n){var r=e.toHSL(),i=(r.h+n.value)%360;return r.h=i<0?360+i:i,t(r)},mix:function(t,n,r){r||(r=new e.Dimension(50));var i=r.value/100,s=i*2-1,o=t.toHSL().a-n.toHSL().a,u=((s*o==-1?s:(s+o)/(1+s*o))+1)/2,a=1-u,f=[t.rgb[0]*u+n.rgb[0]*a,t.rgb[1]*u+n.rgb[1]*a,t.rgb[2]*u+n.rgb[2]*a],l=t.alpha*i+n.alpha*(1-i);return new e.Color(f,l)},greyscale:function(t){return this.desaturate(t,new e.Dimension(100))},contrast:function(e,t,n,r){return typeof n=="undefined"&&(n=this.rgba(255,255,255,1)),typeof t=="undefined"&&(t=this.rgba(0,0,0,1)),typeof r=="undefined"?r=.43:r=r.value,(.2126*(e.rgb[0]/255)+.7152*(e.rgb[1]/255)+.0722*(e.rgb[2]/255))*e.alpha<r?n:t},e:function(t){return new e.Anonymous(t instanceof e.JavaScript?t.evaluated:t)},escape:function(t){return new e.Anonymous(encodeURI(t.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(t){var n=Array.prototype.slice.call(arguments,1),r=t.value;for(var i=0;i<n.length;i++)r=r.replace(/%[sda]/i,function(e){var t=e.match(/s/i)?n[i].value:n[i].toCSS();return e.match(/[A-Z]$/)?encodeURIComponent(t):t});return r=r.replace(/%%/g,"%"),new e.Quoted('"'+r+'"',r)},round:function(t,r){var i=typeof r=="undefined"?0:r.value;if(t instanceof e.Dimension)return new e.Dimension(n(t).toFixed(i),t.unit);if(typeof t=="number")return t.toFixed(i);throw{type:"Argument",message:"argument must be a number"}},ceil:function(e){return this._math("ceil",e)},floor:function(e){return this._math("floor",e)},_math:function(t,r){if(r instanceof e.Dimension)return new e.Dimension(Math[t](n(r)),r.unit);if(typeof r=="number")return Math[t](r);throw{type:"Argument",message:"argument must be a number"}},argb:function(t){return new e.Anonymous(t.toARGB())},percentage:function(t){return new e.Dimension(t.value*100,"%")},color:function(t){if(t instanceof e.Quoted)return new e.Color(t.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(t){return this._isa(t,e.Color)},isnumber:function(t){return this._isa(t,e.Dimension)},isstring:function(t){return this._isa(t,e.Quoted)},iskeyword:function(t){return this._isa(t,e.Keyword)},isurl:function(t){return this._isa(t,e.URL)},ispixel:function(t){return t instanceof e.Dimension&&t.unit==="px"?e.True:e.False},ispercentage:function(t){return t instanceof e.Dimension&&t.unit==="%"?e.True:e.False},isem:function(t){return t instanceof e.Dimension&&t.unit==="em"?e.True:e.False},_isa:function(t,n){return t instanceof n?e.True:e.False},multiply:function(e,t){var n=e.rgb[0]*t.rgb[0]/255,r=e.rgb[1]*t.rgb[1]/255,i=e.rgb[2]*t.rgb[2]/255;return this.rgb(n,r,i)},screen:function(e,t){var n=255-(255-e.rgb[0])*(255-t.rgb[0])/255,r=255-(255-e.rgb[1])*(255-t.rgb[1])/255,i=255-(255-e.rgb[2])*(255-t.rgb[2])/255;return this.rgb(n,r,i)},overlay:function(e,t){var n=e.rgb[0]<128?2*e.rgb[0]*t.rgb[0]/255:255-2*(255-e.rgb[0])*(255-t.rgb[0])/255,r=e.rgb[1]<128?2*e.rgb[1]*t.rgb[1]/255:255-2*(255-e.rgb[1])*(255-t.rgb[1])/255,i=e.rgb[2]<128?2*e.rgb[2]*t.rgb[2]/255:255-2*(255-e.rgb[2])*(255-t.rgb[2])/255;return this.rgb(n,r,i)},softlight:function(e,t){var n=t.rgb[0]*e.rgb[0]/255,r=n+e.rgb[0]*(255-(255-e.rgb[0])*(255-t.rgb[0])/255-n)/255;n=t.rgb[1]*e.rgb[1]/255;var i=n+e.rgb[1]*(255-(255-e.rgb[1])*(255-t.rgb[1])/255-n)/255;n=t.rgb[2]*e.rgb[2]/255;var s=n+e.rgb[2]*(255-(255-e.rgb[2])*(255-t.rgb[2])/255-n)/255;return this.rgb(r,i,s)},hardlight:function(e,t){var n=t.rgb[0]<128?2*t.rgb[0]*e.rgb[0]/255:255-2*(255-t.rgb[0])*(255-e.rgb[0])/255,r=t.rgb[1]<128?2*t.rgb[1]*e.rgb[1]/255:255-2*(255-t.rgb[1])*(255-e.rgb[1])/255,i=t.rgb[2]<128?2*t.rgb[2]*e.rgb[2]/255:255-2*(255-t.rgb[2])*(255-e.rgb[2])/255;return this.rgb(n,r,i)},difference:function(e,t){var n=Math.abs(e.rgb[0]-t.rgb[0]),r=Math.abs(e.rgb[1]-t.rgb[1]),i=Math.abs(e.rgb[2]-t.rgb[2]);return this.rgb(n,r,i)},exclusion:function(e,t){var n=e.rgb[0]+t.rgb[0]*(255-e.rgb[0]-e.rgb[0])/255,r=e.rgb[1]+t.rgb[1]*(255-e.rgb[1]-e.rgb[1])/255,i=e.rgb[2]+t.rgb[2]*(255-e.rgb[2]-e.rgb[2])/255;return this.rgb(n,r,i)},average:function(e,t){var n=(e.rgb[0]+t.rgb[0])/2,r=(e.rgb[1]+t.rgb[1])/2,i=(e.rgb[2]+t.rgb[2])/2;return this.rgb(n,r,i)},negation:function(e,t){var n=255-Math.abs(255-t.rgb[0]-e.rgb[0]),r=255-Math.abs(255-t.rgb[1]-e.rgb[1]),i=255-Math.abs(255-t.rgb[2]-e.rgb[2]);return this.rgb(n,r,i)},tint:function(e,t){return this.mix(this.rgb(255,255,255),e,t)},shade:function(e,t){return this.mix(this.rgb(0,0,0),e,t)}}})(n("./tree")),function(e){e.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(n("./tree")),function(e){e.Alpha=function(e){this.value=e},e.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(e){return this.value.eval&&(this.value=this.value.eval(e)),this}}}(n("../tree")),function(e){e.Anonymous=function(e){this.value=e.value||e},e.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this},compare:function(e){if(!e.toCSS)return-1;var t=this.toCSS(),n=e.toCSS();return t===n?0:t<n?-1:1}}}(n("../tree")),function(e){e.Assignment=function(e,t){this.key=e,this.value=t},e.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(t){return this.value.eval?new e.Assignment(this.key,this.value.eval(t)):this}}}(n("../tree")),function(e){e.Call=function(e,t,n,r){this.name=e,this.args=t,this.index=n,this.filename=r},e.Call.prototype={eval:function(t){var n=this.args.map(function(e){return e.eval(t)});if(!(this.name in e.functions))return new e.Anonymous(this.name+"("+n.map(function(e){return e.toCSS(t)}).join(", ")+")");try{return e.functions[this.name].apply(e.functions,n)}catch(r){throw{type:r.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(r.message?": "+r.message:""),index:this.index,filename:this.filename}}},toCSS:function(e){return this.eval(e).toCSS()}}}(n("../tree")),function(e){e.Color=function(e,t){Array.isArray(e)?this.rgb=e:e.length==6?this.rgb=e.match(/.{2}/g).map(function(e){return parseInt(e,16)}):this.rgb=e.split("").map(function(e){return parseInt(e+e,16)}),this.alpha=typeof t=="number"?t:1},e.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(e){return Math.round(e)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(e){return e=Math.round(e),e=(e>255?255:e<0?0:e).toString(16),e.length===1?"0"+e:e}).join("")},operate:function(t,n){var r=[];n instanceof e.Color||(n=n.toColor());for(var i=0;i<3;i++)r[i]=e.operate(t,this.rgb[i],n.rgb[i]);return new e.Color(r,this.alpha+n.alpha)},toHSL:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255,r=this.alpha,i=Math.max(e,t,n),s=Math.min(e,t, >--n),o,u,a=(i+s)/2,f=i-s;if(i===s)o=u=0;else{u=a>.5?f/(2-i-s):f/(i+s);switch(i){case e:o=(t-n)/f+(t<n?6:0);break;case t:o=(n-e)/f+2;break;case n:o=(e-t)/f+4}o/=6}return{h:o*360,s:u,l:a,a:r}},toARGB:function(){var e=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+e.map(function(e){return e=Math.round(e),e=(e>255?255:e<0?0:e).toString(16),e.length===1?"0"+e:e}).join("")},compare:function(e){return e.rgb?e.rgb[0]===this.rgb[0]&&e.rgb[1]===this.rgb[1]&&e.rgb[2]===this.rgb[2]&&e.alpha===this.alpha?0:-1:-1}}}(n("../tree")),function(e){e.Comment=function(e,t){this.value=e,this.silent=!!t},e.Comment.prototype={toCSS:function(e){return e.compress?"":this.value},eval:function(){return this}}}(n("../tree")),function(e){e.Condition=function(e,t,n,r,i){this.op=e.trim(),this.lvalue=t,this.rvalue=n,this.index=r,this.negate=i},e.Condition.prototype.eval=function(e){var t=this.lvalue.eval(e),n=this.rvalue.eval(e),r=this.index,i,i=function(e){switch(e){case"and":return t&&n;case"or":return t||n;default:if(t.compare)i=t.compare(n);else{if(!n.compare)throw{type:"Type",message:"Unable to perform comparison",index:r};i=n.compare(t)}switch(i){case-1:return e==="<"||e==="=<";case 0:return e==="="||e===">="||e==="=<";case 1:return e===">"||e===">="}}}(this.op);return this.negate?!i:i}}(n("../tree")),function(e){e.Dimension=function(e,t){this.value=parseFloat(e),this.unit=t||null},e.Dimension.prototype={eval:function(){return this},toColor:function(){return new e.Color([this.value,this.value,this.value])},toCSS:function(){var e=this.value+this.unit;return e},operate:function(t,n){return new e.Dimension(e.operate(t,this.value,n.value),this.unit||n.unit)},compare:function(t){return t instanceof e.Dimension?t.value>this.value?-1:t.value<this.value?1:0:-1}}}(n("../tree")),function(e){e.Directive=function(t,n){this.name=t,Array.isArray(n)?(this.ruleset=new e.Ruleset([],n),this.ruleset.allowImports=!0):this.value=n},e.Directive.prototype={toCSS:function(e,t){return this.ruleset?(this.ruleset.root=!0,this.name+(t.compress?"{":" {\n ")+this.ruleset.toCSS(e,t).trim().replace(/\n/g,"\n ")+(t.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(t){var n=this;return this.ruleset&&(t.frames.unshift(this),n=new e.Directive(this.name),n.ruleset=this.ruleset.eval(t),t.frames.shift()),n},variable:function(t){return e.Ruleset.prototype.variable.call(this.ruleset,t)},find:function(){return e.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return e.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(n("../tree")),function(e){e.Element=function(t,n,r){this.combinator=t instanceof e.Combinator?t:new e.Combinator(t),typeof n=="string"?this.value=n.trim():n?this.value=n:this.value="",this.index=r},e.Element.prototype.eval=function(t){return new e.Element(this.combinator,this.value.eval?this.value.eval(t):this.value,this.index)},e.Element.prototype.toCSS=function(e){var t=this.value.toCSS?this.value.toCSS(e):this.value;return t==""&&this.combinator.value.charAt(0)=="&"?"":this.combinator.toCSS(e||{})+t},e.Combinator=function(e){e===" "?this.value=" ":this.value=e?e.trim():""},e.Combinator.prototype.toCSS=function(e){return{"":""," ":" ",":":" :","+":e.compress?"+":" + ","~":e.compress?"~":" ~ ",">":e.compress?">":" > "}[this.value]}}(n("../tree")),function(e){e.Expression=function(e){this.value=e},e.Expression.prototype={eval:function(t){return this.value.length>1?new e.Expression(this.value.map(function(e){return e.eval(t)})):this.value.length===1?this.value[0].eval(t):this},toCSS:function(e){return this.value.map(function(t){return t.toCSS?t.toCSS(e):""}).join(" ")}}}(n("../tree")),function(e){e.Import=function(t,n,r,i,s){var o=this;this.once=i,this.index=s,this._path=t,this.features=r&&new e.Value(r),t instanceof e.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(t.value)?t.value:t.value+".less":this.path=t.value.value||t.value,this.css=/css(\?.*)?$/.test(this.path),this.css||n.push(this.path,function(t,n,r){t&&(t.index=s),r&&o.once&&(o.skip=r),o.root=n||new e.Ruleset([],[])})},e.Import.prototype={toCSS:function(e){var t=this.features?" "+this.features.toCSS(e):"";return this.css?"@import "+this._path.toCSS()+t+";\n":""},eval:function(t){var n,r=this.features&&this.features.eval(t);if(this.skip)return[];if(this.css)return this;n=new e.Ruleset([],this.root.rules.slice(0));for(var i=0;i<n.rules.length;i++)n.rules[i]instanceof e.Import&&Array.prototype.splice.apply(n.rules,[i,1].concat(n.rules[i].eval(t)));return this.features?new e.Media(n.rules,this.features.value):n.rules}}}(n("../tree")),function(e){e.JavaScript=function(e,t,n){this.escaped=n,this.expression=e,this.index=t},e.JavaScript.prototype={eval:function(t){var n,r=this,i={},s=this.expression.replace(/@\{([\w-]+)\}/g,function(n,i){return e.jsify((new e.Variable("@"+i,r.index)).eval(t))});try{s=new Function("return ("+s+")")}catch(o){throw{message:"JavaScript evaluation error: `"+s+"`",index:this.index}}for(var u in t.frames[0].variables())i[u.slice(1)]={value:t.frames[0].variables()[u].value,toJS:function(){return this.value.eval(t).toCSS()}};try{n=s.call(i)}catch(o){throw{message:"JavaScript evaluation error: '"+o.name+": "+o.message+"'",index:this.index}}return typeof n=="string"?new e.Quoted('"'+n+'"',n,this.escaped,this.index):Array.isArray(n)?new e.Anonymous(n.join(", ")):new e.Anonymous(n)}}}(n("../tree")),function(e){e.Keyword=function(e){this.value=e},e.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(t){return t instanceof e.Keyword?t.value===this.value?0:1:-1}},e.True=new e.Keyword("true"),e.False=new e.Keyword("false")}(n("../tree")),function(e){e.Media=function(t,n){var r=this.emptySelectors();this.features=new e.Value(n),this.ruleset=new e.Ruleset(r,t),this.ruleset.allowImports=!0},e.Media.prototype={toCSS:function(e,t){var n=this.features.toCSS(t);return this.ruleset.root=e.length===0||e[0].multiMedia,"@media "+n+(t.compress?"{":" {\n ")+this.ruleset.toCSS(e,t).trim().replace(/\n/g,"\n ")+(t.compress?"}":"\n}\n")},eval:function(t){t.mediaBlocks||(t.mediaBlocks=[],t.mediaPath=[]);var n=t.mediaBlocks.length;t.mediaPath.push(this),t.mediaBlocks.push(this);var r=new e.Media([],[]);return this.debugInfo&&(this.ruleset.debugInfo=this.debugInfo,r.debugInfo=this.debugInfo),r.features=this.features.eval(t),t.frames.unshift(this.ruleset),r.ruleset=this.ruleset.eval(t),t.frames.shift(),t.mediaBlocks[n]=r,t.mediaPath.pop(),t.mediaPath.length===0?r.evalTop(t):r.evalNested(t)},variable:function(t){return e.Ruleset.prototype.variable.call(this.ruleset,t)},find:function(){return e.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return e.Ruleset.prototype.rulesets.apply(this.ruleset)},emptySelectors:function(){var t=new e.Element("","&",0);return[new e.Selector([t])]},evalTop:function(t){var n=this;if(t.mediaBlocks.length>1){var r=this.emptySelectors();n=new e.Ruleset(r,t.mediaBlocks),n.multiMedia=!0}return delete t.mediaBlocks,delete t.mediaPath,n},evalNested:function(t){var n,r,i=t.mediaPath.concat([this]);for(n=0;n<i.length;n++)r=i[n].features instanceof e.Value?i[n].features.value:i[n].features,i[n]=Array.isArray(r)?r:[r];return this.features=new e.Value(this.permute(i).map(function(t){t=t.map(function(t){return t.toCSS?t:new e.Anonymous(t)});for(n=t.length-1;n>0;n--)t.splice(n,0,new e.Anonymous("and"));return new e.Expression(t)})),new e.Ruleset([],[])},permute:function(e){if(e.length===0)return[];if(e.length===1)return e[0];var t=[],n=this.permute(e.slice(1));for(var r=0;r<n.length;r++)for(var i=0;i<e[0].length;i++)t.push([e[0][i]].concat(n[r]));return t},bubbleSelectors:function(t){this.ruleset=new e.Ruleset(t.slice(0),[this.ruleset])}}}(n("../tree")),function(e){e.mixin={},e.mixin.Call=function(t,n,r,i,s){this.selector=new e.Selector(t),this.arguments=n,this.index=r,this.filename=i,this.important=s},e.mixin.Call.prototype={eval:function(e){var t,n,r=[],i=!1;for(var s=0;s<e.frames.length;s++)if((t=e.frames[s].find(this.selector)).length>0){n=this.arguments&&this.arguments.map(function(t){return{name:t.name,value:t.value.eval(e)}});for(var o=0;o<t.length;o++)if(t[o].match(n,e))try{Array.prototype.push.apply(r,t[o].eval(e,this.arguments,this.important).rules),i=!0}catch(u){throw{message:u.message,index:this.index,filename:this.filename,stack:u.stack}}if(i)return r;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(e){return e.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},e.mixin.Definition=function(t,n,r,i,s){this.name=t,this.selectors=[new e.Selector([new e.Element(null,t)])],this.params=n,this.condition=i,this.variadic=s,this.arity=n.length,this.rules=r,this._lookups={},this.required=n.reduce(function(e,t){return!t.name||t.name&&!t.value?e+1:e},0),this.parent=e.Ruleset.prototype,this.frames=[]},e.mixin.Definition.prototype={toCSS:function(){return""},variable:function(e){return this.parent.variable.call(this,e)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(t,n){var r=new e.Ruleset(null,[]),i,s;for(var o=0,u,a;o<this.params.length;o++){s=n&&n[o];if(s&&s.name){r.rules.unshift(new e.Rule(s.name,s.value.eval(t))),n.splice(o,1),o--;continue}if(a=this.params[o].name)if(this.params[o].variadic&&n){i=[];for(var f=o;f<n.length;f++)i.push(n[f].value.eval(t));r.rules.unshift(new e.Rule(a,(new e.Expression(i)).eval(t)))}else{if(!(u=s&&s.value||this.params[o].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+n.length+" for "+this.arity+")"};r.rules.unshift(new e.Rule(a,u.eval(t)))}}return r},eval:function(t,n,r){var i=this.evalParams(t,n),s,o=[],u,a;for(var f=0;f<Math.max(this.params.length,n&&n.length);f++)o.push(n[f]&&n[f].value||this.params[f].value);return i.rules.unshift(new e.Rule("@arguments",(new e.Expression(o)).eval(t))),u=r?this.rules.map(function(t){return new e.Rule(t.name,t.value,"!important",t.index)}):this.rules.slice(0),(new e.Ruleset(null,u)).eval({frames:[this,i].concat(this.frames,t.frames)})},match:function(e,t){var n=e&&e.length||0,r,i;if(!this.variadic){if(n<this.required)return!1;if(n>this.params.length)return!1;if(this.required>0&&n>this.params.length)return!1}if(this.condition&&!this.condition.eval({frames:[this.evalParams(t,e)].concat(t.frames)}))return!1;r=Math.min(n,this.arity);for(var s=0;s<r;s++)if(!this.params[s].name&&e[s].value.eval(t).toCSS()!=this.params[s].value.eval(t).toCSS())return!1;return!0}}}(n("../tree")),function(e){e.Operation=function(e,t){this.op=e.trim(),this.operands=t},e.Operation.prototype.eval=function(t){var n=this.operands[0].eval(t),r=this.operands[1].eval(t),i;if(n instanceof e.Dimension&&r instanceof e.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};i=r,r=n,n=i}return n.operate(this.op,r)},e.operate=function(e,t,n){switch(e){case"+":return t+n;case"-":return t-n;case"*":return t*n;case"/":return t/n}}}(n("../tree")),function(e){e.Paren=function(e){this.value=e},e.Paren.prototype={toCSS:function(e){return"("+this.value.toCSS(e)+")"},eval:function(t){return new e.Paren(this.value.eval(t))}}}(n("../tree")),function(e){e.Quoted=function(e,t,n,r){this.escaped=n,this.value=t||"",this.quote=e.charAt(0),this.index=r},e.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(t){var n=this,r=this.value.replace(/`([^`]+)`/g,function(r,i){return(new e.JavaScript(i,n.index,!0)).eval(t).value}).replace(/@\{([\w-]+)\}/g,function(r,i){var s=(new e.Variable("@"+i,n.index)).eval(t);return"value"in s?s.value:s.toCSS()});return new e.Quoted(this.quote+r+this.quote,r,this.escaped,this.index)},compare:function(e){if(!e.toCSS)return-1;var t=this.toCSS(),n=e.toCSS();return t===n?0:t<n?-1:1}}}(n("../tree")),function(e){e.Ratio=function(e){this.value=e},e.Ratio.prototype={toCSS:function(e){return this.value},eval:function(){return this}}}(n("../tree")),function(e){e.Rule=function(t,n,r,i,s){this.name=t,this.value=n instanceof e.Value?n:new e.Value([n]),this.important=r?" "+r.trim():"",this.index=i,this.inline=s||!1,t.charAt(0)==="@"?this.variable=!0:this.variable=!1},e.Rule.prototype.toCSS=function(e){return this.variable?"":this.name+(e.compress?":":": ")+this.value.toCSS(e)+this.important+(this.inline?"":";")},e.Rule.prototype.eval=function(t){return new e.Rule(this.name,this.value.eval(t),this.important,this.index,this.inline)},e.Shorthand=function(e,t){this.a=e,this.b=t},e.Shorthand.prototype={toCSS:function(e){return this.a.toCSS(e)+"/"+this.b.toCSS(e)},eval:function(){return this}}}(n("../tree")),function(e){e.Ruleset=function(e,t,n){this.selectors=e,this.rules=t,this._lookups={},this.strictImports=n},e.Ruleset.prototype={eval:function(t){var n=this.selectors&&this.selectors.map(function(e){return e.eval(t)}),r=new e.Ruleset(n,this.rules.slice(0),this.strictImports),i=[];r.root=this.root,r.allowImports=this.allowImports,this.debugInfo&&(r.debugInfo=this.debugInfo),t.frames.unshift(r);if(r.root||r.allowImports||!r.strictImports){for(var s=0;s<r.rules.length;s++)r.rules[s]instanceof e.Import?i=i.concat(r.rules[s].eval(t)):i.push(r.rules[s]);r.rules=i,i=[]}for(var s=0;s<r.rules.length;s++)r.rules[s]instanceof e.mixin.Definition&&(r.rules[s].frames=t.frames.slice(0));var o=t.mediaBlocks&&t.mediaBlocks.length||0;for(var s=0;s<r.rules.length;s++)r.rules[s]instanceof e.mixin.Call?i=i.concat(r.rules[s].eval(t)):i.push(r.rules[s]);r.rules=i;for(var s=0,u;s<r.rules.length;s++)u=r.rules[s],u instanceof e.mixin.Definition||(r.rules[s]=u.eval?u.eval(t):u);t.frames.shift();if(t.mediaBlocks)for(var s=o;s<t.mediaBlocks.length;s++)t.mediaBlocks[s].bubbleSelectors(n);return r},match:function(e){return!e||e.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(t,n){return n instanceof e.Rule&&n.variable===!0&&(t[n.name]=n),t},{})},variable:function(e){return this.variables()[e]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(t){return t instanceof e.Ruleset||t instanceof e.mixin.Definition})},find:function(t,n){n=n||this;var r=[],i,s,o=t.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach(function(i){if(i!==n)for(var o=0;o<i.selectors.length;o++)if(s=t.match(i.selectors[o])){t.elements.length>i.selectors[o].elements.length?Array.prototype.push.apply(r,i.find(new e.Selector(t.elements.slice(1)),n)):r.push(i);break}}),this._lookups[o]=r)},toCSS:function(t,n){var r=[],i=[],s=[],o=[],u=[],a,f,l;this.root||this.joinSelectors(u,t,this.selectors);for(var c=0;c<this.rules.length;c++)l=this.rules[c],l.rules||l instanceof e.Directive||l instanceof e.Media?o.push(l.toCSS(u,n)):l instanceof e.Comment?l.silent||(this.root?o.push(l.toCSS(n)):i.push(l.toCSS(n))):l.toCSS&&!l.variable?i.push(l.toCSS(n)):l.value&&!l.variable&&i.push(l.value.toString());o=o.join("");if(this.root)r.push(i.join(n.compress?"":"\n"));else if(i.length>0){f=e.debugInfo(n,this),a=u.map(function(e){return e.map(function(e){return e.toCSS(n)}).join("").trim()}).join(n.compress?",":",\n");for(var c=i.length-1;c>=0;c--)s.indexOf(i[c])===-1&&s.unshift(i[c]);i=s,r.push(f+a+(n.compress?"{":" {\n ")+i.join(n.compress?"":"\n ")+(n.compress?"}":"\n}\n"))}return r.push(o),r.join("")+(n.compress?"\n":"")},joinSelectors:function(e,t,n){for(var r=0;r<n.length;r++)this.joinSelector(e,t,n[r])},joinSelector:function(t,n,r){var i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;for(i=0;i<r.elements.length;i++)f=r.elements[i],f.value==="&"&&(u=!0);if(!u){if(n.length>0)for(i=0;i<n.length;i++)t.push(n[i].concat(r));else t.push([r]);return}g=[],a=[[]];for(i=0;i<r.elements.length;i++){f=r.elements[i];if(f.value!=="&")g.push(f);else{y=[],g.length>0&&this.mergeElementsOnToSelectors(g,a);for(s=0;s<a.length;s++){l=a[s];if(n.length==0)l.length>0&&(l[0].elements=l[0].elements.slice(0),l[0].elements.push(new e.Element(f.combinator,"",0))),y.push(l);else for(o=0;o<n.length;o++)c=n[o],h=[],p=[],v=!0,l.length>0?(h=l.slice(0),m=h.pop(),d=new e.Selector(m.elements.slice(0)),v=!1):d=new e.Selector([]),c.length>1&&(p=p.concat(c.slice(1))),c.length>0&&(v=!1,d.elements.push(new e.Element(f.combinator,c[0].elements[0].value,0)),d.elements=d.elements.concat(c[0].elements.slice(1))),v||h.push(d),h=h.concat(p),y.push(h)}a=y,g=[]}}g.length>0&&this.mergeElementsOnToSelectors(g,a);for(i=0;i<a.length;i++)t.push(a[i])},mergeElementsOnToSelectors:function(t,n){var r,i;if(n.length==0){n.push([new e.Selector(t)]);return}for(r=0;r<n.length;r++)i=n[r],i.length>0?i[i.length-1]=new e.Selector(i[i.length-1].elements.concat(t)):i.push(new e.Selector(t))}}}(n("../tree")),function(e){e.Selector=function(e){this.elements=e},e.Selector.prototype.match=function(e){var t=this.elements.length,n=e.elements.length,r=Math.min(t,n);if(t<n)return!1;for(var i=0;i<r;i++)if(this.elements[i].value!==e.elements[i].value)return!1;return!0},e.Selector.prototype.eval=function(t){return new e.Selector(this.elements.map(function(e){return e.eval(t)}))},e.Selector.prototype.toCSS=function(e){return this._css?this._css:(this.elements[0].combinator.value===""?this._css=" ":this._css="",this._css+=this.elements.map(function(t){return typeof t=="string"?" "+t.trim():t.toCSS(e)}).join(""),this._css)}}(n("../tree")),function(t){t.URL=function(e,t){this.value=e,this.paths=t},t.URL.prototype={toCSS:function(){return"url("+this.value.toCSS()+")"},eval:function(n){var r=this.value.eval(n);return typeof e!="undefined"&&typeof r.value=="string"&&!/^(?:[a-z-]+:|\/)/.test(r.value)&&this.paths.length>0&&(r.value=this.paths[0]+(r.value.charAt(0)==="/"?r.value.slice(1):r.value)),new t.URL(r,this.paths)}}}(n("../tree")),function(e){e.Value=function(e){this.value=e,this.is="value"},e.Value.prototype={eval:function(t){return this.value.length===1?this.value[0].eval(t):new e.Value(this.value.map(function(e){return e.eval(t)}))},toCSS:function(e){return this.value.map(function(t){return t.toCSS(e)}).join(e.compress?",":", ")}}}(n("../tree")),function(e){e.Variable=function(e,t,n){this.name=e,this.index=t,this.file=n},e.Variable.prototype={eval:function(t){var n,r,i=this.name;i.indexOf("@@")==0&&(i="@"+(new e.Variable(i.slice(1))).eval(t).value);if(n=e.find(t.frames,function(e){if(r=e.variable(i))return r.value.eval(t)}))return n;throw{type:"Name",message:"variable "+i+" is undefined",filename:this.file,index:this.index}}}}(n("../tree")),function(e){e.debugInfo=function(t,n){var r="";if(t.dumpLineNumbers&&!t.compress)switch(t.dumpLineNumbers){case"comments":r=e.debugInfo.asComment(n);break;case"mediaquery":r=e.debugInfo.asMediaQuery(n);break;case"all":r=e.debugInfo.asComment(n)+e.debugInfo.asMediaQuery(n)}return r},e.debugInfo.asComment=function(e){return"/* line "+e.debugInfo.lineNumber+", "+e.debugInfo.fileName+" */\n"},e.debugInfo.asMediaQuery=function(e){return'@media -sass-debug-info{filename{font-family:"'+e.debugInfo.fileName+'";}line{font-family:"'+e.debugInfo.lineNumber+'";}}\n'},e.find=function(e,t){for(var n=0,r;n<e.length;n++)if(r=t.call(e,e[n]))return r;return null},e.jsify=function(e){return Array.isArray(e.value)&&e.value.length>1?"["+e.value.map(function(e){return e.toCSS(!1)}).join(", ")+"]":e.toCSS(!1)}}(n("./tree"));var s=/^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol);r.env=r.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||s?"development":"production"),r.async=r.async||!1,r.fileAsync=r.fileAsync||!1,r.poll=r.poll||(s?1e3:1500),r.watch=function(){return this.watchMode=!0},r.unwatch=function(){return this.watchMode=!1};if(r.env==="development"){r.optimization=0,/!watch/.test(location.hash)&&r.watch();var o=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash);o&&(r.dumpLineNumbers=o[1]),r.watchTimer=setInterval(function(){r.watchMode&&p(function(e,t,n,r,i){t&&m(t.toCSS(),r,i.lastModified)})},r.poll)}else r.optimization=3;var u;try{u=typeof e.localStorage=="undefined"?null:e.localStorage}catch(a){u=null}var f=document.getElementsByTagName("link"),l=/^text\/(x-)?less$/;r.sheets=[];for(var c=0;c<f.length;c++)(f[c].rel==="stylesheet/less"||f[c].rel.match(/stylesheet/)&&f[c].type.match(l))&&r.sheets.push(f[c]);r.refresh=function(e){var t,n;t=n=new Date,p(function(e,r,i,s,o){o.local?w("loading "+s.href+" from cache."):(w("parsed "+s.href+" successfully."),m(r.toCSS(),s,o.lastModified)),w("css for "+s.href+" generated in "+(new Date-n)+"ms"),o.remaining===0&&w("css generated in "+(new Date-t)+"ms"),n=new Date},e),h()},r.refreshStyles=h,r.refresh(r.env==="development"),typeof define=="function"&&define.amd&&define("less",[],function(){return r})})(window); >-\ No newline at end of file >-diff --git a/dist/less-rhino-1.1.3.js b/dist/less-rhino-1.1.3.js >-deleted file mode 100644 >-index b31b25f14dc54c124da7f48086a516e3d3cf13cb..0000000000000000000000000000000000000000 >---- a/dist/less-rhino-1.1.3.js >-+++ /dev/null >-@@ -1,2460 +0,0 @@ >--// >--// Stub out `require` in rhino >--// >--function require(arg) { >-- return less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof(window) === 'undefined') { >-- if (typeof(exports) === 'undefined') { >-- // Rhino >-- less = {}; >-- tree = less.tree = {}; >-- } else { >-- // Node.js >-- less = exports, >-- tree = require('less/tree'); >-- } >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[A-Za-z-]+/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e) } >-- >-- if (c.value && c.value[0] === '&') { >-- return new(tree.Element)(c, null); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- if (match = /^([.#: \w-]+)[\s\n]*\{/.exec(chunks[j])) { >-- i += match[0].length - 1; >-- selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])]; >-- } else { >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page|@-[-a-z]+/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (typeof(window) !== 'undefined' /* browser */ || typeof(exports) === 'undefined' /* rhino */) { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { message: "error evaluating function `" + this.name + "`", >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else if (rgb.length == 8) { >-- this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0; >-- this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- } >--}; >-- >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value ? value.trim() : ""; >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('less/tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > 1) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors( paths, context, this.selectors ); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function( paths, context, selectors ) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function( paths, context, selector ) { >-- var before = [], after = [], beforeElements = [], afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value[0] === '&') { >-- hasParentSelector = true; >-- } >-- if(!hasParentSelector) { >-- beforeElements.push(el); >-- } else { >-- afterElements.push(el); >-- } >-- } >-- >-- if(!hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if(beforeElements.length > 0) { >-- before.push(new (tree.Selector)(beforeElements)); >-- } >-- if(afterElements.length > 0) { >-- after.push(new (tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- if (this.elements[0].value === other.elements[0].value) { >-- return true; >-- } else { >-- return false; >-- } >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/|file:\/|data:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('less/tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('less/tree')); >--require('less/tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('less/tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--var name; >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var sheetName = name.slice(0, name.lastIndexOf('/') + 1) + sheet.href; >-- var input = readFile(sheetName); >-- var parser = new less.Parser(); >-- parser.parse(input, function (e, root) { >-- if (e) { >-- print("Error: " + e); >-- quit(1); >-- } >-- callback(root, sheet, { local: false, lastModified: 0, remaining: remaining }); >-- }); >-- >-- // callback({}, sheet, { local: true, remaining: remaining }); >--} >-- >--function writeFile(filename, content) { >-- var fstream = new java.io.FileWriter(filename); >-- var out = new java.io.BufferedWriter(fstream); >-- out.write(content); >-- out.close(); >--} >-- >--// Command line integration via Rhino >--(function (args) { >-- name = args[0]; >-- var output = args[1]; >-- >-- if (!name) { >-- print('No files present in the fileset; Check your pattern match in build.xml'); >-- quit(1); >-- } >-- path = name.split("/");path.pop();path=path.join("/") >-- >-- var input = readFile(name); >-- >-- if (!input) { >-- print('lesscss: couldn\'t open file ' + name); >-- quit(1); >-- } >-- >-- var result; >-- var parser = new less.Parser(); >-- parser.parse(input, function (e, root) { >-- if (e) { >-- quit(1); >-- } else { >-- result = root.toCSS(); >-- if (output) { >-- writeFile(output, result); >-- print("Written to " + output); >-- } else { >-- print(result); >-- } >-- quit(0); >-- } >-- }); >-- print("done"); >--}(arguments)); >-diff --git a/dist/less-rhino-1.1.5.js b/dist/less-rhino-1.1.5.js >-deleted file mode 100644 >-index e755f6310290b9d7474346a8a2a7a7afbece78e6..0000000000000000000000000000000000000000 >---- a/dist/less-rhino-1.1.5.js >-+++ /dev/null >-@@ -1,2481 +0,0 @@ >--// >--// Stub out `require` in rhino >--// >--function require(arg) { >-- return less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- less = {}; >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'rhino'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- mime: env && env.mime, // MIME type of .less files >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- that.files[path] = root; // Store the root >-- >-- callback(root); >-- >-- if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, c, index, endIndex, k, mem; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- mem = i += length; >-- endIndex = i + chunks[j].length - length; >-- >-- while (i < endIndex) { >-- c = input.charCodeAt(i); >-- if (! (c === 32 || c === 10 || c === 9)) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- chunks = []; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /[^"'`\{\}\/\(\)]+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam, >-- inString; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = i; >-- >-- if (!inString && !inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- if (c === '{' && !inString && !inParam) { level ++; >-- chunk.push(c); >-- } else if (c === '}' && !inString && !inParam) { level --; >-- chunk.push(c); >-- chunks[++j] = chunk = []; >-- } else if (c === '(' && !inString && !inParam) { >-- chunk.push(c); >-- inParam = true; >-- } else if (c === ')' && !inString && inParam) { >-- chunk.push(c); >-- inParam = false; >-- } else { >-- if (c === '"' || c === "'" || c === '`') { >-- if (! inString) { >-- inString = c; >-- } else { >-- inString = inString === c ? false : inString; >-- } >-- } >-- chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- throw { >-- type: 'Syntax', >-- message: "Missing closing `}`", >-- filename: env.filename >-- }; >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = []; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false }); >-- } catch (e) { >-- lines = input.split('\n'); >-- line = getLine(e.index); >-- >-- for (var n = e.index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- throw { >-- type: e.type, >-- message: e.message, >-- filename: env.filename, >-- index: e.index, >-- line: typeof(line) === 'number' ? line + 1 : null, >-- callLine: e.call && (getLine(e.call) + 1), >-- callExtract: lines[getLine(e.call)], >-- stack: e.stack, >-- column: column, >-- extract: [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ] >-- }; >-- } >-- if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- >-- function getLine(index) { >-- return index ? (input.slice(0, index).match(/\n/g) || "").length : null; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- name: "ParseError", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function () { callback(error, root) }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { return new(tree.Keyword)(k) } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, args, index = i; >-- >-- if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; >-- >-- name = name[1].toLowerCase(); >-- >-- if (name === 'url') { return null } >-- else { i += name.length } >-- >-- if (name === 'alpha') { return $(this.alpha) } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || ""; >-- if (! $(')')) throw new(Error)("missing closing ) for url()"); >-- >-- return new(tree.URL)((value.value || value.data || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- dataURI: function () { >-- var obj; >-- >-- if ($(/^data:/)) { >-- obj = {}; >-- obj.mime = $(/^[^\/]+\/[^,;)]+/) || ''; >-- obj.charset = $(/^;\s*charset=[^,;)]+/) || ''; >-- obj.base64 = $(/^;\s*base64/) || ''; >-- obj.data = $(/^,\s*[^)]+/); >-- >-- if (obj.data) { return obj } >-- } >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args, index = i, s = input.charAt(i); >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- $('(') && (args = $(this.entities.arguments)) && $(')'); >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index); >-- } >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value; >-- >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- while (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- params.push({ name: param.name, value: value }); >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- if (! $(')')) throw new(Error)("missing closing ) for alpha()"); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c; >-- >-- c = $(this.combinator); >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || >-- $('*') || $(this.attribute) || $(/^\([^)@]+\)/); >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- >-- if (c.value && c.value.charAt(0) === '&') { >-- return new(tree.Element)(c, null, i); >-- } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(c); >-- } else if (c === '&') { >-- match = '&'; >-- i++; >-- if(input.charAt(i) === ' ') { >-- match = '& '; >-- } >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)(match); >-- } else if (c === ':' && input.charAt(i + 1) === ':') { >-- i += 2; >-- while (input.charAt(i) === ' ') { i++ } >-- return new(tree.Combinator)('::'); >-- } else if (input.charAt(i - 1) === ' ') { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match; >-- save(); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- return new(tree.Ruleset)(selectors, rules); >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path; >-- if ($(/^@import\s+/) && >-- (path = $(this.entities.quoted) || $(this.entities.url)) && >-- $(';')) { >-- return new(tree.Import)(path, imports); >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, types; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import'])) { >-- return value; >-- } else if (name = $(/^@media|@page/) || $(/^@(?:-webkit-|-moz-)?keyframes/)) { >-- types = ($(/^[^{]+/) || '').trim(); >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name + " " + types, rules); >-- } >-- } else if (name = $(/^@[-a-z]+/)) { >-- if (name === '@font-face') { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while ((op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (path.charAt(0) !== '/' && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- loadStyleSheet({ href: path, title: path, type: env.mime }, callback, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math.round(number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math.round(n); >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "math functions take numbers as parameters" >-- }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { message: "error evaluating function `" + this.name + "`", >-- index: this.index }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- env.frames.unshift(this); >-- this.ruleset = this.ruleset && this.ruleset.eval(env); >-- env.frames.shift(); >-- return this; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- this.value = value ? value.trim() : ""; >-- this.index = index; >--}; >--tree.Element.prototype.toCSS = function (env) { >-- return this.combinator.toCSS(env || {}) + this.value; >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else if (value === '& ') { >-- this.value = '& '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- '&' : '', >-- '& ' : ' ', >-- ':' : ' :', >-- '::': '::', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports) { >-- var that = this; >-- >-- this._path = path; >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (root) { >-- if (! root) { >-- throw new(Error)("Error parsing " + that.path); >-- } >-- that.root = root; >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function () { >-- if (this.css) { >-- return "@import " + this._path.toCSS() + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)(null, this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { return a.eval(env) }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: e.index, stack: e.stack, call: this.index }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index }; >-- } >-- } >-- } >-- throw { message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- eval: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), context, _arguments = []; >-- >-- for (var i = 0, val; i < this.params.length; i++) { >-- if (this.params[i].name) { >-- if (val = (args && args[i]) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env))); >-- } else { >-- throw { message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push(args[i] || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- return new(tree.Ruleset)(null, this.rules.slice(0)).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len; >-- >-- if (argsLength < this.required) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return v.value || v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + ";"; >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, this.value.eval(context), this.important, this.index); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var ruleset = new(tree.Ruleset)(this.selectors, this.rules.slice(0)); >-- >-- ruleset.root = this.root; >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- Array.prototype.splice >-- .apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- rule; >-- >-- if (! this.root) { >-- if (context.length === 0) { >-- paths = this.selectors.map(function (s) { return [s] }); >-- } else { >-- this.joinSelectors( paths, context, this.selectors ); >-- } >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : (paths.length > 3 ? ',\n' : ', ')); >-- css.push(selector, >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- var before = [], after = [], beforeElements = [], >-- afterElements = [], hasParentSelector = false, el; >-- >-- for (var i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.combinator.value.charAt(0) === '&') { >-- hasParentSelector = true; >-- } >-- if (hasParentSelector) afterElements.push(el); >-- else beforeElements.push(el); >-- } >-- >-- if (! hasParentSelector) { >-- afterElements = beforeElements; >-- beforeElements = []; >-- } >-- >-- if (beforeElements.length > 0) { >-- before.push(new(tree.Selector)(beforeElements)); >-- } >-- >-- if (afterElements.length > 0) { >-- after.push(new(tree.Selector)(afterElements)); >-- } >-- >-- for (var c = 0; c < context.length; c++) { >-- paths.push(before.concat(context[c]).concat(after)); >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >-- if (this.elements[0].combinator.value === "") { >-- this.elements[0].combinator.value = ' '; >-- } >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- return this._css = this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- if (val.data) { >-- this.attrs = val; >-- } else { >-- // Add the base path if the URL is relative and we are in the browser >-- if (!/^(?:https?:\/\/|file:\/\/|data:)?/.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') { >-- val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- this.value = val; >-- this.paths = paths; >-- } >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + (this.attrs ? 'data:' + this.attrs.mime + this.attrs.charset + this.attrs.base64 + this.attrs.data >-- : this.value.toCSS()) + ")"; >-- }, >-- eval: function (ctx) { >-- return this.attrs ? this : new(tree.URL)(this.value.eval(ctx), this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index) { this.name = name, this.index = index }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { message: "variable " + name + " is undefined", >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--require('./tree').find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--require('./tree').jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >--var name; >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var sheetName = name.slice(0, name.lastIndexOf('/') + 1) + sheet.href; >-- var input = readFile(sheetName); >-- var parser = new less.Parser(); >-- parser.parse(input, function (e, root) { >-- if (e) { >-- print("Error: " + e); >-- quit(1); >-- } >-- callback(root, sheet, { local: false, lastModified: 0, remaining: remaining }); >-- }); >-- >-- // callback({}, sheet, { local: true, remaining: remaining }); >--} >-- >--function writeFile(filename, content) { >-- var fstream = new java.io.FileWriter(filename); >-- var out = new java.io.BufferedWriter(fstream); >-- out.write(content); >-- out.close(); >--} >-- >--// Command line integration via Rhino >--(function (args) { >-- name = args[0]; >-- var output = args[1]; >-- >-- if (!name) { >-- print('No files present in the fileset; Check your pattern match in build.xml'); >-- quit(1); >-- } >-- path = name.split("/");path.pop();path=path.join("/") >-- >-- var input = readFile(name); >-- >-- if (!input) { >-- print('lesscss: couldn\'t open file ' + name); >-- quit(1); >-- } >-- >-- var result; >-- var parser = new less.Parser(); >-- parser.parse(input, function (e, root) { >-- if (e) { >-- quit(1); >-- } else { >-- result = root.toCSS(); >-- if (output) { >-- writeFile(output, result); >-- print("Written to " + output); >-- } else { >-- print(result); >-- } >-- quit(0); >-- } >-- }); >-- print("done"); >--}(arguments)); >-diff --git a/dist/less-rhino-1.3.1.js b/dist/less-rhino-1.3.1.js >-deleted file mode 100644 >-index 1ebe0ea4b6822a1e6a6a8660088fb8afb0b662b1..0000000000000000000000000000000000000000 >---- a/dist/less-rhino-1.3.1.js >-+++ /dev/null >-@@ -1,3725 +0,0 @@ >--// >--// Stub out `require` in rhino >--// >--function require(arg) { >-- return less[arg.split('/')[1]]; >--}; >-- >-- >--// ecma-5.js >--// >--// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License >--// -- tlrobinson Tom Robinson >--// dantman Daniel Friesen >-- >--// >--// Array >--// >--if (!Array.isArray) { >-- Array.isArray = function(obj) { >-- return Object.prototype.toString.call(obj) === "[object Array]" || >-- (obj instanceof Array); >-- }; >--} >--if (!Array.prototype.forEach) { >-- Array.prototype.forEach = function(block, thisObject) { >-- var len = this.length >>> 0; >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- block.call(thisObject, this[i], i, this); >-- } >-- } >-- }; >--} >--if (!Array.prototype.map) { >-- Array.prototype.map = function(fun /*, thisp*/) { >-- var len = this.length >>> 0; >-- var res = new Array(len); >-- var thisp = arguments[1]; >-- >-- for (var i = 0; i < len; i++) { >-- if (i in this) { >-- res[i] = fun.call(thisp, this[i], i, this); >-- } >-- } >-- return res; >-- }; >--} >--if (!Array.prototype.filter) { >-- Array.prototype.filter = function (block /*, thisp */) { >-- var values = []; >-- var thisp = arguments[1]; >-- for (var i = 0; i < this.length; i++) { >-- if (block.call(thisp, this[i])) { >-- values.push(this[i]); >-- } >-- } >-- return values; >-- }; >--} >--if (!Array.prototype.reduce) { >-- Array.prototype.reduce = function(fun /*, initial*/) { >-- var len = this.length >>> 0; >-- var i = 0; >-- >-- // no value to return if no initial value and an empty array >-- if (len === 0 && arguments.length === 1) throw new TypeError(); >-- >-- if (arguments.length >= 2) { >-- var rv = arguments[1]; >-- } else { >-- do { >-- if (i in this) { >-- rv = this[i++]; >-- break; >-- } >-- // if array contains no values, no initial value to return >-- if (++i >= len) throw new TypeError(); >-- } while (true); >-- } >-- for (; i < len; i++) { >-- if (i in this) { >-- rv = fun.call(null, rv, this[i], i, this); >-- } >-- } >-- return rv; >-- }; >--} >--if (!Array.prototype.indexOf) { >-- Array.prototype.indexOf = function (value /*, fromIndex */ ) { >-- var length = this.length; >-- var i = arguments[1] || 0; >-- >-- if (!length) return -1; >-- if (i >= length) return -1; >-- if (i < 0) i += length; >-- >-- for (; i < length; i++) { >-- if (!Object.prototype.hasOwnProperty.call(this, i)) { continue } >-- if (value === this[i]) return i; >-- } >-- return -1; >-- }; >--} >-- >--// >--// Object >--// >--if (!Object.keys) { >-- Object.keys = function (object) { >-- var keys = []; >-- for (var name in object) { >-- if (Object.prototype.hasOwnProperty.call(object, name)) { >-- keys.push(name); >-- } >-- } >-- return keys; >-- }; >--} >-- >--// >--// String >--// >--if (!String.prototype.trim) { >-- String.prototype.trim = function () { >-- return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); >-- }; >--} >--var less, tree; >-- >--if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") { >-- // Rhino >-- // Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88 >-- if (typeof(window) === 'undefined') { less = {} } >-- else { less = window.less = {} } >-- tree = less.tree = {}; >-- less.mode = 'rhino'; >--} else if (typeof(window) === 'undefined') { >-- // Node.js >-- less = exports, >-- tree = require('./tree'); >-- less.mode = 'node'; >--} else { >-- // Browser >-- if (typeof(window.less) === 'undefined') { window.less = {} } >-- less = window.less, >-- tree = window.less.tree = {}; >-- less.mode = 'browser'; >--} >--// >--// less.js - parser >--// >--// A relatively straight-forward predictive parser. >--// There is no tokenization/lexing stage, the input is parsed >--// in one sweep. >--// >--// To make the parser fast enough to run in the browser, several >--// optimization had to be made: >--// >--// - Matching and slicing on a huge input is often cause of slowdowns. >--// The solution is to chunkify the input into smaller strings. >--// The chunks are stored in the `chunks` var, >--// `j` holds the current chunk index, and `current` holds >--// the index of the current chunk in relation to `input`. >--// This gives us an almost 4x speed-up. >--// >--// - In many cases, we don't need to match individual tokens; >--// for example, if a value doesn't hold any variables, operations >--// or dynamic references, the parser can effectively 'skip' it, >--// treating it as a literal. >--// An example would be '1px solid #000' - which evaluates to itself, >--// we don't need to know what the individual components are. >--// The drawback, of course is that you don't get the benefits of >--// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, >--// and a smaller speed-up in the code-gen. >--// >--// >--// Token matching is done with the `$` function, which either takes >--// a terminal string or regexp, or a non-terminal function to call. >--// It also takes care of moving all the indices forwards. >--// >--// >--less.Parser = function Parser(env) { >-- var input, // LeSS input string >-- i, // current index in `input` >-- j, // current chunk >-- temp, // temporarily holds a chunk's state, for backtracking >-- memo, // temporarily holds `i`, when backtracking >-- furthest, // furthest index the parser has gone to >-- chunks, // chunkified input >-- current, // index of current chunk, in `input` >-- parser; >-- >-- var that = this; >-- >-- // Top parser on an import tree must be sure there is one "env" >-- // which will then be passed arround by reference. >-- var env = env || { }; >-- if (!env.contents) { env.contents={}; } // env.contents must be passed arround with top env >-- >-- // This function is called after all files >-- // have been imported through `@import`. >-- var finish = function () {}; >-- >-- var imports = this.imports = { >-- paths: env && env.paths || [], // Search paths, when importing >-- queue: [], // Files which haven't been imported yet >-- files: {}, // Holds the imported parse trees >-- contents: env.contents, // Holds the imported file contents >-- mime: env && env.mime, // MIME type of .less files >-- error: null, // Error in parsing/evaluating an import >-- push: function (path, callback) { >-- var that = this; >-- this.queue.push(path); >-- >-- // >-- // Import a file asynchronously >-- // >-- less.Parser.importer(path, this.paths, function (e, root) { >-- that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue >-- >-- var imported = path in that.files; >-- >-- that.files[path] = root; // Store the root >-- >-- if (e && !that.error) { that.error = e } >-- >-- callback(e, root, imported); >-- >-- if (that.queue.length === 0) { finish(e) } // Call `finish` if we're done importing >-- }, env); >-- } >-- }; >-- >-- function save() { temp = chunks[j], memo = i, current = i } >-- function restore() { chunks[j] = temp, i = memo, current = i } >-- >-- function sync() { >-- if (i > current) { >-- chunks[j] = chunks[j].slice(i - current); >-- current = i; >-- } >-- } >-- function isWhitespace(c) { >-- // Could change to \s? >-- var code = c.charCodeAt(0); >-- return code === 32 || code === 10 || code === 9; >-- } >-- // >-- // Parse from a token, regexp or string, and move forward if match >-- // >-- function $(tok) { >-- var match, args, length, index, k; >-- >-- // >-- // Non-terminal >-- // >-- if (tok instanceof Function) { >-- return tok.call(parser.parsers); >-- // >-- // Terminal >-- // >-- // Either match a single character in the input, >-- // or match a regexp in the current chunk (chunk[j]). >-- // >-- } else if (typeof(tok) === 'string') { >-- match = input.charAt(i) === tok ? tok : null; >-- length = 1; >-- sync (); >-- } else { >-- sync (); >-- >-- if (match = tok.exec(chunks[j])) { >-- length = match[0].length; >-- } else { >-- return null; >-- } >-- } >-- >-- // The match is confirmed, add the match length to `i`, >-- // and consume any extra white-space characters (' ' || '\n') >-- // which come after that. The reason for this is that LeSS's >-- // grammar is mostly white-space insensitive. >-- // >-- if (match) { >-- skipWhitespace(length); >-- >-- if(typeof(match) === 'string') { >-- return match; >-- } else { >-- return match.length === 1 ? match[0] : match; >-- } >-- } >-- } >-- >-- function skipWhitespace(length) { >-- var oldi = i, oldj = j, >-- endIndex = i + chunks[j].length, >-- mem = i += length; >-- >-- while (i < endIndex) { >-- if (! isWhitespace(input.charAt(i))) { break } >-- i++; >-- } >-- chunks[j] = chunks[j].slice(length + (i - mem)); >-- current = i; >-- >-- if (chunks[j].length === 0 && j < chunks.length - 1) { j++ } >-- >-- return oldi !== i || oldj !== j; >-- } >-- >-- function expect(arg, msg) { >-- var result = $(arg); >-- if (! result) { >-- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" >-- : "unexpected token")); >-- } else { >-- return result; >-- } >-- } >-- >-- function error(msg, type) { >-- throw { index: i, type: type || 'Syntax', message: msg }; >-- } >-- >-- // Same as $(), but don't change the state of the parser, >-- // just return the match. >-- function peek(tok) { >-- if (typeof(tok) === 'string') { >-- return input.charAt(i) === tok; >-- } else { >-- if (tok.test(chunks[j])) { >-- return true; >-- } else { >-- return false; >-- } >-- } >-- } >-- >-- function getInput(e, env) { >-- if (e.filename && env.filename && (e.filename !== env.filename)) { >-- return parser.imports.contents[e.filename]; >-- } else { >-- return input; >-- } >-- } >-- >-- function getLocation(index, input) { >-- for (var n = index, column = -1; >-- n >= 0 && input.charAt(n) !== '\n'; >-- n--) { column++ } >-- >-- return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null, >-- column: column }; >-- } >-- >-- function getFileName(e) { >-- if(less.mode === 'browser' || less.mode === 'rhino') >-- return e.filename; >-- else >-- return require('path').resolve(e.filename); >-- } >-- >-- function getDebugInfo(index, inputStream, e) { >-- return { >-- lineNumber: getLocation(index, inputStream).line + 1, >-- fileName: getFileName(e) >-- }; >-- } >-- >-- function LessError(e, env) { >-- var input = getInput(e, env), >-- loc = getLocation(e.index, input), >-- line = loc.line, >-- col = loc.column, >-- lines = input.split('\n'); >-- >-- this.type = e.type || 'Syntax'; >-- this.message = e.message; >-- this.filename = e.filename || env.filename; >-- this.index = e.index; >-- this.line = typeof(line) === 'number' ? line + 1 : null; >-- this.callLine = e.call && (getLocation(e.call, input).line + 1); >-- this.callExtract = lines[getLocation(e.call, input).line]; >-- this.stack = e.stack; >-- this.column = col; >-- this.extract = [ >-- lines[line - 1], >-- lines[line], >-- lines[line + 1] >-- ]; >-- } >-- >-- this.env = env = env || {}; >-- >-- // The optimization level dictates the thoroughness of the parser, >-- // the lower the number, the less nodes it will create in the tree. >-- // This could matter for debugging, or if you want to access >-- // the individual nodes in the tree. >-- this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; >-- >-- this.env.filename = this.env.filename || null; >-- >-- // >-- // The Parser >-- // >-- return parser = { >-- >-- imports: imports, >-- // >-- // Parse an input string into an abstract syntax tree, >-- // call `callback` when done. >-- // >-- parse: function (str, callback) { >-- var root, start, end, zone, line, lines, buff = [], c, error = null; >-- >-- i = j = current = furthest = 0; >-- input = str.replace(/\r\n/g, '\n'); >-- >-- // Remove potential UTF Byte Order Mark >-- input = input.replace(/^\uFEFF/, ''); >-- >-- // Split the input into chunks. >-- chunks = (function (chunks) { >-- var j = 0, >-- skip = /(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g, >-- comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, >-- string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g, >-- level = 0, >-- match, >-- chunk = chunks[0], >-- inParam; >-- >-- for (var i = 0, c, cc; i < input.length; i++) { >-- skip.lastIndex = i; >-- if (match = skip.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- } >-- } >-- c = input.charAt(i); >-- comment.lastIndex = string.lastIndex = i; >-- >-- if (match = string.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- >-- if (!inParam && c === '/') { >-- cc = input.charAt(i + 1); >-- if (cc === '/' || cc === '*') { >-- if (match = comment.exec(input)) { >-- if (match.index === i) { >-- i += match[0].length; >-- chunk.push(match[0]); >-- c = input.charAt(i); >-- } >-- } >-- } >-- } >-- >-- switch (c) { >-- case '{': if (! inParam) { level ++; chunk.push(c); break } >-- case '}': if (! inParam) { level --; chunk.push(c); chunks[++j] = chunk = []; break } >-- case '(': if (! inParam) { inParam = true; chunk.push(c); break } >-- case ')': if ( inParam) { inParam = false; chunk.push(c); break } >-- default: chunk.push(c); >-- } >-- } >-- if (level > 0) { >-- error = new(LessError)({ >-- index: i, >-- type: 'Parse', >-- message: "missing closing `}`", >-- filename: env.filename >-- }, env); >-- } >-- >-- return chunks.map(function (c) { return c.join('') });; >-- })([[]]); >-- >-- if (error) { >-- return callback(error); >-- } >-- >-- // Start with the primary rule. >-- // The whole syntax tree is held under a Ruleset node, >-- // with the `root` property set to true, so no `{}` are >-- // output. The callback is called when the input is parsed. >-- try { >-- root = new(tree.Ruleset)([], $(this.parsers.primary)); >-- root.root = true; >-- } catch (e) { >-- return callback(new(LessError)(e, env)); >-- } >-- >-- root.toCSS = (function (evaluate) { >-- var line, lines, column; >-- >-- return function (options, variables) { >-- var frames = [], importError; >-- >-- options = options || {}; >-- // >-- // Allows setting variables with a hash, so: >-- // >-- // `{ color: new(tree.Color)('#f01') }` will become: >-- // >-- // new(tree.Rule)('@color', >-- // new(tree.Value)([ >-- // new(tree.Expression)([ >-- // new(tree.Color)('#f01') >-- // ]) >-- // ]) >-- // ) >-- // >-- if (typeof(variables) === 'object' && !Array.isArray(variables)) { >-- variables = Object.keys(variables).map(function (k) { >-- var value = variables[k]; >-- >-- if (! (value instanceof tree.Value)) { >-- if (! (value instanceof tree.Expression)) { >-- value = new(tree.Expression)([value]); >-- } >-- value = new(tree.Value)([value]); >-- } >-- return new(tree.Rule)('@' + k, value, false, 0); >-- }); >-- frames = [new(tree.Ruleset)(null, variables)]; >-- } >-- >-- try { >-- var css = evaluate.call(this, { frames: frames }) >-- .toCSS([], { compress: options.compress || false, dumpLineNumbers: env.dumpLineNumbers }); >-- } catch (e) { >-- throw new(LessError)(e, env); >-- } >-- >-- if ((importError = parser.imports.error)) { // Check if there was an error during importing >-- if (importError instanceof LessError) throw importError; >-- else throw new(LessError)(importError, env); >-- } >-- >-- if (options.yuicompress && less.mode === 'node') { >-- return require('./cssmin').compressor.cssmin(css); >-- } else if (options.compress) { >-- return css.replace(/(\s)+/g, "$1"); >-- } else { >-- return css; >-- } >-- }; >-- })(root.eval); >-- >-- // If `i` is smaller than the `input.length - 1`, >-- // it means the parser wasn't able to parse the whole >-- // string, so we've got a parsing error. >-- // >-- // We try to extract a \n delimited string, >-- // showing the line where the parse error occured. >-- // We split it up into two parts (the part which parsed, >-- // and the part which didn't), so we can color them differently. >-- if (i < input.length - 1) { >-- i = furthest; >-- lines = input.split('\n'); >-- line = (input.slice(0, i).match(/\n/g) || "").length + 1; >-- >-- for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ } >-- >-- error = { >-- type: "Parse", >-- message: "Syntax Error on line " + line, >-- index: i, >-- filename: env.filename, >-- line: line, >-- column: column, >-- extract: [ >-- lines[line - 2], >-- lines[line - 1], >-- lines[line] >-- ] >-- }; >-- } >-- >-- if (this.imports.queue.length > 0) { >-- finish = function (e) { >-- if (e) callback(e); >-- else callback(null, root); >-- }; >-- } else { >-- callback(error, root); >-- } >-- }, >-- >-- // >-- // Here in, the parsing rules/functions >-- // >-- // The basic structure of the syntax tree generated is as follows: >-- // >-- // Ruleset -> Rule -> Value -> Expression -> Entity >-- // >-- // Here's some LESS code: >-- // >-- // .class { >-- // color: #fff; >-- // border: 1px solid #000; >-- // width: @w + 4px; >-- // > .child {...} >-- // } >-- // >-- // And here's what the parse tree might look like: >-- // >-- // Ruleset (Selector '.class', [ >-- // Rule ("color", Value ([Expression [Color #fff]])) >-- // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) >-- // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) >-- // Ruleset (Selector [Element '>', '.child'], [...]) >-- // ]) >-- // >-- // In general, most rules will try to parse a token with the `$()` function, and if the return >-- // value is truly, will return a new node, of the relevant type. Sometimes, we need to check >-- // first, before parsing, that's when we use `peek()`. >-- // >-- parsers: { >-- // >-- // The `primary` rule is the *entry* and *exit* point of the parser. >-- // The rules here can appear at any level of the parse tree. >-- // >-- // The recursive nature of the grammar is an interplay between the `block` >-- // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, >-- // as represented by this simplified grammar: >-- // >-- // primary → (ruleset | rule)+ >-- // ruleset → selector+ block >-- // block → '{' primary '}' >-- // >-- // Only at one point is the primary rule not called from the >-- // block rule: at the root level. >-- // >-- primary: function () { >-- var node, root = []; >-- >-- while ((node = $(this.mixin.definition) || $(this.rule) || $(this.ruleset) || >-- $(this.mixin.call) || $(this.comment) || $(this.directive)) >-- || $(/^[\s\n]+/)) { >-- node && root.push(node); >-- } >-- return root; >-- }, >-- >-- // We create a Comment node for CSS comments `/* */`, >-- // but keep the LeSS comments `//` silent, by just skipping >-- // over them. >-- comment: function () { >-- var comment; >-- >-- if (input.charAt(i) !== '/') return; >-- >-- if (input.charAt(i + 1) === '/') { >-- return new(tree.Comment)($(/^\/\/.*/), true); >-- } else if (comment = $(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { >-- return new(tree.Comment)(comment); >-- } >-- }, >-- >-- // >-- // Entities are tokens which can be found inside an Expression >-- // >-- entities: { >-- // >-- // A string, which supports escaping " and ' >-- // >-- // "milky way" 'he\'s the one!' >-- // >-- quoted: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '"' && input.charAt(j) !== "'") return; >-- >-- e && $('~'); >-- >-- if (str = $(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/)) { >-- return new(tree.Quoted)(str[0], str[1] || str[2], e); >-- } >-- }, >-- >-- // >-- // A catch-all word, such as: >-- // >-- // black border-collapse >-- // >-- keyword: function () { >-- var k; >-- >-- if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { >-- if (tree.colors.hasOwnProperty(k)) { >-- // detect named color >-- return new(tree.Color)(tree.colors[k].slice(1)); >-- } else { >-- return new(tree.Keyword)(k); >-- } >-- } >-- }, >-- >-- // >-- // A function call >-- // >-- // rgb(255, 0, 255) >-- // >-- // We also try to catch IE's `alpha()`, but let the `alpha` parser >-- // deal with the details. >-- // >-- // The arguments are parsed with the `entities.arguments` parser. >-- // >-- call: function () { >-- var name, nameLC, args, alpha_ret, index = i; >-- >-- if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; >-- >-- name = name[1]; >-- nameLC = name.toLowerCase(); >-- >-- if (nameLC === 'url') { return null } >-- else { i += name.length } >-- >-- if (nameLC === 'alpha') { >-- alpha_ret = $(this.alpha); >-- if(typeof alpha_ret !== 'undefined') { >-- return alpha_ret; >-- } >-- } >-- >-- $('('); // Parse the '(' and consume whitespace. >-- >-- args = $(this.entities.arguments); >-- >-- if (! $(')')) return; >-- >-- if (name) { return new(tree.Call)(name, args, index, env.filename) } >-- }, >-- arguments: function () { >-- var args = [], arg; >-- >-- while (arg = $(this.entities.assignment) || $(this.expression)) { >-- args.push(arg); >-- if (! $(',')) { break } >-- } >-- return args; >-- }, >-- literal: function () { >-- return $(this.entities.ratio) || >-- $(this.entities.dimension) || >-- $(this.entities.color) || >-- $(this.entities.quoted); >-- }, >-- >-- // Assignments are argument entities for calls. >-- // They are present in ie filter properties as shown below. >-- // >-- // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) >-- // >-- >-- assignment: function () { >-- var key, value; >-- if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { >-- return new(tree.Assignment)(key, value); >-- } >-- }, >-- >-- // >-- // Parse url() tokens >-- // >-- // We use a specific rule for urls, because they don't really behave like >-- // standard function calls. The difference is that the argument doesn't have >-- // to be enclosed within a string, so it can't be parsed as an Expression. >-- // >-- url: function () { >-- var value; >-- >-- if (input.charAt(i) !== 'u' || !$(/^url\(/)) return; >-- value = $(this.entities.quoted) || $(this.entities.variable) || >-- $(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ""; >-- >-- expect(')'); >-- >-- return new(tree.URL)((value.value != null || value instanceof tree.Variable) >-- ? value : new(tree.Anonymous)(value), imports.paths); >-- }, >-- >-- // >-- // A Variable entity, such as `@fink`, in >-- // >-- // width: @fink + 2px >-- // >-- // We use a different parser for variable definitions, >-- // see `parsers.variable`. >-- // >-- variable: function () { >-- var name, index = i; >-- >-- if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) { >-- return new(tree.Variable)(name, index, env.filename); >-- } >-- }, >-- >-- // A variable entity useing the protective {} e.g. @{var} >-- variableCurly: function () { >-- var name, curly, index = i; >-- >-- if (input.charAt(i) === '@' && (curly = $(/^@\{([\w-]+)\}/))) { >-- return new(tree.Variable)("@" + curly[1], index, env.filename); >-- } >-- }, >-- >-- // >-- // A Hexadecimal color >-- // >-- // #4F3C2F >-- // >-- // `rgb` and `hsl` colors are parsed through the `entities.call` parser. >-- // >-- color: function () { >-- var rgb; >-- >-- if (input.charAt(i) === '#' && (rgb = $(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { >-- return new(tree.Color)(rgb[1]); >-- } >-- }, >-- >-- // >-- // A Dimension, that is, a number and a unit >-- // >-- // 0.5em 95% >-- // >-- dimension: function () { >-- var value, c = input.charCodeAt(i); >-- if ((c > 57 || c < 45) || c === 47) return; >-- >-- if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|dpi|dpcm|dppx|rem|vw|vh|vmin|vm|ch)?/)) { >-- return new(tree.Dimension)(value[1], value[2]); >-- } >-- }, >-- >-- // >-- // A Ratio >-- // >-- // 16/9 >-- // >-- ratio: function () { >-- var value, c = input.charCodeAt(i); >-- if (c > 57 || c < 48) return; >-- >-- if (value = $(/^(\d+\/\d+)/)) { >-- return new(tree.Ratio)(value[1]); >-- } >-- }, >-- >-- // >-- // JavaScript code to be evaluated >-- // >-- // `window.location.href` >-- // >-- javascript: function () { >-- var str, j = i, e; >-- >-- if (input.charAt(j) === '~') { j++, e = true } // Escaped strings >-- if (input.charAt(j) !== '`') { return } >-- >-- e && $('~'); >-- >-- if (str = $(/^`([^`]*)`/)) { >-- return new(tree.JavaScript)(str[1], i, e); >-- } >-- } >-- }, >-- >-- // >-- // The variable part of a variable definition. Used in the `rule` parser >-- // >-- // @fink: >-- // >-- variable: function () { >-- var name; >-- >-- if (input.charAt(i) === '@' && (name = $(/^(@[\w-]+)\s*:/))) { return name[1] } >-- }, >-- >-- // >-- // A font size/line-height shorthand >-- // >-- // small/12px >-- // >-- // We need to peek first, or we'll match on keywords and dimensions >-- // >-- shorthand: function () { >-- var a, b; >-- >-- if (! peek(/^[@\w.%-]+\/[@\w.-]+/)) return; >-- >-- save(); >-- >-- if ((a = $(this.entity)) && $('/') && (b = $(this.entity))) { >-- return new(tree.Shorthand)(a, b); >-- } >-- >-- restore(); >-- }, >-- >-- // >-- // Mixins >-- // >-- mixin: { >-- // >-- // A Mixin call, with an optional argument list >-- // >-- // #mixins > .square(#fff); >-- // .rounded(4px, black); >-- // .button; >-- // >-- // The `while` loop is there because mixins can be >-- // namespaced, but we only support the child and descendant >-- // selector for now. >-- // >-- call: function () { >-- var elements = [], e, c, args = [], arg, index = i, s = input.charAt(i), name, value, important = false; >-- >-- if (s !== '.' && s !== '#') { return } >-- >-- save(); // stop us absorbing part of an invalid selector >-- >-- while (e = $(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)) { >-- elements.push(new(tree.Element)(c, e, i)); >-- c = $('>'); >-- } >-- if ($('(')) { >-- while (arg = $(this.expression)) { >-- value = arg; >-- name = null; >-- >-- // Variable >-- if (arg.value.length == 1) { >-- var val = arg.value[0]; >-- if (val instanceof tree.Variable) { >-- if ($(':')) { >-- if (value = $(this.expression)) { >-- name = val.name; >-- } else { >-- throw new(Error)("Expected value"); >-- } >-- } >-- } >-- } >-- >-- args.push({ name: name, value: value }); >-- >-- if (! $(',')) { break } >-- } >-- if (! $(')')) throw new(Error)("Expected )"); >-- } >-- >-- if ($(this.important)) { >-- important = true; >-- } >-- >-- if (elements.length > 0 && ($(';') || peek('}'))) { >-- return new(tree.mixin.Call)(elements, args, index, env.filename, important); >-- } >-- >-- restore(); >-- }, >-- >-- // >-- // A Mixin definition, with a list of parameters >-- // >-- // .rounded (@radius: 2px, @color) { >-- // ... >-- // } >-- // >-- // Until we have a finer grained state-machine, we have to >-- // do a look-ahead, to make sure we don't have a mixin call. >-- // See the `rule` function for more information. >-- // >-- // We start by matching `.rounded (`, and then proceed on to >-- // the argument list, which has optional default values. >-- // We store the parameters in `params`, with a `value` key, >-- // if there is a value, such as in the case of `@radius`. >-- // >-- // Once we've got our params list, and a closing `)`, we parse >-- // the `{...}` block. >-- // >-- definition: function () { >-- var name, params = [], match, ruleset, param, value, cond, variadic = false; >-- if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || >-- peek(/^[^{]*(;|})/)) return; >-- >-- save(); >-- >-- if (match = $(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)) { >-- name = match[1]; >-- >-- do { >-- if (input.charAt(i) === '.' && $(/^\.{3}/)) { >-- variadic = true; >-- break; >-- } else if (param = $(this.entities.variable) || $(this.entities.literal) >-- || $(this.entities.keyword)) { >-- // Variable >-- if (param instanceof tree.Variable) { >-- if ($(':')) { >-- value = expect(this.expression, 'expected expression'); >-- params.push({ name: param.name, value: value }); >-- } else if ($(/^\.{3}/)) { >-- params.push({ name: param.name, variadic: true }); >-- variadic = true; >-- break; >-- } else { >-- params.push({ name: param.name }); >-- } >-- } else { >-- params.push({ value: param }); >-- } >-- } else { >-- break; >-- } >-- } while ($(',')) >-- >-- // .mixincall("@{a}"); >-- // looks a bit like a mixin definition.. so we have to be nice and restore >-- if (!$(')')) { >-- furthest = i; >-- restore(); >-- } >-- >-- if ($(/^when/)) { // Guard >-- cond = expect(this.conditions, 'expected condition'); >-- } >-- >-- ruleset = $(this.block); >-- >-- if (ruleset) { >-- return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic); >-- } else { >-- restore(); >-- } >-- } >-- } >-- }, >-- >-- // >-- // Entities are the smallest recognized token, >-- // and can be found inside a rule's value. >-- // >-- entity: function () { >-- return $(this.entities.literal) || $(this.entities.variable) || $(this.entities.url) || >-- $(this.entities.call) || $(this.entities.keyword) || $(this.entities.javascript) || >-- $(this.comment); >-- }, >-- >-- // >-- // A Rule terminator. Note that we use `peek()` to check for '}', >-- // because the `block` rule will be expecting it, but we still need to make sure >-- // it's there, if ';' was ommitted. >-- // >-- end: function () { >-- return $(';') || peek('}'); >-- }, >-- >-- // >-- // IE's alpha function >-- // >-- // alpha(opacity=88) >-- // >-- alpha: function () { >-- var value; >-- >-- if (! $(/^\(opacity=/i)) return; >-- if (value = $(/^\d+/) || $(this.entities.variable)) { >-- expect(')'); >-- return new(tree.Alpha)(value); >-- } >-- }, >-- >-- // >-- // A Selector Element >-- // >-- // div >-- // + h1 >-- // #socks >-- // input[type="text"] >-- // >-- // Elements are the building blocks for Selectors, >-- // they are made out of a `Combinator` (see combinator rule), >-- // and an element name, such as a tag a class, or `*`. >-- // >-- element: function () { >-- var e, t, c, v; >-- >-- c = $(this.combinator); >-- >-- e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || >-- $('*') || $('&') || $(this.attribute) || $(/^\([^)@]+\)/) || $(/^[\.#](?=@)/) || $(this.entities.variableCurly); >-- >-- if (! e) { >-- if ($('(') && (v = ($(this.entities.variableCurly) || $(this.entities.variable))) && $(')')) { >-- e = new(tree.Paren)(v); >-- } >-- } >-- >-- if (e) { return new(tree.Element)(c, e, i) } >-- }, >-- >-- // >-- // Combinators combine elements together, in a Selector. >-- // >-- // Because our parser isn't white-space sensitive, special care >-- // has to be taken, when parsing the descendant combinator, ` `, >-- // as it's an empty space. We have to check the previous character >-- // in the input, to see if it's a ` ` character. More info on how >-- // we deal with this in *combinator.js*. >-- // >-- combinator: function () { >-- var match, c = input.charAt(i); >-- >-- if (c === '>' || c === '+' || c === '~') { >-- i++; >-- while (input.charAt(i).match(/\s/)) { i++ } >-- return new(tree.Combinator)(c); >-- } else if (input.charAt(i - 1).match(/\s/)) { >-- return new(tree.Combinator)(" "); >-- } else { >-- return new(tree.Combinator)(null); >-- } >-- }, >-- >-- // >-- // A CSS Selector >-- // >-- // .class > div + h1 >-- // li a:hover >-- // >-- // Selectors are made out of one or more Elements, see above. >-- // >-- selector: function () { >-- var sel, e, elements = [], c, match; >-- >-- // depreciated, will be removed soon >-- if ($('(')) { >-- sel = $(this.entity); >-- expect(')'); >-- return new(tree.Selector)([new(tree.Element)('', sel, i)]); >-- } >-- >-- while (e = $(this.element)) { >-- c = input.charAt(i); >-- elements.push(e) >-- if (c === '{' || c === '}' || c === ';' || c === ',') { break } >-- } >-- >-- if (elements.length > 0) { return new(tree.Selector)(elements) } >-- }, >-- tag: function () { >-- return $(/^[A-Za-z][A-Za-z-]*[0-9]?/) || $('*'); >-- }, >-- attribute: function () { >-- var attr = '', key, val, op; >-- >-- if (! $('[')) return; >-- >-- if (key = $(/^(?:[_A-Za-z0-9-]|\\.)+/) || $(this.entities.quoted)) { >-- if ((op = $(/^[|~*$^]?=/)) && >-- (val = $(this.entities.quoted) || $(/^[\w-]+/))) { >-- attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); >-- } else { attr = key } >-- } >-- >-- if (! $(']')) return; >-- >-- if (attr) { return "[" + attr + "]" } >-- }, >-- >-- // >-- // The `block` rule is used by `ruleset` and `mixin.definition`. >-- // It's a wrapper around the `primary` rule, with added `{}`. >-- // >-- block: function () { >-- var content; >-- if ($('{') && (content = $(this.primary)) && $('}')) { >-- return content; >-- } >-- }, >-- >-- // >-- // div, .class, body > p {...} >-- // >-- ruleset: function () { >-- var selectors = [], s, rules, match, debugInfo; >-- save(); >-- >-- if (env.dumpLineNumbers) >-- debugInfo = getDebugInfo(i, input, env); >-- >-- while (s = $(this.selector)) { >-- selectors.push(s); >-- $(this.comment); >-- if (! $(',')) { break } >-- $(this.comment); >-- } >-- >-- if (selectors.length > 0 && (rules = $(this.block))) { >-- var ruleset = new(tree.Ruleset)(selectors, rules, env.strictImports); >-- if (env.dumpLineNumbers) >-- ruleset.debugInfo = debugInfo; >-- return ruleset; >-- } else { >-- // Backtrack >-- furthest = i; >-- restore(); >-- } >-- }, >-- rule: function () { >-- var name, value, c = input.charAt(i), important, match; >-- save(); >-- >-- if (c === '.' || c === '#' || c === '&') { return } >-- >-- if (name = $(this.variable) || $(this.property)) { >-- if ((name.charAt(0) != '@') && (match = /^([^@+\/'"*`(;{}-]*);/.exec(chunks[j]))) { >-- i += match[0].length - 1; >-- value = new(tree.Anonymous)(match[1]); >-- } else if (name === "font") { >-- value = $(this.font); >-- } else { >-- value = $(this.value); >-- } >-- important = $(this.important); >-- >-- if (value && $(this.end)) { >-- return new(tree.Rule)(name, value, important, memo); >-- } else { >-- furthest = i; >-- restore(); >-- } >-- } >-- }, >-- >-- // >-- // An @import directive >-- // >-- // @import "lib"; >-- // >-- // Depending on our environemnt, importing is done differently: >-- // In the browser, it's an XHR request, in Node, it would be a >-- // file-system operation. The function used for importing is >-- // stored in `import`, which we pass to the Import constructor. >-- // >-- "import": function () { >-- var path, features, index = i; >-- >-- save(); >-- >-- var dir = $(/^@import(?:-(once))?\s+/); >-- >-- if (dir && (path = $(this.entities.quoted) || $(this.entities.url))) { >-- features = $(this.mediaFeatures); >-- if ($(';')) { >-- return new(tree.Import)(path, imports, features, (dir[1] === 'once'), index); >-- } >-- } >-- >-- restore(); >-- }, >-- >-- mediaFeature: function () { >-- var e, p, nodes = []; >-- >-- do { >-- if (e = $(this.entities.keyword)) { >-- nodes.push(e); >-- } else if ($('(')) { >-- p = $(this.property); >-- e = $(this.entity); >-- if ($(')')) { >-- if (p && e) { >-- nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true))); >-- } else if (e) { >-- nodes.push(new(tree.Paren)(e)); >-- } else { >-- return null; >-- } >-- } else { return null } >-- } >-- } while (e); >-- >-- if (nodes.length > 0) { >-- return new(tree.Expression)(nodes); >-- } >-- }, >-- >-- mediaFeatures: function () { >-- var e, features = []; >-- >-- do { >-- if (e = $(this.mediaFeature)) { >-- features.push(e); >-- if (! $(',')) { break } >-- } else if (e = $(this.entities.variable)) { >-- features.push(e); >-- if (! $(',')) { break } >-- } >-- } while (e); >-- >-- return features.length > 0 ? features : null; >-- }, >-- >-- media: function () { >-- var features, rules, media, debugInfo; >-- >-- if (env.dumpLineNumbers) >-- debugInfo = getDebugInfo(i, input, env); >-- >-- if ($(/^@media/)) { >-- features = $(this.mediaFeatures); >-- >-- if (rules = $(this.block)) { >-- media = new(tree.Media)(rules, features); >-- if(env.dumpLineNumbers) >-- media.debugInfo = debugInfo; >-- return media; >-- } >-- } >-- }, >-- >-- // >-- // A CSS Directive >-- // >-- // @charset "utf-8"; >-- // >-- directive: function () { >-- var name, value, rules, identifier, e, nodes, nonVendorSpecificName, >-- hasBlock, hasIdentifier; >-- >-- if (input.charAt(i) !== '@') return; >-- >-- if (value = $(this['import']) || $(this.media)) { >-- return value; >-- } >-- >-- save(); >-- >-- name = $(/^@[a-z-]+/); >-- >-- nonVendorSpecificName = name; >-- if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { >-- nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); >-- } >-- >-- switch(nonVendorSpecificName) { >-- case "@font-face": >-- hasBlock = true; >-- break; >-- case "@viewport": >-- case "@top-left": >-- case "@top-left-corner": >-- case "@top-center": >-- case "@top-right": >-- case "@top-right-corner": >-- case "@bottom-left": >-- case "@bottom-left-corner": >-- case "@bottom-center": >-- case "@bottom-right": >-- case "@bottom-right-corner": >-- case "@left-top": >-- case "@left-middle": >-- case "@left-bottom": >-- case "@right-top": >-- case "@right-middle": >-- case "@right-bottom": >-- hasBlock = true; >-- break; >-- case "@page": >-- case "@document": >-- case "@supports": >-- case "@keyframes": >-- hasBlock = true; >-- hasIdentifier = true; >-- break; >-- } >-- >-- if (hasIdentifier) { >-- name += " " + ($(/^[^{]+/) || '').trim(); >-- } >-- >-- if (hasBlock) >-- { >-- if (rules = $(this.block)) { >-- return new(tree.Directive)(name, rules); >-- } >-- } else { >-- if ((value = $(this.entity)) && $(';')) { >-- return new(tree.Directive)(name, value); >-- } >-- } >-- >-- restore(); >-- }, >-- font: function () { >-- var value = [], expression = [], weight, shorthand, font, e; >-- >-- while (e = $(this.shorthand) || $(this.entity)) { >-- expression.push(e); >-- } >-- value.push(new(tree.Expression)(expression)); >-- >-- if ($(',')) { >-- while (e = $(this.expression)) { >-- value.push(e); >-- if (! $(',')) { break } >-- } >-- } >-- return new(tree.Value)(value); >-- }, >-- >-- // >-- // A Value is a comma-delimited list of Expressions >-- // >-- // font-family: Baskerville, Georgia, serif; >-- // >-- // In a Rule, a Value represents everything after the `:`, >-- // and before the `;`. >-- // >-- value: function () { >-- var e, expressions = [], important; >-- >-- while (e = $(this.expression)) { >-- expressions.push(e); >-- if (! $(',')) { break } >-- } >-- >-- if (expressions.length > 0) { >-- return new(tree.Value)(expressions); >-- } >-- }, >-- important: function () { >-- if (input.charAt(i) === '!') { >-- return $(/^! *important/); >-- } >-- }, >-- sub: function () { >-- var e; >-- >-- if ($('(') && (e = $(this.expression)) && $(')')) { >-- return e; >-- } >-- }, >-- multiplication: function () { >-- var m, a, op, operation; >-- if (m = $(this.operand)) { >-- while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- addition: function () { >-- var m, a, op, operation; >-- if (m = $(this.multiplication)) { >-- while ((op = $(/^[-+]\s+/) || (!isWhitespace(input.charAt(i - 1)) && ($('+') || $('-')))) && >-- (a = $(this.multiplication))) { >-- operation = new(tree.Operation)(op, [operation || m, a]); >-- } >-- return operation || m; >-- } >-- }, >-- conditions: function () { >-- var a, b, index = i, condition; >-- >-- if (a = $(this.condition)) { >-- while ($(',') && (b = $(this.condition))) { >-- condition = new(tree.Condition)('or', condition || a, b, index); >-- } >-- return condition || a; >-- } >-- }, >-- condition: function () { >-- var a, b, c, op, index = i, negate = false; >-- >-- if ($(/^not/)) { negate = true } >-- expect('('); >-- if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- if (op = $(/^(?:>=|=<|[<=>])/)) { >-- if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) { >-- c = new(tree.Condition)(op, a, b, index, negate); >-- } else { >-- error('expected expression'); >-- } >-- } else { >-- c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate); >-- } >-- expect(')'); >-- return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c; >-- } >-- }, >-- >-- // >-- // An operand is anything that can be part of an operation, >-- // such as a Color, or a Variable >-- // >-- operand: function () { >-- var negate, p = input.charAt(i + 1); >-- >-- if (input.charAt(i) === '-' && (p === '@' || p === '(')) { negate = $('-') } >-- var o = $(this.sub) || $(this.entities.dimension) || >-- $(this.entities.color) || $(this.entities.variable) || >-- $(this.entities.call); >-- return negate ? new(tree.Operation)('*', [new(tree.Dimension)(-1), o]) >-- : o; >-- }, >-- >-- // >-- // Expressions either represent mathematical operations, >-- // or white-space delimited Entities. >-- // >-- // 1px solid black >-- // @var * 2 >-- // >-- expression: function () { >-- var e, delim, entities = [], d; >-- >-- while (e = $(this.addition) || $(this.entity)) { >-- entities.push(e); >-- } >-- if (entities.length > 0) { >-- return new(tree.Expression)(entities); >-- } >-- }, >-- property: function () { >-- var name; >-- >-- if (name = $(/^(\*?-?[_a-z0-9-]+)\s*:/)) { >-- return name[1]; >-- } >-- } >-- } >-- }; >--}; >-- >--if (less.mode === 'browser' || less.mode === 'rhino') { >-- // >-- // Used by `@import` directives >-- // >-- less.Parser.importer = function (path, paths, callback, env) { >-- if (!/^([a-z-]+:)?\//.test(path) && paths.length > 0) { >-- path = paths[0] + path; >-- } >-- // We pass `true` as 3rd argument, to force the reload of the import. >-- // This is so we can get the syntax tree as opposed to just the CSS output, >-- // as we need this to evaluate the current stylesheet. >-- // __ Now using the hack of passing a ref to top parser's content cache in the 1st arg. __ >-- loadStyleSheet({ href: path, title: path, type: env.mime, contents: env.contents }, function (e) { >-- if (e && typeof(env.errback) === "function") { >-- env.errback.call(null, path, paths, callback, env); >-- } else { >-- callback.apply(null, arguments); >-- } >-- }, true); >-- }; >--} >-- >--(function (tree) { >-- >--tree.functions = { >-- rgb: function (r, g, b) { >-- return this.rgba(r, g, b, 1.0); >-- }, >-- rgba: function (r, g, b, a) { >-- var rgb = [r, g, b].map(function (c) { return number(c) }), >-- a = number(a); >-- return new(tree.Color)(rgb, a); >-- }, >-- hsl: function (h, s, l) { >-- return this.hsla(h, s, l, 1.0); >-- }, >-- hsla: function (h, s, l, a) { >-- h = (number(h) % 360) / 360; >-- s = number(s); l = number(l); a = number(a); >-- >-- var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; >-- var m1 = l * 2 - m2; >-- >-- return this.rgba(hue(h + 1/3) * 255, >-- hue(h) * 255, >-- hue(h - 1/3) * 255, >-- a); >-- >-- function hue(h) { >-- h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); >-- if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; >-- else if (h * 2 < 1) return m2; >-- else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; >-- else return m1; >-- } >-- }, >-- hue: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().h)); >-- }, >-- saturation: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%'); >-- }, >-- lightness: function (color) { >-- return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%'); >-- }, >-- red: function (color) { >-- return new(tree.Dimension)(color.rgb[0]); >-- }, >-- green: function (color) { >-- return new(tree.Dimension)(color.rgb[1]); >-- }, >-- blue: function (color) { >-- return new(tree.Dimension)(color.rgb[2]); >-- }, >-- alpha: function (color) { >-- return new(tree.Dimension)(color.toHSL().a); >-- }, >-- luma: function (color) { >-- return new(tree.Dimension)(Math.round((0.2126 * (color.rgb[0]/255) + >-- 0.7152 * (color.rgb[1]/255) + >-- 0.0722 * (color.rgb[2]/255)) >-- * color.alpha * 100), '%'); >-- }, >-- saturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s += amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- desaturate: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.s -= amount.value / 100; >-- hsl.s = clamp(hsl.s); >-- return hsla(hsl); >-- }, >-- lighten: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l += amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- darken: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.l -= amount.value / 100; >-- hsl.l = clamp(hsl.l); >-- return hsla(hsl); >-- }, >-- fadein: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a += amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fadeout: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a -= amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- fade: function (color, amount) { >-- var hsl = color.toHSL(); >-- >-- hsl.a = amount.value / 100; >-- hsl.a = clamp(hsl.a); >-- return hsla(hsl); >-- }, >-- spin: function (color, amount) { >-- var hsl = color.toHSL(); >-- var hue = (hsl.h + amount.value) % 360; >-- >-- hsl.h = hue < 0 ? 360 + hue : hue; >-- >-- return hsla(hsl); >-- }, >-- // >-- // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein >-- // http://sass-lang.com >-- // >-- mix: function (color1, color2, weight) { >-- if (!weight) { >-- weight = new(tree.Dimension)(50); >-- } >-- var p = weight.value / 100.0; >-- var w = p * 2 - 1; >-- var a = color1.toHSL().a - color2.toHSL().a; >-- >-- var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; >-- var w2 = 1 - w1; >-- >-- var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, >-- color1.rgb[1] * w1 + color2.rgb[1] * w2, >-- color1.rgb[2] * w1 + color2.rgb[2] * w2]; >-- >-- var alpha = color1.alpha * p + color2.alpha * (1 - p); >-- >-- return new(tree.Color)(rgb, alpha); >-- }, >-- greyscale: function (color) { >-- return this.desaturate(color, new(tree.Dimension)(100)); >-- }, >-- contrast: function (color, dark, light, threshold) { >-- if (typeof light === 'undefined') { >-- light = this.rgba(255, 255, 255, 1.0); >-- } >-- if (typeof dark === 'undefined') { >-- dark = this.rgba(0, 0, 0, 1.0); >-- } >-- if (typeof threshold === 'undefined') { >-- threshold = 0.43; >-- } else { >-- threshold = threshold.value; >-- } >-- if (((0.2126 * (color.rgb[0]/255) + 0.7152 * (color.rgb[1]/255) + 0.0722 * (color.rgb[2]/255)) * color.alpha) < threshold) { >-- return light; >-- } else { >-- return dark; >-- } >-- }, >-- e: function (str) { >-- return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str); >-- }, >-- escape: function (str) { >-- return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); >-- }, >-- '%': function (quoted /* arg, arg, ...*/) { >-- var args = Array.prototype.slice.call(arguments, 1), >-- str = quoted.value; >-- >-- for (var i = 0; i < args.length; i++) { >-- str = str.replace(/%[sda]/i, function(token) { >-- var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); >-- return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; >-- }); >-- } >-- str = str.replace(/%%/g, '%'); >-- return new(tree.Quoted)('"' + str + '"', str); >-- }, >-- round: function (n, f) { >-- var fraction = typeof(f) === "undefined" ? 0 : f.value; >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(number(n).toFixed(fraction), n.unit); >-- } else if (typeof(n) === 'number') { >-- return n.toFixed(fraction); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- ceil: function (n) { >-- return this._math('ceil', n); >-- }, >-- floor: function (n) { >-- return this._math('floor', n); >-- }, >-- _math: function (fn, n) { >-- if (n instanceof tree.Dimension) { >-- return new(tree.Dimension)(Math[fn](number(n)), n.unit); >-- } else if (typeof(n) === 'number') { >-- return Math[fn](n); >-- } else { >-- throw { type: "Argument", message: "argument must be a number" }; >-- } >-- }, >-- argb: function (color) { >-- return new(tree.Anonymous)(color.toARGB()); >-- >-- }, >-- percentage: function (n) { >-- return new(tree.Dimension)(n.value * 100, '%'); >-- }, >-- color: function (n) { >-- if (n instanceof tree.Quoted) { >-- return new(tree.Color)(n.value.slice(1)); >-- } else { >-- throw { type: "Argument", message: "argument must be a string" }; >-- } >-- }, >-- iscolor: function (n) { >-- return this._isa(n, tree.Color); >-- }, >-- isnumber: function (n) { >-- return this._isa(n, tree.Dimension); >-- }, >-- isstring: function (n) { >-- return this._isa(n, tree.Quoted); >-- }, >-- iskeyword: function (n) { >-- return this._isa(n, tree.Keyword); >-- }, >-- isurl: function (n) { >-- return this._isa(n, tree.URL); >-- }, >-- ispixel: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False; >-- }, >-- ispercentage: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False; >-- }, >-- isem: function (n) { >-- return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False; >-- }, >-- _isa: function (n, Type) { >-- return (n instanceof Type) ? tree.True : tree.False; >-- }, >-- >-- /* Blending modes */ >-- >-- multiply: function(color1, color2) { >-- var r = color1.rgb[0] * color2.rgb[0] / 255; >-- var g = color1.rgb[1] * color2.rgb[1] / 255; >-- var b = color1.rgb[2] * color2.rgb[2] / 255; >-- return this.rgb(r, g, b); >-- }, >-- screen: function(color1, color2) { >-- var r = 255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255; >-- var g = 255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255; >-- var b = 255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- overlay: function(color1, color2) { >-- var r = color1.rgb[0] < 128 ? 2 * color1.rgb[0] * color2.rgb[0] / 255 : 255 - 2 * (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255; >-- var g = color1.rgb[1] < 128 ? 2 * color1.rgb[1] * color2.rgb[1] / 255 : 255 - 2 * (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255; >-- var b = color1.rgb[2] < 128 ? 2 * color1.rgb[2] * color2.rgb[2] / 255 : 255 - 2 * (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- softlight: function(color1, color2) { >-- var t = color2.rgb[0] * color1.rgb[0] / 255; >-- var r = t + color1.rgb[0] * (255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255 - t) / 255; >-- t = color2.rgb[1] * color1.rgb[1] / 255; >-- var g = t + color1.rgb[1] * (255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255 - t) / 255; >-- t = color2.rgb[2] * color1.rgb[2] / 255; >-- var b = t + color1.rgb[2] * (255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255 - t) / 255; >-- return this.rgb(r, g, b); >-- }, >-- hardlight: function(color1, color2) { >-- var r = color2.rgb[0] < 128 ? 2 * color2.rgb[0] * color1.rgb[0] / 255 : 255 - 2 * (255 - color2.rgb[0]) * (255 - color1.rgb[0]) / 255; >-- var g = color2.rgb[1] < 128 ? 2 * color2.rgb[1] * color1.rgb[1] / 255 : 255 - 2 * (255 - color2.rgb[1]) * (255 - color1.rgb[1]) / 255; >-- var b = color2.rgb[2] < 128 ? 2 * color2.rgb[2] * color1.rgb[2] / 255 : 255 - 2 * (255 - color2.rgb[2]) * (255 - color1.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- difference: function(color1, color2) { >-- var r = Math.abs(color1.rgb[0] - color2.rgb[0]); >-- var g = Math.abs(color1.rgb[1] - color2.rgb[1]); >-- var b = Math.abs(color1.rgb[2] - color2.rgb[2]); >-- return this.rgb(r, g, b); >-- }, >-- exclusion: function(color1, color2) { >-- var r = color1.rgb[0] + color2.rgb[0] * (255 - color1.rgb[0] - color1.rgb[0]) / 255; >-- var g = color1.rgb[1] + color2.rgb[1] * (255 - color1.rgb[1] - color1.rgb[1]) / 255; >-- var b = color1.rgb[2] + color2.rgb[2] * (255 - color1.rgb[2] - color1.rgb[2]) / 255; >-- return this.rgb(r, g, b); >-- }, >-- average: function(color1, color2) { >-- var r = (color1.rgb[0] + color2.rgb[0]) / 2; >-- var g = (color1.rgb[1] + color2.rgb[1]) / 2; >-- var b = (color1.rgb[2] + color2.rgb[2]) / 2; >-- return this.rgb(r, g, b); >-- }, >-- negation: function(color1, color2) { >-- var r = 255 - Math.abs(255 - color2.rgb[0] - color1.rgb[0]); >-- var g = 255 - Math.abs(255 - color2.rgb[1] - color1.rgb[1]); >-- var b = 255 - Math.abs(255 - color2.rgb[2] - color1.rgb[2]); >-- return this.rgb(r, g, b); >-- }, >-- tint: function(color, amount) { >-- return this.mix(this.rgb(255,255,255), color, amount); >-- }, >-- shade: function(color, amount) { >-- return this.mix(this.rgb(0, 0, 0), color, amount); >-- } >--}; >-- >--function hsla(hsla) { >-- return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a); >--} >-- >--function number(n) { >-- if (n instanceof tree.Dimension) { >-- return parseFloat(n.unit == '%' ? n.value / 100 : n.value); >-- } else if (typeof(n) === 'number') { >-- return n; >-- } else { >-- throw { >-- error: "RuntimeError", >-- message: "color functions take numbers as parameters" >-- }; >-- } >--} >-- >--function clamp(val) { >-- return Math.min(1, Math.max(0, val)); >--} >-- >--})(require('./tree')); >--(function (tree) { >-- tree.colors = { >-- 'aliceblue':'#f0f8ff', >-- 'antiquewhite':'#faebd7', >-- 'aqua':'#00ffff', >-- 'aquamarine':'#7fffd4', >-- 'azure':'#f0ffff', >-- 'beige':'#f5f5dc', >-- 'bisque':'#ffe4c4', >-- 'black':'#000000', >-- 'blanchedalmond':'#ffebcd', >-- 'blue':'#0000ff', >-- 'blueviolet':'#8a2be2', >-- 'brown':'#a52a2a', >-- 'burlywood':'#deb887', >-- 'cadetblue':'#5f9ea0', >-- 'chartreuse':'#7fff00', >-- 'chocolate':'#d2691e', >-- 'coral':'#ff7f50', >-- 'cornflowerblue':'#6495ed', >-- 'cornsilk':'#fff8dc', >-- 'crimson':'#dc143c', >-- 'cyan':'#00ffff', >-- 'darkblue':'#00008b', >-- 'darkcyan':'#008b8b', >-- 'darkgoldenrod':'#b8860b', >-- 'darkgray':'#a9a9a9', >-- 'darkgrey':'#a9a9a9', >-- 'darkgreen':'#006400', >-- 'darkkhaki':'#bdb76b', >-- 'darkmagenta':'#8b008b', >-- 'darkolivegreen':'#556b2f', >-- 'darkorange':'#ff8c00', >-- 'darkorchid':'#9932cc', >-- 'darkred':'#8b0000', >-- 'darksalmon':'#e9967a', >-- 'darkseagreen':'#8fbc8f', >-- 'darkslateblue':'#483d8b', >-- 'darkslategray':'#2f4f4f', >-- 'darkslategrey':'#2f4f4f', >-- 'darkturquoise':'#00ced1', >-- 'darkviolet':'#9400d3', >-- 'deeppink':'#ff1493', >-- 'deepskyblue':'#00bfff', >-- 'dimgray':'#696969', >-- 'dimgrey':'#696969', >-- 'dodgerblue':'#1e90ff', >-- 'firebrick':'#b22222', >-- 'floralwhite':'#fffaf0', >-- 'forestgreen':'#228b22', >-- 'fuchsia':'#ff00ff', >-- 'gainsboro':'#dcdcdc', >-- 'ghostwhite':'#f8f8ff', >-- 'gold':'#ffd700', >-- 'goldenrod':'#daa520', >-- 'gray':'#808080', >-- 'grey':'#808080', >-- 'green':'#008000', >-- 'greenyellow':'#adff2f', >-- 'honeydew':'#f0fff0', >-- 'hotpink':'#ff69b4', >-- 'indianred':'#cd5c5c', >-- 'indigo':'#4b0082', >-- 'ivory':'#fffff0', >-- 'khaki':'#f0e68c', >-- 'lavender':'#e6e6fa', >-- 'lavenderblush':'#fff0f5', >-- 'lawngreen':'#7cfc00', >-- 'lemonchiffon':'#fffacd', >-- 'lightblue':'#add8e6', >-- 'lightcoral':'#f08080', >-- 'lightcyan':'#e0ffff', >-- 'lightgoldenrodyellow':'#fafad2', >-- 'lightgray':'#d3d3d3', >-- 'lightgrey':'#d3d3d3', >-- 'lightgreen':'#90ee90', >-- 'lightpink':'#ffb6c1', >-- 'lightsalmon':'#ffa07a', >-- 'lightseagreen':'#20b2aa', >-- 'lightskyblue':'#87cefa', >-- 'lightslategray':'#778899', >-- 'lightslategrey':'#778899', >-- 'lightsteelblue':'#b0c4de', >-- 'lightyellow':'#ffffe0', >-- 'lime':'#00ff00', >-- 'limegreen':'#32cd32', >-- 'linen':'#faf0e6', >-- 'magenta':'#ff00ff', >-- 'maroon':'#800000', >-- 'mediumaquamarine':'#66cdaa', >-- 'mediumblue':'#0000cd', >-- 'mediumorchid':'#ba55d3', >-- 'mediumpurple':'#9370d8', >-- 'mediumseagreen':'#3cb371', >-- 'mediumslateblue':'#7b68ee', >-- 'mediumspringgreen':'#00fa9a', >-- 'mediumturquoise':'#48d1cc', >-- 'mediumvioletred':'#c71585', >-- 'midnightblue':'#191970', >-- 'mintcream':'#f5fffa', >-- 'mistyrose':'#ffe4e1', >-- 'moccasin':'#ffe4b5', >-- 'navajowhite':'#ffdead', >-- 'navy':'#000080', >-- 'oldlace':'#fdf5e6', >-- 'olive':'#808000', >-- 'olivedrab':'#6b8e23', >-- 'orange':'#ffa500', >-- 'orangered':'#ff4500', >-- 'orchid':'#da70d6', >-- 'palegoldenrod':'#eee8aa', >-- 'palegreen':'#98fb98', >-- 'paleturquoise':'#afeeee', >-- 'palevioletred':'#d87093', >-- 'papayawhip':'#ffefd5', >-- 'peachpuff':'#ffdab9', >-- 'peru':'#cd853f', >-- 'pink':'#ffc0cb', >-- 'plum':'#dda0dd', >-- 'powderblue':'#b0e0e6', >-- 'purple':'#800080', >-- 'red':'#ff0000', >-- 'rosybrown':'#bc8f8f', >-- 'royalblue':'#4169e1', >-- 'saddlebrown':'#8b4513', >-- 'salmon':'#fa8072', >-- 'sandybrown':'#f4a460', >-- 'seagreen':'#2e8b57', >-- 'seashell':'#fff5ee', >-- 'sienna':'#a0522d', >-- 'silver':'#c0c0c0', >-- 'skyblue':'#87ceeb', >-- 'slateblue':'#6a5acd', >-- 'slategray':'#708090', >-- 'slategrey':'#708090', >-- 'snow':'#fffafa', >-- 'springgreen':'#00ff7f', >-- 'steelblue':'#4682b4', >-- 'tan':'#d2b48c', >-- 'teal':'#008080', >-- 'thistle':'#d8bfd8', >-- 'tomato':'#ff6347', >-- // 'transparent':'rgba(0,0,0,0)', >-- 'turquoise':'#40e0d0', >-- 'violet':'#ee82ee', >-- 'wheat':'#f5deb3', >-- 'white':'#ffffff', >-- 'whitesmoke':'#f5f5f5', >-- 'yellow':'#ffff00', >-- 'yellowgreen':'#9acd32' >-- }; >--})(require('./tree')); >--(function (tree) { >-- >--tree.Alpha = function (val) { >-- this.value = val; >--}; >--tree.Alpha.prototype = { >-- toCSS: function () { >-- return "alpha(opacity=" + >-- (this.value.toCSS ? this.value.toCSS() : this.value) + ")"; >-- }, >-- eval: function (env) { >-- if (this.value.eval) { this.value = this.value.eval(env) } >-- return this; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Anonymous = function (string) { >-- this.value = string.value || string; >--}; >--tree.Anonymous.prototype = { >-- toCSS: function () { >-- return this.value; >-- }, >-- eval: function () { return this }, >-- compare: function (x) { >-- if (!x.toCSS) { >-- return -1; >-- } >-- >-- var left = this.toCSS(), >-- right = x.toCSS(); >-- >-- if (left === right) { >-- return 0; >-- } >-- >-- return left < right ? -1 : 1; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Assignment = function (key, val) { >-- this.key = key; >-- this.value = val; >--}; >--tree.Assignment.prototype = { >-- toCSS: function () { >-- return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); >-- }, >-- eval: function (env) { >-- if (this.value.eval) { >-- return new(tree.Assignment)(this.key, this.value.eval(env)); >-- } >-- return this; >-- } >--}; >-- >--})(require('../tree'));(function (tree) { >-- >--// >--// A function call node. >--// >--tree.Call = function (name, args, index, filename) { >-- this.name = name; >-- this.args = args; >-- this.index = index; >-- this.filename = filename; >--}; >--tree.Call.prototype = { >-- // >-- // When evaluating a function call, >-- // we either find the function in `tree.functions` [1], >-- // in which case we call it, passing the evaluated arguments, >-- // or we simply print it out as it appeared originally [2]. >-- // >-- // The *functions.js* file contains the built-in functions. >-- // >-- // The reason why we evaluate the arguments, is in the case where >-- // we try to pass a variable to a function, like: `saturate(@color)`. >-- // The function should receive the value, not the variable. >-- // >-- eval: function (env) { >-- var args = this.args.map(function (a) { return a.eval(env) }); >-- >-- if (this.name in tree.functions) { // 1. >-- try { >-- return tree.functions[this.name].apply(tree.functions, args); >-- } catch (e) { >-- throw { type: e.type || "Runtime", >-- message: "error evaluating function `" + this.name + "`" + >-- (e.message ? ': ' + e.message : ''), >-- index: this.index, filename: this.filename }; >-- } >-- } else { // 2. >-- return new(tree.Anonymous)(this.name + >-- "(" + args.map(function (a) { return a.toCSS(env) }).join(', ') + ")"); >-- } >-- }, >-- >-- toCSS: function (env) { >-- return this.eval(env).toCSS(); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// RGB Colors - #ff0014, #eee >--// >--tree.Color = function (rgb, a) { >-- // >-- // The end goal here, is to parse the arguments >-- // into an integer triplet, such as `128, 255, 0` >-- // >-- // This facilitates operations and conversions. >-- // >-- if (Array.isArray(rgb)) { >-- this.rgb = rgb; >-- } else if (rgb.length == 6) { >-- this.rgb = rgb.match(/.{2}/g).map(function (c) { >-- return parseInt(c, 16); >-- }); >-- } else { >-- this.rgb = rgb.split('').map(function (c) { >-- return parseInt(c + c, 16); >-- }); >-- } >-- this.alpha = typeof(a) === 'number' ? a : 1; >--}; >--tree.Color.prototype = { >-- eval: function () { return this }, >-- >-- // >-- // If we have some transparency, the only way to represent it >-- // is via `rgba`. Otherwise, we use the hex representation, >-- // which has better compatibility with older browsers. >-- // Values are capped between `0` and `255`, rounded and zero-padded. >-- // >-- toCSS: function () { >-- if (this.alpha < 1.0) { >-- return "rgba(" + this.rgb.map(function (c) { >-- return Math.round(c); >-- }).concat(this.alpha).join(', ') + ")"; >-- } else { >-- return '#' + this.rgb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- } >-- }, >-- >-- // >-- // Operations have to be done per-channel, if not, >-- // channels will spill onto each other. Once we have >-- // our result, in the form of an integer triplet, >-- // we create a new Color node to hold the result. >-- // >-- operate: function (op, other) { >-- var result = []; >-- >-- if (! (other instanceof tree.Color)) { >-- other = other.toColor(); >-- } >-- >-- for (var c = 0; c < 3; c++) { >-- result[c] = tree.operate(op, this.rgb[c], other.rgb[c]); >-- } >-- return new(tree.Color)(result, this.alpha + other.alpha); >-- }, >-- >-- toHSL: function () { >-- var r = this.rgb[0] / 255, >-- g = this.rgb[1] / 255, >-- b = this.rgb[2] / 255, >-- a = this.alpha; >-- >-- var max = Math.max(r, g, b), min = Math.min(r, g, b); >-- var h, s, l = (max + min) / 2, d = max - min; >-- >-- if (max === min) { >-- h = s = 0; >-- } else { >-- s = l > 0.5 ? d / (2 - max - min) : d / (max + min); >-- >-- switch (max) { >-- case r: h = (g - b) / d + (g < b ? 6 : 0); break; >-- case g: h = (b - r) / d + 2; break; >-- case b: h = (r - g) / d + 4; break; >-- } >-- h /= 6; >-- } >-- return { h: h * 360, s: s, l: l, a: a }; >-- }, >-- toARGB: function () { >-- var argb = [Math.round(this.alpha * 255)].concat(this.rgb); >-- return '#' + argb.map(function (i) { >-- i = Math.round(i); >-- i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); >-- return i.length === 1 ? '0' + i : i; >-- }).join(''); >-- }, >-- compare: function (x) { >-- if (!x.rgb) { >-- return -1; >-- } >-- >-- return (x.rgb[0] === this.rgb[0] && >-- x.rgb[1] === this.rgb[1] && >-- x.rgb[2] === this.rgb[2] && >-- x.alpha === this.alpha) ? 0 : -1; >-- } >--}; >-- >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Comment = function (value, silent) { >-- this.value = value; >-- this.silent = !!silent; >--}; >--tree.Comment.prototype = { >-- toCSS: function (env) { >-- return env.compress ? '' : this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Condition = function (op, l, r, i, negate) { >-- this.op = op.trim(); >-- this.lvalue = l; >-- this.rvalue = r; >-- this.index = i; >-- this.negate = negate; >--}; >--tree.Condition.prototype.eval = function (env) { >-- var a = this.lvalue.eval(env), >-- b = this.rvalue.eval(env); >-- >-- var i = this.index, result; >-- >-- var result = (function (op) { >-- switch (op) { >-- case 'and': >-- return a && b; >-- case 'or': >-- return a || b; >-- default: >-- if (a.compare) { >-- result = a.compare(b); >-- } else if (b.compare) { >-- result = b.compare(a); >-- } else { >-- throw { type: "Type", >-- message: "Unable to perform comparison", >-- index: i }; >-- } >-- switch (result) { >-- case -1: return op === '<' || op === '=<'; >-- case 0: return op === '=' || op === '>=' || op === '=<'; >-- case 1: return op === '>' || op === '>='; >-- } >-- } >-- })(this.op); >-- return this.negate ? !result : result; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--// >--// A number with a unit >--// >--tree.Dimension = function (value, unit) { >-- this.value = parseFloat(value); >-- this.unit = unit || null; >--}; >-- >--tree.Dimension.prototype = { >-- eval: function () { return this }, >-- toColor: function () { >-- return new(tree.Color)([this.value, this.value, this.value]); >-- }, >-- toCSS: function () { >-- var css = this.value + this.unit; >-- return css; >-- }, >-- >-- // In an operation between two Dimensions, >-- // we default to the first Dimension's unit, >-- // so `1px + 2em` will yield `3px`. >-- // In the future, we could implement some unit >-- // conversions such that `100cm + 10mm` would yield >-- // `101cm`. >-- operate: function (op, other) { >-- return new(tree.Dimension) >-- (tree.operate(op, this.value, other.value), >-- this.unit || other.unit); >-- }, >-- >-- // TODO: Perform unit conversion before comparing >-- compare: function (other) { >-- if (other instanceof tree.Dimension) { >-- if (other.value > this.value) { >-- return -1; >-- } else if (other.value < this.value) { >-- return 1; >-- } else { >-- return 0; >-- } >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Directive = function (name, value) { >-- this.name = name; >-- >-- if (Array.isArray(value)) { >-- this.ruleset = new(tree.Ruleset)([], value); >-- this.ruleset.allowImports = true; >-- } else { >-- this.value = value; >-- } >--}; >--tree.Directive.prototype = { >-- toCSS: function (ctx, env) { >-- if (this.ruleset) { >-- this.ruleset.root = true; >-- return this.name + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- } else { >-- return this.name + ' ' + this.value.toCSS() + ';\n'; >-- } >-- }, >-- eval: function (env) { >-- var evaldDirective = this; >-- if (this.ruleset) { >-- env.frames.unshift(this); >-- evaldDirective = new(tree.Directive)(this.name); >-- evaldDirective.ruleset = this.ruleset.eval(env); >-- env.frames.shift(); >-- } >-- return evaldDirective; >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Element = function (combinator, value, index) { >-- this.combinator = combinator instanceof tree.Combinator ? >-- combinator : new(tree.Combinator)(combinator); >-- >-- if (typeof(value) === 'string') { >-- this.value = value.trim(); >-- } else if (value) { >-- this.value = value; >-- } else { >-- this.value = ""; >-- } >-- this.index = index; >--}; >--tree.Element.prototype.eval = function (env) { >-- return new(tree.Element)(this.combinator, >-- this.value.eval ? this.value.eval(env) : this.value, >-- this.index); >--}; >--tree.Element.prototype.toCSS = function (env) { >-- var value = (this.value.toCSS ? this.value.toCSS(env) : this.value); >-- if (value == '' && this.combinator.value.charAt(0) == '&') { >-- return ''; >-- } else { >-- return this.combinator.toCSS(env || {}) + value; >-- } >--}; >-- >--tree.Combinator = function (value) { >-- if (value === ' ') { >-- this.value = ' '; >-- } else { >-- this.value = value ? value.trim() : ""; >-- } >--}; >--tree.Combinator.prototype.toCSS = function (env) { >-- return { >-- '' : '', >-- ' ' : ' ', >-- ':' : ' :', >-- '+' : env.compress ? '+' : ' + ', >-- '~' : env.compress ? '~' : ' ~ ', >-- '>' : env.compress ? '>' : ' > ' >-- }[this.value]; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Expression = function (value) { this.value = value }; >--tree.Expression.prototype = { >-- eval: function (env) { >-- if (this.value.length > 1) { >-- return new(tree.Expression)(this.value.map(function (e) { >-- return e.eval(env); >-- })); >-- } else if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return this; >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS ? e.toCSS(env) : ''; >-- }).join(' '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >--// >--// CSS @import node >--// >--// The general strategy here is that we don't want to wait >--// for the parsing to be completed, before we start importing >--// the file. That's because in the context of a browser, >--// most of the time will be spent waiting for the server to respond. >--// >--// On creation, we push the import path to our import queue, though >--// `import,push`, we also pass it a callback, which it'll call once >--// the file has been fetched, and parsed. >--// >--tree.Import = function (path, imports, features, once, index) { >-- var that = this; >-- >-- this.once = once; >-- this.index = index; >-- this._path = path; >-- this.features = features && new(tree.Value)(features); >-- >-- // The '.less' extension is optional >-- if (path instanceof tree.Quoted) { >-- this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less'; >-- } else { >-- this.path = path.value.value || path.value; >-- } >-- >-- this.css = /css(\?.*)?$/.test(this.path); >-- >-- // Only pre-compile .less files >-- if (! this.css) { >-- imports.push(this.path, function (e, root, imported) { >-- if (e) { e.index = index } >-- if (imported && that.once) that.skip = imported; >-- that.root = root || new(tree.Ruleset)([], []); >-- }); >-- } >--}; >-- >--// >--// The actual import node doesn't return anything, when converted to CSS. >--// The reason is that it's used at the evaluation stage, so that the rules >--// it imports can be treated like any other rules. >--// >--// In `eval`, we make sure all Import nodes get evaluated, recursively, so >--// we end up with a flat structure, which can easily be imported in the parent >--// ruleset. >--// >--tree.Import.prototype = { >-- toCSS: function (env) { >-- var features = this.features ? ' ' + this.features.toCSS(env) : ''; >-- >-- if (this.css) { >-- return "@import " + this._path.toCSS() + features + ';\n'; >-- } else { >-- return ""; >-- } >-- }, >-- eval: function (env) { >-- var ruleset, features = this.features && this.features.eval(env); >-- >-- if (this.skip) return []; >-- >-- if (this.css) { >-- return this; >-- } else { >-- ruleset = new(tree.Ruleset)([], this.root.rules.slice(0)); >-- >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- Array.prototype >-- .splice >-- .apply(ruleset.rules, >-- [i, 1].concat(ruleset.rules[i].eval(env))); >-- } >-- } >-- return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.JavaScript = function (string, index, escaped) { >-- this.escaped = escaped; >-- this.expression = string; >-- this.index = index; >--}; >--tree.JavaScript.prototype = { >-- eval: function (env) { >-- var result, >-- that = this, >-- context = {}; >-- >-- var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { >-- return tree.jsify(new(tree.Variable)('@' + name, that.index).eval(env)); >-- }); >-- >-- try { >-- expression = new(Function)('return (' + expression + ')'); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: `" + expression + "`" , >-- index: this.index }; >-- } >-- >-- for (var k in env.frames[0].variables()) { >-- context[k.slice(1)] = { >-- value: env.frames[0].variables()[k].value, >-- toJS: function () { >-- return this.value.eval(env).toCSS(); >-- } >-- }; >-- } >-- >-- try { >-- result = expression.call(context); >-- } catch (e) { >-- throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" , >-- index: this.index }; >-- } >-- if (typeof(result) === 'string') { >-- return new(tree.Quoted)('"' + result + '"', result, this.escaped, this.index); >-- } else if (Array.isArray(result)) { >-- return new(tree.Anonymous)(result.join(', ')); >-- } else { >-- return new(tree.Anonymous)(result); >-- } >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Keyword = function (value) { this.value = value }; >--tree.Keyword.prototype = { >-- eval: function () { return this }, >-- toCSS: function () { return this.value }, >-- compare: function (other) { >-- if (other instanceof tree.Keyword) { >-- return other.value === this.value ? 0 : 1; >-- } else { >-- return -1; >-- } >-- } >--}; >-- >--tree.True = new(tree.Keyword)('true'); >--tree.False = new(tree.Keyword)('false'); >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Media = function (value, features) { >-- var selectors = this.emptySelectors(); >-- >-- this.features = new(tree.Value)(features); >-- this.ruleset = new(tree.Ruleset)(selectors, value); >-- this.ruleset.allowImports = true; >--}; >--tree.Media.prototype = { >-- toCSS: function (ctx, env) { >-- var features = this.features.toCSS(env); >-- >-- this.ruleset.root = (ctx.length === 0 || ctx[0].multiMedia); >-- return '@media ' + features + (env.compress ? '{' : ' {\n ') + >-- this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + >-- (env.compress ? '}': '\n}\n'); >-- }, >-- eval: function (env) { >-- if (!env.mediaBlocks) { >-- env.mediaBlocks = []; >-- env.mediaPath = []; >-- } >-- >-- var blockIndex = env.mediaBlocks.length; >-- env.mediaPath.push(this); >-- env.mediaBlocks.push(this); >-- >-- var media = new(tree.Media)([], []); >-- if(this.debugInfo) { >-- this.ruleset.debugInfo = this.debugInfo; >-- media.debugInfo = this.debugInfo; >-- } >-- media.features = this.features.eval(env); >-- >-- env.frames.unshift(this.ruleset); >-- media.ruleset = this.ruleset.eval(env); >-- env.frames.shift(); >-- >-- env.mediaBlocks[blockIndex] = media; >-- env.mediaPath.pop(); >-- >-- return env.mediaPath.length === 0 ? media.evalTop(env) : >-- media.evalNested(env) >-- }, >-- variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, >-- find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, >-- rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) }, >-- emptySelectors: function() { >-- var el = new(tree.Element)('', '&', 0); >-- return [new(tree.Selector)([el])]; >-- }, >-- >-- evalTop: function (env) { >-- var result = this; >-- >-- // Render all dependent Media blocks. >-- if (env.mediaBlocks.length > 1) { >-- var selectors = this.emptySelectors(); >-- result = new(tree.Ruleset)(selectors, env.mediaBlocks); >-- result.multiMedia = true; >-- } >-- >-- delete env.mediaBlocks; >-- delete env.mediaPath; >-- >-- return result; >-- }, >-- evalNested: function (env) { >-- var i, value, >-- path = env.mediaPath.concat([this]); >-- >-- // Extract the media-query conditions separated with `,` (OR). >-- for (i = 0; i < path.length; i++) { >-- value = path[i].features instanceof tree.Value ? >-- path[i].features.value : path[i].features; >-- path[i] = Array.isArray(value) ? value : [value]; >-- } >-- >-- // Trace all permutations to generate the resulting media-query. >-- // >-- // (a, b and c) with nested (d, e) -> >-- // a and d >-- // a and e >-- // b and c and d >-- // b and c and e >-- this.features = new(tree.Value)(this.permute(path).map(function (path) { >-- path = path.map(function (fragment) { >-- return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment); >-- }); >-- >-- for(i = path.length - 1; i > 0; i--) { >-- path.splice(i, 0, new(tree.Anonymous)("and")); >-- } >-- >-- return new(tree.Expression)(path); >-- })); >-- >-- // Fake a tree-node that doesn't output anything. >-- return new(tree.Ruleset)([], []); >-- }, >-- permute: function (arr) { >-- if (arr.length === 0) { >-- return []; >-- } else if (arr.length === 1) { >-- return arr[0]; >-- } else { >-- var result = []; >-- var rest = this.permute(arr.slice(1)); >-- for (var i = 0; i < rest.length; i++) { >-- for (var j = 0; j < arr[0].length; j++) { >-- result.push([arr[0][j]].concat(rest[i])); >-- } >-- } >-- return result; >-- } >-- }, >-- bubbleSelectors: function (selectors) { >-- this.ruleset = new(tree.Ruleset)(selectors.slice(0), [this.ruleset]); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.mixin = {}; >--tree.mixin.Call = function (elements, args, index, filename, important) { >-- this.selector = new(tree.Selector)(elements); >-- this.arguments = args; >-- this.index = index; >-- this.filename = filename; >-- this.important = important; >--}; >--tree.mixin.Call.prototype = { >-- eval: function (env) { >-- var mixins, args, rules = [], match = false; >-- >-- for (var i = 0; i < env.frames.length; i++) { >-- if ((mixins = env.frames[i].find(this.selector)).length > 0) { >-- args = this.arguments && this.arguments.map(function (a) { >-- return { name: a.name, value: a.value.eval(env) }; >-- }); >-- for (var m = 0; m < mixins.length; m++) { >-- if (mixins[m].match(args, env)) { >-- try { >-- Array.prototype.push.apply( >-- rules, mixins[m].eval(env, this.arguments, this.important).rules); >-- match = true; >-- } catch (e) { >-- throw { message: e.message, index: this.index, filename: this.filename, stack: e.stack }; >-- } >-- } >-- } >-- if (match) { >-- return rules; >-- } else { >-- throw { type: 'Runtime', >-- message: 'No matching definition was found for `' + >-- this.selector.toCSS().trim() + '(' + >-- this.arguments.map(function (a) { >-- return a.toCSS(); >-- }).join(', ') + ")`", >-- index: this.index, filename: this.filename }; >-- } >-- } >-- } >-- throw { type: 'Name', >-- message: this.selector.toCSS().trim() + " is undefined", >-- index: this.index, filename: this.filename }; >-- } >--}; >-- >--tree.mixin.Definition = function (name, params, rules, condition, variadic) { >-- this.name = name; >-- this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; >-- this.params = params; >-- this.condition = condition; >-- this.variadic = variadic; >-- this.arity = params.length; >-- this.rules = rules; >-- this._lookups = {}; >-- this.required = params.reduce(function (count, p) { >-- if (!p.name || (p.name && !p.value)) { return count + 1 } >-- else { return count } >-- }, 0); >-- this.parent = tree.Ruleset.prototype; >-- this.frames = []; >--}; >--tree.mixin.Definition.prototype = { >-- toCSS: function () { return "" }, >-- variable: function (name) { return this.parent.variable.call(this, name) }, >-- variables: function () { return this.parent.variables.call(this) }, >-- find: function () { return this.parent.find.apply(this, arguments) }, >-- rulesets: function () { return this.parent.rulesets.apply(this) }, >-- >-- evalParams: function (env, args) { >-- var frame = new(tree.Ruleset)(null, []), varargs, arg; >-- >-- for (var i = 0, val, name; i < this.params.length; i++) { >-- arg = args && args[i] >-- >-- if (arg && arg.name) { >-- frame.rules.unshift(new(tree.Rule)(arg.name, arg.value.eval(env))); >-- args.splice(i, 1); >-- i--; >-- continue; >-- } >-- >-- if (name = this.params[i].name) { >-- if (this.params[i].variadic && args) { >-- varargs = []; >-- for (var j = i; j < args.length; j++) { >-- varargs.push(args[j].value.eval(env)); >-- } >-- frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env))); >-- } else if (val = (arg && arg.value) || this.params[i].value) { >-- frame.rules.unshift(new(tree.Rule)(name, val.eval(env))); >-- } else { >-- throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + >-- ' (' + args.length + ' for ' + this.arity + ')' }; >-- } >-- } >-- } >-- return frame; >-- }, >-- eval: function (env, args, important) { >-- var frame = this.evalParams(env, args), context, _arguments = [], rules, start; >-- >-- for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) { >-- _arguments.push((args[i] && args[i].value) || this.params[i].value); >-- } >-- frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env))); >-- >-- rules = important ? >-- this.rules.map(function (r) { >-- return new(tree.Rule)(r.name, r.value, '!important', r.index); >-- }) : this.rules.slice(0); >-- >-- return new(tree.Ruleset)(null, rules).eval({ >-- frames: [this, frame].concat(this.frames, env.frames) >-- }); >-- }, >-- match: function (args, env) { >-- var argsLength = (args && args.length) || 0, len, frame; >-- >-- if (! this.variadic) { >-- if (argsLength < this.required) { return false } >-- if (argsLength > this.params.length) { return false } >-- if ((this.required > 0) && (argsLength > this.params.length)) { return false } >-- } >-- >-- if (this.condition && !this.condition.eval({ >-- frames: [this.evalParams(env, args)].concat(env.frames) >-- })) { return false } >-- >-- len = Math.min(argsLength, this.arity); >-- >-- for (var i = 0; i < len; i++) { >-- if (!this.params[i].name) { >-- if (args[i].value.eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { >-- return false; >-- } >-- } >-- } >-- return true; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Operation = function (op, operands) { >-- this.op = op.trim(); >-- this.operands = operands; >--}; >--tree.Operation.prototype.eval = function (env) { >-- var a = this.operands[0].eval(env), >-- b = this.operands[1].eval(env), >-- temp; >-- >-- if (a instanceof tree.Dimension && b instanceof tree.Color) { >-- if (this.op === '*' || this.op === '+') { >-- temp = b, b = a, a = temp; >-- } else { >-- throw { name: "OperationError", >-- message: "Can't substract or divide a color from a number" }; >-- } >-- } >-- return a.operate(this.op, b); >--}; >-- >--tree.operate = function (op, a, b) { >-- switch (op) { >-- case '+': return a + b; >-- case '-': return a - b; >-- case '*': return a * b; >-- case '/': return a / b; >-- } >--}; >-- >--})(require('../tree')); >-- >--(function (tree) { >-- >--tree.Paren = function (node) { >-- this.value = node; >--}; >--tree.Paren.prototype = { >-- toCSS: function (env) { >-- return '(' + this.value.toCSS(env) + ')'; >-- }, >-- eval: function (env) { >-- return new(tree.Paren)(this.value.eval(env)); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Quoted = function (str, content, escaped, i) { >-- this.escaped = escaped; >-- this.value = content || ''; >-- this.quote = str.charAt(0); >-- this.index = i; >--}; >--tree.Quoted.prototype = { >-- toCSS: function () { >-- if (this.escaped) { >-- return this.value; >-- } else { >-- return this.quote + this.value + this.quote; >-- } >-- }, >-- eval: function (env) { >-- var that = this; >-- var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { >-- return new(tree.JavaScript)(exp, that.index, true).eval(env).value; >-- }).replace(/@\{([\w-]+)\}/g, function (_, name) { >-- var v = new(tree.Variable)('@' + name, that.index).eval(env); >-- return ('value' in v) ? v.value : v.toCSS(); >-- }); >-- return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index); >-- }, >-- compare: function (x) { >-- if (!x.toCSS) { >-- return -1; >-- } >-- >-- var left = this.toCSS(), >-- right = x.toCSS(); >-- >-- if (left === right) { >-- return 0; >-- } >-- >-- return left < right ? -1 : 1; >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ratio = function (value) { >-- this.value = value; >--}; >--tree.Ratio.prototype = { >-- toCSS: function (env) { >-- return this.value; >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Rule = function (name, value, important, index, inline) { >-- this.name = name; >-- this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]); >-- this.important = important ? ' ' + important.trim() : ''; >-- this.index = index; >-- this.inline = inline || false; >-- >-- if (name.charAt(0) === '@') { >-- this.variable = true; >-- } else { this.variable = false } >--}; >--tree.Rule.prototype.toCSS = function (env) { >-- if (this.variable) { return "" } >-- else { >-- return this.name + (env.compress ? ':' : ': ') + >-- this.value.toCSS(env) + >-- this.important + (this.inline ? "" : ";"); >-- } >--}; >-- >--tree.Rule.prototype.eval = function (context) { >-- return new(tree.Rule)(this.name, >-- this.value.eval(context), >-- this.important, >-- this.index, this.inline); >--}; >-- >--tree.Shorthand = function (a, b) { >-- this.a = a; >-- this.b = b; >--}; >-- >--tree.Shorthand.prototype = { >-- toCSS: function (env) { >-- return this.a.toCSS(env) + "/" + this.b.toCSS(env); >-- }, >-- eval: function () { return this } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Ruleset = function (selectors, rules, strictImports) { >-- this.selectors = selectors; >-- this.rules = rules; >-- this._lookups = {}; >-- this.strictImports = strictImports; >--}; >--tree.Ruleset.prototype = { >-- eval: function (env) { >-- var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) }); >-- var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports); >-- var rules = []; >-- >-- ruleset.root = this.root; >-- ruleset.allowImports = this.allowImports; >-- >-- if(this.debugInfo) { >-- ruleset.debugInfo = this.debugInfo; >-- } >-- >-- // push the current ruleset to the frames stack >-- env.frames.unshift(ruleset); >-- >-- // Evaluate imports >-- if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.Import) { >-- rules = rules.concat(ruleset.rules[i].eval(env)); >-- } else { >-- rules.push(ruleset.rules[i]); >-- } >-- } >-- ruleset.rules = rules; >-- rules = []; >-- } >-- >-- // Store the frames around mixin definitions, >-- // so they can be evaluated like closures when the time comes. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Definition) { >-- ruleset.rules[i].frames = env.frames.slice(0); >-- } >-- } >-- >-- var mediaBlockCount = (env.mediaBlocks && env.mediaBlocks.length) || 0; >-- >-- // Evaluate mixin calls. >-- for (var i = 0; i < ruleset.rules.length; i++) { >-- if (ruleset.rules[i] instanceof tree.mixin.Call) { >-- rules = rules.concat(ruleset.rules[i].eval(env)); >-- } else { >-- rules.push(ruleset.rules[i]); >-- } >-- } >-- ruleset.rules = rules; >-- >-- // Evaluate everything else >-- for (var i = 0, rule; i < ruleset.rules.length; i++) { >-- rule = ruleset.rules[i]; >-- >-- if (! (rule instanceof tree.mixin.Definition)) { >-- ruleset.rules[i] = rule.eval ? rule.eval(env) : rule; >-- } >-- } >-- >-- // Pop the stack >-- env.frames.shift(); >-- >-- if (env.mediaBlocks) { >-- for(var i = mediaBlockCount; i < env.mediaBlocks.length; i++) { >-- env.mediaBlocks[i].bubbleSelectors(selectors); >-- } >-- } >-- >-- return ruleset; >-- }, >-- match: function (args) { >-- return !args || args.length === 0; >-- }, >-- variables: function () { >-- if (this._variables) { return this._variables } >-- else { >-- return this._variables = this.rules.reduce(function (hash, r) { >-- if (r instanceof tree.Rule && r.variable === true) { >-- hash[r.name] = r; >-- } >-- return hash; >-- }, {}); >-- } >-- }, >-- variable: function (name) { >-- return this.variables()[name]; >-- }, >-- rulesets: function () { >-- if (this._rulesets) { return this._rulesets } >-- else { >-- return this._rulesets = this.rules.filter(function (r) { >-- return (r instanceof tree.Ruleset) || (r instanceof tree.mixin.Definition); >-- }); >-- } >-- }, >-- find: function (selector, self) { >-- self = self || this; >-- var rules = [], rule, match, >-- key = selector.toCSS(); >-- >-- if (key in this._lookups) { return this._lookups[key] } >-- >-- this.rulesets().forEach(function (rule) { >-- if (rule !== self) { >-- for (var j = 0; j < rule.selectors.length; j++) { >-- if (match = selector.match(rule.selectors[j])) { >-- if (selector.elements.length > rule.selectors[j].elements.length) { >-- Array.prototype.push.apply(rules, rule.find( >-- new(tree.Selector)(selector.elements.slice(1)), self)); >-- } else { >-- rules.push(rule); >-- } >-- break; >-- } >-- } >-- } >-- }); >-- return this._lookups[key] = rules; >-- }, >-- // >-- // Entry point for code generation >-- // >-- // `context` holds an array of arrays. >-- // >-- toCSS: function (context, env) { >-- var css = [], // The CSS output >-- rules = [], // node.Rule instances >-- _rules = [], // >-- rulesets = [], // node.Ruleset instances >-- paths = [], // Current selectors >-- selector, // The fully rendered selector >-- debugInfo, // Line number debugging >-- rule; >-- >-- if (! this.root) { >-- this.joinSelectors(paths, context, this.selectors); >-- } >-- >-- // Compile rules and rulesets >-- for (var i = 0; i < this.rules.length; i++) { >-- rule = this.rules[i]; >-- >-- if (rule.rules || (rule instanceof tree.Directive) || (rule instanceof tree.Media)) { >-- rulesets.push(rule.toCSS(paths, env)); >-- } else if (rule instanceof tree.Comment) { >-- if (!rule.silent) { >-- if (this.root) { >-- rulesets.push(rule.toCSS(env)); >-- } else { >-- rules.push(rule.toCSS(env)); >-- } >-- } >-- } else { >-- if (rule.toCSS && !rule.variable) { >-- rules.push(rule.toCSS(env)); >-- } else if (rule.value && !rule.variable) { >-- rules.push(rule.value.toString()); >-- } >-- } >-- } >-- >-- rulesets = rulesets.join(''); >-- >-- // If this is the root node, we don't render >-- // a selector, or {}. >-- // Otherwise, only output if this ruleset has rules. >-- if (this.root) { >-- css.push(rules.join(env.compress ? '' : '\n')); >-- } else { >-- if (rules.length > 0) { >-- debugInfo = tree.debugInfo(env, this); >-- selector = paths.map(function (p) { >-- return p.map(function (s) { >-- return s.toCSS(env); >-- }).join('').trim(); >-- }).join(env.compress ? ',' : ',\n'); >-- >-- // Remove duplicates >-- for (var i = rules.length - 1; i >= 0; i--) { >-- if (_rules.indexOf(rules[i]) === -1) { >-- _rules.unshift(rules[i]); >-- } >-- } >-- rules = _rules; >-- >-- css.push(debugInfo + selector + >-- (env.compress ? '{' : ' {\n ') + >-- rules.join(env.compress ? '' : '\n ') + >-- (env.compress ? '}' : '\n}\n')); >-- } >-- } >-- css.push(rulesets); >-- >-- return css.join('') + (env.compress ? '\n' : ''); >-- }, >-- >-- joinSelectors: function (paths, context, selectors) { >-- for (var s = 0; s < selectors.length; s++) { >-- this.joinSelector(paths, context, selectors[s]); >-- } >-- }, >-- >-- joinSelector: function (paths, context, selector) { >-- >-- var i, j, k, >-- hasParentSelector, newSelectors, el, sel, parentSel, >-- newSelectorPath, afterParentJoin, newJoinedSelector, >-- newJoinedSelectorEmpty, lastSelector, currentElements, >-- selectorsMultiplied; >-- >-- for (i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- if (el.value === '&') { >-- hasParentSelector = true; >-- } >-- } >-- >-- if (!hasParentSelector) { >-- if (context.length > 0) { >-- for(i = 0; i < context.length; i++) { >-- paths.push(context[i].concat(selector)); >-- } >-- } >-- else { >-- paths.push([selector]); >-- } >-- return; >-- } >-- >-- // The paths are [[Selector]] >-- // The first list is a list of comma seperated selectors >-- // The inner list is a list of inheritance seperated selectors >-- // e.g. >-- // .a, .b { >-- // .c { >-- // } >-- // } >-- // == [[.a] [.c]] [[.b] [.c]] >-- // >-- >-- // the elements from the current selector so far >-- currentElements = []; >-- // the current list of new selectors to add to the path. >-- // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors >-- // by the parents >-- newSelectors = [[]]; >-- >-- for (i = 0; i < selector.elements.length; i++) { >-- el = selector.elements[i]; >-- // non parent reference elements just get added >-- if (el.value !== "&") { >-- currentElements.push(el); >-- } else { >-- // the new list of selectors to add >-- selectorsMultiplied = []; >-- >-- // merge the current list of non parent selector elements >-- // on to the current list of selectors to add >-- if (currentElements.length > 0) { >-- this.mergeElementsOnToSelectors(currentElements, newSelectors); >-- } >-- >-- // loop through our current selectors >-- for(j = 0; j < newSelectors.length; j++) { >-- sel = newSelectors[j]; >-- // if we don't have any parent paths, the & might be in a mixin so that it can be used >-- // whether there are parents or not >-- if (context.length == 0) { >-- // the combinator used on el should now be applied to the next element instead so that >-- // it is not lost >-- if (sel.length > 0) { >-- sel[0].elements = sel[0].elements.slice(0); >-- sel[0].elements.push(new(tree.Element)(el.combinator, '', 0)); //new Element(el.Combinator, "")); >-- } >-- selectorsMultiplied.push(sel); >-- } >-- else { >-- // and the parent selectors >-- for(k = 0; k < context.length; k++) { >-- parentSel = context[k]; >-- // We need to put the current selectors >-- // then join the last selector's elements on to the parents selectors >-- >-- // our new selector path >-- newSelectorPath = []; >-- // selectors from the parent after the join >-- afterParentJoin = []; >-- newJoinedSelectorEmpty = true; >-- >-- //construct the joined selector - if & is the first thing this will be empty, >-- // if not newJoinedSelector will be the last set of elements in the selector >-- if (sel.length > 0) { >-- newSelectorPath = sel.slice(0); >-- lastSelector = newSelectorPath.pop(); >-- newJoinedSelector = new(tree.Selector)(lastSelector.elements.slice(0)); >-- newJoinedSelectorEmpty = false; >-- } >-- else { >-- newJoinedSelector = new(tree.Selector)([]); >-- } >-- >-- //put together the parent selectors after the join >-- if (parentSel.length > 1) { >-- afterParentJoin = afterParentJoin.concat(parentSel.slice(1)); >-- } >-- >-- if (parentSel.length > 0) { >-- newJoinedSelectorEmpty = false; >-- >-- // join the elements so far with the first part of the parent >-- newJoinedSelector.elements.push(new(tree.Element)(el.combinator, parentSel[0].elements[0].value, 0)); >-- newJoinedSelector.elements = newJoinedSelector.elements.concat(parentSel[0].elements.slice(1)); >-- } >-- >-- if (!newJoinedSelectorEmpty) { >-- // now add the joined selector >-- newSelectorPath.push(newJoinedSelector); >-- } >-- >-- // and the rest of the parent >-- newSelectorPath = newSelectorPath.concat(afterParentJoin); >-- >-- // add that to our new set of selectors >-- selectorsMultiplied.push(newSelectorPath); >-- } >-- } >-- } >-- >-- // our new selectors has been multiplied, so reset the state >-- newSelectors = selectorsMultiplied; >-- currentElements = []; >-- } >-- } >-- >-- // if we have any elements left over (e.g. .a& .b == .b) >-- // add them on to all the current selectors >-- if (currentElements.length > 0) { >-- this.mergeElementsOnToSelectors(currentElements, newSelectors); >-- } >-- >-- for(i = 0; i < newSelectors.length; i++) { >-- paths.push(newSelectors[i]); >-- } >-- }, >-- >-- mergeElementsOnToSelectors: function(elements, selectors) { >-- var i, sel; >-- >-- if (selectors.length == 0) { >-- selectors.push([ new(tree.Selector)(elements) ]); >-- return; >-- } >-- >-- for(i = 0; i < selectors.length; i++) { >-- sel = selectors[i]; >-- >-- // if the previous thing in sel is a parent this needs to join on to it >-- if (sel.length > 0) { >-- sel[sel.length - 1] = new(tree.Selector)(sel[sel.length - 1].elements.concat(elements)); >-- } >-- else { >-- sel.push(new(tree.Selector)(elements)); >-- } >-- } >-- } >--}; >--})(require('../tree')); >--(function (tree) { >-- >--tree.Selector = function (elements) { >-- this.elements = elements; >--}; >--tree.Selector.prototype.match = function (other) { >-- var len = this.elements.length, >-- olen = other.elements.length, >-- max = Math.min(len, olen); >-- >-- if (len < olen) { >-- return false; >-- } else { >-- for (var i = 0; i < max; i++) { >-- if (this.elements[i].value !== other.elements[i].value) { >-- return false; >-- } >-- } >-- } >-- return true; >--}; >--tree.Selector.prototype.eval = function (env) { >-- return new(tree.Selector)(this.elements.map(function (e) { >-- return e.eval(env); >-- })); >--}; >--tree.Selector.prototype.toCSS = function (env) { >-- if (this._css) { return this._css } >-- >-- if (this.elements[0].combinator.value === "") { >-- this._css = ' '; >-- } else { >-- this._css = ''; >-- } >-- >-- this._css += this.elements.map(function (e) { >-- if (typeof(e) === 'string') { >-- return ' ' + e.trim(); >-- } else { >-- return e.toCSS(env); >-- } >-- }).join(''); >-- >-- return this._css; >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.URL = function (val, paths) { >-- this.value = val; >-- this.paths = paths; >--}; >--tree.URL.prototype = { >-- toCSS: function () { >-- return "url(" + this.value.toCSS() + ")"; >-- }, >-- eval: function (ctx) { >-- var val = this.value.eval(ctx); >-- >-- // Add the base path if the URL is relative and we are in the browser >-- if (typeof window !== 'undefined' && typeof val.value === "string" && !/^(?:[a-z-]+:|\/)/.test(val.value) && this.paths.length > 0) { >-- val.value = this.paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); >-- } >-- >-- return new(tree.URL)(val, this.paths); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Value = function (value) { >-- this.value = value; >-- this.is = 'value'; >--}; >--tree.Value.prototype = { >-- eval: function (env) { >-- if (this.value.length === 1) { >-- return this.value[0].eval(env); >-- } else { >-- return new(tree.Value)(this.value.map(function (v) { >-- return v.eval(env); >-- })); >-- } >-- }, >-- toCSS: function (env) { >-- return this.value.map(function (e) { >-- return e.toCSS(env); >-- }).join(env.compress ? ',' : ', '); >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file }; >--tree.Variable.prototype = { >-- eval: function (env) { >-- var variable, v, name = this.name; >-- >-- if (name.indexOf('@@') == 0) { >-- name = '@' + new(tree.Variable)(name.slice(1)).eval(env).value; >-- } >-- >-- if (variable = tree.find(env.frames, function (frame) { >-- if (v = frame.variable(name)) { >-- return v.value.eval(env); >-- } >-- })) { return variable } >-- else { >-- throw { type: 'Name', >-- message: "variable " + name + " is undefined", >-- filename: this.file, >-- index: this.index }; >-- } >-- } >--}; >-- >--})(require('../tree')); >--(function (tree) { >-- >--tree.debugInfo = function(env, ctx) { >-- var result=""; >-- if (env.dumpLineNumbers && !env.compress) { >-- switch(env.dumpLineNumbers) { >-- case 'comments': >-- result = tree.debugInfo.asComment(ctx); >-- break; >-- case 'mediaquery': >-- result = tree.debugInfo.asMediaQuery(ctx); >-- break; >-- case 'all': >-- result = tree.debugInfo.asComment(ctx)+tree.debugInfo.asMediaQuery(ctx); >-- break; >-- } >-- } >-- return result; >--}; >-- >--tree.debugInfo.asComment = function(ctx) { >-- return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; >--}; >-- >--tree.debugInfo.asMediaQuery = function(ctx) { >-- return '@media -sass-debug-info{filename{font-family:"' + ctx.debugInfo.fileName + '";}line{font-family:"' + ctx.debugInfo.lineNumber + '";}}\n'; >--}; >-- >--tree.find = function (obj, fun) { >-- for (var i = 0, r; i < obj.length; i++) { >-- if (r = fun.call(obj, obj[i])) { return r } >-- } >-- return null; >--}; >--tree.jsify = function (obj) { >-- if (Array.isArray(obj.value) && (obj.value.length > 1)) { >-- return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']'; >-- } else { >-- return obj.toCSS(false); >-- } >--}; >-- >--})(require('./tree')); >--var name; >-- >--function loadStyleSheet(sheet, callback, reload, remaining) { >-- var endOfPath = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\')), >-- sheetName = name.slice(0, endOfPath + 1) + sheet.href, >-- contents = sheet.contents || {}, >-- input = readFile(sheetName); >-- >-- contents[sheetName] = input; >-- >-- var parser = new less.Parser({ >-- paths: [sheet.href.replace(/[\w\.-]+$/, '')], >-- contents: contents >-- }); >-- parser.parse(input, function (e, root) { >-- if (e) { >-- return error(e, sheetName); >-- } >-- try { >-- callback(e, root, sheet, { local: false, lastModified: 0, remaining: remaining }); >-- } catch(e) { >-- error(e, sheetName); >-- } >-- }); >--} >-- >--function writeFile(filename, content) { >-- var fstream = new java.io.FileWriter(filename); >-- var out = new java.io.BufferedWriter(fstream); >-- out.write(content); >-- out.close(); >--} >-- >--// Command line integration via Rhino >--(function (args) { >-- var output, >-- compress = false, >-- i; >-- >-- for(i = 0; i < args.length; i++) { >-- switch(args[i]) { >-- case "-x": >-- compress = true; >-- break; >-- default: >-- if (!name) { >-- name = args[i]; >-- } else if (!output) { >-- output = args[i]; >-- } else { >-- print("unrecognised parameters"); >-- print("input_file [output_file] [-x]"); >-- } >-- } >-- } >-- >-- if (!name) { >-- print('No files present in the fileset; Check your pattern match in build.xml'); >-- quit(1); >-- } >-- path = name.split("/");path.pop();path=path.join("/") >-- >-- var input = readFile(name); >-- >-- if (!input) { >-- print('lesscss: couldn\'t open file ' + name); >-- quit(1); >-- } >-- >-- var result; >-- try { >-- var parser = new less.Parser(); >-- parser.parse(input, function (e, root) { >-- if (e) { >-- error(e, name); >-- quit(1); >-- } else { >-- result = root.toCSS({compress: compress || false}); >-- if (output) { >-- writeFile(output, result); >-- print("Written to " + output); >-- } else { >-- print(result); >-- } >-- quit(0); >-- } >-- }); >-- } >-- catch(e) { >-- error(e, name); >-- quit(1); >-- } >-- print("done"); >--}(arguments)); >-- >--function error(e, filename) { >-- >-- var content = "Error : " + filename + "\n"; >-- >-- filename = e.filename || filename; >-- >-- if (e.message) { >-- content += e.message + "\n"; >-- } >-- >-- var errorline = function (e, i, classname) { >-- if (e.extract[i]) { >-- content += >-- String(parseInt(e.line) + (i - 1)) + >-- ":" + e.extract[i] + "\n"; >-- } >-- }; >-- >-- if (e.stack) { >-- content += e.stack; >-- } else if (e.extract) { >-- content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':\n'; >-- errorline(e, 0); >-- errorline(e, 1); >-- errorline(e, 2); >-- } >-- print(content); >--} >-\ No newline at end of file >--- >-1.8.0.1 >- >diff --git a/lessjs-1.3.1-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch b/lessjs-1.3.1-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch >new file mode 100644 >index 0000000..ce60ebe >--- /dev/null >+++ b/lessjs-1.3.1-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch >@@ -0,0 +1,43 @@ >+From ea94b55d0b71b79d80ce80cc964983f20e7054d1 Mon Sep 17 00:00:00 2001 >+From: Stephen Gallagher <sgallagh@redhat.com> >+Date: Wed, 19 Dec 2012 09:06:24 -0500 >+Subject: [PATCH 3/4] substitute paths to use /usr/share instead of /usr/lib >+ >+--- >+ bin/lessc | 6 +++--- >+ 1 file changed, 3 insertions(+), 3 deletions(-) >+ >+diff --git a/bin/lessc b/bin/lessc >+index af96ea237b3fb82284b38babf6562b7c5849f668..231298719ed0b9f745281f71e4cf374aec13c04c 100755 >+--- a/bin/lessc >++++ b/bin/lessc >+@@ -5,7 +5,7 @@ var path = require('path'), >+ sys = require('util'), >+ os = require('os'); >+ >+-var less = require('../lib/less'); >++var less = require('../share/less'); >+ var args = process.argv.slice(1); >+ var options = { >+ compress: false, >+@@ -51,7 +51,7 @@ args = args.filter(function (arg) { >+ break; >+ case 'h': >+ case 'help': >+- require('../lib/less/lessc_helper').printUsage(); >++ require('../share/less/lessc_helper').printUsage(); >+ continueProcessing = false; >+ case 'x': >+ case 'compress': >+@@ -99,7 +99,7 @@ if (output) { >+ if (! input) { >+ sys.puts("lessc: no input files"); >+ sys.puts(""); >+- require('../lib/less/lessc_helper').printUsage(); >++ require('../share/less/lessc_helper').printUsage(); >+ currentErrorcode = 1; >+ return; >+ } >+-- >+1.8.0.1 >+ >diff --git a/lessjs.spec b/lessjs.spec >index cf05908..eb23597 100644 >--- a/lessjs.spec >+++ b/lessjs.spec >@@ -1,32 +1,16 @@ > Name: lessjs >-Version: 1.3.1 >-Release: 5%{?dist} >+Version: 1.3.3 >+Release: 1%{?dist} > Summary: Less.js The dynamic stylesheet language >- >-# cssmin.js is licensed under BSD license >-# everything else is ASL 2.0 >-License: ASL 2.0 and BSD >- >+License: ASL 2.0 > URL: http://lesscss.org >-# The source URL does not match the output filename: >-# Source0: https://github.com/cloudhead/less.js/archive/v%{version}.tar.gz >-Source0: less.js-%{version}.tar.gz >- >-# Fedora/EPEL patch to disable YUI compression because lessjs otherwise >-# would be carrying a bundled copy of cssmin.js >-Patch0001: 0001-Disable-YUI-compression.patch >- >-# Upstream version number is incorrect for 1.3.1 >-Patch0002: 0002-Fix-version-number.patch >+Source0: http://registry.npmjs.org/less/-/less-%{version}.tgz > > # Use /usr/share paths instead of /usr/lib >-Patch0003: 0003-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch >- >-# Remove pre-built files from the dist/ directory >-Patch0004: 0004-Remove-pre-builds.patch >+Patch0: %{name}-1.3.1-substitute-paths-to-use-usr-share-instead-of-usr-lib.patch > > BuildArch: noarch >-BuildRequires: nodejs >+BuildRequires: nodejs-devel > Requires: nodejs > > %description >@@ -35,12 +19,9 @@ and functions. LESS runs on both the client-side (Chrome, Safari, Firefox) > and server-side, with Node.js and Rhino. > > %prep >-%setup -q -n less.js-%{version} >+%setup -q -n package >+%patch0 -p1 > >-%patch0001 -p1 >-%patch0002 -p1 >-%patch0003 -p1 >-%patch0004 -p1 > > %build > # Nothing to be built, we're just carrying around flat files >@@ -62,6 +43,10 @@ cp -rp lib/less %{buildroot}%{_datadir} > > > %changelog >+* Fri Mar 15 2013 Jamie Nguyen <jamielinux@fedoraproject.org> - 1.3.3-1 >+- update to upstream release 1.3.3 >+- cssmin.js has now been unbundled upstream >+ > * Thu Feb 14 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.1-5 > - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild > >diff --git a/sources b/sources >index 4d6e6d8..c7124e7 100644 >--- a/sources >+++ b/sources >@@ -1 +1 @@ >-ea231720e2d8818055fb9474d7c79d71 less.js-1.3.1.tar.gz >+b40123e3fc653dc440c577ee9dea3177 less-1.3.3.tgz >-- >1.8.1.4 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 921932
: 710531 |
710532