From 5cb5f561c81d34fc60713cc4e13166da145e0295 Mon Sep 17 00:00:00 2001 From: Luke Page Date: Tue, 30 Apr 2013 20:54:06 +0100 Subject: [PATCH] Convert property merging to the new agreed syntax of +: --- lib/less/parser.js | 31 +++++++++++++------------------ lib/less/tree/rule.js | 2 +- lib/less/tree/ruleset.js | 8 ++++---- test/css/merge.css | 27 ++++++++++----------------- test/less/merge.less | 34 ++++++++++++---------------------- 5 files changed, 40 insertions(+), 62 deletions(-) diff --git a/lib/less/parser.js b/lib/less/parser.js index 8c47d8db..4977aafd 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -1230,12 +1230,12 @@ less.Parser = function Parser(env) { } }, rule: function (tryAnonymous) { - var name, value, c = input.charAt(i), important, merge, match; + var name, value, c = input.charAt(i), important, merge = false, match; save(); if (c === '.' || c === '#' || c === '&') { return } - if (name = $(this.variable) || $(this.property)) { + if (name = $(this.variable) || $(this.ruleProperty)) { // prefer to try to parse first if its a variable or we are compressing // but always fallback on the other one value = !tryAnonymous && (env.compress || (name.charAt(0) === '@')) ? @@ -1244,7 +1244,10 @@ less.Parser = function Parser(env) { important = $(this.important); - merge = $(this.merge); + if (name[name.length-1] === "+") { + merge = true; + name = name.substr(0, name.length - 1); + } if (value && $(this.end)) { return new (tree.Rule)(name, value, important, merge, memo, env.currentFileInfo); @@ -1497,21 +1500,6 @@ less.Parser = function Parser(env) { return $(/^! *important/); } }, - merge: function () { - var separator; - if (input.charAt(i) === '!') { - if ($(/^! *merge\(/)) { - separator = expect(/^ *space|comma */); - if (separator) { - separator = (separator.trim() === 'space') - ? ' ' - : ','; - } - expect(')'); - } - } - return separator; - }, sub: function () { var a, e; @@ -1632,6 +1620,13 @@ less.Parser = function Parser(env) { if (name = $(/^(\*?-?[_a-z0-9-]+)\s*:/)) { return name[1]; } + }, + ruleProperty: function () { + var name; + + if (name = $(/^(\*?-?[_a-z0-9-]+)\s*(\+?)\s*:/)) { + return name[1] + (name[2] || ""); + } } } }; diff --git a/lib/less/tree/rule.js b/lib/less/tree/rule.js index eacd5419..f0ef9930 100644 --- a/lib/less/tree/rule.js +++ b/lib/less/tree/rule.js @@ -20,7 +20,7 @@ tree.Rule.prototype = { this.value = visitor.visit(this.value); }, toCSS: function (env) { - if (this.variable) { return "" } + if (this.variable) { return ""; } else { try { return this.name + (env.compress ? ':' : ': ') + diff --git a/lib/less/tree/ruleset.js b/lib/less/tree/ruleset.js index 7055785c..a579ec43 100644 --- a/lib/less/tree/ruleset.js +++ b/lib/less/tree/ruleset.js @@ -178,7 +178,8 @@ tree.Ruleset.prototype = { debugInfo, // Line number debugging rule; - this.mergeRules(); + this.mergeRules(); + // Compile rules and rulesets for (var i = 0; i < this.rules.length; i++) { rule = this.rules[i]; @@ -468,8 +469,7 @@ tree.Ruleset.prototype = { if ((rule instanceof tree.Rule) && rule.merge) { key = [rule.name, - rule.important ? "!" : "", - rule.merge].join(","); + rule.important ? "!" : ""].join(","); if (!groups[key]) { parts = groups[key] = []; @@ -487,7 +487,7 @@ tree.Ruleset.prototype = { if (parts.length > 1) { rule = parts[0]; - rule.value = new ((rule.merge === ' ') ? tree.Expression : tree.Value)(parts.map(function (p) { + rule.value = new (tree.Value)(parts.map(function (p) { return p.value; })); } diff --git a/test/css/merge.css b/test/css/merge.css index e27aa789..4cf8c579 100644 --- a/test/css/merge.css +++ b/test/css/merge.css @@ -1,29 +1,22 @@ .test1 { - transform: rotate(90deg) skew(30deg) scale(2, 4); + transform: rotate(90deg), skew(30deg), scale(2, 4); } .test2 { - transform: rotate(90deg) skew(30deg); + transform: rotate(90deg), skew(30deg); transform: scaleX(45deg); } .test3 { - background: url(data://img1.png), url(data://img2.png); -} -.test4 { - transform: rotate(90deg) skew(30deg); - transform: scaleX(45deg); -} -.test5 { transform: scaleX(45deg); background: url(data://img1.png); } +.test4 { + transform: rotate(90deg), skew(30deg); + transform: scale(2, 4) !important; +} +.test5 { + transform: rotate(90deg), skew(30deg); + transform: scale(2, 4) !important; +} .test6 { - transform: rotate(90deg) skew(30deg); - transform: scale(2, 4) !important; -} -.test7 { - transform: rotate(90deg) skew(30deg); - transform: scale(2, 4) !important; -} -.test8 { transform: scale(2, 4); } diff --git a/test/less/merge.less b/test/less/merge.less index 29c122ca..52d0796e 100644 --- a/test/less/merge.less +++ b/test/less/merge.less @@ -1,61 +1,51 @@ .first-transform() { - transform: rotate(90deg) skew(30deg) !merge(space); + transform+: rotate(90deg), skew(30deg); } .second-transform() { - transform: scale(2,4) !merge(space); + transform+: scale(2,4); } .third-transform() { transform: scaleX(45deg); } .fourth-transform() { - transform: scaleX(45deg) !merge(comma); + transform+: scaleX(45deg); } .fifth-transform() { - transform: scale(2,4) !important !merge(space); + transform+: scale(2,4) !important; } .first-background() { - background: url(data://img1.png) !merge(comma); + background+: url(data://img1.png); } .second-background() { - background: url(data://img2.png) !merge(comma); + background+: url(data://img2.png); } .test1 { - // Can merge values with space separator + // Can merge values .first-transform(); .second-transform(); } .test2 { - // Wont merge values without !merge directive, for backwards compatibility with css + // Wont merge values without +: merge directive, for backwards compatibility with css .first-transform(); .third-transform(); } .test3 { - // Can merge values with comma separator + // Wont merge values from two sources with different properties + .fourth-transform(); .first-background(); - .second-background(); } .test4 { - // Wont merge values from two sources with different seperators - .first-transform(); - .fourth-transform(); -} -.test5 { - // Wont merge values from two sources with the same seperators but different properties - .fourth-transform(); - .first-background(); -} -.test6 { // Wont merge values from sources that merked as !important, for backwards compatibility with css .first-transform(); .fifth-transform(); } -.test7 { +.test5 { // Wont merge values from mixins that merked as !important, for backwards compatibility with css .first-transform(); .second-transform() !important; } -.test8 { +.test6 { // Ignores !merge if no peers found .second-transform(); } \ No newline at end of file