less-js-source 1.1.3 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/less-js-source.gemspec +1 -1
- data/lib/less_js/less.js +1546 -420
- metadata +23 -39
data/less-js-source.gemspec
CHANGED
data/lib/less_js/less.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
//
|
2
|
-
// LESS - Leaner CSS v1.
|
2
|
+
// LESS - Leaner CSS v1.3.0
|
3
3
|
// http://lesscss.org
|
4
4
|
//
|
5
5
|
// Copyright (c) 2009-2011, Alexis Sellier
|
@@ -13,6 +13,12 @@ function require(arg) {
|
|
13
13
|
return window.less[arg.split('/')[1]];
|
14
14
|
};
|
15
15
|
|
16
|
+
// amd.js
|
17
|
+
//
|
18
|
+
// Define Less as an AMD module.
|
19
|
+
if (typeof define === "function" && define.amd) {
|
20
|
+
define("less", [], function () { return less; } );
|
21
|
+
}
|
16
22
|
|
17
23
|
// ecma-5.js
|
18
24
|
//
|
@@ -135,13 +141,24 @@ if (!String.prototype.trim) {
|
|
135
141
|
}
|
136
142
|
var less, tree;
|
137
143
|
|
138
|
-
if (typeof(
|
144
|
+
if (typeof environment === "object" && ({}).toString.call(environment) === "[object Environment]") {
|
145
|
+
// Rhino
|
146
|
+
// Details on how to detect Rhino: https://github.com/ringo/ringojs/issues/88
|
147
|
+
if (typeof(window) === 'undefined') { less = {} }
|
148
|
+
else { less = window.less = {} }
|
149
|
+
tree = less.tree = {};
|
150
|
+
less.mode = 'rhino';
|
151
|
+
} else if (typeof(window) === 'undefined') {
|
152
|
+
// Node.js
|
139
153
|
less = exports,
|
140
|
-
tree = require('
|
154
|
+
tree = require('./tree');
|
155
|
+
less.mode = 'node';
|
141
156
|
} else {
|
157
|
+
// Browser
|
142
158
|
if (typeof(window.less) === 'undefined') { window.less = {} }
|
143
159
|
less = window.less,
|
144
160
|
tree = window.less.tree = {};
|
161
|
+
less.mode = 'browser';
|
145
162
|
}
|
146
163
|
//
|
147
164
|
// less.js - parser
|
@@ -197,7 +214,9 @@ less.Parser = function Parser(env) {
|
|
197
214
|
paths: env && env.paths || [], // Search paths, when importing
|
198
215
|
queue: [], // Files which haven't been imported yet
|
199
216
|
files: {}, // Holds the imported parse trees
|
217
|
+
contents: {}, // Holds the imported file contents
|
200
218
|
mime: env && env.mime, // MIME type of .less files
|
219
|
+
error: null, // Error in parsing/evaluating an import
|
201
220
|
push: function (path, callback) {
|
202
221
|
var that = this;
|
203
222
|
this.queue.push(path);
|
@@ -205,11 +224,13 @@ less.Parser = function Parser(env) {
|
|
205
224
|
//
|
206
225
|
// Import a file asynchronously
|
207
226
|
//
|
208
|
-
less.Parser.importer(path, this.paths, function (root) {
|
227
|
+
less.Parser.importer(path, this.paths, function (e, root, contents) {
|
209
228
|
that.queue.splice(that.queue.indexOf(path), 1); // Remove the path from the queue
|
210
229
|
that.files[path] = root; // Store the root
|
230
|
+
that.contents[path] = contents;
|
211
231
|
|
212
|
-
|
232
|
+
if (e && !that.error) { that.error = e }
|
233
|
+
callback(e, root);
|
213
234
|
|
214
235
|
if (that.queue.length === 0) { finish() } // Call `finish` if we're done importing
|
215
236
|
}, env);
|
@@ -283,6 +304,20 @@ less.Parser = function Parser(env) {
|
|
283
304
|
}
|
284
305
|
}
|
285
306
|
|
307
|
+
function expect(arg, msg) {
|
308
|
+
var result = $(arg);
|
309
|
+
if (! result) {
|
310
|
+
error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'"
|
311
|
+
: "unexpected token"));
|
312
|
+
} else {
|
313
|
+
return result;
|
314
|
+
}
|
315
|
+
}
|
316
|
+
|
317
|
+
function error(msg, type) {
|
318
|
+
throw { index: i, type: type || 'Syntax', message: msg };
|
319
|
+
}
|
320
|
+
|
286
321
|
// Same as $(), but don't change the state of the parser,
|
287
322
|
// just return the match.
|
288
323
|
function peek(tok) {
|
@@ -297,6 +332,54 @@ less.Parser = function Parser(env) {
|
|
297
332
|
}
|
298
333
|
}
|
299
334
|
|
335
|
+
function basename(pathname) {
|
336
|
+
if (less.mode === 'node') {
|
337
|
+
return require('path').basename(pathname);
|
338
|
+
} else {
|
339
|
+
return pathname.match(/[^\/]+$/)[0];
|
340
|
+
}
|
341
|
+
}
|
342
|
+
|
343
|
+
function getInput(e, env) {
|
344
|
+
if (e.filename && env.filename && (e.filename !== env.filename)) {
|
345
|
+
return parser.imports.contents[basename(e.filename)];
|
346
|
+
} else {
|
347
|
+
return input;
|
348
|
+
}
|
349
|
+
}
|
350
|
+
|
351
|
+
function getLocation(index, input) {
|
352
|
+
for (var n = index, column = -1;
|
353
|
+
n >= 0 && input.charAt(n) !== '\n';
|
354
|
+
n--) { column++ }
|
355
|
+
|
356
|
+
return { line: typeof(index) === 'number' ? (input.slice(0, index).match(/\n/g) || "").length : null,
|
357
|
+
column: column };
|
358
|
+
}
|
359
|
+
|
360
|
+
function LessError(e, env) {
|
361
|
+
var input = getInput(e, env),
|
362
|
+
loc = getLocation(e.index, input),
|
363
|
+
line = loc.line,
|
364
|
+
col = loc.column,
|
365
|
+
lines = input.split('\n');
|
366
|
+
|
367
|
+
this.type = e.type || 'Syntax';
|
368
|
+
this.message = e.message;
|
369
|
+
this.filename = e.filename || env.filename;
|
370
|
+
this.index = e.index;
|
371
|
+
this.line = typeof(line) === 'number' ? line + 1 : null;
|
372
|
+
this.callLine = e.call && (getLocation(e.call, input).line + 1);
|
373
|
+
this.callExtract = lines[getLocation(e.call, input).line];
|
374
|
+
this.stack = e.stack;
|
375
|
+
this.column = col;
|
376
|
+
this.extract = [
|
377
|
+
lines[line - 1],
|
378
|
+
lines[line],
|
379
|
+
lines[line + 1]
|
380
|
+
];
|
381
|
+
}
|
382
|
+
|
300
383
|
this.env = env = env || {};
|
301
384
|
|
302
385
|
// The optimization level dictates the thoroughness of the parser,
|
@@ -321,19 +404,18 @@ less.Parser = function Parser(env) {
|
|
321
404
|
var root, start, end, zone, line, lines, buff = [], c, error = null;
|
322
405
|
|
323
406
|
i = j = current = furthest = 0;
|
324
|
-
chunks = [];
|
325
407
|
input = str.replace(/\r\n/g, '\n');
|
326
408
|
|
327
409
|
// Split the input into chunks.
|
328
410
|
chunks = (function (chunks) {
|
329
411
|
var j = 0,
|
330
|
-
skip = /[^"'`\{\}\/\(\)]+/g,
|
412
|
+
skip = /[^"'`\{\}\/\(\)\\]+/g,
|
331
413
|
comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,
|
414
|
+
string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`\\\r\n]|\\.)*)`/g,
|
332
415
|
level = 0,
|
333
416
|
match,
|
334
417
|
chunk = chunks[0],
|
335
|
-
inParam
|
336
|
-
inString;
|
418
|
+
inParam;
|
337
419
|
|
338
420
|
for (var i = 0, c, cc; i < input.length; i++) {
|
339
421
|
skip.lastIndex = i;
|
@@ -344,9 +426,17 @@ less.Parser = function Parser(env) {
|
|
344
426
|
}
|
345
427
|
}
|
346
428
|
c = input.charAt(i);
|
347
|
-
comment.lastIndex = i;
|
429
|
+
comment.lastIndex = string.lastIndex = i;
|
430
|
+
|
431
|
+
if (match = string.exec(input)) {
|
432
|
+
if (match.index === i) {
|
433
|
+
i += match[0].length;
|
434
|
+
chunk.push(match[0]);
|
435
|
+
c = input.charAt(i);
|
436
|
+
}
|
437
|
+
}
|
348
438
|
|
349
|
-
if (!
|
439
|
+
if (!inParam && c === '/') {
|
350
440
|
cc = input.charAt(i + 1);
|
351
441
|
if (cc === '/' || cc === '*') {
|
352
442
|
if (match = comment.exec(input)) {
|
@@ -359,51 +449,46 @@ less.Parser = function Parser(env) {
|
|
359
449
|
}
|
360
450
|
}
|
361
451
|
|
362
|
-
|
363
|
-
chunk.push(c);
|
364
|
-
|
365
|
-
chunk.push(c);
|
366
|
-
|
367
|
-
|
368
|
-
chunk.push(c);
|
369
|
-
inParam = true;
|
370
|
-
} else if (c === ')' && !inString && inParam) {
|
371
|
-
chunk.push(c);
|
372
|
-
inParam = false;
|
373
|
-
} else {
|
374
|
-
if (c === '"' || c === "'" || c === '`') {
|
375
|
-
if (! inString) {
|
376
|
-
inString = c;
|
377
|
-
} else {
|
378
|
-
inString = inString === c ? false : inString;
|
379
|
-
}
|
380
|
-
}
|
381
|
-
chunk.push(c);
|
452
|
+
switch (c) {
|
453
|
+
case '{': if (! inParam) { level ++; chunk.push(c); break }
|
454
|
+
case '}': if (! inParam) { level --; chunk.push(c); chunks[++j] = chunk = []; break }
|
455
|
+
case '(': if (! inParam) { inParam = true; chunk.push(c); break }
|
456
|
+
case ')': if ( inParam) { inParam = false; chunk.push(c); break }
|
457
|
+
default: chunk.push(c);
|
382
458
|
}
|
383
459
|
}
|
384
460
|
if (level > 0) {
|
385
|
-
|
386
|
-
|
387
|
-
|
461
|
+
error = new(LessError)({
|
462
|
+
index: i,
|
463
|
+
type: 'Parse',
|
464
|
+
message: "missing closing `}`",
|
388
465
|
filename: env.filename
|
389
|
-
};
|
466
|
+
}, env);
|
390
467
|
}
|
391
468
|
|
392
469
|
return chunks.map(function (c) { return c.join('') });;
|
393
470
|
})([[]]);
|
394
471
|
|
472
|
+
if (error) {
|
473
|
+
return callback(error);
|
474
|
+
}
|
475
|
+
|
395
476
|
// Start with the primary rule.
|
396
477
|
// The whole syntax tree is held under a Ruleset node,
|
397
478
|
// with the `root` property set to true, so no `{}` are
|
398
479
|
// output. The callback is called when the input is parsed.
|
399
|
-
|
400
|
-
|
480
|
+
try {
|
481
|
+
root = new(tree.Ruleset)([], $(this.parsers.primary));
|
482
|
+
root.root = true;
|
483
|
+
} catch (e) {
|
484
|
+
return callback(new(LessError)(e, env));
|
485
|
+
}
|
401
486
|
|
402
487
|
root.toCSS = (function (evaluate) {
|
403
488
|
var line, lines, column;
|
404
489
|
|
405
490
|
return function (options, variables) {
|
406
|
-
var frames = [];
|
491
|
+
var frames = [], importError;
|
407
492
|
|
408
493
|
options = options || {};
|
409
494
|
//
|
@@ -438,39 +523,21 @@ less.Parser = function Parser(env) {
|
|
438
523
|
var css = evaluate.call(this, { frames: frames })
|
439
524
|
.toCSS([], { compress: options.compress || false });
|
440
525
|
} catch (e) {
|
441
|
-
|
442
|
-
line = getLine(e.index);
|
443
|
-
|
444
|
-
for (var n = e.index, column = -1;
|
445
|
-
n >= 0 && input.charAt(n) !== '\n';
|
446
|
-
n--) { column++ }
|
447
|
-
|
448
|
-
throw {
|
449
|
-
type: e.type,
|
450
|
-
message: e.message,
|
451
|
-
filename: env.filename,
|
452
|
-
index: e.index,
|
453
|
-
line: typeof(line) === 'number' ? line + 1 : null,
|
454
|
-
callLine: e.call && (getLine(e.call) + 1),
|
455
|
-
callExtract: lines[getLine(e.call)],
|
456
|
-
stack: e.stack,
|
457
|
-
column: column,
|
458
|
-
extract: [
|
459
|
-
lines[line - 1],
|
460
|
-
lines[line],
|
461
|
-
lines[line + 1]
|
462
|
-
]
|
463
|
-
};
|
526
|
+
throw new(LessError)(e, env);
|
464
527
|
}
|
465
|
-
|
528
|
+
|
529
|
+
if ((importError = parser.imports.error)) { // Check if there was an error during importing
|
530
|
+
if (importError instanceof LessError) throw importError;
|
531
|
+
else throw new(LessError)(importError, env);
|
532
|
+
}
|
533
|
+
|
534
|
+
if (options.yuicompress && less.mode === 'node') {
|
535
|
+
return require('./cssmin').compressor.cssmin(css);
|
536
|
+
} else if (options.compress) {
|
466
537
|
return css.replace(/(\s)+/g, "$1");
|
467
538
|
} else {
|
468
539
|
return css;
|
469
540
|
}
|
470
|
-
|
471
|
-
function getLine(index) {
|
472
|
-
return index ? (input.slice(0, index).match(/\n/g) || "").length : null;
|
473
|
-
}
|
474
541
|
};
|
475
542
|
})(root.eval);
|
476
543
|
|
@@ -490,7 +557,7 @@ less.Parser = function Parser(env) {
|
|
490
557
|
for (var n = i, column = -1; n >= 0 && input.charAt(n) !== '\n'; n--) { column++ }
|
491
558
|
|
492
559
|
error = {
|
493
|
-
|
560
|
+
type: "Parse",
|
494
561
|
message: "Syntax Error on line " + line,
|
495
562
|
index: i,
|
496
563
|
filename: env.filename,
|
@@ -611,7 +678,15 @@ less.Parser = function Parser(env) {
|
|
611
678
|
//
|
612
679
|
keyword: function () {
|
613
680
|
var k;
|
614
|
-
|
681
|
+
|
682
|
+
if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) {
|
683
|
+
if (tree.colors.hasOwnProperty(k)) {
|
684
|
+
// detect named color
|
685
|
+
return new(tree.Color)(tree.colors[k].slice(1));
|
686
|
+
} else {
|
687
|
+
return new(tree.Keyword)(k);
|
688
|
+
}
|
689
|
+
}
|
615
690
|
},
|
616
691
|
|
617
692
|
//
|
@@ -627,7 +702,7 @@ less.Parser = function Parser(env) {
|
|
627
702
|
call: function () {
|
628
703
|
var name, args, index = i;
|
629
704
|
|
630
|
-
if (! (name = /^([\w-]
|
705
|
+
if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return;
|
631
706
|
|
632
707
|
name = name[1].toLowerCase();
|
633
708
|
|
@@ -642,12 +717,12 @@ less.Parser = function Parser(env) {
|
|
642
717
|
|
643
718
|
if (! $(')')) return;
|
644
719
|
|
645
|
-
if (name) { return new(tree.Call)(name, args, index) }
|
720
|
+
if (name) { return new(tree.Call)(name, args, index, env.filename) }
|
646
721
|
},
|
647
722
|
arguments: function () {
|
648
723
|
var args = [], arg;
|
649
724
|
|
650
|
-
while (arg = $(this.expression)) {
|
725
|
+
while (arg = $(this.entities.assignment) || $(this.expression)) {
|
651
726
|
args.push(arg);
|
652
727
|
if (! $(',')) { break }
|
653
728
|
}
|
@@ -659,6 +734,19 @@ less.Parser = function Parser(env) {
|
|
659
734
|
$(this.entities.quoted);
|
660
735
|
},
|
661
736
|
|
737
|
+
// Assignments are argument entities for calls.
|
738
|
+
// They are present in ie filter properties as shown below.
|
739
|
+
//
|
740
|
+
// filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )
|
741
|
+
//
|
742
|
+
|
743
|
+
assignment: function () {
|
744
|
+
var key, value;
|
745
|
+
if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) {
|
746
|
+
return new(tree.Assignment)(key, value);
|
747
|
+
}
|
748
|
+
},
|
749
|
+
|
662
750
|
//
|
663
751
|
// Parse url() tokens
|
664
752
|
//
|
@@ -672,7 +760,8 @@ less.Parser = function Parser(env) {
|
|
672
760
|
if (input.charAt(i) !== 'u' || !$(/^url\(/)) return;
|
673
761
|
value = $(this.entities.quoted) || $(this.entities.variable) ||
|
674
762
|
$(this.entities.dataURI) || $(/^[-\w%@$\/.&=:;#+?~]+/) || "";
|
675
|
-
|
763
|
+
|
764
|
+
expect(')');
|
676
765
|
|
677
766
|
return new(tree.URL)((value.value || value.data || value instanceof tree.Variable)
|
678
767
|
? value : new(tree.Anonymous)(value), imports.paths);
|
@@ -704,7 +793,7 @@ less.Parser = function Parser(env) {
|
|
704
793
|
var name, index = i;
|
705
794
|
|
706
795
|
if (input.charAt(i) === '@' && (name = $(/^@@?[\w-]+/))) {
|
707
|
-
return new(tree.Variable)(name, index);
|
796
|
+
return new(tree.Variable)(name, index, env.filename);
|
708
797
|
}
|
709
798
|
},
|
710
799
|
|
@@ -732,7 +821,7 @@ less.Parser = function Parser(env) {
|
|
732
821
|
var value, c = input.charCodeAt(i);
|
733
822
|
if ((c > 57 || c < 45) || c === 47) return;
|
734
823
|
|
735
|
-
if (value = $(/^(-?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) {
|
824
|
+
if (value = $(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/)) {
|
736
825
|
return new(tree.Dimension)(value[1], value[2]);
|
737
826
|
}
|
738
827
|
},
|
@@ -800,18 +889,22 @@ less.Parser = function Parser(env) {
|
|
800
889
|
// selector for now.
|
801
890
|
//
|
802
891
|
call: function () {
|
803
|
-
var elements = [], e, c, args, index = i, s = input.charAt(i);
|
892
|
+
var elements = [], e, c, args, index = i, s = input.charAt(i), important = false;
|
804
893
|
|
805
894
|
if (s !== '.' && s !== '#') { return }
|
806
895
|
|
807
896
|
while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) {
|
808
|
-
elements.push(new(tree.Element)(c, e));
|
897
|
+
elements.push(new(tree.Element)(c, e, i));
|
809
898
|
c = $('>');
|
810
899
|
}
|
811
900
|
$('(') && (args = $(this.entities.arguments)) && $(')');
|
812
901
|
|
902
|
+
if ($(this.important)) {
|
903
|
+
important = true;
|
904
|
+
}
|
905
|
+
|
813
906
|
if (elements.length > 0 && ($(';') || peek('}'))) {
|
814
|
-
return new(tree.mixin.Call)(elements, args, index);
|
907
|
+
return new(tree.mixin.Call)(elements, args || [], index, env.filename, important);
|
815
908
|
}
|
816
909
|
},
|
817
910
|
|
@@ -835,38 +928,53 @@ less.Parser = function Parser(env) {
|
|
835
928
|
// the `{...}` block.
|
836
929
|
//
|
837
930
|
definition: function () {
|
838
|
-
var name, params = [], match, ruleset, param, value;
|
839
|
-
|
931
|
+
var name, params = [], match, ruleset, param, value, cond, variadic = false;
|
840
932
|
if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') ||
|
841
933
|
peek(/^[^{]*(;|})/)) return;
|
842
934
|
|
935
|
+
save();
|
936
|
+
|
843
937
|
if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) {
|
844
938
|
name = match[1];
|
845
939
|
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
940
|
+
do {
|
941
|
+
if (input.charAt(i) === '.' && $(/^\.{3}/)) {
|
942
|
+
variadic = true;
|
943
|
+
break;
|
944
|
+
} else if (param = $(this.entities.variable) || $(this.entities.literal)
|
945
|
+
|| $(this.entities.keyword)) {
|
946
|
+
// Variable
|
947
|
+
if (param instanceof tree.Variable) {
|
948
|
+
if ($(':')) {
|
949
|
+
value = expect(this.expression, 'expected expression');
|
852
950
|
params.push({ name: param.name, value: value });
|
951
|
+
} else if ($(/^\.{3}/)) {
|
952
|
+
params.push({ name: param.name, variadic: true });
|
953
|
+
variadic = true;
|
954
|
+
break;
|
853
955
|
} else {
|
854
|
-
|
956
|
+
params.push({ name: param.name });
|
855
957
|
}
|
856
958
|
} else {
|
857
|
-
params.push({
|
959
|
+
params.push({ value: param });
|
858
960
|
}
|
859
961
|
} else {
|
860
|
-
|
962
|
+
break;
|
861
963
|
}
|
862
|
-
|
964
|
+
} while ($(','))
|
965
|
+
|
966
|
+
expect(')');
|
967
|
+
|
968
|
+
if ($(/^when/)) { // Guard
|
969
|
+
cond = expect(this.conditions, 'expected condition');
|
863
970
|
}
|
864
|
-
if (! $(')')) throw new(Error)("Expected )");
|
865
971
|
|
866
972
|
ruleset = $(this.block);
|
867
973
|
|
868
974
|
if (ruleset) {
|
869
|
-
return new(tree.mixin.Definition)(name, params, ruleset);
|
975
|
+
return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);
|
976
|
+
} else {
|
977
|
+
restore();
|
870
978
|
}
|
871
979
|
}
|
872
980
|
}
|
@@ -901,7 +1009,7 @@ less.Parser = function Parser(env) {
|
|
901
1009
|
|
902
1010
|
if (! $(/^\(opacity=/i)) return;
|
903
1011
|
if (value = $(/^\d+/) || $(this.entities.variable)) {
|
904
|
-
|
1012
|
+
expect(')');
|
905
1013
|
return new(tree.Alpha)(value);
|
906
1014
|
}
|
907
1015
|
},
|
@@ -919,12 +1027,21 @@ less.Parser = function Parser(env) {
|
|
919
1027
|
// and an element name, such as a tag a class, or `*`.
|
920
1028
|
//
|
921
1029
|
element: function () {
|
922
|
-
var e, t, c;
|
1030
|
+
var e, t, c, v;
|
923
1031
|
|
924
1032
|
c = $(this.combinator);
|
925
|
-
e = $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) ||
|
1033
|
+
e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) ||
|
1034
|
+
$('*') || $(this.attribute) || $(/^\([^)@]+\)/);
|
1035
|
+
|
1036
|
+
if (! e) {
|
1037
|
+
$('(') && (v = $(this.entities.variable)) && $(')') && (e = new(tree.Paren)(v));
|
1038
|
+
}
|
1039
|
+
|
1040
|
+
if (e) { return new(tree.Element)(c, e, i) }
|
926
1041
|
|
927
|
-
if (
|
1042
|
+
if (c.value && c.value.charAt(0) === '&') {
|
1043
|
+
return new(tree.Element)(c, null, i);
|
1044
|
+
}
|
928
1045
|
},
|
929
1046
|
|
930
1047
|
//
|
@@ -939,14 +1056,18 @@ less.Parser = function Parser(env) {
|
|
939
1056
|
combinator: function () {
|
940
1057
|
var match, c = input.charAt(i);
|
941
1058
|
|
942
|
-
if (c === '>' || c === '
|
1059
|
+
if (c === '>' || c === '+' || c === '~') {
|
943
1060
|
i++;
|
944
1061
|
while (input.charAt(i) === ' ') { i++ }
|
945
1062
|
return new(tree.Combinator)(c);
|
946
|
-
} else if (c === '
|
947
|
-
|
1063
|
+
} else if (c === '&') {
|
1064
|
+
match = '&';
|
1065
|
+
i++;
|
1066
|
+
if(input.charAt(i) === ' ') {
|
1067
|
+
match = '& ';
|
1068
|
+
}
|
948
1069
|
while (input.charAt(i) === ' ') { i++ }
|
949
|
-
return new(tree.Combinator)(
|
1070
|
+
return new(tree.Combinator)(match);
|
950
1071
|
} else if (input.charAt(i - 1) === ' ') {
|
951
1072
|
return new(tree.Combinator)(" ");
|
952
1073
|
} else {
|
@@ -965,6 +1086,12 @@ less.Parser = function Parser(env) {
|
|
965
1086
|
selector: function () {
|
966
1087
|
var sel, e, elements = [], c, match;
|
967
1088
|
|
1089
|
+
if ($('(')) {
|
1090
|
+
sel = $(this.entity);
|
1091
|
+
expect(')');
|
1092
|
+
return new(tree.Selector)([new(tree.Element)('', sel, i)]);
|
1093
|
+
}
|
1094
|
+
|
968
1095
|
while (e = $(this.element)) {
|
969
1096
|
c = input.charAt(i);
|
970
1097
|
elements.push(e)
|
@@ -1012,20 +1139,15 @@ less.Parser = function Parser(env) {
|
|
1012
1139
|
var selectors = [], s, rules, match;
|
1013
1140
|
save();
|
1014
1141
|
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
selectors.push(s);
|
1021
|
-
$(this.comment);
|
1022
|
-
if (! $(',')) { break }
|
1023
|
-
$(this.comment);
|
1024
|
-
}
|
1142
|
+
while (s = $(this.selector)) {
|
1143
|
+
selectors.push(s);
|
1144
|
+
$(this.comment);
|
1145
|
+
if (! $(',')) { break }
|
1146
|
+
$(this.comment);
|
1025
1147
|
}
|
1026
1148
|
|
1027
1149
|
if (selectors.length > 0 && (rules = $(this.block))) {
|
1028
|
-
return new(tree.Ruleset)(selectors, rules);
|
1150
|
+
return new(tree.Ruleset)(selectors, rules, env.strictImports);
|
1029
1151
|
} else {
|
1030
1152
|
// Backtrack
|
1031
1153
|
furthest = i;
|
@@ -1069,11 +1191,67 @@ less.Parser = function Parser(env) {
|
|
1069
1191
|
// stored in `import`, which we pass to the Import constructor.
|
1070
1192
|
//
|
1071
1193
|
"import": function () {
|
1072
|
-
var path;
|
1194
|
+
var path, features, index = i;
|
1073
1195
|
if ($(/^@import\s+/) &&
|
1074
|
-
(path = $(this.entities.quoted) || $(this.entities.url))
|
1075
|
-
$(
|
1076
|
-
|
1196
|
+
(path = $(this.entities.quoted) || $(this.entities.url))) {
|
1197
|
+
features = $(this.mediaFeatures);
|
1198
|
+
if ($(';')) {
|
1199
|
+
return new(tree.Import)(path, imports, features, index);
|
1200
|
+
}
|
1201
|
+
}
|
1202
|
+
},
|
1203
|
+
|
1204
|
+
mediaFeature: function () {
|
1205
|
+
var e, p, nodes = [];
|
1206
|
+
|
1207
|
+
do {
|
1208
|
+
if (e = $(this.entities.keyword)) {
|
1209
|
+
nodes.push(e);
|
1210
|
+
} else if ($('(')) {
|
1211
|
+
p = $(this.property);
|
1212
|
+
e = $(this.entity);
|
1213
|
+
if ($(')')) {
|
1214
|
+
if (p && e) {
|
1215
|
+
nodes.push(new(tree.Paren)(new(tree.Rule)(p, e, null, i, true)));
|
1216
|
+
} else if (e) {
|
1217
|
+
nodes.push(new(tree.Paren)(e));
|
1218
|
+
} else {
|
1219
|
+
return null;
|
1220
|
+
}
|
1221
|
+
} else { return null }
|
1222
|
+
}
|
1223
|
+
} while (e);
|
1224
|
+
|
1225
|
+
if (nodes.length > 0) {
|
1226
|
+
return new(tree.Expression)(nodes);
|
1227
|
+
}
|
1228
|
+
},
|
1229
|
+
|
1230
|
+
mediaFeatures: function () {
|
1231
|
+
var e, features = [];
|
1232
|
+
|
1233
|
+
do {
|
1234
|
+
if (e = $(this.mediaFeature)) {
|
1235
|
+
features.push(e);
|
1236
|
+
if (! $(',')) { break }
|
1237
|
+
} else if (e = $(this.entities.variable)) {
|
1238
|
+
features.push(e);
|
1239
|
+
if (! $(',')) { break }
|
1240
|
+
}
|
1241
|
+
} while (e);
|
1242
|
+
|
1243
|
+
return features.length > 0 ? features : null;
|
1244
|
+
},
|
1245
|
+
|
1246
|
+
media: function () {
|
1247
|
+
var features, rules;
|
1248
|
+
|
1249
|
+
if ($(/^@media/)) {
|
1250
|
+
features = $(this.mediaFeatures);
|
1251
|
+
|
1252
|
+
if (rules = $(this.block)) {
|
1253
|
+
return new(tree.Media)(rules, features);
|
1254
|
+
}
|
1077
1255
|
}
|
1078
1256
|
},
|
1079
1257
|
|
@@ -1083,13 +1261,13 @@ less.Parser = function Parser(env) {
|
|
1083
1261
|
// @charset "utf-8";
|
1084
1262
|
//
|
1085
1263
|
directive: function () {
|
1086
|
-
var name, value, rules, types;
|
1264
|
+
var name, value, rules, types, e, nodes;
|
1087
1265
|
|
1088
1266
|
if (input.charAt(i) !== '@') return;
|
1089
1267
|
|
1090
|
-
if (value = $(this['import'])) {
|
1268
|
+
if (value = $(this['import']) || $(this.media)) {
|
1091
1269
|
return value;
|
1092
|
-
} else if (name = $(/^@
|
1270
|
+
} else if (name = $(/^@page|@keyframes/) || $(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)) {
|
1093
1271
|
types = ($(/^[^{]+/) || '').trim();
|
1094
1272
|
if (rules = $(this.block)) {
|
1095
1273
|
return new(tree.Directive)(name + " " + types, rules);
|
@@ -1156,7 +1334,7 @@ less.Parser = function Parser(env) {
|
|
1156
1334
|
multiplication: function () {
|
1157
1335
|
var m, a, op, operation;
|
1158
1336
|
if (m = $(this.operand)) {
|
1159
|
-
while ((op = ($('/') || $('*'))) && (a = $(this.operand))) {
|
1337
|
+
while (!peek(/^\/\*/) && (op = ($('/') || $('*'))) && (a = $(this.operand))) {
|
1160
1338
|
operation = new(tree.Operation)(op, [operation || m, a]);
|
1161
1339
|
}
|
1162
1340
|
return operation || m;
|
@@ -1172,6 +1350,35 @@ less.Parser = function Parser(env) {
|
|
1172
1350
|
return operation || m;
|
1173
1351
|
}
|
1174
1352
|
},
|
1353
|
+
conditions: function () {
|
1354
|
+
var a, b, index = i, condition;
|
1355
|
+
|
1356
|
+
if (a = $(this.condition)) {
|
1357
|
+
while ($(',') && (b = $(this.condition))) {
|
1358
|
+
condition = new(tree.Condition)('or', condition || a, b, index);
|
1359
|
+
}
|
1360
|
+
return condition || a;
|
1361
|
+
}
|
1362
|
+
},
|
1363
|
+
condition: function () {
|
1364
|
+
var a, b, c, op, index = i, negate = false;
|
1365
|
+
|
1366
|
+
if ($(/^not/)) { negate = true }
|
1367
|
+
expect('(');
|
1368
|
+
if (a = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) {
|
1369
|
+
if (op = $(/^(?:>=|=<|[<=>])/)) {
|
1370
|
+
if (b = $(this.addition) || $(this.entities.keyword) || $(this.entities.quoted)) {
|
1371
|
+
c = new(tree.Condition)(op, a, b, index, negate);
|
1372
|
+
} else {
|
1373
|
+
error('expected expression');
|
1374
|
+
}
|
1375
|
+
} else {
|
1376
|
+
c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, negate);
|
1377
|
+
}
|
1378
|
+
expect(')');
|
1379
|
+
return $(/^and/) ? new(tree.Condition)('and', c, $(this.condition)) : c;
|
1380
|
+
}
|
1381
|
+
},
|
1175
1382
|
|
1176
1383
|
//
|
1177
1384
|
// An operand is anything that can be part of an operation,
|
@@ -1216,106 +1423,510 @@ less.Parser = function Parser(env) {
|
|
1216
1423
|
};
|
1217
1424
|
};
|
1218
1425
|
|
1219
|
-
if (
|
1426
|
+
if (less.mode === 'browser' || less.mode === 'rhino') {
|
1220
1427
|
//
|
1221
1428
|
// Used by `@import` directives
|
1222
1429
|
//
|
1223
1430
|
less.Parser.importer = function (path, paths, callback, env) {
|
1224
|
-
if (
|
1431
|
+
if (!/^([a-z]+:)?\//.test(path) && paths.length > 0) {
|
1225
1432
|
path = paths[0] + path;
|
1226
1433
|
}
|
1227
1434
|
// We pass `true` as 3rd argument, to force the reload of the import.
|
1228
1435
|
// This is so we can get the syntax tree as opposed to just the CSS output,
|
1229
1436
|
// as we need this to evaluate the current stylesheet.
|
1230
|
-
loadStyleSheet({ href: path, title: path, type: env.mime },
|
1437
|
+
loadStyleSheet({ href: path, title: path, type: env.mime }, function (e) {
|
1438
|
+
if (e && typeof(env.errback) === "function") {
|
1439
|
+
env.errback.call(null, path, paths, callback, env);
|
1440
|
+
} else {
|
1441
|
+
callback.apply(null, arguments);
|
1442
|
+
}
|
1443
|
+
}, true);
|
1231
1444
|
};
|
1232
1445
|
}
|
1233
1446
|
|
1234
1447
|
(function (tree) {
|
1235
1448
|
|
1236
|
-
tree.
|
1237
|
-
|
1238
|
-
|
1239
|
-
tree.Alpha.prototype = {
|
1240
|
-
toCSS: function () {
|
1241
|
-
return "alpha(opacity=" +
|
1242
|
-
(this.value.toCSS ? this.value.toCSS() : this.value) + ")";
|
1449
|
+
tree.functions = {
|
1450
|
+
rgb: function (r, g, b) {
|
1451
|
+
return this.rgba(r, g, b, 1.0);
|
1243
1452
|
},
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
}
|
1453
|
+
rgba: function (r, g, b, a) {
|
1454
|
+
var rgb = [r, g, b].map(function (c) { return number(c) }),
|
1455
|
+
a = number(a);
|
1456
|
+
return new(tree.Color)(rgb, a);
|
1457
|
+
},
|
1458
|
+
hsl: function (h, s, l) {
|
1459
|
+
return this.hsla(h, s, l, 1.0);
|
1460
|
+
},
|
1461
|
+
hsla: function (h, s, l, a) {
|
1462
|
+
h = (number(h) % 360) / 360;
|
1463
|
+
s = number(s); l = number(l); a = number(a);
|
1249
1464
|
|
1250
|
-
|
1251
|
-
|
1465
|
+
var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
|
1466
|
+
var m1 = l * 2 - m2;
|
1252
1467
|
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
|
1468
|
+
return this.rgba(hue(h + 1/3) * 255,
|
1469
|
+
hue(h) * 255,
|
1470
|
+
hue(h - 1/3) * 255,
|
1471
|
+
a);
|
1472
|
+
|
1473
|
+
function hue(h) {
|
1474
|
+
h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
|
1475
|
+
if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
|
1476
|
+
else if (h * 2 < 1) return m2;
|
1477
|
+
else if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
|
1478
|
+
else return m1;
|
1479
|
+
}
|
1259
1480
|
},
|
1260
|
-
|
1261
|
-
|
1481
|
+
hue: function (color) {
|
1482
|
+
return new(tree.Dimension)(Math.round(color.toHSL().h));
|
1483
|
+
},
|
1484
|
+
saturation: function (color) {
|
1485
|
+
return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%');
|
1486
|
+
},
|
1487
|
+
lightness: function (color) {
|
1488
|
+
return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%');
|
1489
|
+
},
|
1490
|
+
alpha: function (color) {
|
1491
|
+
return new(tree.Dimension)(color.toHSL().a);
|
1492
|
+
},
|
1493
|
+
saturate: function (color, amount) {
|
1494
|
+
var hsl = color.toHSL();
|
1262
1495
|
|
1263
|
-
|
1264
|
-
|
1496
|
+
hsl.s += amount.value / 100;
|
1497
|
+
hsl.s = clamp(hsl.s);
|
1498
|
+
return hsla(hsl);
|
1499
|
+
},
|
1500
|
+
desaturate: function (color, amount) {
|
1501
|
+
var hsl = color.toHSL();
|
1265
1502
|
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
this.index = index;
|
1273
|
-
};
|
1274
|
-
tree.Call.prototype = {
|
1275
|
-
//
|
1276
|
-
// When evaluating a function call,
|
1277
|
-
// we either find the function in `tree.functions` [1],
|
1278
|
-
// in which case we call it, passing the evaluated arguments,
|
1279
|
-
// or we simply print it out as it appeared originally [2].
|
1280
|
-
//
|
1281
|
-
// The *functions.js* file contains the built-in functions.
|
1282
|
-
//
|
1283
|
-
// The reason why we evaluate the arguments, is in the case where
|
1284
|
-
// we try to pass a variable to a function, like: `saturate(@color)`.
|
1285
|
-
// The function should receive the value, not the variable.
|
1286
|
-
//
|
1287
|
-
eval: function (env) {
|
1288
|
-
var args = this.args.map(function (a) { return a.eval(env) });
|
1503
|
+
hsl.s -= amount.value / 100;
|
1504
|
+
hsl.s = clamp(hsl.s);
|
1505
|
+
return hsla(hsl);
|
1506
|
+
},
|
1507
|
+
lighten: function (color, amount) {
|
1508
|
+
var hsl = color.toHSL();
|
1289
1509
|
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
} catch (e) {
|
1294
|
-
throw { message: "error evaluating function `" + this.name + "`",
|
1295
|
-
index: this.index };
|
1296
|
-
}
|
1297
|
-
} else { // 2.
|
1298
|
-
return new(tree.Anonymous)(this.name +
|
1299
|
-
"(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")");
|
1300
|
-
}
|
1510
|
+
hsl.l += amount.value / 100;
|
1511
|
+
hsl.l = clamp(hsl.l);
|
1512
|
+
return hsla(hsl);
|
1301
1513
|
},
|
1514
|
+
darken: function (color, amount) {
|
1515
|
+
var hsl = color.toHSL();
|
1302
1516
|
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
}
|
1517
|
+
hsl.l -= amount.value / 100;
|
1518
|
+
hsl.l = clamp(hsl.l);
|
1519
|
+
return hsla(hsl);
|
1520
|
+
},
|
1521
|
+
fadein: function (color, amount) {
|
1522
|
+
var hsl = color.toHSL();
|
1307
1523
|
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1524
|
+
hsl.a += amount.value / 100;
|
1525
|
+
hsl.a = clamp(hsl.a);
|
1526
|
+
return hsla(hsl);
|
1527
|
+
},
|
1528
|
+
fadeout: function (color, amount) {
|
1529
|
+
var hsl = color.toHSL();
|
1530
|
+
|
1531
|
+
hsl.a -= amount.value / 100;
|
1532
|
+
hsl.a = clamp(hsl.a);
|
1533
|
+
return hsla(hsl);
|
1534
|
+
},
|
1535
|
+
fade: function (color, amount) {
|
1536
|
+
var hsl = color.toHSL();
|
1537
|
+
|
1538
|
+
hsl.a = amount.value / 100;
|
1539
|
+
hsl.a = clamp(hsl.a);
|
1540
|
+
return hsla(hsl);
|
1541
|
+
},
|
1542
|
+
spin: function (color, amount) {
|
1543
|
+
var hsl = color.toHSL();
|
1544
|
+
var hue = (hsl.h + amount.value) % 360;
|
1545
|
+
|
1546
|
+
hsl.h = hue < 0 ? 360 + hue : hue;
|
1547
|
+
|
1548
|
+
return hsla(hsl);
|
1549
|
+
},
|
1314
1550
|
//
|
1315
|
-
//
|
1316
|
-
//
|
1551
|
+
// Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
|
1552
|
+
// http://sass-lang.com
|
1317
1553
|
//
|
1318
|
-
|
1554
|
+
mix: function (color1, color2, weight) {
|
1555
|
+
var p = weight.value / 100.0;
|
1556
|
+
var w = p * 2 - 1;
|
1557
|
+
var a = color1.toHSL().a - color2.toHSL().a;
|
1558
|
+
|
1559
|
+
var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
|
1560
|
+
var w2 = 1 - w1;
|
1561
|
+
|
1562
|
+
var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
|
1563
|
+
color1.rgb[1] * w1 + color2.rgb[1] * w2,
|
1564
|
+
color1.rgb[2] * w1 + color2.rgb[2] * w2];
|
1565
|
+
|
1566
|
+
var alpha = color1.alpha * p + color2.alpha * (1 - p);
|
1567
|
+
|
1568
|
+
return new(tree.Color)(rgb, alpha);
|
1569
|
+
},
|
1570
|
+
greyscale: function (color) {
|
1571
|
+
return this.desaturate(color, new(tree.Dimension)(100));
|
1572
|
+
},
|
1573
|
+
e: function (str) {
|
1574
|
+
return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str);
|
1575
|
+
},
|
1576
|
+
escape: function (str) {
|
1577
|
+
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"));
|
1578
|
+
},
|
1579
|
+
'%': function (quoted /* arg, arg, ...*/) {
|
1580
|
+
var args = Array.prototype.slice.call(arguments, 1),
|
1581
|
+
str = quoted.value;
|
1582
|
+
|
1583
|
+
for (var i = 0; i < args.length; i++) {
|
1584
|
+
str = str.replace(/%[sda]/i, function(token) {
|
1585
|
+
var value = token.match(/s/i) ? args[i].value : args[i].toCSS();
|
1586
|
+
return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
|
1587
|
+
});
|
1588
|
+
}
|
1589
|
+
str = str.replace(/%%/g, '%');
|
1590
|
+
return new(tree.Quoted)('"' + str + '"', str);
|
1591
|
+
},
|
1592
|
+
round: function (n) {
|
1593
|
+
return this._math('round', n);
|
1594
|
+
},
|
1595
|
+
ceil: function (n) {
|
1596
|
+
return this._math('ceil', n);
|
1597
|
+
},
|
1598
|
+
floor: function (n) {
|
1599
|
+
return this._math('floor', n);
|
1600
|
+
},
|
1601
|
+
_math: function (fn, n) {
|
1602
|
+
if (n instanceof tree.Dimension) {
|
1603
|
+
return new(tree.Dimension)(Math[fn](number(n)), n.unit);
|
1604
|
+
} else if (typeof(n) === 'number') {
|
1605
|
+
return Math[fn](n);
|
1606
|
+
} else {
|
1607
|
+
throw { type: "Argument", message: "argument must be a number" };
|
1608
|
+
}
|
1609
|
+
},
|
1610
|
+
argb: function (color) {
|
1611
|
+
return new(tree.Anonymous)(color.toARGB());
|
1612
|
+
|
1613
|
+
},
|
1614
|
+
percentage: function (n) {
|
1615
|
+
return new(tree.Dimension)(n.value * 100, '%');
|
1616
|
+
},
|
1617
|
+
color: function (n) {
|
1618
|
+
if (n instanceof tree.Quoted) {
|
1619
|
+
return new(tree.Color)(n.value.slice(1));
|
1620
|
+
} else {
|
1621
|
+
throw { type: "Argument", message: "argument must be a string" };
|
1622
|
+
}
|
1623
|
+
},
|
1624
|
+
iscolor: function (n) {
|
1625
|
+
return this._isa(n, tree.Color);
|
1626
|
+
},
|
1627
|
+
isnumber: function (n) {
|
1628
|
+
return this._isa(n, tree.Dimension);
|
1629
|
+
},
|
1630
|
+
isstring: function (n) {
|
1631
|
+
return this._isa(n, tree.Quoted);
|
1632
|
+
},
|
1633
|
+
iskeyword: function (n) {
|
1634
|
+
return this._isa(n, tree.Keyword);
|
1635
|
+
},
|
1636
|
+
isurl: function (n) {
|
1637
|
+
return this._isa(n, tree.URL);
|
1638
|
+
},
|
1639
|
+
ispixel: function (n) {
|
1640
|
+
return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False;
|
1641
|
+
},
|
1642
|
+
ispercentage: function (n) {
|
1643
|
+
return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False;
|
1644
|
+
},
|
1645
|
+
isem: function (n) {
|
1646
|
+
return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False;
|
1647
|
+
},
|
1648
|
+
_isa: function (n, Type) {
|
1649
|
+
return (n instanceof Type) ? tree.True : tree.False;
|
1650
|
+
}
|
1651
|
+
};
|
1652
|
+
|
1653
|
+
function hsla(hsla) {
|
1654
|
+
return tree.functions.hsla(hsla.h, hsla.s, hsla.l, hsla.a);
|
1655
|
+
}
|
1656
|
+
|
1657
|
+
function number(n) {
|
1658
|
+
if (n instanceof tree.Dimension) {
|
1659
|
+
return parseFloat(n.unit == '%' ? n.value / 100 : n.value);
|
1660
|
+
} else if (typeof(n) === 'number') {
|
1661
|
+
return n;
|
1662
|
+
} else {
|
1663
|
+
throw {
|
1664
|
+
error: "RuntimeError",
|
1665
|
+
message: "color functions take numbers as parameters"
|
1666
|
+
};
|
1667
|
+
}
|
1668
|
+
}
|
1669
|
+
|
1670
|
+
function clamp(val) {
|
1671
|
+
return Math.min(1, Math.max(0, val));
|
1672
|
+
}
|
1673
|
+
|
1674
|
+
})(require('./tree'));
|
1675
|
+
(function (tree) {
|
1676
|
+
tree.colors = {
|
1677
|
+
'aliceblue':'#f0f8ff',
|
1678
|
+
'antiquewhite':'#faebd7',
|
1679
|
+
'aqua':'#00ffff',
|
1680
|
+
'aquamarine':'#7fffd4',
|
1681
|
+
'azure':'#f0ffff',
|
1682
|
+
'beige':'#f5f5dc',
|
1683
|
+
'bisque':'#ffe4c4',
|
1684
|
+
'black':'#000000',
|
1685
|
+
'blanchedalmond':'#ffebcd',
|
1686
|
+
'blue':'#0000ff',
|
1687
|
+
'blueviolet':'#8a2be2',
|
1688
|
+
'brown':'#a52a2a',
|
1689
|
+
'burlywood':'#deb887',
|
1690
|
+
'cadetblue':'#5f9ea0',
|
1691
|
+
'chartreuse':'#7fff00',
|
1692
|
+
'chocolate':'#d2691e',
|
1693
|
+
'coral':'#ff7f50',
|
1694
|
+
'cornflowerblue':'#6495ed',
|
1695
|
+
'cornsilk':'#fff8dc',
|
1696
|
+
'crimson':'#dc143c',
|
1697
|
+
'cyan':'#00ffff',
|
1698
|
+
'darkblue':'#00008b',
|
1699
|
+
'darkcyan':'#008b8b',
|
1700
|
+
'darkgoldenrod':'#b8860b',
|
1701
|
+
'darkgray':'#a9a9a9',
|
1702
|
+
'darkgrey':'#a9a9a9',
|
1703
|
+
'darkgreen':'#006400',
|
1704
|
+
'darkkhaki':'#bdb76b',
|
1705
|
+
'darkmagenta':'#8b008b',
|
1706
|
+
'darkolivegreen':'#556b2f',
|
1707
|
+
'darkorange':'#ff8c00',
|
1708
|
+
'darkorchid':'#9932cc',
|
1709
|
+
'darkred':'#8b0000',
|
1710
|
+
'darksalmon':'#e9967a',
|
1711
|
+
'darkseagreen':'#8fbc8f',
|
1712
|
+
'darkslateblue':'#483d8b',
|
1713
|
+
'darkslategray':'#2f4f4f',
|
1714
|
+
'darkslategrey':'#2f4f4f',
|
1715
|
+
'darkturquoise':'#00ced1',
|
1716
|
+
'darkviolet':'#9400d3',
|
1717
|
+
'deeppink':'#ff1493',
|
1718
|
+
'deepskyblue':'#00bfff',
|
1719
|
+
'dimgray':'#696969',
|
1720
|
+
'dimgrey':'#696969',
|
1721
|
+
'dodgerblue':'#1e90ff',
|
1722
|
+
'firebrick':'#b22222',
|
1723
|
+
'floralwhite':'#fffaf0',
|
1724
|
+
'forestgreen':'#228b22',
|
1725
|
+
'fuchsia':'#ff00ff',
|
1726
|
+
'gainsboro':'#dcdcdc',
|
1727
|
+
'ghostwhite':'#f8f8ff',
|
1728
|
+
'gold':'#ffd700',
|
1729
|
+
'goldenrod':'#daa520',
|
1730
|
+
'gray':'#808080',
|
1731
|
+
'grey':'#808080',
|
1732
|
+
'green':'#008000',
|
1733
|
+
'greenyellow':'#adff2f',
|
1734
|
+
'honeydew':'#f0fff0',
|
1735
|
+
'hotpink':'#ff69b4',
|
1736
|
+
'indianred':'#cd5c5c',
|
1737
|
+
'indigo':'#4b0082',
|
1738
|
+
'ivory':'#fffff0',
|
1739
|
+
'khaki':'#f0e68c',
|
1740
|
+
'lavender':'#e6e6fa',
|
1741
|
+
'lavenderblush':'#fff0f5',
|
1742
|
+
'lawngreen':'#7cfc00',
|
1743
|
+
'lemonchiffon':'#fffacd',
|
1744
|
+
'lightblue':'#add8e6',
|
1745
|
+
'lightcoral':'#f08080',
|
1746
|
+
'lightcyan':'#e0ffff',
|
1747
|
+
'lightgoldenrodyellow':'#fafad2',
|
1748
|
+
'lightgray':'#d3d3d3',
|
1749
|
+
'lightgrey':'#d3d3d3',
|
1750
|
+
'lightgreen':'#90ee90',
|
1751
|
+
'lightpink':'#ffb6c1',
|
1752
|
+
'lightsalmon':'#ffa07a',
|
1753
|
+
'lightseagreen':'#20b2aa',
|
1754
|
+
'lightskyblue':'#87cefa',
|
1755
|
+
'lightslategray':'#778899',
|
1756
|
+
'lightslategrey':'#778899',
|
1757
|
+
'lightsteelblue':'#b0c4de',
|
1758
|
+
'lightyellow':'#ffffe0',
|
1759
|
+
'lime':'#00ff00',
|
1760
|
+
'limegreen':'#32cd32',
|
1761
|
+
'linen':'#faf0e6',
|
1762
|
+
'magenta':'#ff00ff',
|
1763
|
+
'maroon':'#800000',
|
1764
|
+
'mediumaquamarine':'#66cdaa',
|
1765
|
+
'mediumblue':'#0000cd',
|
1766
|
+
'mediumorchid':'#ba55d3',
|
1767
|
+
'mediumpurple':'#9370d8',
|
1768
|
+
'mediumseagreen':'#3cb371',
|
1769
|
+
'mediumslateblue':'#7b68ee',
|
1770
|
+
'mediumspringgreen':'#00fa9a',
|
1771
|
+
'mediumturquoise':'#48d1cc',
|
1772
|
+
'mediumvioletred':'#c71585',
|
1773
|
+
'midnightblue':'#191970',
|
1774
|
+
'mintcream':'#f5fffa',
|
1775
|
+
'mistyrose':'#ffe4e1',
|
1776
|
+
'moccasin':'#ffe4b5',
|
1777
|
+
'navajowhite':'#ffdead',
|
1778
|
+
'navy':'#000080',
|
1779
|
+
'oldlace':'#fdf5e6',
|
1780
|
+
'olive':'#808000',
|
1781
|
+
'olivedrab':'#6b8e23',
|
1782
|
+
'orange':'#ffa500',
|
1783
|
+
'orangered':'#ff4500',
|
1784
|
+
'orchid':'#da70d6',
|
1785
|
+
'palegoldenrod':'#eee8aa',
|
1786
|
+
'palegreen':'#98fb98',
|
1787
|
+
'paleturquoise':'#afeeee',
|
1788
|
+
'palevioletred':'#d87093',
|
1789
|
+
'papayawhip':'#ffefd5',
|
1790
|
+
'peachpuff':'#ffdab9',
|
1791
|
+
'peru':'#cd853f',
|
1792
|
+
'pink':'#ffc0cb',
|
1793
|
+
'plum':'#dda0dd',
|
1794
|
+
'powderblue':'#b0e0e6',
|
1795
|
+
'purple':'#800080',
|
1796
|
+
'red':'#ff0000',
|
1797
|
+
'rosybrown':'#bc8f8f',
|
1798
|
+
'royalblue':'#4169e1',
|
1799
|
+
'saddlebrown':'#8b4513',
|
1800
|
+
'salmon':'#fa8072',
|
1801
|
+
'sandybrown':'#f4a460',
|
1802
|
+
'seagreen':'#2e8b57',
|
1803
|
+
'seashell':'#fff5ee',
|
1804
|
+
'sienna':'#a0522d',
|
1805
|
+
'silver':'#c0c0c0',
|
1806
|
+
'skyblue':'#87ceeb',
|
1807
|
+
'slateblue':'#6a5acd',
|
1808
|
+
'slategray':'#708090',
|
1809
|
+
'slategrey':'#708090',
|
1810
|
+
'snow':'#fffafa',
|
1811
|
+
'springgreen':'#00ff7f',
|
1812
|
+
'steelblue':'#4682b4',
|
1813
|
+
'tan':'#d2b48c',
|
1814
|
+
'teal':'#008080',
|
1815
|
+
'thistle':'#d8bfd8',
|
1816
|
+
'tomato':'#ff6347',
|
1817
|
+
'turquoise':'#40e0d0',
|
1818
|
+
'violet':'#ee82ee',
|
1819
|
+
'wheat':'#f5deb3',
|
1820
|
+
'white':'#ffffff',
|
1821
|
+
'whitesmoke':'#f5f5f5',
|
1822
|
+
'yellow':'#ffff00',
|
1823
|
+
'yellowgreen':'#9acd32'
|
1824
|
+
};
|
1825
|
+
})(require('./tree'));
|
1826
|
+
(function (tree) {
|
1827
|
+
|
1828
|
+
tree.Alpha = function (val) {
|
1829
|
+
this.value = val;
|
1830
|
+
};
|
1831
|
+
tree.Alpha.prototype = {
|
1832
|
+
toCSS: function () {
|
1833
|
+
return "alpha(opacity=" +
|
1834
|
+
(this.value.toCSS ? this.value.toCSS() : this.value) + ")";
|
1835
|
+
},
|
1836
|
+
eval: function (env) {
|
1837
|
+
if (this.value.eval) { this.value = this.value.eval(env) }
|
1838
|
+
return this;
|
1839
|
+
}
|
1840
|
+
};
|
1841
|
+
|
1842
|
+
})(require('../tree'));
|
1843
|
+
(function (tree) {
|
1844
|
+
|
1845
|
+
tree.Anonymous = function (string) {
|
1846
|
+
this.value = string.value || string;
|
1847
|
+
};
|
1848
|
+
tree.Anonymous.prototype = {
|
1849
|
+
toCSS: function () {
|
1850
|
+
return this.value;
|
1851
|
+
},
|
1852
|
+
eval: function () { return this }
|
1853
|
+
};
|
1854
|
+
|
1855
|
+
})(require('../tree'));
|
1856
|
+
(function (tree) {
|
1857
|
+
|
1858
|
+
tree.Assignment = function (key, val) {
|
1859
|
+
this.key = key;
|
1860
|
+
this.value = val;
|
1861
|
+
};
|
1862
|
+
tree.Assignment.prototype = {
|
1863
|
+
toCSS: function () {
|
1864
|
+
return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value);
|
1865
|
+
},
|
1866
|
+
eval: function (env) {
|
1867
|
+
if (this.value.eval) { this.value = this.value.eval(env) }
|
1868
|
+
return this;
|
1869
|
+
}
|
1870
|
+
};
|
1871
|
+
|
1872
|
+
})(require('../tree'));(function (tree) {
|
1873
|
+
|
1874
|
+
//
|
1875
|
+
// A function call node.
|
1876
|
+
//
|
1877
|
+
tree.Call = function (name, args, index, filename) {
|
1878
|
+
this.name = name;
|
1879
|
+
this.args = args;
|
1880
|
+
this.index = index;
|
1881
|
+
this.filename = filename;
|
1882
|
+
};
|
1883
|
+
tree.Call.prototype = {
|
1884
|
+
//
|
1885
|
+
// When evaluating a function call,
|
1886
|
+
// we either find the function in `tree.functions` [1],
|
1887
|
+
// in which case we call it, passing the evaluated arguments,
|
1888
|
+
// or we simply print it out as it appeared originally [2].
|
1889
|
+
//
|
1890
|
+
// The *functions.js* file contains the built-in functions.
|
1891
|
+
//
|
1892
|
+
// The reason why we evaluate the arguments, is in the case where
|
1893
|
+
// we try to pass a variable to a function, like: `saturate(@color)`.
|
1894
|
+
// The function should receive the value, not the variable.
|
1895
|
+
//
|
1896
|
+
eval: function (env) {
|
1897
|
+
var args = this.args.map(function (a) { return a.eval(env) });
|
1898
|
+
|
1899
|
+
if (this.name in tree.functions) { // 1.
|
1900
|
+
try {
|
1901
|
+
return tree.functions[this.name].apply(tree.functions, args);
|
1902
|
+
} catch (e) {
|
1903
|
+
throw { type: e.type || "Runtime",
|
1904
|
+
message: "error evaluating function `" + this.name + "`" +
|
1905
|
+
(e.message ? ': ' + e.message : ''),
|
1906
|
+
index: this.index, filename: this.filename };
|
1907
|
+
}
|
1908
|
+
} else { // 2.
|
1909
|
+
return new(tree.Anonymous)(this.name +
|
1910
|
+
"(" + args.map(function (a) { return a.toCSS() }).join(', ') + ")");
|
1911
|
+
}
|
1912
|
+
},
|
1913
|
+
|
1914
|
+
toCSS: function (env) {
|
1915
|
+
return this.eval(env).toCSS();
|
1916
|
+
}
|
1917
|
+
};
|
1918
|
+
|
1919
|
+
})(require('../tree'));
|
1920
|
+
(function (tree) {
|
1921
|
+
//
|
1922
|
+
// RGB Colors - #ff0014, #eee
|
1923
|
+
//
|
1924
|
+
tree.Color = function (rgb, a) {
|
1925
|
+
//
|
1926
|
+
// The end goal here, is to parse the arguments
|
1927
|
+
// into an integer triplet, such as `128, 255, 0`
|
1928
|
+
//
|
1929
|
+
// This facilitates operations and conversions.
|
1319
1930
|
//
|
1320
1931
|
if (Array.isArray(rgb)) {
|
1321
1932
|
this.rgb = rgb;
|
@@ -1323,11 +1934,6 @@ tree.Color = function (rgb, a) {
|
|
1323
1934
|
this.rgb = rgb.match(/.{2}/g).map(function (c) {
|
1324
1935
|
return parseInt(c, 16);
|
1325
1936
|
});
|
1326
|
-
} else if (rgb.length == 8) {
|
1327
|
-
this.alpha = parseInt(rgb.substring(0,2), 16) / 255.0;
|
1328
|
-
this.rgb = rgb.substr(2).match(/.{2}/g).map(function (c) {
|
1329
|
-
return parseInt(c, 16);
|
1330
|
-
});
|
1331
1937
|
} else {
|
1332
1938
|
this.rgb = rgb.split('').map(function (c) {
|
1333
1939
|
return parseInt(c + c, 16);
|
@@ -1399,11 +2005,19 @@ tree.Color.prototype = {
|
|
1399
2005
|
h /= 6;
|
1400
2006
|
}
|
1401
2007
|
return { h: h * 360, s: s, l: l, a: a };
|
2008
|
+
},
|
2009
|
+
toARGB: function () {
|
2010
|
+
var argb = [Math.round(this.alpha * 255)].concat(this.rgb);
|
2011
|
+
return '#' + argb.map(function (i) {
|
2012
|
+
i = Math.round(i);
|
2013
|
+
i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16);
|
2014
|
+
return i.length === 1 ? '0' + i : i;
|
2015
|
+
}).join('');
|
1402
2016
|
}
|
1403
2017
|
};
|
1404
2018
|
|
1405
2019
|
|
1406
|
-
})(require('
|
2020
|
+
})(require('../tree'));
|
1407
2021
|
(function (tree) {
|
1408
2022
|
|
1409
2023
|
tree.Comment = function (value, silent) {
|
@@ -1417,7 +2031,49 @@ tree.Comment.prototype = {
|
|
1417
2031
|
eval: function () { return this }
|
1418
2032
|
};
|
1419
2033
|
|
1420
|
-
})(require('
|
2034
|
+
})(require('../tree'));
|
2035
|
+
(function (tree) {
|
2036
|
+
|
2037
|
+
tree.Condition = function (op, l, r, i, negate) {
|
2038
|
+
this.op = op.trim();
|
2039
|
+
this.lvalue = l;
|
2040
|
+
this.rvalue = r;
|
2041
|
+
this.index = i;
|
2042
|
+
this.negate = negate;
|
2043
|
+
};
|
2044
|
+
tree.Condition.prototype.eval = function (env) {
|
2045
|
+
var a = this.lvalue.eval(env),
|
2046
|
+
b = this.rvalue.eval(env);
|
2047
|
+
|
2048
|
+
var i = this.index, result;
|
2049
|
+
|
2050
|
+
var result = (function (op) {
|
2051
|
+
switch (op) {
|
2052
|
+
case 'and':
|
2053
|
+
return a && b;
|
2054
|
+
case 'or':
|
2055
|
+
return a || b;
|
2056
|
+
default:
|
2057
|
+
if (a.compare) {
|
2058
|
+
result = a.compare(b);
|
2059
|
+
} else if (b.compare) {
|
2060
|
+
result = b.compare(a);
|
2061
|
+
} else {
|
2062
|
+
throw { type: "Type",
|
2063
|
+
message: "Unable to perform comparison",
|
2064
|
+
index: i };
|
2065
|
+
}
|
2066
|
+
switch (result) {
|
2067
|
+
case -1: return op === '<' || op === '=<';
|
2068
|
+
case 0: return op === '=' || op === '>=' || op === '=<';
|
2069
|
+
case 1: return op === '>' || op === '>=';
|
2070
|
+
}
|
2071
|
+
}
|
2072
|
+
})(this.op);
|
2073
|
+
return this.negate ? !result : result;
|
2074
|
+
};
|
2075
|
+
|
2076
|
+
})(require('../tree'));
|
1421
2077
|
(function (tree) {
|
1422
2078
|
|
1423
2079
|
//
|
@@ -1448,16 +2104,33 @@ tree.Dimension.prototype = {
|
|
1448
2104
|
return new(tree.Dimension)
|
1449
2105
|
(tree.operate(op, this.value, other.value),
|
1450
2106
|
this.unit || other.unit);
|
2107
|
+
},
|
2108
|
+
|
2109
|
+
// TODO: Perform unit conversion before comparing
|
2110
|
+
compare: function (other) {
|
2111
|
+
if (other instanceof tree.Dimension) {
|
2112
|
+
if (other.value > this.value) {
|
2113
|
+
return -1;
|
2114
|
+
} else if (other.value < this.value) {
|
2115
|
+
return 1;
|
2116
|
+
} else {
|
2117
|
+
return 0;
|
2118
|
+
}
|
2119
|
+
} else {
|
2120
|
+
return -1;
|
2121
|
+
}
|
1451
2122
|
}
|
1452
2123
|
};
|
1453
2124
|
|
1454
|
-
})(require('
|
2125
|
+
})(require('../tree'));
|
1455
2126
|
(function (tree) {
|
1456
2127
|
|
1457
|
-
tree.Directive = function (name, value) {
|
2128
|
+
tree.Directive = function (name, value, features) {
|
1458
2129
|
this.name = name;
|
2130
|
+
|
1459
2131
|
if (Array.isArray(value)) {
|
1460
2132
|
this.ruleset = new(tree.Ruleset)([], value);
|
2133
|
+
this.ruleset.allowImports = true;
|
1461
2134
|
} else {
|
1462
2135
|
this.value = value;
|
1463
2136
|
}
|
@@ -1484,21 +2157,36 @@ tree.Directive.prototype = {
|
|
1484
2157
|
rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) }
|
1485
2158
|
};
|
1486
2159
|
|
1487
|
-
})(require('
|
2160
|
+
})(require('../tree'));
|
1488
2161
|
(function (tree) {
|
1489
2162
|
|
1490
|
-
tree.Element = function (combinator, value) {
|
2163
|
+
tree.Element = function (combinator, value, index) {
|
1491
2164
|
this.combinator = combinator instanceof tree.Combinator ?
|
1492
2165
|
combinator : new(tree.Combinator)(combinator);
|
1493
|
-
|
2166
|
+
|
2167
|
+
if (typeof(value) === 'string') {
|
2168
|
+
this.value = value.trim();
|
2169
|
+
} else if (value) {
|
2170
|
+
this.value = value;
|
2171
|
+
} else {
|
2172
|
+
this.value = "";
|
2173
|
+
}
|
2174
|
+
this.index = index;
|
2175
|
+
};
|
2176
|
+
tree.Element.prototype.eval = function (env) {
|
2177
|
+
return new(tree.Element)(this.combinator,
|
2178
|
+
this.value.eval ? this.value.eval(env) : this.value,
|
2179
|
+
this.index);
|
1494
2180
|
};
|
1495
2181
|
tree.Element.prototype.toCSS = function (env) {
|
1496
|
-
return this.combinator.toCSS(env || {}) + this.value;
|
2182
|
+
return this.combinator.toCSS(env || {}) + (this.value.toCSS ? this.value.toCSS(env) : this.value);
|
1497
2183
|
};
|
1498
2184
|
|
1499
2185
|
tree.Combinator = function (value) {
|
1500
2186
|
if (value === ' ') {
|
1501
2187
|
this.value = ' ';
|
2188
|
+
} else if (value === '& ') {
|
2189
|
+
this.value = '& ';
|
1502
2190
|
} else {
|
1503
2191
|
this.value = value ? value.trim() : "";
|
1504
2192
|
}
|
@@ -1508,15 +2196,15 @@ tree.Combinator.prototype.toCSS = function (env) {
|
|
1508
2196
|
'' : '',
|
1509
2197
|
' ' : ' ',
|
1510
2198
|
'&' : '',
|
2199
|
+
'& ' : ' ',
|
1511
2200
|
':' : ' :',
|
1512
|
-
'::': '::',
|
1513
2201
|
'+' : env.compress ? '+' : ' + ',
|
1514
2202
|
'~' : env.compress ? '~' : ' ~ ',
|
1515
2203
|
'>' : env.compress ? '>' : ' > '
|
1516
2204
|
}[this.value];
|
1517
2205
|
};
|
1518
2206
|
|
1519
|
-
})(require('
|
2207
|
+
})(require('../tree'));
|
1520
2208
|
(function (tree) {
|
1521
2209
|
|
1522
2210
|
tree.Expression = function (value) { this.value = value };
|
@@ -1534,12 +2222,12 @@ tree.Expression.prototype = {
|
|
1534
2222
|
},
|
1535
2223
|
toCSS: function (env) {
|
1536
2224
|
return this.value.map(function (e) {
|
1537
|
-
return e.toCSS(env);
|
2225
|
+
return e.toCSS ? e.toCSS(env) : '';
|
1538
2226
|
}).join(' ');
|
1539
2227
|
}
|
1540
2228
|
};
|
1541
2229
|
|
1542
|
-
})(require('
|
2230
|
+
})(require('../tree'));
|
1543
2231
|
(function (tree) {
|
1544
2232
|
//
|
1545
2233
|
// CSS @import node
|
@@ -1553,27 +2241,27 @@ tree.Expression.prototype = {
|
|
1553
2241
|
// `import,push`, we also pass it a callback, which it'll call once
|
1554
2242
|
// the file has been fetched, and parsed.
|
1555
2243
|
//
|
1556
|
-
tree.Import = function (path, imports) {
|
2244
|
+
tree.Import = function (path, imports, features, index) {
|
1557
2245
|
var that = this;
|
1558
2246
|
|
2247
|
+
this.index = index;
|
1559
2248
|
this._path = path;
|
2249
|
+
this.features = features && new(tree.Value)(features);
|
1560
2250
|
|
1561
2251
|
// The '.less' extension is optional
|
1562
2252
|
if (path instanceof tree.Quoted) {
|
1563
|
-
this.path = /\.(le?|c)ss
|
2253
|
+
this.path = /\.(le?|c)ss(\?.*)?$/.test(path.value) ? path.value : path.value + '.less';
|
1564
2254
|
} else {
|
1565
2255
|
this.path = path.value.value || path.value;
|
1566
2256
|
}
|
1567
2257
|
|
1568
|
-
this.css = /css
|
2258
|
+
this.css = /css(\?.*)?$/.test(this.path);
|
1569
2259
|
|
1570
2260
|
// Only pre-compile .less files
|
1571
2261
|
if (! this.css) {
|
1572
|
-
imports.push(this.path, function (root) {
|
1573
|
-
if (
|
1574
|
-
|
1575
|
-
}
|
1576
|
-
that.root = root;
|
2262
|
+
imports.push(this.path, function (e, root) {
|
2263
|
+
if (e) { e.index = index }
|
2264
|
+
that.root = root || new(tree.Ruleset)([], []);
|
1577
2265
|
});
|
1578
2266
|
}
|
1579
2267
|
};
|
@@ -1588,20 +2276,22 @@ tree.Import = function (path, imports) {
|
|
1588
2276
|
// ruleset.
|
1589
2277
|
//
|
1590
2278
|
tree.Import.prototype = {
|
1591
|
-
toCSS: function () {
|
2279
|
+
toCSS: function (env) {
|
2280
|
+
var features = this.features ? ' ' + this.features.toCSS(env) : '';
|
2281
|
+
|
1592
2282
|
if (this.css) {
|
1593
|
-
return "@import " + this._path.toCSS() + ';\n';
|
2283
|
+
return "@import " + this._path.toCSS() + features + ';\n';
|
1594
2284
|
} else {
|
1595
2285
|
return "";
|
1596
2286
|
}
|
1597
2287
|
},
|
1598
2288
|
eval: function (env) {
|
1599
|
-
var ruleset;
|
2289
|
+
var ruleset, features = this.features && this.features.eval(env);
|
1600
2290
|
|
1601
2291
|
if (this.css) {
|
1602
2292
|
return this;
|
1603
2293
|
} else {
|
1604
|
-
ruleset = new(tree.Ruleset)(
|
2294
|
+
ruleset = new(tree.Ruleset)([], this.root.rules.slice(0));
|
1605
2295
|
|
1606
2296
|
for (var i = 0; i < ruleset.rules.length; i++) {
|
1607
2297
|
if (ruleset.rules[i] instanceof tree.Import) {
|
@@ -1611,12 +2301,12 @@ tree.Import.prototype = {
|
|
1611
2301
|
[i, 1].concat(ruleset.rules[i].eval(env)));
|
1612
2302
|
}
|
1613
2303
|
}
|
1614
|
-
return ruleset.rules;
|
2304
|
+
return this.features ? new(tree.Media)(ruleset.rules, this.features.value) : ruleset.rules;
|
1615
2305
|
}
|
1616
2306
|
}
|
1617
2307
|
};
|
1618
2308
|
|
1619
|
-
})(require('
|
2309
|
+
})(require('../tree'));
|
1620
2310
|
(function (tree) {
|
1621
2311
|
|
1622
2312
|
tree.JavaScript = function (string, index, escaped) {
|
@@ -1666,24 +2356,150 @@ tree.JavaScript.prototype = {
|
|
1666
2356
|
}
|
1667
2357
|
};
|
1668
2358
|
|
1669
|
-
})(require('
|
2359
|
+
})(require('../tree'));
|
1670
2360
|
|
1671
2361
|
(function (tree) {
|
1672
2362
|
|
1673
2363
|
tree.Keyword = function (value) { this.value = value };
|
1674
2364
|
tree.Keyword.prototype = {
|
1675
2365
|
eval: function () { return this },
|
1676
|
-
toCSS: function () { return this.value }
|
2366
|
+
toCSS: function () { return this.value },
|
2367
|
+
compare: function (other) {
|
2368
|
+
if (other instanceof tree.Keyword) {
|
2369
|
+
return other.value === this.value ? 0 : 1;
|
2370
|
+
} else {
|
2371
|
+
return -1;
|
2372
|
+
}
|
2373
|
+
}
|
2374
|
+
};
|
2375
|
+
|
2376
|
+
tree.True = new(tree.Keyword)('true');
|
2377
|
+
tree.False = new(tree.Keyword)('false');
|
2378
|
+
|
2379
|
+
})(require('../tree'));
|
2380
|
+
(function (tree) {
|
2381
|
+
|
2382
|
+
tree.Media = function (value, features) {
|
2383
|
+
var el = new(tree.Element)('&', null, 0),
|
2384
|
+
selectors = [new(tree.Selector)([el])];
|
2385
|
+
|
2386
|
+
this.features = new(tree.Value)(features);
|
2387
|
+
this.ruleset = new(tree.Ruleset)(selectors, value);
|
2388
|
+
this.ruleset.allowImports = true;
|
2389
|
+
};
|
2390
|
+
tree.Media.prototype = {
|
2391
|
+
toCSS: function (ctx, env) {
|
2392
|
+
var features = this.features.toCSS(env);
|
2393
|
+
|
2394
|
+
this.ruleset.root = (ctx.length === 0 || ctx[0].multiMedia);
|
2395
|
+
return '@media ' + features + (env.compress ? '{' : ' {\n ') +
|
2396
|
+
this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') +
|
2397
|
+
(env.compress ? '}': '\n}\n');
|
2398
|
+
},
|
2399
|
+
eval: function (env) {
|
2400
|
+
if (!env.mediaBlocks) {
|
2401
|
+
env.mediaBlocks = [];
|
2402
|
+
env.mediaPath = [];
|
2403
|
+
}
|
2404
|
+
|
2405
|
+
var blockIndex = env.mediaBlocks.length;
|
2406
|
+
env.mediaPath.push(this);
|
2407
|
+
env.mediaBlocks.push(this);
|
2408
|
+
|
2409
|
+
var media = new(tree.Media)([], []);
|
2410
|
+
media.features = this.features.eval(env);
|
2411
|
+
|
2412
|
+
env.frames.unshift(this.ruleset);
|
2413
|
+
media.ruleset = this.ruleset.eval(env);
|
2414
|
+
env.frames.shift();
|
2415
|
+
|
2416
|
+
env.mediaBlocks[blockIndex] = media;
|
2417
|
+
env.mediaPath.pop();
|
2418
|
+
|
2419
|
+
return env.mediaPath.length === 0 ? media.evalTop(env) :
|
2420
|
+
media.evalNested(env)
|
2421
|
+
},
|
2422
|
+
variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) },
|
2423
|
+
find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) },
|
2424
|
+
rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) },
|
2425
|
+
|
2426
|
+
evalTop: function (env) {
|
2427
|
+
var result = this;
|
2428
|
+
|
2429
|
+
// Render all dependent Media blocks.
|
2430
|
+
if (env.mediaBlocks.length > 1) {
|
2431
|
+
var el = new(tree.Element)('&', null, 0);
|
2432
|
+
var selectors = [new(tree.Selector)([el])];
|
2433
|
+
result = new(tree.Ruleset)(selectors, env.mediaBlocks);
|
2434
|
+
result.multiMedia = true;
|
2435
|
+
}
|
2436
|
+
|
2437
|
+
delete env.mediaBlocks;
|
2438
|
+
delete env.mediaPath;
|
2439
|
+
|
2440
|
+
return result;
|
2441
|
+
},
|
2442
|
+
evalNested: function (env) {
|
2443
|
+
var i, value,
|
2444
|
+
path = env.mediaPath.concat([this]);
|
2445
|
+
|
2446
|
+
// Extract the media-query conditions separated with `,` (OR).
|
2447
|
+
for (i = 0; i < path.length; i++) {
|
2448
|
+
value = path[i].features instanceof tree.Value ?
|
2449
|
+
path[i].features.value : path[i].features;
|
2450
|
+
path[i] = Array.isArray(value) ? value : [value];
|
2451
|
+
}
|
2452
|
+
|
2453
|
+
// Trace all permutations to generate the resulting media-query.
|
2454
|
+
//
|
2455
|
+
// (a, b and c) with nested (d, e) ->
|
2456
|
+
// a and d
|
2457
|
+
// a and e
|
2458
|
+
// b and c and d
|
2459
|
+
// b and c and e
|
2460
|
+
this.features = new(tree.Value)(this.permute(path).map(function (path) {
|
2461
|
+
path = path.map(function (fragment) {
|
2462
|
+
return fragment.toCSS ? fragment : new(tree.Anonymous)(fragment);
|
2463
|
+
});
|
2464
|
+
|
2465
|
+
for(i = path.length - 1; i > 0; i--) {
|
2466
|
+
path.splice(i, 0, new(tree.Anonymous)("and"));
|
2467
|
+
}
|
2468
|
+
|
2469
|
+
return new(tree.Expression)(path);
|
2470
|
+
}));
|
2471
|
+
|
2472
|
+
// Fake a tree-node that doesn't output anything.
|
2473
|
+
return new(tree.Ruleset)([], []);
|
2474
|
+
},
|
2475
|
+
permute: function (arr) {
|
2476
|
+
if (arr.length === 0) {
|
2477
|
+
return [];
|
2478
|
+
} else if (arr.length === 1) {
|
2479
|
+
return arr[0];
|
2480
|
+
} else {
|
2481
|
+
var result = [];
|
2482
|
+
var rest = this.permute(arr.slice(1));
|
2483
|
+
for (var i = 0; i < rest.length; i++) {
|
2484
|
+
for (var j = 0; j < arr[0].length; j++) {
|
2485
|
+
result.push([arr[0][j]].concat(rest[i]));
|
2486
|
+
}
|
2487
|
+
}
|
2488
|
+
return result;
|
2489
|
+
}
|
2490
|
+
}
|
1677
2491
|
};
|
1678
2492
|
|
1679
|
-
})(require('
|
2493
|
+
})(require('../tree'));
|
1680
2494
|
(function (tree) {
|
1681
2495
|
|
1682
2496
|
tree.mixin = {};
|
1683
|
-
tree.mixin.Call = function (elements, args, index) {
|
2497
|
+
tree.mixin.Call = function (elements, args, index, filename, important) {
|
1684
2498
|
this.selector = new(tree.Selector)(elements);
|
1685
2499
|
this.arguments = args;
|
1686
2500
|
this.index = index;
|
2501
|
+
this.filename = filename;
|
2502
|
+
this.important = important;
|
1687
2503
|
};
|
1688
2504
|
tree.mixin.Call.prototype = {
|
1689
2505
|
eval: function (env) {
|
@@ -1696,34 +2512,38 @@ tree.mixin.Call.prototype = {
|
|
1696
2512
|
if (mixins[m].match(args, env)) {
|
1697
2513
|
try {
|
1698
2514
|
Array.prototype.push.apply(
|
1699
|
-
rules, mixins[m].eval(env, this.arguments).rules);
|
2515
|
+
rules, mixins[m].eval(env, this.arguments, this.important).rules);
|
1700
2516
|
match = true;
|
1701
2517
|
} catch (e) {
|
1702
|
-
throw { message: e.message, index:
|
2518
|
+
throw { message: e.message, index: this.index, filename: this.filename, stack: e.stack };
|
1703
2519
|
}
|
1704
2520
|
}
|
1705
2521
|
}
|
1706
2522
|
if (match) {
|
1707
2523
|
return rules;
|
1708
2524
|
} else {
|
1709
|
-
throw {
|
2525
|
+
throw { type: 'Runtime',
|
2526
|
+
message: 'No matching definition was found for `' +
|
1710
2527
|
this.selector.toCSS().trim() + '(' +
|
1711
2528
|
this.arguments.map(function (a) {
|
1712
2529
|
return a.toCSS();
|
1713
2530
|
}).join(', ') + ")`",
|
1714
|
-
index: this.index };
|
2531
|
+
index: this.index, filename: this.filename };
|
1715
2532
|
}
|
1716
2533
|
}
|
1717
2534
|
}
|
1718
|
-
throw {
|
1719
|
-
|
2535
|
+
throw { type: 'Name',
|
2536
|
+
message: this.selector.toCSS().trim() + " is undefined",
|
2537
|
+
index: this.index, filename: this.filename };
|
1720
2538
|
}
|
1721
2539
|
};
|
1722
2540
|
|
1723
|
-
tree.mixin.Definition = function (name, params, rules) {
|
2541
|
+
tree.mixin.Definition = function (name, params, rules, condition, variadic) {
|
1724
2542
|
this.name = name;
|
1725
2543
|
this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])];
|
1726
2544
|
this.params = params;
|
2545
|
+
this.condition = condition;
|
2546
|
+
this.variadic = variadic;
|
1727
2547
|
this.arity = params.length;
|
1728
2548
|
this.rules = rules;
|
1729
2549
|
this._lookups = {};
|
@@ -1741,33 +2561,56 @@ tree.mixin.Definition.prototype = {
|
|
1741
2561
|
find: function () { return this.parent.find.apply(this, arguments) },
|
1742
2562
|
rulesets: function () { return this.parent.rulesets.apply(this) },
|
1743
2563
|
|
1744
|
-
|
1745
|
-
var frame = new(tree.Ruleset)(null, []),
|
2564
|
+
evalParams: function (env, args) {
|
2565
|
+
var frame = new(tree.Ruleset)(null, []), varargs;
|
1746
2566
|
|
1747
|
-
for (var i = 0, val; i < this.params.length; i++) {
|
1748
|
-
if (this.params[i].name) {
|
1749
|
-
if (
|
1750
|
-
|
2567
|
+
for (var i = 0, val, name; i < this.params.length; i++) {
|
2568
|
+
if (name = this.params[i].name) {
|
2569
|
+
if (this.params[i].variadic && args) {
|
2570
|
+
varargs = [];
|
2571
|
+
for (var j = i; j < args.length; j++) {
|
2572
|
+
varargs.push(args[j].eval(env));
|
2573
|
+
}
|
2574
|
+
frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env)));
|
2575
|
+
} else if (val = (args && args[i]) || this.params[i].value) {
|
2576
|
+
frame.rules.unshift(new(tree.Rule)(name, val.eval(env)));
|
1751
2577
|
} else {
|
1752
|
-
throw { message: "wrong number of arguments for " + this.name +
|
2578
|
+
throw { type: 'Runtime', message: "wrong number of arguments for " + this.name +
|
1753
2579
|
' (' + args.length + ' for ' + this.arity + ')' };
|
1754
2580
|
}
|
1755
2581
|
}
|
1756
2582
|
}
|
2583
|
+
return frame;
|
2584
|
+
},
|
2585
|
+
eval: function (env, args, important) {
|
2586
|
+
var frame = this.evalParams(env, args), context, _arguments = [], rules, start;
|
2587
|
+
|
1757
2588
|
for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) {
|
1758
2589
|
_arguments.push(args[i] || this.params[i].value);
|
1759
2590
|
}
|
1760
2591
|
frame.rules.unshift(new(tree.Rule)('@arguments', new(tree.Expression)(_arguments).eval(env)));
|
1761
2592
|
|
1762
|
-
|
2593
|
+
rules = important ?
|
2594
|
+
this.rules.map(function (r) {
|
2595
|
+
return new(tree.Rule)(r.name, r.value, '!important', r.index);
|
2596
|
+
}) : this.rules.slice(0);
|
2597
|
+
|
2598
|
+
return new(tree.Ruleset)(null, rules).eval({
|
1763
2599
|
frames: [this, frame].concat(this.frames, env.frames)
|
1764
2600
|
});
|
1765
2601
|
},
|
1766
2602
|
match: function (args, env) {
|
1767
|
-
var argsLength = (args && args.length) || 0, len;
|
2603
|
+
var argsLength = (args && args.length) || 0, len, frame;
|
2604
|
+
|
2605
|
+
if (! this.variadic) {
|
2606
|
+
if (argsLength < this.required) { return false }
|
2607
|
+
if (argsLength > this.params.length) { return false }
|
2608
|
+
if ((this.required > 0) && (argsLength > this.params.length)) { return false }
|
2609
|
+
}
|
1768
2610
|
|
1769
|
-
if (
|
1770
|
-
|
2611
|
+
if (this.condition && !this.condition.eval({
|
2612
|
+
frames: [this.evalParams(env, args)].concat(env.frames)
|
2613
|
+
})) { return false }
|
1771
2614
|
|
1772
2615
|
len = Math.min(argsLength, this.arity);
|
1773
2616
|
|
@@ -1782,7 +2625,7 @@ tree.mixin.Definition.prototype = {
|
|
1782
2625
|
}
|
1783
2626
|
};
|
1784
2627
|
|
1785
|
-
})(require('
|
2628
|
+
})(require('../tree'));
|
1786
2629
|
(function (tree) {
|
1787
2630
|
|
1788
2631
|
tree.Operation = function (op, operands) {
|
@@ -1814,7 +2657,23 @@ tree.operate = function (op, a, b) {
|
|
1814
2657
|
}
|
1815
2658
|
};
|
1816
2659
|
|
1817
|
-
})(require('
|
2660
|
+
})(require('../tree'));
|
2661
|
+
|
2662
|
+
(function (tree) {
|
2663
|
+
|
2664
|
+
tree.Paren = function (node) {
|
2665
|
+
this.value = node;
|
2666
|
+
};
|
2667
|
+
tree.Paren.prototype = {
|
2668
|
+
toCSS: function (env) {
|
2669
|
+
return '(' + this.value.toCSS(env) + ')';
|
2670
|
+
},
|
2671
|
+
eval: function (env) {
|
2672
|
+
return new(tree.Paren)(this.value.eval(env));
|
2673
|
+
}
|
2674
|
+
};
|
2675
|
+
|
2676
|
+
})(require('../tree'));
|
1818
2677
|
(function (tree) {
|
1819
2678
|
|
1820
2679
|
tree.Quoted = function (str, content, escaped, i) {
|
@@ -1837,20 +2696,21 @@ tree.Quoted.prototype = {
|
|
1837
2696
|
return new(tree.JavaScript)(exp, that.index, true).eval(env).value;
|
1838
2697
|
}).replace(/@\{([\w-]+)\}/g, function (_, name) {
|
1839
2698
|
var v = new(tree.Variable)('@' + name, that.index).eval(env);
|
1840
|
-
return v.value
|
2699
|
+
return ('value' in v) ? v.value : v.toCSS();
|
1841
2700
|
});
|
1842
2701
|
return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index);
|
1843
2702
|
}
|
1844
2703
|
};
|
1845
2704
|
|
1846
|
-
})(require('
|
2705
|
+
})(require('../tree'));
|
1847
2706
|
(function (tree) {
|
1848
2707
|
|
1849
|
-
tree.Rule = function (name, value, important, index) {
|
2708
|
+
tree.Rule = function (name, value, important, index, inline) {
|
1850
2709
|
this.name = name;
|
1851
2710
|
this.value = (value instanceof tree.Value) ? value : new(tree.Value)([value]);
|
1852
2711
|
this.important = important ? ' ' + important.trim() : '';
|
1853
2712
|
this.index = index;
|
2713
|
+
this.inline = inline || false;
|
1854
2714
|
|
1855
2715
|
if (name.charAt(0) === '@') {
|
1856
2716
|
this.variable = true;
|
@@ -1861,12 +2721,15 @@ tree.Rule.prototype.toCSS = function (env) {
|
|
1861
2721
|
else {
|
1862
2722
|
return this.name + (env.compress ? ':' : ': ') +
|
1863
2723
|
this.value.toCSS(env) +
|
1864
|
-
this.important + ";";
|
2724
|
+
this.important + (this.inline ? "" : ";");
|
1865
2725
|
}
|
1866
2726
|
};
|
1867
2727
|
|
1868
2728
|
tree.Rule.prototype.eval = function (context) {
|
1869
|
-
return new(tree.Rule)(this.name,
|
2729
|
+
return new(tree.Rule)(this.name,
|
2730
|
+
this.value.eval(context),
|
2731
|
+
this.important,
|
2732
|
+
this.index, this.inline);
|
1870
2733
|
};
|
1871
2734
|
|
1872
2735
|
tree.Shorthand = function (a, b) {
|
@@ -1881,25 +2744,28 @@ tree.Shorthand.prototype = {
|
|
1881
2744
|
eval: function () { return this }
|
1882
2745
|
};
|
1883
2746
|
|
1884
|
-
})(require('
|
2747
|
+
})(require('../tree'));
|
1885
2748
|
(function (tree) {
|
1886
2749
|
|
1887
|
-
tree.Ruleset = function (selectors, rules) {
|
2750
|
+
tree.Ruleset = function (selectors, rules, strictImports) {
|
1888
2751
|
this.selectors = selectors;
|
1889
2752
|
this.rules = rules;
|
1890
2753
|
this._lookups = {};
|
2754
|
+
this.strictImports = strictImports;
|
1891
2755
|
};
|
1892
2756
|
tree.Ruleset.prototype = {
|
1893
2757
|
eval: function (env) {
|
1894
|
-
var
|
2758
|
+
var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) });
|
2759
|
+
var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports);
|
1895
2760
|
|
1896
2761
|
ruleset.root = this.root;
|
2762
|
+
ruleset.allowImports = this.allowImports;
|
1897
2763
|
|
1898
2764
|
// push the current ruleset to the frames stack
|
1899
2765
|
env.frames.unshift(ruleset);
|
1900
2766
|
|
1901
2767
|
// Evaluate imports
|
1902
|
-
if (ruleset.root) {
|
2768
|
+
if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
|
1903
2769
|
for (var i = 0; i < ruleset.rules.length; i++) {
|
1904
2770
|
if (ruleset.rules[i] instanceof tree.Import) {
|
1905
2771
|
Array.prototype.splice
|
@@ -1974,7 +2840,7 @@ tree.Ruleset.prototype = {
|
|
1974
2840
|
if (rule !== self) {
|
1975
2841
|
for (var j = 0; j < rule.selectors.length; j++) {
|
1976
2842
|
if (match = selector.match(rule.selectors[j])) {
|
1977
|
-
if (selector.elements.length >
|
2843
|
+
if (selector.elements.length > rule.selectors[j].elements.length) {
|
1978
2844
|
Array.prototype.push.apply(rules, rule.find(
|
1979
2845
|
new(tree.Selector)(selector.elements.slice(1)), self));
|
1980
2846
|
} else {
|
@@ -2004,11 +2870,7 @@ tree.Ruleset.prototype = {
|
|
2004
2870
|
if (context.length === 0) {
|
2005
2871
|
paths = this.selectors.map(function (s) { return [s] });
|
2006
2872
|
} else {
|
2007
|
-
|
2008
|
-
for (var c = 0; c < context.length; c++) {
|
2009
|
-
paths.push(context[c].concat([this.selectors[s]]));
|
2010
|
-
}
|
2011
|
-
}
|
2873
|
+
this.joinSelectors(paths, context, this.selectors);
|
2012
2874
|
}
|
2013
2875
|
}
|
2014
2876
|
|
@@ -2016,7 +2878,7 @@ tree.Ruleset.prototype = {
|
|
2016
2878
|
for (var i = 0; i < this.rules.length; i++) {
|
2017
2879
|
rule = this.rules[i];
|
2018
2880
|
|
2019
|
-
if (rule.rules || (rule instanceof tree.Directive)) {
|
2881
|
+
if (rule.rules || (rule instanceof tree.Directive) || (rule instanceof tree.Media)) {
|
2020
2882
|
rulesets.push(rule.toCSS(paths, env));
|
2021
2883
|
} else if (rule instanceof tree.Comment) {
|
2022
2884
|
if (!rule.silent) {
|
@@ -2048,7 +2910,8 @@ tree.Ruleset.prototype = {
|
|
2048
2910
|
return p.map(function (s) {
|
2049
2911
|
return s.toCSS(env);
|
2050
2912
|
}).join('').trim();
|
2051
|
-
}).join(env.compress ? ',' :
|
2913
|
+
}).join( env.compress ? ',' : ',\n');
|
2914
|
+
|
2052
2915
|
css.push(selector,
|
2053
2916
|
(env.compress ? '{' : ' {\n ') +
|
2054
2917
|
rules.join(env.compress ? '' : '\n ') +
|
@@ -2058,9 +2921,46 @@ tree.Ruleset.prototype = {
|
|
2058
2921
|
css.push(rulesets);
|
2059
2922
|
|
2060
2923
|
return css.join('') + (env.compress ? '\n' : '');
|
2924
|
+
},
|
2925
|
+
|
2926
|
+
joinSelectors: function (paths, context, selectors) {
|
2927
|
+
for (var s = 0; s < selectors.length; s++) {
|
2928
|
+
this.joinSelector(paths, context, selectors[s]);
|
2929
|
+
}
|
2930
|
+
},
|
2931
|
+
|
2932
|
+
joinSelector: function (paths, context, selector) {
|
2933
|
+
var before = [], after = [], beforeElements = [],
|
2934
|
+
afterElements = [], hasParentSelector = false, el;
|
2935
|
+
|
2936
|
+
for (var i = 0; i < selector.elements.length; i++) {
|
2937
|
+
el = selector.elements[i];
|
2938
|
+
if (el.combinator.value.charAt(0) === '&') {
|
2939
|
+
hasParentSelector = true;
|
2940
|
+
}
|
2941
|
+
if (hasParentSelector) afterElements.push(el);
|
2942
|
+
else beforeElements.push(el);
|
2943
|
+
}
|
2944
|
+
|
2945
|
+
if (! hasParentSelector) {
|
2946
|
+
afterElements = beforeElements;
|
2947
|
+
beforeElements = [];
|
2948
|
+
}
|
2949
|
+
|
2950
|
+
if (beforeElements.length > 0) {
|
2951
|
+
before.push(new(tree.Selector)(beforeElements));
|
2952
|
+
}
|
2953
|
+
|
2954
|
+
if (afterElements.length > 0) {
|
2955
|
+
after.push(new(tree.Selector)(afterElements));
|
2956
|
+
}
|
2957
|
+
|
2958
|
+
for (var c = 0; c < context.length; c++) {
|
2959
|
+
paths.push(before.concat(context[c]).concat(after));
|
2960
|
+
}
|
2061
2961
|
}
|
2062
2962
|
};
|
2063
|
-
})(require('
|
2963
|
+
})(require('../tree'));
|
2064
2964
|
(function (tree) {
|
2065
2965
|
|
2066
2966
|
tree.Selector = function (elements) {
|
@@ -2070,11 +2970,25 @@ tree.Selector = function (elements) {
|
|
2070
2970
|
}
|
2071
2971
|
};
|
2072
2972
|
tree.Selector.prototype.match = function (other) {
|
2073
|
-
|
2074
|
-
|
2075
|
-
|
2973
|
+
var len = this.elements.length,
|
2974
|
+
olen = other.elements.length,
|
2975
|
+
max = Math.min(len, olen);
|
2976
|
+
|
2977
|
+
if (len < olen) {
|
2076
2978
|
return false;
|
2979
|
+
} else {
|
2980
|
+
for (var i = 0; i < max; i++) {
|
2981
|
+
if (this.elements[i].value !== other.elements[i].value) {
|
2982
|
+
return false;
|
2983
|
+
}
|
2984
|
+
}
|
2077
2985
|
}
|
2986
|
+
return true;
|
2987
|
+
};
|
2988
|
+
tree.Selector.prototype.eval = function (env) {
|
2989
|
+
return new(tree.Selector)(this.elements.map(function (e) {
|
2990
|
+
return e.eval(env);
|
2991
|
+
}));
|
2078
2992
|
};
|
2079
2993
|
tree.Selector.prototype.toCSS = function (env) {
|
2080
2994
|
if (this._css) { return this._css }
|
@@ -2088,7 +3002,7 @@ tree.Selector.prototype.toCSS = function (env) {
|
|
2088
3002
|
}).join('');
|
2089
3003
|
};
|
2090
3004
|
|
2091
|
-
})(require('
|
3005
|
+
})(require('../tree'));
|
2092
3006
|
(function (tree) {
|
2093
3007
|
|
2094
3008
|
tree.URL = function (val, paths) {
|
@@ -2096,7 +3010,7 @@ tree.URL = function (val, paths) {
|
|
2096
3010
|
this.attrs = val;
|
2097
3011
|
} else {
|
2098
3012
|
// Add the base path if the URL is relative and we are in the browser
|
2099
|
-
if (!/^(?:https
|
3013
|
+
if (typeof(window) !== 'undefined' && !/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(val.value) && paths.length > 0) {
|
2100
3014
|
val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value);
|
2101
3015
|
}
|
2102
3016
|
this.value = val;
|
@@ -2113,7 +3027,7 @@ tree.URL.prototype = {
|
|
2113
3027
|
}
|
2114
3028
|
};
|
2115
3029
|
|
2116
|
-
})(require('
|
3030
|
+
})(require('../tree'));
|
2117
3031
|
(function (tree) {
|
2118
3032
|
|
2119
3033
|
tree.Value = function (value) {
|
@@ -2137,10 +3051,10 @@ tree.Value.prototype = {
|
|
2137
3051
|
}
|
2138
3052
|
};
|
2139
3053
|
|
2140
|
-
})(require('
|
3054
|
+
})(require('../tree'));
|
2141
3055
|
(function (tree) {
|
2142
3056
|
|
2143
|
-
tree.Variable = function (name, index) { this.name = name, this.index = index };
|
3057
|
+
tree.Variable = function (name, index, file) { this.name = name, this.index = index, this.file = file };
|
2144
3058
|
tree.Variable.prototype = {
|
2145
3059
|
eval: function (env) {
|
2146
3060
|
var variable, v, name = this.name;
|
@@ -2155,198 +3069,410 @@ tree.Variable.prototype = {
|
|
2155
3069
|
}
|
2156
3070
|
})) { return variable }
|
2157
3071
|
else {
|
2158
|
-
throw {
|
3072
|
+
throw { type: 'Name',
|
3073
|
+
message: "variable " + name + " is undefined",
|
3074
|
+
filename: this.file,
|
2159
3075
|
index: this.index };
|
2160
3076
|
}
|
2161
3077
|
}
|
2162
3078
|
};
|
2163
3079
|
|
2164
|
-
})(require('
|
2165
|
-
|
3080
|
+
})(require('../tree'));
|
3081
|
+
(function (tree) {
|
3082
|
+
|
3083
|
+
tree.find = function (obj, fun) {
|
2166
3084
|
for (var i = 0, r; i < obj.length; i++) {
|
2167
3085
|
if (r = fun.call(obj, obj[i])) { return r }
|
2168
3086
|
}
|
2169
3087
|
return null;
|
2170
3088
|
};
|
2171
|
-
|
3089
|
+
tree.jsify = function (obj) {
|
2172
3090
|
if (Array.isArray(obj.value) && (obj.value.length > 1)) {
|
2173
3091
|
return '[' + obj.value.map(function (v) { return v.toCSS(false) }).join(', ') + ']';
|
2174
3092
|
} else {
|
2175
3093
|
return obj.toCSS(false);
|
2176
3094
|
}
|
2177
3095
|
};
|
2178
|
-
(function (tree) {
|
2179
3096
|
|
2180
|
-
tree
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
rgba: function (r, g, b, a) {
|
2185
|
-
var rgb = [r, g, b].map(function (c) { return number(c) }),
|
2186
|
-
a = number(a);
|
2187
|
-
return new(tree.Color)(rgb, a);
|
2188
|
-
},
|
2189
|
-
hsl: function (h, s, l) {
|
2190
|
-
return this.hsla(h, s, l, 1.0);
|
2191
|
-
},
|
2192
|
-
hsla: function (h, s, l, a) {
|
2193
|
-
h = (number(h) % 360) / 360;
|
2194
|
-
s = number(s); l = number(l); a = number(a);
|
3097
|
+
})(require('./tree'));
|
3098
|
+
//
|
3099
|
+
// browser.js - client-side engine
|
3100
|
+
//
|
2195
3101
|
|
2196
|
-
|
2197
|
-
|
3102
|
+
var isFileProtocol = (location.protocol === 'file:' ||
|
3103
|
+
location.protocol === 'chrome:' ||
|
3104
|
+
location.protocol === 'chrome-extension:' ||
|
3105
|
+
location.protocol === 'resource:');
|
2198
3106
|
|
2199
|
-
|
2200
|
-
|
2201
|
-
|
2202
|
-
|
3107
|
+
less.env = less.env || (location.hostname == '127.0.0.1' ||
|
3108
|
+
location.hostname == '0.0.0.0' ||
|
3109
|
+
location.hostname == 'localhost' ||
|
3110
|
+
location.port.length > 0 ||
|
3111
|
+
isFileProtocol ? 'development'
|
3112
|
+
: 'production');
|
2203
3113
|
|
2204
|
-
|
2205
|
-
|
2206
|
-
|
2207
|
-
|
2208
|
-
|
2209
|
-
|
2210
|
-
|
2211
|
-
},
|
2212
|
-
hue: function (color) {
|
2213
|
-
return new(tree.Dimension)(Math.round(color.toHSL().h));
|
2214
|
-
},
|
2215
|
-
saturation: function (color) {
|
2216
|
-
return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%');
|
2217
|
-
},
|
2218
|
-
lightness: function (color) {
|
2219
|
-
return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%');
|
2220
|
-
},
|
2221
|
-
alpha: function (color) {
|
2222
|
-
return new(tree.Dimension)(color.toHSL().a);
|
2223
|
-
},
|
2224
|
-
saturate: function (color, amount) {
|
2225
|
-
var hsl = color.toHSL();
|
3114
|
+
// Load styles asynchronously (default: false)
|
3115
|
+
//
|
3116
|
+
// This is set to `false` by default, so that the body
|
3117
|
+
// doesn't start loading before the stylesheets are parsed.
|
3118
|
+
// Setting this to `true` can result in flickering.
|
3119
|
+
//
|
3120
|
+
less.async = false;
|
2226
3121
|
|
2227
|
-
|
2228
|
-
|
2229
|
-
return hsla(hsl);
|
2230
|
-
},
|
2231
|
-
desaturate: function (color, amount) {
|
2232
|
-
var hsl = color.toHSL();
|
3122
|
+
// Interval between watch polls
|
3123
|
+
less.poll = less.poll || (isFileProtocol ? 1000 : 1500);
|
2233
3124
|
|
2234
|
-
|
2235
|
-
|
2236
|
-
|
2237
|
-
|
2238
|
-
|
2239
|
-
var hsl = color.toHSL();
|
3125
|
+
//
|
3126
|
+
// Watch mode
|
3127
|
+
//
|
3128
|
+
less.watch = function () { return this.watchMode = true };
|
3129
|
+
less.unwatch = function () { return this.watchMode = false };
|
2240
3130
|
|
2241
|
-
|
2242
|
-
|
2243
|
-
return hsla(hsl);
|
2244
|
-
},
|
2245
|
-
darken: function (color, amount) {
|
2246
|
-
var hsl = color.toHSL();
|
3131
|
+
if (less.env === 'development') {
|
3132
|
+
less.optimization = 0;
|
2247
3133
|
|
2248
|
-
|
2249
|
-
|
2250
|
-
|
2251
|
-
|
2252
|
-
|
2253
|
-
|
3134
|
+
if (/!watch/.test(location.hash)) {
|
3135
|
+
less.watch();
|
3136
|
+
}
|
3137
|
+
less.watchTimer = setInterval(function () {
|
3138
|
+
if (less.watchMode) {
|
3139
|
+
loadStyleSheets(function (e, root, _, sheet, env) {
|
3140
|
+
if (root) {
|
3141
|
+
createCSS(root.toCSS(), sheet, env.lastModified);
|
3142
|
+
}
|
3143
|
+
});
|
3144
|
+
}
|
3145
|
+
}, less.poll);
|
3146
|
+
} else {
|
3147
|
+
less.optimization = 3;
|
3148
|
+
}
|
2254
3149
|
|
2255
|
-
|
2256
|
-
hsl.a = clamp(hsl.a);
|
2257
|
-
return hsla(hsl);
|
2258
|
-
},
|
2259
|
-
fadeout: function (color, amount) {
|
2260
|
-
var hsl = color.toHSL();
|
3150
|
+
var cache;
|
2261
3151
|
|
2262
|
-
|
2263
|
-
|
2264
|
-
|
2265
|
-
|
2266
|
-
|
2267
|
-
var hsl = color.toHSL();
|
2268
|
-
var hue = (hsl.h + amount.value) % 360;
|
3152
|
+
try {
|
3153
|
+
cache = (typeof(window.localStorage) === 'undefined') ? null : window.localStorage;
|
3154
|
+
} catch (_) {
|
3155
|
+
cache = null;
|
3156
|
+
}
|
2269
3157
|
|
2270
|
-
|
3158
|
+
//
|
3159
|
+
// Get all <link> tags with the 'rel' attribute set to "stylesheet/less"
|
3160
|
+
//
|
3161
|
+
var links = document.getElementsByTagName('link');
|
3162
|
+
var typePattern = /^text\/(x-)?less$/;
|
2271
3163
|
|
2272
|
-
|
2273
|
-
},
|
2274
|
-
//
|
2275
|
-
// Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
|
2276
|
-
// http://sass-lang.com
|
2277
|
-
//
|
2278
|
-
mix: function (color1, color2, weight) {
|
2279
|
-
var p = weight.value / 100.0;
|
2280
|
-
var w = p * 2 - 1;
|
2281
|
-
var a = color1.toHSL().a - color2.toHSL().a;
|
3164
|
+
less.sheets = [];
|
2282
3165
|
|
2283
|
-
|
2284
|
-
|
3166
|
+
for (var i = 0; i < links.length; i++) {
|
3167
|
+
if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&
|
3168
|
+
(links[i].type.match(typePattern)))) {
|
3169
|
+
less.sheets.push(links[i]);
|
3170
|
+
}
|
3171
|
+
}
|
2285
3172
|
|
2286
|
-
var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,
|
2287
|
-
color1.rgb[1] * w1 + color2.rgb[1] * w2,
|
2288
|
-
color1.rgb[2] * w1 + color2.rgb[2] * w2];
|
2289
3173
|
|
2290
|
-
|
3174
|
+
less.refresh = function (reload) {
|
3175
|
+
var startTime, endTime;
|
3176
|
+
startTime = endTime = new(Date);
|
2291
3177
|
|
2292
|
-
|
2293
|
-
|
2294
|
-
|
2295
|
-
|
2296
|
-
|
2297
|
-
|
2298
|
-
|
2299
|
-
|
2300
|
-
|
2301
|
-
|
2302
|
-
},
|
2303
|
-
'%': function (quoted /* arg, arg, ...*/) {
|
2304
|
-
var args = Array.prototype.slice.call(arguments, 1),
|
2305
|
-
str = quoted.value;
|
3178
|
+
loadStyleSheets(function (e, root, _, sheet, env) {
|
3179
|
+
if (env.local) {
|
3180
|
+
log("loading " + sheet.href + " from cache.");
|
3181
|
+
} else {
|
3182
|
+
log("parsed " + sheet.href + " successfully.");
|
3183
|
+
createCSS(root.toCSS(), sheet, env.lastModified);
|
3184
|
+
}
|
3185
|
+
log("css for " + sheet.href + " generated in " + (new(Date) - endTime) + 'ms');
|
3186
|
+
(env.remaining === 0) && log("css generated in " + (new(Date) - startTime) + 'ms');
|
3187
|
+
endTime = new(Date);
|
3188
|
+
}, reload);
|
2306
3189
|
|
2307
|
-
|
2308
|
-
|
2309
|
-
|
2310
|
-
|
3190
|
+
loadStyles();
|
3191
|
+
};
|
3192
|
+
less.refreshStyles = loadStyles;
|
3193
|
+
|
3194
|
+
less.refresh(less.env === 'development');
|
3195
|
+
|
3196
|
+
function loadStyles() {
|
3197
|
+
var styles = document.getElementsByTagName('style');
|
3198
|
+
for (var i = 0; i < styles.length; i++) {
|
3199
|
+
if (styles[i].type.match(typePattern)) {
|
3200
|
+
new(less.Parser)().parse(styles[i].innerHTML || '', function (e, tree) {
|
3201
|
+
var css = tree.toCSS();
|
3202
|
+
var style = styles[i];
|
3203
|
+
style.type = 'text/css';
|
3204
|
+
if (style.styleSheet) {
|
3205
|
+
style.styleSheet.cssText = css;
|
3206
|
+
} else {
|
3207
|
+
style.innerHTML = css;
|
3208
|
+
}
|
2311
3209
|
});
|
2312
3210
|
}
|
2313
|
-
|
2314
|
-
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2318
|
-
|
2319
|
-
|
2320
|
-
|
3211
|
+
}
|
3212
|
+
}
|
3213
|
+
|
3214
|
+
function loadStyleSheets(callback, reload) {
|
3215
|
+
for (var i = 0; i < less.sheets.length; i++) {
|
3216
|
+
loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1));
|
3217
|
+
}
|
3218
|
+
}
|
3219
|
+
|
3220
|
+
function loadStyleSheet(sheet, callback, reload, remaining) {
|
3221
|
+
var url = window.location.href.replace(/[#?].*$/, '');
|
3222
|
+
var href = sheet.href.replace(/\?.*$/, '');
|
3223
|
+
var css = cache && cache.getItem(href);
|
3224
|
+
var timestamp = cache && cache.getItem(href + ':timestamp');
|
3225
|
+
var styles = { css: css, timestamp: timestamp };
|
3226
|
+
|
3227
|
+
// Stylesheets in IE don't always return the full path
|
3228
|
+
if (! /^(https?|file):/.test(href)) {
|
3229
|
+
if (href.charAt(0) == "/") {
|
3230
|
+
href = window.location.protocol + "//" + window.location.host + href;
|
2321
3231
|
} else {
|
2322
|
-
|
2323
|
-
error: "RuntimeError",
|
2324
|
-
message: "math functions take numbers as parameters"
|
2325
|
-
};
|
3232
|
+
href = url.slice(0, url.lastIndexOf('/') + 1) + href;
|
2326
3233
|
}
|
2327
3234
|
}
|
2328
|
-
|
3235
|
+
var filename = href.match(/([^\/]+)$/)[1];
|
3236
|
+
|
3237
|
+
xhr(sheet.href, sheet.type, function (data, lastModified) {
|
3238
|
+
if (!reload && styles && lastModified &&
|
3239
|
+
(new(Date)(lastModified).valueOf() ===
|
3240
|
+
new(Date)(styles.timestamp).valueOf())) {
|
3241
|
+
// Use local copy
|
3242
|
+
createCSS(styles.css, sheet);
|
3243
|
+
callback(null, null, data, sheet, { local: true, remaining: remaining });
|
3244
|
+
} else {
|
3245
|
+
// Use remote copy (re-parse)
|
3246
|
+
try {
|
3247
|
+
new(less.Parser)({
|
3248
|
+
optimization: less.optimization,
|
3249
|
+
paths: [href.replace(/[\w\.-]+$/, '')],
|
3250
|
+
mime: sheet.type,
|
3251
|
+
filename: filename
|
3252
|
+
}).parse(data, function (e, root) {
|
3253
|
+
if (e) { return error(e, href) }
|
3254
|
+
try {
|
3255
|
+
callback(e, root, data, sheet, { local: false, lastModified: lastModified, remaining: remaining });
|
3256
|
+
removeNode(document.getElementById('less-error-message:' + extractId(href)));
|
3257
|
+
} catch (e) {
|
3258
|
+
error(e, href);
|
3259
|
+
}
|
3260
|
+
});
|
3261
|
+
} catch (e) {
|
3262
|
+
error(e, href);
|
3263
|
+
}
|
3264
|
+
}
|
3265
|
+
}, function (status, url) {
|
3266
|
+
throw new(Error)("Couldn't load " + url + " (" + status + ")");
|
3267
|
+
});
|
3268
|
+
}
|
2329
3269
|
|
2330
|
-
function
|
2331
|
-
return
|
3270
|
+
function extractId(href) {
|
3271
|
+
return href.replace(/^[a-z]+:\/\/?[^\/]+/, '' ) // Remove protocol & domain
|
3272
|
+
.replace(/^\//, '' ) // Remove root /
|
3273
|
+
.replace(/\?.*$/, '' ) // Remove query
|
3274
|
+
.replace(/\.[^\.\/]+$/, '' ) // Remove file extension
|
3275
|
+
.replace(/[^\.\w-]+/g, '-') // Replace illegal characters
|
3276
|
+
.replace(/\./g, ':'); // Replace dots with colons(for valid id)
|
2332
3277
|
}
|
2333
3278
|
|
2334
|
-
function
|
2335
|
-
|
2336
|
-
|
2337
|
-
|
2338
|
-
|
3279
|
+
function createCSS(styles, sheet, lastModified) {
|
3280
|
+
var css;
|
3281
|
+
|
3282
|
+
// Strip the query-string
|
3283
|
+
var href = sheet.href ? sheet.href.replace(/\?.*$/, '') : '';
|
3284
|
+
|
3285
|
+
// If there is no title set, use the filename, minus the extension
|
3286
|
+
var id = 'less:' + (sheet.title || extractId(href));
|
3287
|
+
|
3288
|
+
// If the stylesheet doesn't exist, create a new node
|
3289
|
+
if ((css = document.getElementById(id)) === null) {
|
3290
|
+
css = document.createElement('style');
|
3291
|
+
css.type = 'text/css';
|
3292
|
+
css.media = sheet.media || 'screen';
|
3293
|
+
css.id = id;
|
3294
|
+
document.getElementsByTagName('head')[0].appendChild(css);
|
3295
|
+
}
|
3296
|
+
|
3297
|
+
if (css.styleSheet) { // IE
|
3298
|
+
try {
|
3299
|
+
css.styleSheet.cssText = styles;
|
3300
|
+
} catch (e) {
|
3301
|
+
throw new(Error)("Couldn't reassign styleSheet.cssText.");
|
3302
|
+
}
|
2339
3303
|
} else {
|
2340
|
-
|
2341
|
-
|
2342
|
-
|
3304
|
+
(function (node) {
|
3305
|
+
if (css.childNodes.length > 0) {
|
3306
|
+
if (css.firstChild.nodeValue !== node.nodeValue) {
|
3307
|
+
css.replaceChild(node, css.firstChild);
|
3308
|
+
}
|
3309
|
+
} else {
|
3310
|
+
css.appendChild(node);
|
3311
|
+
}
|
3312
|
+
})(document.createTextNode(styles));
|
3313
|
+
}
|
3314
|
+
|
3315
|
+
// Don't update the local store if the file wasn't modified
|
3316
|
+
if (lastModified && cache) {
|
3317
|
+
log('saving ' + href + ' to cache.');
|
3318
|
+
cache.setItem(href, styles);
|
3319
|
+
cache.setItem(href + ':timestamp', lastModified);
|
3320
|
+
}
|
3321
|
+
}
|
3322
|
+
|
3323
|
+
function xhr(url, type, callback, errback) {
|
3324
|
+
var xhr = getXMLHttpRequest();
|
3325
|
+
var async = isFileProtocol ? false : less.async;
|
3326
|
+
|
3327
|
+
if (typeof(xhr.overrideMimeType) === 'function') {
|
3328
|
+
xhr.overrideMimeType('text/css');
|
3329
|
+
}
|
3330
|
+
xhr.open('GET', url, async);
|
3331
|
+
xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');
|
3332
|
+
xhr.send(null);
|
3333
|
+
|
3334
|
+
if (isFileProtocol) {
|
3335
|
+
if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {
|
3336
|
+
callback(xhr.responseText);
|
3337
|
+
} else {
|
3338
|
+
errback(xhr.status, url);
|
3339
|
+
}
|
3340
|
+
} else if (async) {
|
3341
|
+
xhr.onreadystatechange = function () {
|
3342
|
+
if (xhr.readyState == 4) {
|
3343
|
+
handleResponse(xhr, callback, errback);
|
3344
|
+
}
|
2343
3345
|
};
|
3346
|
+
} else {
|
3347
|
+
handleResponse(xhr, callback, errback);
|
3348
|
+
}
|
3349
|
+
|
3350
|
+
function handleResponse(xhr, callback, errback) {
|
3351
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
3352
|
+
callback(xhr.responseText,
|
3353
|
+
xhr.getResponseHeader("Last-Modified"));
|
3354
|
+
} else if (typeof(errback) === 'function') {
|
3355
|
+
errback(xhr.status, url);
|
3356
|
+
}
|
2344
3357
|
}
|
2345
3358
|
}
|
2346
3359
|
|
2347
|
-
function
|
2348
|
-
|
3360
|
+
function getXMLHttpRequest() {
|
3361
|
+
if (window.XMLHttpRequest) {
|
3362
|
+
return new(XMLHttpRequest);
|
3363
|
+
} else {
|
3364
|
+
try {
|
3365
|
+
return new(ActiveXObject)("MSXML2.XMLHTTP.3.0");
|
3366
|
+
} catch (e) {
|
3367
|
+
log("browser doesn't support AJAX.");
|
3368
|
+
return null;
|
3369
|
+
}
|
3370
|
+
}
|
3371
|
+
}
|
3372
|
+
|
3373
|
+
function removeNode(node) {
|
3374
|
+
return node && node.parentNode.removeChild(node);
|
3375
|
+
}
|
3376
|
+
|
3377
|
+
function log(str) {
|
3378
|
+
if (less.env == 'development' && typeof(console) !== "undefined") { console.log('less: ' + str) }
|
3379
|
+
}
|
3380
|
+
|
3381
|
+
function error(e, href) {
|
3382
|
+
var id = 'less-error-message:' + extractId(href);
|
3383
|
+
var template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>';
|
3384
|
+
var elem = document.createElement('div'), timer, content, error = [];
|
3385
|
+
var filename = e.filename || href;
|
3386
|
+
|
3387
|
+
elem.id = id;
|
3388
|
+
elem.className = "less-error-message";
|
3389
|
+
|
3390
|
+
content = '<h3>' + (e.message || 'There is an error in your .less file') +
|
3391
|
+
'</h3>' + '<p>in <a href="' + filename + '">' + filename + "</a> ";
|
3392
|
+
|
3393
|
+
var errorline = function (e, i, classname) {
|
3394
|
+
if (e.extract[i]) {
|
3395
|
+
error.push(template.replace(/\{line\}/, parseInt(e.line) + (i - 1))
|
3396
|
+
.replace(/\{class\}/, classname)
|
3397
|
+
.replace(/\{content\}/, e.extract[i]));
|
3398
|
+
}
|
3399
|
+
};
|
3400
|
+
|
3401
|
+
if (e.stack) {
|
3402
|
+
content += '<br/>' + e.stack.split('\n').slice(1).join('<br/>');
|
3403
|
+
} else if (e.extract) {
|
3404
|
+
errorline(e, 0, '');
|
3405
|
+
errorline(e, 1, 'line');
|
3406
|
+
errorline(e, 2, '');
|
3407
|
+
content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' +
|
3408
|
+
'<ul>' + error.join('') + '</ul>';
|
3409
|
+
}
|
3410
|
+
elem.innerHTML = content;
|
3411
|
+
|
3412
|
+
// CSS for error messages
|
3413
|
+
createCSS([
|
3414
|
+
'.less-error-message ul, .less-error-message li {',
|
3415
|
+
'list-style-type: none;',
|
3416
|
+
'margin-right: 15px;',
|
3417
|
+
'padding: 4px 0;',
|
3418
|
+
'margin: 0;',
|
3419
|
+
'}',
|
3420
|
+
'.less-error-message label {',
|
3421
|
+
'font-size: 12px;',
|
3422
|
+
'margin-right: 15px;',
|
3423
|
+
'padding: 4px 0;',
|
3424
|
+
'color: #cc7777;',
|
3425
|
+
'}',
|
3426
|
+
'.less-error-message pre {',
|
3427
|
+
'color: #dd6666;',
|
3428
|
+
'padding: 4px 0;',
|
3429
|
+
'margin: 0;',
|
3430
|
+
'display: inline-block;',
|
3431
|
+
'}',
|
3432
|
+
'.less-error-message pre.line {',
|
3433
|
+
'color: #ff0000;',
|
3434
|
+
'}',
|
3435
|
+
'.less-error-message h3 {',
|
3436
|
+
'font-size: 20px;',
|
3437
|
+
'font-weight: bold;',
|
3438
|
+
'padding: 15px 0 5px 0;',
|
3439
|
+
'margin: 0;',
|
3440
|
+
'}',
|
3441
|
+
'.less-error-message a {',
|
3442
|
+
'color: #10a',
|
3443
|
+
'}',
|
3444
|
+
'.less-error-message .error {',
|
3445
|
+
'color: red;',
|
3446
|
+
'font-weight: bold;',
|
3447
|
+
'padding-bottom: 2px;',
|
3448
|
+
'border-bottom: 1px dashed red;',
|
3449
|
+
'}'
|
3450
|
+
].join('\n'), { title: 'error-message' });
|
3451
|
+
|
3452
|
+
elem.style.cssText = [
|
3453
|
+
"font-family: Arial, sans-serif",
|
3454
|
+
"border: 1px solid #e00",
|
3455
|
+
"background-color: #eee",
|
3456
|
+
"border-radius: 5px",
|
3457
|
+
"-webkit-border-radius: 5px",
|
3458
|
+
"-moz-border-radius: 5px",
|
3459
|
+
"color: #e00",
|
3460
|
+
"padding: 15px",
|
3461
|
+
"margin-bottom: 15px"
|
3462
|
+
].join(';');
|
3463
|
+
|
3464
|
+
if (less.env == 'development') {
|
3465
|
+
timer = setInterval(function () {
|
3466
|
+
if (document.body) {
|
3467
|
+
if (document.getElementById(id)) {
|
3468
|
+
document.body.replaceChild(elem, document.getElementById(id));
|
3469
|
+
} else {
|
3470
|
+
document.body.insertBefore(elem, document.body.firstChild);
|
3471
|
+
}
|
3472
|
+
clearInterval(timer);
|
3473
|
+
}
|
3474
|
+
}, 10);
|
3475
|
+
}
|
2349
3476
|
}
|
2350
3477
|
|
2351
|
-
})(
|
2352
|
-
})(this);
|
3478
|
+
})(window);
|