From 458b3975ea0c0de7c38df6998aa2b3facf6f730d Mon Sep 17 00:00:00 2001 From: Max Mikhailov Date: Wed, 31 May 2017 23:25:26 +0300 Subject: [PATCH] update mergeRules (no separate !important rules + cleanup) --- lib/less/visitors/to-css-visitor.js | 71 ++++++++++------------------- test/css/merge.css | 9 ++-- test/less/merge.less | 9 ++-- 3 files changed, 34 insertions(+), 55 deletions(-) diff --git a/lib/less/visitors/to-css-visitor.js b/lib/less/visitors/to-css-visitor.js index 009ac056..74990bc9 100644 --- a/lib/less/visitors/to-css-visitor.js +++ b/lib/less/visitors/to-css-visitor.js @@ -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); } }); }, diff --git a/test/css/merge.css b/test/css/merge.css index fe29dc83..b5d079b5 100644 --- a/test/css/merge.css +++ b/test/css/merge.css @@ -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; diff --git a/test/less/merge.less b/test/less/merge.less index 9d37f67a..7cac833b 100644 --- a/test/less/merge.less +++ b/test/less/merge.less @@ -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(); }