less 3.13.1 → 4.1.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.
- package/Gruntfile.js +1 -1
- package/bin/lessc +14 -3
- package/dist/less.js +11156 -11157
- package/dist/less.min.js +3 -3
- package/dist/less.min.js.map +1 -1
- package/lib/less/constants.js +2 -2
- package/lib/less/constants.js.map +1 -1
- package/lib/less/contexts.js +88 -110
- package/lib/less/contexts.js.map +1 -1
- package/lib/less/data/index.js +3 -5
- package/lib/less/data/index.js.map +1 -1
- package/lib/less/default-options.js +57 -53
- package/lib/less/default-options.js.map +1 -1
- package/lib/less/environment/abstract-file-manager.js +6 -6
- package/lib/less/environment/abstract-file-manager.js.map +1 -1
- package/lib/less/environment/abstract-plugin-loader.js +7 -13
- package/lib/less/environment/abstract-plugin-loader.js.map +1 -1
- package/lib/less/environment/environment.js +9 -11
- package/lib/less/environment/environment.js.map +1 -1
- package/lib/less/functions/boolean.js +14 -6
- package/lib/less/functions/boolean.js.map +1 -1
- package/lib/less/functions/color-blending.js +2 -4
- package/lib/less/functions/color-blending.js.map +1 -1
- package/lib/less/functions/color.js +41 -9
- package/lib/less/functions/color.js.map +1 -1
- package/lib/less/functions/data-uri.js +5 -26
- package/lib/less/functions/data-uri.js.map +1 -1
- package/lib/less/functions/default.js +2 -4
- package/lib/less/functions/default.js.map +1 -1
- package/lib/less/functions/function-caller.js +19 -35
- package/lib/less/functions/function-caller.js.map +1 -1
- package/lib/less/functions/index.js +14 -16
- package/lib/less/functions/index.js.map +1 -1
- package/lib/less/functions/list.js +21 -12
- package/lib/less/functions/list.js.map +1 -1
- package/lib/less/functions/math-helper.js +2 -4
- package/lib/less/functions/math-helper.js.map +1 -1
- package/lib/less/functions/math.js +2 -4
- package/lib/less/functions/math.js.map +1 -1
- package/lib/less/functions/number.js +12 -8
- package/lib/less/functions/number.js.map +1 -1
- package/lib/less/functions/string.js +4 -6
- package/lib/less/functions/string.js.map +1 -1
- package/lib/less/functions/svg.js +6 -8
- package/lib/less/functions/svg.js.map +1 -1
- package/lib/less/functions/types.js +9 -11
- package/lib/less/functions/types.js.map +1 -1
- package/lib/less/import-manager.js +6 -27
- package/lib/less/import-manager.js.map +1 -1
- package/lib/less/index.js +48 -82
- package/lib/less/index.js.map +1 -1
- package/lib/less/less-error.js +6 -24
- package/lib/less/less-error.js.map +1 -1
- package/lib/less/parse-tree.js +8 -8
- package/lib/less/parse-tree.js.map +1 -1
- package/lib/less/parse.js +11 -31
- package/lib/less/parse.js.map +1 -1
- package/lib/less/parser/chunker.js +4 -2
- package/lib/less/parser/chunker.js.map +1 -1
- package/lib/less/parser/parser-input.js +2 -4
- package/lib/less/parser/parser-input.js.map +1 -1
- package/lib/less/parser/parser.js +8 -29
- package/lib/less/parser/parser.js.map +1 -1
- package/lib/less/plugin-manager.js +2 -3
- package/lib/less/plugin-manager.js.map +1 -1
- package/lib/less/render.js +6 -22
- package/lib/less/render.js.map +1 -1
- package/lib/less/source-map-builder.js +4 -2
- package/lib/less/source-map-builder.js.map +1 -1
- package/lib/less/source-map-output.js +5 -7
- package/lib/less/source-map-output.js.map +1 -1
- package/lib/less/transform-tree.js +9 -9
- package/lib/less/transform-tree.js.map +1 -1
- package/lib/less/tree/anonymous.js +19 -20
- package/lib/less/tree/anonymous.js.map +1 -1
- package/lib/less/tree/assignment.js +22 -23
- package/lib/less/tree/assignment.js.map +1 -1
- package/lib/less/tree/atrule.js +105 -116
- package/lib/less/tree/atrule.js.map +1 -1
- package/lib/less/tree/attribute.js +18 -19
- package/lib/less/tree/attribute.js.map +1 -1
- package/lib/less/tree/call.js +68 -69
- package/lib/less/tree/call.js.map +1 -1
- package/lib/less/tree/color.js +163 -172
- package/lib/less/tree/color.js.map +1 -1
- package/lib/less/tree/combinator.js +9 -10
- package/lib/less/tree/combinator.js.map +1 -1
- package/lib/less/tree/comment.js +15 -16
- package/lib/less/tree/comment.js.map +1 -1
- package/lib/less/tree/condition.js +29 -30
- package/lib/less/tree/condition.js.map +1 -1
- package/lib/less/tree/debug-info.js +32 -30
- package/lib/less/tree/debug-info.js.map +1 -1
- package/lib/less/tree/declaration.js +71 -95
- package/lib/less/tree/declaration.js.map +1 -1
- package/lib/less/tree/detached-ruleset.js +18 -38
- package/lib/less/tree/detached-ruleset.js.map +1 -1
- package/lib/less/tree/dimension.js +126 -129
- package/lib/less/tree/dimension.js.map +1 -1
- package/lib/less/tree/element.js +40 -41
- package/lib/less/tree/element.js.map +1 -1
- package/lib/less/tree/expression.js +55 -74
- package/lib/less/tree/expression.js.map +1 -1
- package/lib/less/tree/extend.js +28 -34
- package/lib/less/tree/extend.js.map +1 -1
- package/lib/less/tree/import.js +120 -140
- package/lib/less/tree/import.js.map +1 -1
- package/lib/less/tree/index.js +37 -39
- package/lib/less/tree/index.js.map +1 -1
- package/lib/less/tree/javascript.js +23 -24
- package/lib/less/tree/javascript.js.map +1 -1
- package/lib/less/tree/js-eval-node.js +51 -50
- package/lib/less/tree/js-eval-node.js.map +1 -1
- package/lib/less/tree/keyword.js +10 -11
- package/lib/less/tree/keyword.js.map +1 -1
- package/lib/less/tree/media.js +111 -131
- package/lib/less/tree/media.js.map +1 -1
- package/lib/less/tree/mixin-call.js +156 -160
- package/lib/less/tree/mixin-call.js.map +1 -1
- package/lib/less/tree/mixin-definition.js +164 -184
- package/lib/less/tree/mixin-definition.js.map +1 -1
- package/lib/less/tree/namespace-value.js +53 -57
- package/lib/less/tree/namespace-value.js.map +1 -1
- package/lib/less/tree/negative.js +16 -17
- package/lib/less/tree/negative.js.map +1 -1
- package/lib/less/tree/node.js +39 -39
- package/lib/less/tree/node.js.map +1 -1
- package/lib/less/tree/operation.js +41 -63
- package/lib/less/tree/operation.js.map +1 -1
- package/lib/less/tree/paren.js +13 -14
- package/lib/less/tree/paren.js.map +1 -1
- package/lib/less/tree/property.js +48 -49
- package/lib/less/tree/property.js.map +1 -1
- package/lib/less/tree/quoted.js +50 -51
- package/lib/less/tree/quoted.js.map +1 -1
- package/lib/less/tree/ruleset.js +665 -702
- package/lib/less/tree/ruleset.js.map +1 -1
- package/lib/less/tree/selector.js +105 -106
- package/lib/less/tree/selector.js.map +1 -1
- package/lib/less/tree/unicode-descriptor.js +5 -6
- package/lib/less/tree/unicode-descriptor.js.map +1 -1
- package/lib/less/tree/unit.js +99 -120
- package/lib/less/tree/unit.js.map +1 -1
- package/lib/less/tree/url.js +44 -45
- package/lib/less/tree/url.js.map +1 -1
- package/lib/less/tree/value.js +27 -26
- package/lib/less/tree/value.js.map +1 -1
- package/lib/less/tree/variable-call.js +30 -31
- package/lib/less/tree/variable-call.js.map +1 -1
- package/lib/less/tree/variable.js +46 -48
- package/lib/less/tree/variable.js.map +1 -1
- package/lib/less/utils.js +5 -23
- package/lib/less/utils.js.map +1 -1
- package/lib/less/visitors/extend-visitor.js +14 -41
- package/lib/less/visitors/extend-visitor.js.map +1 -1
- package/lib/less/visitors/import-sequencer.js +2 -7
- package/lib/less/visitors/import-sequencer.js.map +1 -1
- package/lib/less/visitors/import-visitor.js +7 -33
- package/lib/less/visitors/import-visitor.js.map +1 -1
- package/lib/less/visitors/index.js +7 -9
- package/lib/less/visitors/index.js.map +1 -1
- package/lib/less/visitors/join-selector-visitor.js +2 -4
- package/lib/less/visitors/join-selector-visitor.js.map +1 -1
- package/lib/less/visitors/to-css-visitor.js +4 -6
- package/lib/less/visitors/to-css-visitor.js.map +1 -1
- package/lib/less/visitors/visitor.js +4 -12
- package/lib/less/visitors/visitor.js.map +1 -1
- package/lib/less-browser/add-default-options.js +2 -4
- package/lib/less-browser/add-default-options.js.map +1 -1
- package/lib/less-browser/bootstrap.js +4 -6
- package/lib/less-browser/bootstrap.js.map +1 -1
- package/lib/less-browser/browser.js +2 -20
- package/lib/less-browser/browser.js.map +1 -1
- package/lib/less-browser/error-reporting.js +3 -24
- package/lib/less-browser/error-reporting.js.map +1 -1
- package/lib/less-browser/file-manager.js +17 -36
- package/lib/less-browser/file-manager.js.map +1 -1
- package/lib/less-browser/image-size.js +2 -4
- package/lib/less-browser/image-size.js.map +1 -1
- package/lib/less-browser/index.js +9 -11
- package/lib/less-browser/index.js.map +1 -1
- package/lib/less-browser/plugin-loader.js +10 -29
- package/lib/less-browser/plugin-loader.js.map +1 -1
- package/lib/less-node/file-manager.js +15 -34
- package/lib/less-node/file-manager.js.map +1 -1
- package/lib/less-node/image-size.js +4 -6
- package/lib/less-node/image-size.js.map +1 -1
- package/lib/less-node/index.js +10 -16
- package/lib/less-node/index.js.map +1 -1
- package/lib/less-node/plugin-loader.js +23 -42
- package/lib/less-node/plugin-loader.js.map +1 -1
- package/lib/less-node/url-file-manager.js +23 -38
- package/lib/less-node/url-file-manager.js.map +1 -1
- package/package.json +12 -9
- package/test/browser/less/errors/image-height-error.txt +1 -1
- package/test/browser/less/errors/image-size-error.txt +1 -1
- package/test/browser/less/errors/image-width-error.txt +1 -1
- package/test/index.js +28 -9
- package/test/less-test.js +36 -16
- package/tsconfig.json +1 -0
package/lib/less/tree/ruleset.js
CHANGED
|
@@ -1,40 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
var
|
|
34
|
-
var
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
var
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var node_1 = tslib_1.__importDefault(require("./node"));
|
|
5
|
+
var declaration_1 = tslib_1.__importDefault(require("./declaration"));
|
|
6
|
+
var keyword_1 = tslib_1.__importDefault(require("./keyword"));
|
|
7
|
+
var comment_1 = tslib_1.__importDefault(require("./comment"));
|
|
8
|
+
var paren_1 = tslib_1.__importDefault(require("./paren"));
|
|
9
|
+
var selector_1 = tslib_1.__importDefault(require("./selector"));
|
|
10
|
+
var element_1 = tslib_1.__importDefault(require("./element"));
|
|
11
|
+
var anonymous_1 = tslib_1.__importDefault(require("./anonymous"));
|
|
12
|
+
var contexts_1 = tslib_1.__importDefault(require("../contexts"));
|
|
13
|
+
var function_registry_1 = tslib_1.__importDefault(require("../functions/function-registry"));
|
|
14
|
+
var default_1 = tslib_1.__importDefault(require("../functions/default"));
|
|
15
|
+
var debug_info_1 = tslib_1.__importDefault(require("./debug-info"));
|
|
16
|
+
var utils = tslib_1.__importStar(require("../utils"));
|
|
38
17
|
var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
|
|
39
18
|
this.selectors = selectors;
|
|
40
19
|
this.rules = rules;
|
|
@@ -47,740 +26,724 @@ var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
|
|
|
47
26
|
this.setParent(this.selectors, this);
|
|
48
27
|
this.setParent(this.rules, this);
|
|
49
28
|
};
|
|
50
|
-
Ruleset.prototype = new node_1.default()
|
|
51
|
-
Ruleset
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
29
|
+
Ruleset.prototype = Object.assign(new node_1.default(), {
|
|
30
|
+
type: 'Ruleset',
|
|
31
|
+
isRuleset: true,
|
|
32
|
+
isRulesetLike: function () { return true; },
|
|
33
|
+
accept: function (visitor) {
|
|
34
|
+
if (this.paths) {
|
|
35
|
+
this.paths = visitor.visitArray(this.paths, true);
|
|
36
|
+
}
|
|
37
|
+
else if (this.selectors) {
|
|
38
|
+
this.selectors = visitor.visitArray(this.selectors);
|
|
39
|
+
}
|
|
40
|
+
if (this.rules && this.rules.length) {
|
|
41
|
+
this.rules = visitor.visitArray(this.rules);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
eval: function (context) {
|
|
45
|
+
var that = this;
|
|
46
|
+
var selectors;
|
|
47
|
+
var selCnt;
|
|
48
|
+
var selector;
|
|
49
|
+
var i;
|
|
50
|
+
var hasVariable;
|
|
51
|
+
var hasOnePassingSelector = false;
|
|
52
|
+
if (this.selectors && (selCnt = this.selectors.length)) {
|
|
53
|
+
selectors = new Array(selCnt);
|
|
54
|
+
default_1.default.error({
|
|
55
|
+
type: 'Syntax',
|
|
56
|
+
message: 'it is currently only allowed in parametric mixin guards,'
|
|
57
|
+
});
|
|
58
|
+
for (i = 0; i < selCnt; i++) {
|
|
59
|
+
selector = this.selectors[i].eval(context);
|
|
60
|
+
for (var j = 0; j < selector.elements.length; j++) {
|
|
61
|
+
if (selector.elements[j].isVariable) {
|
|
62
|
+
hasVariable = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
selectors[i] = selector;
|
|
67
|
+
if (selector.evaldCondition) {
|
|
68
|
+
hasOnePassingSelector = true;
|
|
85
69
|
}
|
|
86
70
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
71
|
+
if (hasVariable) {
|
|
72
|
+
var toParseSelectors = new Array(selCnt);
|
|
73
|
+
for (i = 0; i < selCnt; i++) {
|
|
74
|
+
selector = selectors[i];
|
|
75
|
+
toParseSelectors[i] = selector.toCSS(context);
|
|
76
|
+
}
|
|
77
|
+
this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) {
|
|
78
|
+
if (result) {
|
|
79
|
+
selectors = utils.flattenArray(result);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
90
82
|
}
|
|
83
|
+
default_1.default.reset();
|
|
91
84
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
85
|
+
else {
|
|
86
|
+
hasOnePassingSelector = true;
|
|
87
|
+
}
|
|
88
|
+
var rules = this.rules ? utils.copyArray(this.rules) : null;
|
|
89
|
+
var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
|
|
90
|
+
var rule;
|
|
91
|
+
var subRule;
|
|
92
|
+
ruleset.originalRuleset = this;
|
|
93
|
+
ruleset.root = this.root;
|
|
94
|
+
ruleset.firstRoot = this.firstRoot;
|
|
95
|
+
ruleset.allowImports = this.allowImports;
|
|
96
|
+
if (this.debugInfo) {
|
|
97
|
+
ruleset.debugInfo = this.debugInfo;
|
|
98
|
+
}
|
|
99
|
+
if (!hasOnePassingSelector) {
|
|
100
|
+
rules.length = 0;
|
|
101
|
+
}
|
|
102
|
+
// inherit a function registry from the frames stack when possible;
|
|
103
|
+
// otherwise from the global registry
|
|
104
|
+
ruleset.functionRegistry = (function (frames) {
|
|
105
|
+
var i = 0;
|
|
106
|
+
var n = frames.length;
|
|
107
|
+
var found;
|
|
108
|
+
for (; i !== n; ++i) {
|
|
109
|
+
found = frames[i].functionRegistry;
|
|
110
|
+
if (found) {
|
|
111
|
+
return found;
|
|
101
112
|
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
ruleset.functionRegistry = (function (frames) {
|
|
126
|
-
var i = 0;
|
|
127
|
-
var n = frames.length;
|
|
128
|
-
var found;
|
|
129
|
-
for (; i !== n; ++i) {
|
|
130
|
-
found = frames[i].functionRegistry;
|
|
131
|
-
if (found) {
|
|
132
|
-
return found;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return function_registry_1.default;
|
|
136
|
-
})(context.frames).inherit();
|
|
137
|
-
// push the current ruleset to the frames stack
|
|
138
|
-
var ctxFrames = context.frames;
|
|
139
|
-
ctxFrames.unshift(ruleset);
|
|
140
|
-
// currrent selectors
|
|
141
|
-
var ctxSelectors = context.selectors;
|
|
142
|
-
if (!ctxSelectors) {
|
|
143
|
-
context.selectors = ctxSelectors = [];
|
|
144
|
-
}
|
|
145
|
-
ctxSelectors.unshift(this.selectors);
|
|
146
|
-
// Evaluate imports
|
|
147
|
-
if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
|
|
148
|
-
ruleset.evalImports(context);
|
|
149
|
-
}
|
|
150
|
-
// Store the frames around mixin definitions,
|
|
151
|
-
// so they can be evaluated like closures when the time comes.
|
|
152
|
-
var rsRules = ruleset.rules;
|
|
153
|
-
for (i = 0; (rule = rsRules[i]); i++) {
|
|
154
|
-
if (rule.evalFirst) {
|
|
155
|
-
rsRules[i] = rule.eval(context);
|
|
113
|
+
}
|
|
114
|
+
return function_registry_1.default;
|
|
115
|
+
}(context.frames)).inherit();
|
|
116
|
+
// push the current ruleset to the frames stack
|
|
117
|
+
var ctxFrames = context.frames;
|
|
118
|
+
ctxFrames.unshift(ruleset);
|
|
119
|
+
// currrent selectors
|
|
120
|
+
var ctxSelectors = context.selectors;
|
|
121
|
+
if (!ctxSelectors) {
|
|
122
|
+
context.selectors = ctxSelectors = [];
|
|
123
|
+
}
|
|
124
|
+
ctxSelectors.unshift(this.selectors);
|
|
125
|
+
// Evaluate imports
|
|
126
|
+
if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
|
|
127
|
+
ruleset.evalImports(context);
|
|
128
|
+
}
|
|
129
|
+
// Store the frames around mixin definitions,
|
|
130
|
+
// so they can be evaluated like closures when the time comes.
|
|
131
|
+
var rsRules = ruleset.rules;
|
|
132
|
+
for (i = 0; (rule = rsRules[i]); i++) {
|
|
133
|
+
if (rule.evalFirst) {
|
|
134
|
+
rsRules[i] = rule.eval(context);
|
|
135
|
+
}
|
|
156
136
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
137
|
+
var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
|
|
138
|
+
// Evaluate mixin calls.
|
|
139
|
+
for (i = 0; (rule = rsRules[i]); i++) {
|
|
140
|
+
if (rule.type === 'MixinCall') {
|
|
141
|
+
/* jshint loopfunc:true */
|
|
142
|
+
rules = rule.eval(context).filter(function (r) {
|
|
143
|
+
if ((r instanceof declaration_1.default) && r.variable) {
|
|
144
|
+
// do not pollute the scope if the variable is
|
|
145
|
+
// already there. consider returning false here
|
|
146
|
+
// but we need a way to "return" variable from mixins
|
|
147
|
+
return !(ruleset.variable(r.name));
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
});
|
|
151
|
+
rsRules.splice.apply(rsRules, [i, 1].concat(rules));
|
|
152
|
+
i += rules.length - 1;
|
|
153
|
+
ruleset.resetCache();
|
|
154
|
+
}
|
|
155
|
+
else if (rule.type === 'VariableCall') {
|
|
156
|
+
/* jshint loopfunc:true */
|
|
157
|
+
rules = rule.eval(context).rules.filter(function (r) {
|
|
158
|
+
if ((r instanceof declaration_1.default) && r.variable) {
|
|
159
|
+
// do not pollute the scope at all
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
});
|
|
164
|
+
rsRules.splice.apply(rsRules, [i, 1].concat(rules));
|
|
165
|
+
i += rules.length - 1;
|
|
166
|
+
ruleset.resetCache();
|
|
167
|
+
}
|
|
188
168
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
169
|
+
// Evaluate everything else
|
|
170
|
+
for (i = 0; (rule = rsRules[i]); i++) {
|
|
171
|
+
if (!rule.evalFirst) {
|
|
172
|
+
rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
|
|
173
|
+
}
|
|
194
174
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
175
|
+
// Evaluate everything else
|
|
176
|
+
for (i = 0; (rule = rsRules[i]); i++) {
|
|
177
|
+
// for rulesets, check if it is a css guard and can be removed
|
|
178
|
+
if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {
|
|
179
|
+
// check if it can be folded in (e.g. & where)
|
|
180
|
+
if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
|
|
181
|
+
rsRules.splice(i--, 1);
|
|
182
|
+
for (var j = 0; (subRule = rule.rules[j]); j++) {
|
|
183
|
+
if (subRule instanceof node_1.default) {
|
|
184
|
+
subRule.copyVisibilityInfo(rule.visibilityInfo());
|
|
185
|
+
if (!(subRule instanceof declaration_1.default) || !subRule.variable) {
|
|
186
|
+
rsRules.splice(++i, 0, subRule);
|
|
187
|
+
}
|
|
208
188
|
}
|
|
209
189
|
}
|
|
210
190
|
}
|
|
211
191
|
}
|
|
212
192
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
context.mediaBlocks[i].bubbleSelectors(selectors);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
return ruleset;
|
|
223
|
-
};
|
|
224
|
-
Ruleset.prototype.evalImports = function (context) {
|
|
225
|
-
var rules = this.rules;
|
|
226
|
-
var i;
|
|
227
|
-
var importRules;
|
|
228
|
-
if (!rules) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
for (i = 0; i < rules.length; i++) {
|
|
232
|
-
if (rules[i].type === 'Import') {
|
|
233
|
-
importRules = rules[i].eval(context);
|
|
234
|
-
if (importRules && (importRules.length || importRules.length === 0)) {
|
|
235
|
-
rules.splice.apply(rules, [i, 1].concat(importRules));
|
|
236
|
-
i += importRules.length - 1;
|
|
193
|
+
// Pop the stack
|
|
194
|
+
ctxFrames.shift();
|
|
195
|
+
ctxSelectors.shift();
|
|
196
|
+
if (context.mediaBlocks) {
|
|
197
|
+
for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
|
|
198
|
+
context.mediaBlocks[i].bubbleSelectors(selectors);
|
|
237
199
|
}
|
|
238
|
-
else {
|
|
239
|
-
rules.splice(i, 1, importRules);
|
|
240
|
-
}
|
|
241
|
-
this.resetCache();
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
Ruleset.prototype.makeImportant = function () {
|
|
246
|
-
var result = new Ruleset(this.selectors, this.rules.map(function (r) {
|
|
247
|
-
if (r.makeImportant) {
|
|
248
|
-
return r.makeImportant();
|
|
249
200
|
}
|
|
250
|
-
|
|
251
|
-
|
|
201
|
+
return ruleset;
|
|
202
|
+
},
|
|
203
|
+
evalImports: function (context) {
|
|
204
|
+
var rules = this.rules;
|
|
205
|
+
var i;
|
|
206
|
+
var importRules;
|
|
207
|
+
if (!rules) {
|
|
208
|
+
return;
|
|
252
209
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
// lets you call a css selector with a guard
|
|
260
|
-
Ruleset.prototype.matchCondition = function (args, context) {
|
|
261
|
-
var lastSelector = this.selectors[this.selectors.length - 1];
|
|
262
|
-
if (!lastSelector.evaldCondition) {
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
265
|
-
if (lastSelector.condition &&
|
|
266
|
-
!lastSelector.condition.eval(new contexts_1.default.Eval(context, context.frames))) {
|
|
267
|
-
return false;
|
|
268
|
-
}
|
|
269
|
-
return true;
|
|
270
|
-
};
|
|
271
|
-
Ruleset.prototype.resetCache = function () {
|
|
272
|
-
this._rulesets = null;
|
|
273
|
-
this._variables = null;
|
|
274
|
-
this._properties = null;
|
|
275
|
-
this._lookups = {};
|
|
276
|
-
};
|
|
277
|
-
Ruleset.prototype.variables = function () {
|
|
278
|
-
if (!this._variables) {
|
|
279
|
-
this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
|
|
280
|
-
if (r instanceof declaration_1.default && r.variable === true) {
|
|
281
|
-
hash[r.name] = r;
|
|
282
|
-
}
|
|
283
|
-
// when evaluating variables in an import statement, imports have not been eval'd
|
|
284
|
-
// so we need to go inside import statements.
|
|
285
|
-
// guard against root being a string (in the case of inlined less)
|
|
286
|
-
if (r.type === 'Import' && r.root && r.root.variables) {
|
|
287
|
-
var vars = r.root.variables();
|
|
288
|
-
for (var name_1 in vars) {
|
|
289
|
-
if (vars.hasOwnProperty(name_1)) {
|
|
290
|
-
hash[name_1] = r.root.variable(name_1);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return hash;
|
|
295
|
-
}, {});
|
|
296
|
-
}
|
|
297
|
-
return this._variables;
|
|
298
|
-
};
|
|
299
|
-
Ruleset.prototype.properties = function () {
|
|
300
|
-
if (!this._properties) {
|
|
301
|
-
this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
|
|
302
|
-
if (r instanceof declaration_1.default && r.variable !== true) {
|
|
303
|
-
var name_2 = (r.name.length === 1) && (r.name[0] instanceof keyword_1.default) ?
|
|
304
|
-
r.name[0].value : r.name;
|
|
305
|
-
// Properties don't overwrite as they can merge
|
|
306
|
-
if (!hash["$" + name_2]) {
|
|
307
|
-
hash["$" + name_2] = [r];
|
|
210
|
+
for (i = 0; i < rules.length; i++) {
|
|
211
|
+
if (rules[i].type === 'Import') {
|
|
212
|
+
importRules = rules[i].eval(context);
|
|
213
|
+
if (importRules && (importRules.length || importRules.length === 0)) {
|
|
214
|
+
rules.splice.apply(rules, [i, 1].concat(importRules));
|
|
215
|
+
i += importRules.length - 1;
|
|
308
216
|
}
|
|
309
217
|
else {
|
|
310
|
-
|
|
218
|
+
rules.splice(i, 1, importRules);
|
|
311
219
|
}
|
|
220
|
+
this.resetCache();
|
|
312
221
|
}
|
|
313
|
-
return hash;
|
|
314
|
-
}, {});
|
|
315
|
-
}
|
|
316
|
-
return this._properties;
|
|
317
|
-
};
|
|
318
|
-
Ruleset.prototype.variable = function (name) {
|
|
319
|
-
var decl = this.variables()[name];
|
|
320
|
-
if (decl) {
|
|
321
|
-
return this.parseValue(decl);
|
|
322
|
-
}
|
|
323
|
-
};
|
|
324
|
-
Ruleset.prototype.property = function (name) {
|
|
325
|
-
var decl = this.properties()[name];
|
|
326
|
-
if (decl) {
|
|
327
|
-
return this.parseValue(decl);
|
|
328
|
-
}
|
|
329
|
-
};
|
|
330
|
-
Ruleset.prototype.lastDeclaration = function () {
|
|
331
|
-
for (var i = this.rules.length; i > 0; i--) {
|
|
332
|
-
var decl = this.rules[i - 1];
|
|
333
|
-
if (decl instanceof declaration_1.default) {
|
|
334
|
-
return this.parseValue(decl);
|
|
335
222
|
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
Ruleset.
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
if (decl.value instanceof anonymous_1.default && !decl.parsed) {
|
|
342
|
-
if (typeof decl.value.value === 'string') {
|
|
343
|
-
this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) {
|
|
344
|
-
if (err) {
|
|
345
|
-
decl.parsed = true;
|
|
346
|
-
}
|
|
347
|
-
if (result) {
|
|
348
|
-
decl.value = result[0];
|
|
349
|
-
decl.important = result[1] || '';
|
|
350
|
-
decl.parsed = true;
|
|
351
|
-
}
|
|
352
|
-
});
|
|
223
|
+
},
|
|
224
|
+
makeImportant: function () {
|
|
225
|
+
var result = new Ruleset(this.selectors, this.rules.map(function (r) {
|
|
226
|
+
if (r.makeImportant) {
|
|
227
|
+
return r.makeImportant();
|
|
353
228
|
}
|
|
354
229
|
else {
|
|
355
|
-
|
|
230
|
+
return r;
|
|
356
231
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
this.rules = [rule];
|
|
396
|
-
}
|
|
397
|
-
this.setParent(rule, this);
|
|
398
|
-
};
|
|
399
|
-
Ruleset.prototype.find = function (selector, self, filter) {
|
|
400
|
-
if (self === void 0) { self = this; }
|
|
401
|
-
var rules = [];
|
|
402
|
-
var match;
|
|
403
|
-
var foundMixins;
|
|
404
|
-
var key = selector.toCSS();
|
|
405
|
-
if (key in this._lookups) {
|
|
406
|
-
return this._lookups[key];
|
|
407
|
-
}
|
|
408
|
-
this.rulesets().forEach(function (rule) {
|
|
409
|
-
if (rule !== self) {
|
|
410
|
-
for (var j = 0; j < rule.selectors.length; j++) {
|
|
411
|
-
match = selector.match(rule.selectors[j]);
|
|
412
|
-
if (match) {
|
|
413
|
-
if (selector.elements.length > match) {
|
|
414
|
-
if (!filter || filter(rule)) {
|
|
415
|
-
foundMixins = rule.find(new selector_1.default(selector.elements.slice(match)), self, filter);
|
|
416
|
-
for (var i = 0; i < foundMixins.length; ++i) {
|
|
417
|
-
foundMixins[i].path.push(rule);
|
|
418
|
-
}
|
|
419
|
-
Array.prototype.push.apply(rules, foundMixins);
|
|
232
|
+
}), this.strictImports, this.visibilityInfo());
|
|
233
|
+
return result;
|
|
234
|
+
},
|
|
235
|
+
matchArgs: function (args) {
|
|
236
|
+
return !args || args.length === 0;
|
|
237
|
+
},
|
|
238
|
+
// lets you call a css selector with a guard
|
|
239
|
+
matchCondition: function (args, context) {
|
|
240
|
+
var lastSelector = this.selectors[this.selectors.length - 1];
|
|
241
|
+
if (!lastSelector.evaldCondition) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
if (lastSelector.condition &&
|
|
245
|
+
!lastSelector.condition.eval(new contexts_1.default.Eval(context, context.frames))) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
return true;
|
|
249
|
+
},
|
|
250
|
+
resetCache: function () {
|
|
251
|
+
this._rulesets = null;
|
|
252
|
+
this._variables = null;
|
|
253
|
+
this._properties = null;
|
|
254
|
+
this._lookups = {};
|
|
255
|
+
},
|
|
256
|
+
variables: function () {
|
|
257
|
+
if (!this._variables) {
|
|
258
|
+
this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
|
|
259
|
+
if (r instanceof declaration_1.default && r.variable === true) {
|
|
260
|
+
hash[r.name] = r;
|
|
261
|
+
}
|
|
262
|
+
// when evaluating variables in an import statement, imports have not been eval'd
|
|
263
|
+
// so we need to go inside import statements.
|
|
264
|
+
// guard against root being a string (in the case of inlined less)
|
|
265
|
+
if (r.type === 'Import' && r.root && r.root.variables) {
|
|
266
|
+
var vars = r.root.variables();
|
|
267
|
+
for (var name_1 in vars) {
|
|
268
|
+
if (vars.hasOwnProperty(name_1)) {
|
|
269
|
+
hash[name_1] = r.root.variable(name_1);
|
|
420
270
|
}
|
|
421
271
|
}
|
|
272
|
+
}
|
|
273
|
+
return hash;
|
|
274
|
+
}, {});
|
|
275
|
+
}
|
|
276
|
+
return this._variables;
|
|
277
|
+
},
|
|
278
|
+
properties: function () {
|
|
279
|
+
if (!this._properties) {
|
|
280
|
+
this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
|
|
281
|
+
if (r instanceof declaration_1.default && r.variable !== true) {
|
|
282
|
+
var name_2 = (r.name.length === 1) && (r.name[0] instanceof keyword_1.default) ?
|
|
283
|
+
r.name[0].value : r.name;
|
|
284
|
+
// Properties don't overwrite as they can merge
|
|
285
|
+
if (!hash["$" + name_2]) {
|
|
286
|
+
hash["$" + name_2] = [r];
|
|
287
|
+
}
|
|
422
288
|
else {
|
|
423
|
-
|
|
289
|
+
hash["$" + name_2].push(r);
|
|
424
290
|
}
|
|
425
|
-
break;
|
|
426
291
|
}
|
|
427
|
-
|
|
292
|
+
return hash;
|
|
293
|
+
}, {});
|
|
294
|
+
}
|
|
295
|
+
return this._properties;
|
|
296
|
+
},
|
|
297
|
+
variable: function (name) {
|
|
298
|
+
var decl = this.variables()[name];
|
|
299
|
+
if (decl) {
|
|
300
|
+
return this.parseValue(decl);
|
|
428
301
|
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
var path;
|
|
442
|
-
context.tabLevel = (context.tabLevel || 0);
|
|
443
|
-
if (!this.root) {
|
|
444
|
-
context.tabLevel++;
|
|
445
|
-
}
|
|
446
|
-
var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
|
|
447
|
-
var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
|
|
448
|
-
var sep;
|
|
449
|
-
var charsetNodeIndex = 0;
|
|
450
|
-
var importNodeIndex = 0;
|
|
451
|
-
for (i = 0; (rule = this.rules[i]); i++) {
|
|
452
|
-
if (rule instanceof comment_1.default) {
|
|
453
|
-
if (importNodeIndex === i) {
|
|
454
|
-
importNodeIndex++;
|
|
302
|
+
},
|
|
303
|
+
property: function (name) {
|
|
304
|
+
var decl = this.properties()[name];
|
|
305
|
+
if (decl) {
|
|
306
|
+
return this.parseValue(decl);
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
lastDeclaration: function () {
|
|
310
|
+
for (var i = this.rules.length; i > 0; i--) {
|
|
311
|
+
var decl = this.rules[i - 1];
|
|
312
|
+
if (decl instanceof declaration_1.default) {
|
|
313
|
+
return this.parseValue(decl);
|
|
455
314
|
}
|
|
456
|
-
ruleNodes.push(rule);
|
|
457
315
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
316
|
+
},
|
|
317
|
+
parseValue: function (toParse) {
|
|
318
|
+
var self = this;
|
|
319
|
+
function transformDeclaration(decl) {
|
|
320
|
+
if (decl.value instanceof anonymous_1.default && !decl.parsed) {
|
|
321
|
+
if (typeof decl.value.value === 'string') {
|
|
322
|
+
this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) {
|
|
323
|
+
if (err) {
|
|
324
|
+
decl.parsed = true;
|
|
325
|
+
}
|
|
326
|
+
if (result) {
|
|
327
|
+
decl.value = result[0];
|
|
328
|
+
decl.important = result[1] || '';
|
|
329
|
+
decl.parsed = true;
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
decl.parsed = true;
|
|
335
|
+
}
|
|
336
|
+
return decl;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
return decl;
|
|
340
|
+
}
|
|
462
341
|
}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
importNodeIndex++;
|
|
342
|
+
if (!Array.isArray(toParse)) {
|
|
343
|
+
return transformDeclaration.call(self, toParse);
|
|
466
344
|
}
|
|
467
345
|
else {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
// a selector, or {}.
|
|
474
|
-
if (!this.root) {
|
|
475
|
-
debugInfo = debug_info_1.default(context, this, tabSetStr);
|
|
476
|
-
if (debugInfo) {
|
|
477
|
-
output.add(debugInfo);
|
|
478
|
-
output.add(tabSetStr);
|
|
479
|
-
}
|
|
480
|
-
var paths = this.paths;
|
|
481
|
-
var pathCnt = paths.length;
|
|
482
|
-
var pathSubCnt = void 0;
|
|
483
|
-
sep = context.compress ? ',' : (",\n" + tabSetStr);
|
|
484
|
-
for (i = 0; i < pathCnt; i++) {
|
|
485
|
-
path = paths[i];
|
|
486
|
-
if (!(pathSubCnt = path.length)) {
|
|
487
|
-
continue;
|
|
488
|
-
}
|
|
489
|
-
if (i > 0) {
|
|
490
|
-
output.add(sep);
|
|
491
|
-
}
|
|
492
|
-
context.firstSelector = true;
|
|
493
|
-
path[0].genCSS(context, output);
|
|
494
|
-
context.firstSelector = false;
|
|
495
|
-
for (j = 1; j < pathSubCnt; j++) {
|
|
496
|
-
path[j].genCSS(context, output);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
|
|
500
|
-
}
|
|
501
|
-
// Compile rules and rulesets
|
|
502
|
-
for (i = 0; (rule = ruleNodes[i]); i++) {
|
|
503
|
-
if (i + 1 === ruleNodes.length) {
|
|
504
|
-
context.lastRule = true;
|
|
505
|
-
}
|
|
506
|
-
var currentLastRule = context.lastRule;
|
|
507
|
-
if (rule.isRulesetLike(rule)) {
|
|
508
|
-
context.lastRule = false;
|
|
346
|
+
var nodes_1 = [];
|
|
347
|
+
toParse.forEach(function (n) {
|
|
348
|
+
nodes_1.push(transformDeclaration.call(self, n));
|
|
349
|
+
});
|
|
350
|
+
return nodes_1;
|
|
509
351
|
}
|
|
510
|
-
|
|
511
|
-
|
|
352
|
+
},
|
|
353
|
+
rulesets: function () {
|
|
354
|
+
if (!this.rules) {
|
|
355
|
+
return [];
|
|
512
356
|
}
|
|
513
|
-
|
|
514
|
-
|
|
357
|
+
var filtRules = [];
|
|
358
|
+
var rules = this.rules;
|
|
359
|
+
var i;
|
|
360
|
+
var rule;
|
|
361
|
+
for (i = 0; (rule = rules[i]); i++) {
|
|
362
|
+
if (rule.isRuleset) {
|
|
363
|
+
filtRules.push(rule);
|
|
364
|
+
}
|
|
515
365
|
}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
366
|
+
return filtRules;
|
|
367
|
+
},
|
|
368
|
+
prependRule: function (rule) {
|
|
369
|
+
var rules = this.rules;
|
|
370
|
+
if (rules) {
|
|
371
|
+
rules.unshift(rule);
|
|
519
372
|
}
|
|
520
373
|
else {
|
|
521
|
-
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
this.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
374
|
+
this.rules = [rule];
|
|
375
|
+
}
|
|
376
|
+
this.setParent(rule, this);
|
|
377
|
+
},
|
|
378
|
+
find: function (selector, self, filter) {
|
|
379
|
+
self = self || this;
|
|
380
|
+
var rules = [];
|
|
381
|
+
var match;
|
|
382
|
+
var foundMixins;
|
|
383
|
+
var key = selector.toCSS();
|
|
384
|
+
if (key in this._lookups) {
|
|
385
|
+
return this._lookups[key];
|
|
386
|
+
}
|
|
387
|
+
this.rulesets().forEach(function (rule) {
|
|
388
|
+
if (rule !== self) {
|
|
389
|
+
for (var j = 0; j < rule.selectors.length; j++) {
|
|
390
|
+
match = selector.match(rule.selectors[j]);
|
|
391
|
+
if (match) {
|
|
392
|
+
if (selector.elements.length > match) {
|
|
393
|
+
if (!filter || filter(rule)) {
|
|
394
|
+
foundMixins = rule.find(new selector_1.default(selector.elements.slice(match)), self, filter);
|
|
395
|
+
for (var i = 0; i < foundMixins.length; ++i) {
|
|
396
|
+
foundMixins[i].path.push(rule);
|
|
397
|
+
}
|
|
398
|
+
Array.prototype.push.apply(rules, foundMixins);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
rules.push({ rule: rule, path: [] });
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
this._lookups[key] = rules;
|
|
410
|
+
return rules;
|
|
411
|
+
},
|
|
412
|
+
genCSS: function (context, output) {
|
|
413
|
+
var i;
|
|
540
414
|
var j;
|
|
541
|
-
|
|
542
|
-
|
|
415
|
+
var charsetRuleNodes = [];
|
|
416
|
+
var ruleNodes = [];
|
|
417
|
+
var // Line number debugging
|
|
418
|
+
debugInfo;
|
|
419
|
+
var rule;
|
|
420
|
+
var path;
|
|
421
|
+
context.tabLevel = (context.tabLevel || 0);
|
|
422
|
+
if (!this.root) {
|
|
423
|
+
context.tabLevel++;
|
|
424
|
+
}
|
|
425
|
+
var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
|
|
426
|
+
var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
|
|
427
|
+
var sep;
|
|
428
|
+
var charsetNodeIndex = 0;
|
|
429
|
+
var importNodeIndex = 0;
|
|
430
|
+
for (i = 0; (rule = this.rules[i]); i++) {
|
|
431
|
+
if (rule instanceof comment_1.default) {
|
|
432
|
+
if (importNodeIndex === i) {
|
|
433
|
+
importNodeIndex++;
|
|
434
|
+
}
|
|
435
|
+
ruleNodes.push(rule);
|
|
436
|
+
}
|
|
437
|
+
else if (rule.isCharset && rule.isCharset()) {
|
|
438
|
+
ruleNodes.splice(charsetNodeIndex, 0, rule);
|
|
439
|
+
charsetNodeIndex++;
|
|
440
|
+
importNodeIndex++;
|
|
441
|
+
}
|
|
442
|
+
else if (rule.type === 'Import') {
|
|
443
|
+
ruleNodes.splice(importNodeIndex, 0, rule);
|
|
444
|
+
importNodeIndex++;
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
ruleNodes.push(rule);
|
|
448
|
+
}
|
|
543
449
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
450
|
+
ruleNodes = charsetRuleNodes.concat(ruleNodes);
|
|
451
|
+
// If this is the root node, we don't render
|
|
452
|
+
// a selector, or {}.
|
|
453
|
+
if (!this.root) {
|
|
454
|
+
debugInfo = debug_info_1.default(context, this, tabSetStr);
|
|
455
|
+
if (debugInfo) {
|
|
456
|
+
output.add(debugInfo);
|
|
457
|
+
output.add(tabSetStr);
|
|
548
458
|
}
|
|
549
|
-
|
|
459
|
+
var paths = this.paths;
|
|
460
|
+
var pathCnt = paths.length;
|
|
461
|
+
var pathSubCnt = void 0;
|
|
462
|
+
sep = context.compress ? ',' : (",\n" + tabSetStr);
|
|
463
|
+
for (i = 0; i < pathCnt; i++) {
|
|
464
|
+
path = paths[i];
|
|
465
|
+
if (!(pathSubCnt = path.length)) {
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
if (i > 0) {
|
|
469
|
+
output.add(sep);
|
|
470
|
+
}
|
|
471
|
+
context.firstSelector = true;
|
|
472
|
+
path[0].genCSS(context, output);
|
|
473
|
+
context.firstSelector = false;
|
|
474
|
+
for (j = 1; j < pathSubCnt; j++) {
|
|
475
|
+
path[j].genCSS(context, output);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
|
|
550
479
|
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
lastSelector = newSelectorPath.pop();
|
|
574
|
-
newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));
|
|
480
|
+
// Compile rules and rulesets
|
|
481
|
+
for (i = 0; (rule = ruleNodes[i]); i++) {
|
|
482
|
+
if (i + 1 === ruleNodes.length) {
|
|
483
|
+
context.lastRule = true;
|
|
484
|
+
}
|
|
485
|
+
var currentLastRule = context.lastRule;
|
|
486
|
+
if (rule.isRulesetLike(rule)) {
|
|
487
|
+
context.lastRule = false;
|
|
488
|
+
}
|
|
489
|
+
if (rule.genCSS) {
|
|
490
|
+
rule.genCSS(context, output);
|
|
491
|
+
}
|
|
492
|
+
else if (rule.value) {
|
|
493
|
+
output.add(rule.value.toString());
|
|
494
|
+
}
|
|
495
|
+
context.lastRule = currentLastRule;
|
|
496
|
+
if (!context.lastRule && rule.isVisible()) {
|
|
497
|
+
output.add(context.compress ? '' : ("\n" + tabRuleStr));
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
context.lastRule = false;
|
|
501
|
+
}
|
|
575
502
|
}
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
if (addPath.length > 0) {
|
|
580
|
-
// /deep/ is a CSS4 selector - (removed, so should deprecate)
|
|
581
|
-
// that is valid without anything in front of it
|
|
582
|
-
// so if the & does not have a combinator that is "" or " " then
|
|
583
|
-
// and there is a combinator on the parent, then grab that.
|
|
584
|
-
// this also allows + a { & .b { .a & { ... though not sure why you would want to do that
|
|
585
|
-
var combinator = replacedElement.combinator;
|
|
586
|
-
var parentEl = addPath[0].elements[0];
|
|
587
|
-
if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
|
|
588
|
-
combinator = parentEl.combinator;
|
|
589
|
-
}
|
|
590
|
-
// join the elements so far with the first part of the parent
|
|
591
|
-
newJoinedSelector.elements.push(new element_1.default(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
|
|
592
|
-
newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
|
|
593
|
-
}
|
|
594
|
-
// now add the joined selector - but only if it is not empty
|
|
595
|
-
if (newJoinedSelector.elements.length !== 0) {
|
|
596
|
-
newSelectorPath.push(newJoinedSelector);
|
|
597
|
-
}
|
|
598
|
-
// put together the parent selectors after the join (e.g. the rest of the parent)
|
|
599
|
-
if (addPath.length > 1) {
|
|
600
|
-
var restOfPath = addPath.slice(1);
|
|
601
|
-
restOfPath = restOfPath.map(function (selector) { return selector.createDerived(selector.elements, []); });
|
|
602
|
-
newSelectorPath = newSelectorPath.concat(restOfPath);
|
|
603
|
-
}
|
|
604
|
-
return newSelectorPath;
|
|
605
|
-
}
|
|
606
|
-
// joins selector path from `beginningPath` with every selector path in `addPaths` array
|
|
607
|
-
// `replacedElement` contains element that is being replaced by `addPath`
|
|
608
|
-
// returns array with all concatenated paths
|
|
609
|
-
function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
|
|
610
|
-
var j;
|
|
611
|
-
for (j = 0; j < beginningPath.length; j++) {
|
|
612
|
-
var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
|
|
613
|
-
result.push(newSelectorPath);
|
|
503
|
+
if (!this.root) {
|
|
504
|
+
output.add((context.compress ? '}' : "\n" + tabSetStr + "}"));
|
|
505
|
+
context.tabLevel--;
|
|
614
506
|
}
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
function mergeElementsOnToSelectors(elements, selectors) {
|
|
618
|
-
var i;
|
|
619
|
-
var sel;
|
|
620
|
-
if (elements.length === 0) {
|
|
621
|
-
return;
|
|
507
|
+
if (!output.isEmpty() && !context.compress && this.firstRoot) {
|
|
508
|
+
output.add('\n');
|
|
622
509
|
}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
510
|
+
},
|
|
511
|
+
joinSelectors: function (paths, context, selectors) {
|
|
512
|
+
for (var s = 0; s < selectors.length; s++) {
|
|
513
|
+
this.joinSelector(paths, context, selectors[s]);
|
|
626
514
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
515
|
+
},
|
|
516
|
+
joinSelector: function (paths, context, selector) {
|
|
517
|
+
function createParenthesis(elementsToPak, originalElement) {
|
|
518
|
+
var replacementParen, j;
|
|
519
|
+
if (elementsToPak.length === 0) {
|
|
520
|
+
replacementParen = new paren_1.default(elementsToPak[0]);
|
|
631
521
|
}
|
|
632
522
|
else {
|
|
633
|
-
|
|
523
|
+
var insideParent = new Array(elementsToPak.length);
|
|
524
|
+
for (j = 0; j < elementsToPak.length; j++) {
|
|
525
|
+
insideParent[j] = new element_1.default(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo);
|
|
526
|
+
}
|
|
527
|
+
replacementParen = new paren_1.default(new selector_1.default(insideParent));
|
|
528
|
+
}
|
|
529
|
+
return replacementParen;
|
|
530
|
+
}
|
|
531
|
+
function createSelector(containedElement, originalElement) {
|
|
532
|
+
var element, selector;
|
|
533
|
+
element = new element_1.default(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
|
|
534
|
+
selector = new selector_1.default([element]);
|
|
535
|
+
return selector;
|
|
536
|
+
}
|
|
537
|
+
// joins selector path from `beginningPath` with selector path in `addPath`
|
|
538
|
+
// `replacedElement` contains element that is being replaced by `addPath`
|
|
539
|
+
// returns concatenated path
|
|
540
|
+
function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
|
|
541
|
+
var newSelectorPath, lastSelector, newJoinedSelector;
|
|
542
|
+
// our new selector path
|
|
543
|
+
newSelectorPath = [];
|
|
544
|
+
// construct the joined selector - if & is the first thing this will be empty,
|
|
545
|
+
// if not newJoinedSelector will be the last set of elements in the selector
|
|
546
|
+
if (beginningPath.length > 0) {
|
|
547
|
+
newSelectorPath = utils.copyArray(beginningPath);
|
|
548
|
+
lastSelector = newSelectorPath.pop();
|
|
549
|
+
newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
newJoinedSelector = originalSelector.createDerived([]);
|
|
553
|
+
}
|
|
554
|
+
if (addPath.length > 0) {
|
|
555
|
+
// /deep/ is a CSS4 selector - (removed, so should deprecate)
|
|
556
|
+
// that is valid without anything in front of it
|
|
557
|
+
// so if the & does not have a combinator that is "" or " " then
|
|
558
|
+
// and there is a combinator on the parent, then grab that.
|
|
559
|
+
// this also allows + a { & .b { .a & { ... though not sure why you would want to do that
|
|
560
|
+
var combinator = replacedElement.combinator;
|
|
561
|
+
var parentEl = addPath[0].elements[0];
|
|
562
|
+
if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
|
|
563
|
+
combinator = parentEl.combinator;
|
|
564
|
+
}
|
|
565
|
+
// join the elements so far with the first part of the parent
|
|
566
|
+
newJoinedSelector.elements.push(new element_1.default(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
|
|
567
|
+
newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
|
|
634
568
|
}
|
|
569
|
+
// now add the joined selector - but only if it is not empty
|
|
570
|
+
if (newJoinedSelector.elements.length !== 0) {
|
|
571
|
+
newSelectorPath.push(newJoinedSelector);
|
|
572
|
+
}
|
|
573
|
+
// put together the parent selectors after the join (e.g. the rest of the parent)
|
|
574
|
+
if (addPath.length > 1) {
|
|
575
|
+
var restOfPath = addPath.slice(1);
|
|
576
|
+
restOfPath = restOfPath.map(function (selector) {
|
|
577
|
+
return selector.createDerived(selector.elements, []);
|
|
578
|
+
});
|
|
579
|
+
newSelectorPath = newSelectorPath.concat(restOfPath);
|
|
580
|
+
}
|
|
581
|
+
return newSelectorPath;
|
|
582
|
+
}
|
|
583
|
+
// joins selector path from `beginningPath` with every selector path in `addPaths` array
|
|
584
|
+
// `replacedElement` contains element that is being replaced by `addPath`
|
|
585
|
+
// returns array with all concatenated paths
|
|
586
|
+
function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
|
|
587
|
+
var j;
|
|
588
|
+
for (j = 0; j < beginningPath.length; j++) {
|
|
589
|
+
var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
|
|
590
|
+
result.push(newSelectorPath);
|
|
591
|
+
}
|
|
592
|
+
return result;
|
|
635
593
|
}
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
// == [[.a] [.c]] [[.b] [.c]]
|
|
650
|
-
//
|
|
651
|
-
var i;
|
|
652
|
-
var j;
|
|
653
|
-
var k;
|
|
654
|
-
var currentElements;
|
|
655
|
-
var newSelectors;
|
|
656
|
-
var selectorsMultiplied;
|
|
657
|
-
var sel;
|
|
658
|
-
var el;
|
|
659
|
-
var hadParentSelector = false;
|
|
660
|
-
var length;
|
|
661
|
-
var lastSelector;
|
|
662
|
-
function findNestedSelector(element) {
|
|
663
|
-
var maybeSelector;
|
|
664
|
-
if (!(element.value instanceof paren_1.default)) {
|
|
665
|
-
return null;
|
|
666
|
-
}
|
|
667
|
-
maybeSelector = element.value.value;
|
|
668
|
-
if (!(maybeSelector instanceof selector_1.default)) {
|
|
669
|
-
return null;
|
|
670
|
-
}
|
|
671
|
-
return maybeSelector;
|
|
672
|
-
}
|
|
673
|
-
// the elements from the current selector so far
|
|
674
|
-
currentElements = [];
|
|
675
|
-
// the current list of new selectors to add to the path.
|
|
676
|
-
// We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
|
|
677
|
-
// by the parents
|
|
678
|
-
newSelectors = [
|
|
679
|
-
[]
|
|
680
|
-
];
|
|
681
|
-
for (i = 0; (el = inSelector.elements[i]); i++) {
|
|
682
|
-
// non parent reference elements just get added
|
|
683
|
-
if (el.value !== '&') {
|
|
684
|
-
var nestedSelector = findNestedSelector(el);
|
|
685
|
-
if (nestedSelector != null) {
|
|
686
|
-
// merge the current list of non parent selector elements
|
|
687
|
-
// on to the current list of selectors to add
|
|
688
|
-
mergeElementsOnToSelectors(currentElements, newSelectors);
|
|
689
|
-
var nestedPaths = [];
|
|
690
|
-
var replaced = void 0;
|
|
691
|
-
var replacedNewSelectors = [];
|
|
692
|
-
replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
|
|
693
|
-
hadParentSelector = hadParentSelector || replaced;
|
|
694
|
-
// the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
|
|
695
|
-
for (k = 0; k < nestedPaths.length; k++) {
|
|
696
|
-
var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
|
|
697
|
-
addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
|
|
698
|
-
}
|
|
699
|
-
newSelectors = replacedNewSelectors;
|
|
700
|
-
currentElements = [];
|
|
594
|
+
function mergeElementsOnToSelectors(elements, selectors) {
|
|
595
|
+
var i, sel;
|
|
596
|
+
if (elements.length === 0) {
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
if (selectors.length === 0) {
|
|
600
|
+
selectors.push([new selector_1.default(elements)]);
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
for (i = 0; (sel = selectors[i]); i++) {
|
|
604
|
+
// if the previous thing in sel is a parent this needs to join on to it
|
|
605
|
+
if (sel.length > 0) {
|
|
606
|
+
sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
|
|
701
607
|
}
|
|
702
608
|
else {
|
|
703
|
-
|
|
609
|
+
sel.push(new selector_1.default(elements));
|
|
704
610
|
}
|
|
705
611
|
}
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
612
|
+
}
|
|
613
|
+
// replace all parent selectors inside `inSelector` by content of `context` array
|
|
614
|
+
// resulting selectors are returned inside `paths` array
|
|
615
|
+
// returns true if `inSelector` contained at least one parent selector
|
|
616
|
+
function replaceParentSelector(paths, context, inSelector) {
|
|
617
|
+
// The paths are [[Selector]]
|
|
618
|
+
// The first list is a list of comma separated selectors
|
|
619
|
+
// The inner list is a list of inheritance separated selectors
|
|
620
|
+
// e.g.
|
|
621
|
+
// .a, .b {
|
|
622
|
+
// .c {
|
|
623
|
+
// }
|
|
624
|
+
// }
|
|
625
|
+
// == [[.a] [.c]] [[.b] [.c]]
|
|
626
|
+
//
|
|
627
|
+
var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
|
|
628
|
+
function findNestedSelector(element) {
|
|
629
|
+
var maybeSelector;
|
|
630
|
+
if (!(element.value instanceof paren_1.default)) {
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
maybeSelector = element.value.value;
|
|
634
|
+
if (!(maybeSelector instanceof selector_1.default)) {
|
|
635
|
+
return null;
|
|
636
|
+
}
|
|
637
|
+
return maybeSelector;
|
|
638
|
+
}
|
|
639
|
+
// the elements from the current selector so far
|
|
640
|
+
currentElements = [];
|
|
641
|
+
// the current list of new selectors to add to the path.
|
|
642
|
+
// We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
|
|
643
|
+
// by the parents
|
|
644
|
+
newSelectors = [
|
|
645
|
+
[]
|
|
646
|
+
];
|
|
647
|
+
for (i = 0; (el = inSelector.elements[i]); i++) {
|
|
648
|
+
// non parent reference elements just get added
|
|
649
|
+
if (el.value !== '&') {
|
|
650
|
+
var nestedSelector = findNestedSelector(el);
|
|
651
|
+
if (nestedSelector != null) {
|
|
652
|
+
// merge the current list of non parent selector elements
|
|
653
|
+
// on to the current list of selectors to add
|
|
654
|
+
mergeElementsOnToSelectors(currentElements, newSelectors);
|
|
655
|
+
var nestedPaths = [];
|
|
656
|
+
var replaced = void 0;
|
|
657
|
+
var replacedNewSelectors = [];
|
|
658
|
+
replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
|
|
659
|
+
hadParentSelector = hadParentSelector || replaced;
|
|
660
|
+
// the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
|
|
661
|
+
for (k = 0; k < nestedPaths.length; k++) {
|
|
662
|
+
var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
|
|
663
|
+
addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
|
|
723
664
|
}
|
|
724
|
-
|
|
665
|
+
newSelectors = replacedNewSelectors;
|
|
666
|
+
currentElements = [];
|
|
725
667
|
}
|
|
726
668
|
else {
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
669
|
+
currentElements.push(el);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
else {
|
|
673
|
+
hadParentSelector = true;
|
|
674
|
+
// the new list of selectors to add
|
|
675
|
+
selectorsMultiplied = [];
|
|
676
|
+
// merge the current list of non parent selector elements
|
|
677
|
+
// on to the current list of selectors to add
|
|
678
|
+
mergeElementsOnToSelectors(currentElements, newSelectors);
|
|
679
|
+
// loop through our current selectors
|
|
680
|
+
for (j = 0; j < newSelectors.length; j++) {
|
|
681
|
+
sel = newSelectors[j];
|
|
682
|
+
// if we don't have any parent paths, the & might be in a mixin so that it can be used
|
|
683
|
+
// whether there are parents or not
|
|
684
|
+
if (context.length === 0) {
|
|
685
|
+
// the combinator used on el should now be applied to the next element instead so that
|
|
686
|
+
// it is not lost
|
|
687
|
+
if (sel.length > 0) {
|
|
688
|
+
sel[0].elements.push(new element_1.default(el.combinator, '', el.isVariable, el._index, el._fileInfo));
|
|
689
|
+
}
|
|
690
|
+
selectorsMultiplied.push(sel);
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
// and the parent selectors
|
|
694
|
+
for (k = 0; k < context.length; k++) {
|
|
695
|
+
// We need to put the current selectors
|
|
696
|
+
// then join the last selector's elements on to the parents selectors
|
|
697
|
+
var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
|
|
698
|
+
// add that to our new set of selectors
|
|
699
|
+
selectorsMultiplied.push(newSelectorPath);
|
|
700
|
+
}
|
|
734
701
|
}
|
|
735
702
|
}
|
|
703
|
+
// our new selectors has been multiplied, so reset the state
|
|
704
|
+
newSelectors = selectorsMultiplied;
|
|
705
|
+
currentElements = [];
|
|
736
706
|
}
|
|
737
|
-
// our new selectors has been multiplied, so reset the state
|
|
738
|
-
newSelectors = selectorsMultiplied;
|
|
739
|
-
currentElements = [];
|
|
740
707
|
}
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
708
|
+
// if we have any elements left over (e.g. .a& .b == .b)
|
|
709
|
+
// add them on to all the current selectors
|
|
710
|
+
mergeElementsOnToSelectors(currentElements, newSelectors);
|
|
711
|
+
for (i = 0; i < newSelectors.length; i++) {
|
|
712
|
+
length = newSelectors[i].length;
|
|
713
|
+
if (length > 0) {
|
|
714
|
+
paths.push(newSelectors[i]);
|
|
715
|
+
lastSelector = newSelectors[i][length - 1];
|
|
716
|
+
newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
|
|
717
|
+
}
|
|
751
718
|
}
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
719
|
+
return hadParentSelector;
|
|
720
|
+
}
|
|
721
|
+
function deriveSelector(visibilityInfo, deriveFrom) {
|
|
722
|
+
var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
|
|
723
|
+
newSelector.copyVisibilityInfo(visibilityInfo);
|
|
724
|
+
return newSelector;
|
|
725
|
+
}
|
|
726
|
+
// joinSelector code follows
|
|
727
|
+
var i, newPaths, hadParentSelector;
|
|
728
|
+
newPaths = [];
|
|
729
|
+
hadParentSelector = replaceParentSelector(newPaths, context, selector);
|
|
730
|
+
if (!hadParentSelector) {
|
|
731
|
+
if (context.length > 0) {
|
|
732
|
+
newPaths = [];
|
|
733
|
+
for (i = 0; i < context.length; i++) {
|
|
734
|
+
var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
|
|
735
|
+
concatenated.push(selector);
|
|
736
|
+
newPaths.push(concatenated);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
else {
|
|
740
|
+
newPaths = [[selector]];
|
|
773
741
|
}
|
|
774
742
|
}
|
|
775
|
-
|
|
776
|
-
newPaths
|
|
743
|
+
for (i = 0; i < newPaths.length; i++) {
|
|
744
|
+
paths.push(newPaths[i]);
|
|
777
745
|
}
|
|
778
746
|
}
|
|
779
|
-
|
|
780
|
-
paths.push(newPaths[i]);
|
|
781
|
-
}
|
|
782
|
-
};
|
|
783
|
-
Ruleset.prototype.type = 'Ruleset';
|
|
784
|
-
Ruleset.prototype.isRuleset = true;
|
|
747
|
+
});
|
|
785
748
|
exports.default = Ruleset;
|
|
786
749
|
//# sourceMappingURL=ruleset.js.map
|