update mergeRules (no separate !important rules + cleanup)

This commit is contained in:
Max Mikhailov
2017-05-31 23:25:26 +03:00
parent a475cc4d81
commit 458b3975ea
3 changed files with 34 additions and 55 deletions

View File

@@ -321,62 +321,37 @@ ToCSSVisitor.prototype = {
}
},
_mergeRules: function (rules) {
if (!rules) { return; }
var groups = {},
parts,
rule,
key;
_mergeRules: function(rules) {
if (!rules) {
return;
}
var groups = {},
groupsArr = [];
for (var i = 0; i < rules.length; i++) {
rule = rules[i];
if ((rule instanceof tree.Declaration) && rule.merge) {
key = [rule.name,
rule.important ? "!" : ""].join(",");
if (!groups[key]) {
groups[key] = [];
} else {
rules.splice(i--, 1);
}
var rule = rules[i];
if (rule.merge) {
var key = rule.name;
groups[key] ? rules.splice(i--, 1) :
groupsArr.push(groups[key] = []);
groups[key].push(rule);
}
}
Object.keys(groups).map(function (k) {
function toExpression(values) {
return new (tree.Expression)(values.map(function (p) {
return p.value;
}));
}
function toValue(values) {
return new (tree.Value)(values.map(function (p) {
return p;
}));
}
parts = groups[k];
if (parts.length > 1) {
rule = parts[0];
var spacedGroups = [];
var lastSpacedGroup = [];
parts.map(function (p) {
if (p.merge === "+") {
if (lastSpacedGroup.length > 0) {
spacedGroups.push(toExpression(lastSpacedGroup));
}
lastSpacedGroup = [];
groupsArr.forEach(function(group) {
if (group.length > 0) {
var result = group[0],
space = [],
comma = [new tree.Expression(space)];
group.forEach(function(rule) {
if ((rule.merge === '+') && (space.length > 0)) {
comma.push(new tree.Expression(space = []));
}
lastSpacedGroup.push(p);
space.push(rule.value);
result.important = result.important || rule.important;
});
spacedGroups.push(toExpression(lastSpacedGroup));
rule.value = toValue(spacedGroups);
result.value = new tree.Value(comma);
}
});
},

View File

@@ -10,16 +10,17 @@
background: url(data://img1.png);
}
.test4 {
transform: rotate(90deg), skew(30deg);
transform: scale(2, 4) !important;
transform: rotate(90deg), skew(30deg), scale(2, 4) !important;
}
.test5 {
transform: rotate(90deg), skew(30deg);
transform: scale(2, 4) !important;
transform: rotate(90deg), skew(30deg), scale(2, 4) !important;
}
.test6 {
transform: scale(2, 4);
}
.test7 {
transform: scale(2, 4), scale(2, 4), scale(2, 4) !important;
}
.test-interleaved {
transform: t1, t2, t3;
background: b1, b2, b3;

View File

@@ -36,17 +36,20 @@
.first-background();
}
.test4 {
// Won't merge values from sources that merked as !important, for backwards compatibility with css
.first-transform();
.fifth-transform();
}
.test5 {
// Won't merge values from mixins that merked as !important, for backwards compatibility with css
.first-transform();
.second-transform() !important;
}
.test6 {
// Ignores !merge if no peers found
.second-transform();
}
.test7 {
// inherit !important from merged subrules
.second-transform();
.second-transform() !important;
.second-transform();
}