mirror of
https://github.com/less/less.js.git
synced 2026-05-01 03:00:22 -04:00
This reverts commit 23569c98e2.
This commit is contained in:
@@ -810,7 +810,7 @@ var Parser = function Parser(context, imports, fileInfo) {
|
||||
if (!e) {
|
||||
break;
|
||||
}
|
||||
elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);
|
||||
elem = new(tree.Element)(c, e, elemIndex, fileInfo);
|
||||
if (elements) {
|
||||
elements.push(elem);
|
||||
} else {
|
||||
@@ -1097,7 +1097,7 @@ var Parser = function Parser(context, imports, fileInfo) {
|
||||
}
|
||||
}
|
||||
|
||||
if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }
|
||||
if (e) { return new(tree.Element)(c, e, index, fileInfo); }
|
||||
},
|
||||
|
||||
//
|
||||
@@ -1177,30 +1177,6 @@ var Parser = function Parser(context, imports, fileInfo) {
|
||||
if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }
|
||||
if (allExtends) { error("Extend must be used to extend a selector, it cannot be used on its own"); }
|
||||
},
|
||||
selectors: function () {
|
||||
var s, selectors;
|
||||
while (true) {
|
||||
s = this.selector();
|
||||
if (!s) {
|
||||
break;
|
||||
}
|
||||
if (selectors) {
|
||||
selectors.push(s);
|
||||
} else {
|
||||
selectors = [ s ];
|
||||
}
|
||||
parserInput.commentStore.length = 0;
|
||||
if (s.condition && selectors.length > 1) {
|
||||
error("Guards are only currently allowed on a single selector.");
|
||||
}
|
||||
if (!parserInput.$char(',')) { break; }
|
||||
if (s.condition) {
|
||||
error("Guards are only currently allowed on a single selector.");
|
||||
}
|
||||
parserInput.commentStore.length = 0;
|
||||
}
|
||||
return selectors;
|
||||
},
|
||||
attribute: function () {
|
||||
if (!parserInput.$char('[')) { return; }
|
||||
|
||||
@@ -1252,7 +1228,7 @@ var Parser = function Parser(context, imports, fileInfo) {
|
||||
// div, .class, body > p {...}
|
||||
//
|
||||
ruleset: function () {
|
||||
var selectors, rules, debugInfo;
|
||||
var selectors, s, rules, debugInfo;
|
||||
|
||||
parserInput.save();
|
||||
|
||||
@@ -1260,7 +1236,26 @@ var Parser = function Parser(context, imports, fileInfo) {
|
||||
debugInfo = getDebugInfo(parserInput.i);
|
||||
}
|
||||
|
||||
selectors = this.selectors();
|
||||
while (true) {
|
||||
s = this.selector();
|
||||
if (!s) {
|
||||
break;
|
||||
}
|
||||
if (selectors) {
|
||||
selectors.push(s);
|
||||
} else {
|
||||
selectors = [ s ];
|
||||
}
|
||||
parserInput.commentStore.length = 0;
|
||||
if (s.condition && selectors.length > 1) {
|
||||
error("Guards are only currently allowed on a single selector.");
|
||||
}
|
||||
if (!parserInput.$char(',')) { break; }
|
||||
if (s.condition) {
|
||||
error("Guards are only currently allowed on a single selector.");
|
||||
}
|
||||
parserInput.commentStore.length = 0;
|
||||
}
|
||||
|
||||
if (selectors && (rules = this.block())) {
|
||||
parserInput.forget();
|
||||
|
||||
@@ -2,7 +2,7 @@ var Node = require("./node"),
|
||||
Paren = require("./paren"),
|
||||
Combinator = require("./combinator");
|
||||
|
||||
var Element = function (combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {
|
||||
var Element = function (combinator, value, index, currentFileInfo, visibilityInfo) {
|
||||
this.combinator = combinator instanceof Combinator ?
|
||||
combinator : new Combinator(combinator);
|
||||
|
||||
@@ -13,7 +13,6 @@ var Element = function (combinator, value, isVariable, index, currentFileInfo, v
|
||||
} else {
|
||||
this.value = "";
|
||||
}
|
||||
this.isVariable = isVariable;
|
||||
this._index = index;
|
||||
this._fileInfo = currentFileInfo;
|
||||
this.copyVisibilityInfo(visibilityInfo);
|
||||
@@ -31,14 +30,12 @@ Element.prototype.accept = function (visitor) {
|
||||
Element.prototype.eval = function (context) {
|
||||
return new Element(this.combinator,
|
||||
this.value.eval ? this.value.eval(context) : this.value,
|
||||
this.isVariable,
|
||||
this.getIndex(),
|
||||
this.fileInfo(), this.visibilityInfo());
|
||||
};
|
||||
Element.prototype.clone = function () {
|
||||
return new Element(this.combinator,
|
||||
this.value,
|
||||
this.isVariable,
|
||||
this.getIndex(),
|
||||
this.fileInfo(), this.visibilityInfo());
|
||||
};
|
||||
|
||||
@@ -8,7 +8,7 @@ var Selector = require("./selector"),
|
||||
|
||||
var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) {
|
||||
this.name = name;
|
||||
this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];
|
||||
this.selectors = [new Selector([new Element(null, name, this._index, this._fileInfo)])];
|
||||
this.params = params;
|
||||
this.condition = condition;
|
||||
this.variadic = variadic;
|
||||
|
||||
@@ -41,72 +41,20 @@ Ruleset.prototype.accept = function (visitor) {
|
||||
}
|
||||
};
|
||||
Ruleset.prototype.eval = function (context) {
|
||||
var that = this, selectors, selCnt, selector, i, hasOnePassingSelector = false;
|
||||
var thisSelectors = this.selectors, selectors,
|
||||
selCnt, selector, i, hasOnePassingSelector = false;
|
||||
|
||||
if (this.selectors && (selCnt = this.selectors.length)) {
|
||||
if (thisSelectors && (selCnt = thisSelectors.length)) {
|
||||
selectors = new Array(selCnt);
|
||||
defaultFunc.error({
|
||||
type: "Syntax",
|
||||
message: "it is currently only allowed in parametric mixin guards,"
|
||||
});
|
||||
for (i = 0; i < selCnt; i++) {
|
||||
selector = this.selectors[i].eval(context);
|
||||
var removeSelector = false;
|
||||
for (var j = 0; j < selector.elements.length; j++) {
|
||||
var el = selector.elements[j];
|
||||
// If selector elements were variables, re-parse to see if they are actually selectors
|
||||
if (el.isVariable) {
|
||||
var selectorsToInsert;
|
||||
if (Array.isArray(el.value.value)) {
|
||||
// Convert var evaluated to list as list of selectors
|
||||
selectorsToInsert = new Array(el.value.value.length);
|
||||
el.value.value.forEach(function(val, k) {
|
||||
selectorsToInsert[k] = new Selector(
|
||||
[new Element(
|
||||
null,
|
||||
val.value,
|
||||
false,
|
||||
el.getIndex(),
|
||||
el.fileInfo()
|
||||
)]
|
||||
);
|
||||
})
|
||||
} else if (typeof el.value.value === 'string') {
|
||||
this.parse.parseNode(
|
||||
el.value.value,
|
||||
["selectors"],
|
||||
el.getIndex(),
|
||||
el.fileInfo(),
|
||||
function(err, result) {
|
||||
el.isVariable = false;
|
||||
if (result) {
|
||||
result = utils.flattenArray(result);
|
||||
// If the parsed element matches itself, it's still an element
|
||||
if (result.length !== 1 || el.value.value !== result[0].elements[0].value) {
|
||||
selectorsToInsert = result;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (selectorsToInsert) {
|
||||
this.selectors = this.selectors.slice(0, i + 1)
|
||||
.concat(selectorsToInsert, this.selectors.slice(i + 1));
|
||||
selCnt += selectorsToInsert.length;
|
||||
removeSelector = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (removeSelector) {
|
||||
selCnt -= 1;
|
||||
this.selectors.splice(i, 1);
|
||||
i -= 1;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
selectors[i] = selector;
|
||||
if (selector.evaldCondition) {
|
||||
hasOnePassingSelector = true;
|
||||
}
|
||||
selector = thisSelectors[i].eval(context);
|
||||
selectors[i] = selector;
|
||||
if (selector.evaldCondition) {
|
||||
hasOnePassingSelector = true;
|
||||
}
|
||||
}
|
||||
defaultFunc.reset();
|
||||
@@ -214,7 +162,7 @@ Ruleset.prototype.eval = function (context) {
|
||||
// for rulesets, check if it is a css guard and can be removed
|
||||
if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {
|
||||
// check if it can be folded in (e.g. & where)
|
||||
if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
|
||||
if (rule.selectors[0].isJustParentSelector()) {
|
||||
rsRules.splice(i--, 1);
|
||||
|
||||
for (var j = 0; (subRule = rule.rules[j]); j++) {
|
||||
@@ -559,13 +507,7 @@ Ruleset.prototype.joinSelector = function (paths, context, selector) {
|
||||
} else {
|
||||
var insideParent = new Array(elementsToPak.length);
|
||||
for (j = 0; j < elementsToPak.length; j++) {
|
||||
insideParent[j] = new Element(
|
||||
null,
|
||||
elementsToPak[j],
|
||||
originalElement.isVariable,
|
||||
originalElement._index,
|
||||
originalElement._fileInfo
|
||||
);
|
||||
insideParent[j] = new Element(null, elementsToPak[j], originalElement._index, originalElement._fileInfo);
|
||||
}
|
||||
replacementParen = new Paren(new Selector(insideParent));
|
||||
}
|
||||
@@ -574,7 +516,7 @@ Ruleset.prototype.joinSelector = function (paths, context, selector) {
|
||||
|
||||
function createSelector(containedElement, originalElement) {
|
||||
var element, selector;
|
||||
element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
|
||||
element = new Element(null, containedElement, originalElement._index, originalElement._fileInfo);
|
||||
selector = new Selector([element]);
|
||||
return selector;
|
||||
}
|
||||
@@ -608,13 +550,7 @@ Ruleset.prototype.joinSelector = function (paths, context, selector) {
|
||||
combinator = parentEl.combinator;
|
||||
}
|
||||
// join the elements so far with the first part of the parent
|
||||
newJoinedSelector.elements.push(new Element(
|
||||
combinator,
|
||||
parentEl.value,
|
||||
replacedElement.isVariable,
|
||||
replacedElement._index,
|
||||
replacedElement._fileInfo
|
||||
));
|
||||
newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement._index, replacedElement._fileInfo));
|
||||
newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
|
||||
}
|
||||
|
||||
@@ -748,7 +684,7 @@ Ruleset.prototype.joinSelector = function (paths, context, selector) {
|
||||
// the combinator used on el should now be applied to the next element instead so that
|
||||
// it is not lost
|
||||
if (sel.length > 0) {
|
||||
sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));
|
||||
sel[0].elements.push(new Element(el.combinator, '', el._index, el._fileInfo));
|
||||
}
|
||||
selectorsMultiplied.push(sel);
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ Selector.prototype.getElements = function(els) {
|
||||
return els;
|
||||
};
|
||||
Selector.prototype.createEmptySelectors = function() {
|
||||
var el = new Element('', '&', false, this._index, this._fileInfo),
|
||||
var el = new Element('', '&', this._index, this._fileInfo),
|
||||
sels = [new Selector([el], null, null, this._index, this._fileInfo)];
|
||||
sels[0].mediaEmpty = true;
|
||||
return sels;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* jshint proto: true */
|
||||
var utils = {
|
||||
module.exports = {
|
||||
getLocation: function(index, inputStream) {
|
||||
var n = index + 1,
|
||||
line = null,
|
||||
@@ -65,21 +65,5 @@ var utils = {
|
||||
}
|
||||
}
|
||||
return obj1;
|
||||
},
|
||||
flattenArray: function(arr, result) {
|
||||
result = result || [];
|
||||
for (var i = 0, length = arr.length; i < length; i++) {
|
||||
var value = arr[i];
|
||||
if (Array.isArray(value)) {
|
||||
utils.flattenArray(value, result);
|
||||
} else {
|
||||
if (value !== undefined) {
|
||||
result.push(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = utils;
|
||||
@@ -385,7 +385,6 @@ ProcessExtendsVisitor.prototype = {
|
||||
firstElement = new tree.Element(
|
||||
match.initialCombinator,
|
||||
replacementSelector.elements[0].value,
|
||||
replacementSelector.elements[0].isVariable,
|
||||
replacementSelector.elements[0].getIndex(),
|
||||
replacementSelector.elements[0].fileInfo()
|
||||
);
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
input[type=text]:focus,
|
||||
input[type=email]:focus,
|
||||
input[type=password]:focus,
|
||||
textarea:focus {
|
||||
foo: bar;
|
||||
}
|
||||
.a + .z,
|
||||
.b + .z,
|
||||
.c + .z {
|
||||
color: blue;
|
||||
}
|
||||
.master-page-1 .selector-1,
|
||||
.master-page-1 .selector-2 {
|
||||
background-color: red;
|
||||
}
|
||||
.fruit-apple,
|
||||
.fruit-satsuma,
|
||||
.fruit-banana,
|
||||
.fruit-pear {
|
||||
content: "Just a test.";
|
||||
}
|
||||
@@ -14,7 +14,7 @@ module.exports = function() {
|
||||
var oneTestOnly = process.argv[2],
|
||||
isFinished = false;
|
||||
|
||||
var isVerbose = process.env.npm_config_loglevel !== 'concise';
|
||||
var isVerbose = process.env.npm_config_loglevel === 'verbose';
|
||||
|
||||
var normalFolder = 'test/less';
|
||||
var bomFolder = 'test/less-bom';
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
@inputs: input[type=text], input[type=email], input[type=password], textarea;
|
||||
|
||||
@{inputs} {
|
||||
&:focus {
|
||||
foo: bar;
|
||||
}
|
||||
}
|
||||
|
||||
@classes: ~".a, .b, .c";
|
||||
|
||||
@{classes} {
|
||||
+ .z {
|
||||
color: blue;
|
||||
}
|
||||
}
|
||||
|
||||
@my-selector: ~'.selector-1, .selector-2';
|
||||
.master-page-1 {
|
||||
@{my-selector} {
|
||||
background-color: red;
|
||||
}
|
||||
}
|
||||
|
||||
@list: apple, satsuma, banana, pear;
|
||||
@{list} {
|
||||
.fruit-& {
|
||||
content: "Just a test.";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user