Fixes rebuilding flat blocks in SelectorOptimizer.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Thu, 2 Oct 2014 13:55:17 +0000 (14:55 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 10 Oct 2014 20:22:45 +0000 (21:22 +0100)
lib/selectors/optimizer.js
lib/selectors/tokenizer.js
test/selectors/tokenizer-test.js

index 3e0b6b4..7b13c8a 100644 (file)
@@ -9,7 +9,9 @@ function SelectorsOptimizer(options, context) {
   this.context = context || {};
 }
 
-function rebuild(tokens, keepBreaks) {
+function rebuild(tokens, keepBreaks, isFlatBlock) {
+  var joinCharacter = isFlatBlock ? ';' : (keepBreaks ? lineBreak : '');
+
   return tokens
     .map(function (token) {
       if (typeof token === 'string')
@@ -28,7 +30,7 @@ function rebuild(tokens, keepBreaks) {
       }
     })
     .filter(function (value) { return value.length > 0; })
-    .join(keepBreaks ? lineBreak : '')
+    .join(joinCharacter)
     .trim();
 }
 
@@ -39,7 +41,7 @@ SelectorsOptimizer.prototype.process = function (data) {
   if (!this.options.noAdvanced)
     new AdvancedOptimizer(this.options, this.context).optimize(tokens);
 
-  return rebuild(tokens, this.options.keepBreaks);
+  return rebuild(tokens, this.options.keepBreaks, false);
 };
 
 module.exports = SelectorsOptimizer;
index 357d742..83857ca 100644 (file)
@@ -141,7 +141,7 @@ function tokenize(context) {
 
         context.mode = oldMode;
 
-        tokenized.push({ block: block, body: specialBody });
+        tokenized.push({ block: block, body: specialBody, isFlatBlock: isFlat });
       }
     } else if (what == 'escape') {
       nextEnd = chunk.indexOf('__', nextSpecial + 1);
index 4c07735..39e77a7 100644 (file)
@@ -70,19 +70,19 @@ vows.describe(Tokenizer)
       ],
       'media query': [
         '@media (min-width:980px){}',
-        [{ block: '@media (min-width:980px)', body: [] }]
+        [{ block: '@media (min-width:980px)', body: [], isFlatBlock: false }]
       ],
       'media query with selectors': [
         '@media (min-width:980px){a{color:red}}',
-        [{ block: '@media (min-width:980px)', body: [{ selector: ['a'], body: ['color:red'] }] }]
+        [{ block: '@media (min-width:980px)', body: [{ selector: ['a'], body: ['color:red'] }], isFlatBlock: false }]
       ],
       'media query spanning more than one chunk': [
         '@media only screen and (max-width:1319px) and (min--moz-device-pixel-ratio:1.5),only screen and (max-width:1319px) and (-moz-min-device-pixel-ratio:1.5){a{color:#000}}',
-        [{ block: '@media only screen and (max-width:1319px) and (min--moz-device-pixel-ratio:1.5),only screen and (max-width:1319px) and (-moz-min-device-pixel-ratio:1.5)', body: [{ selector: ['a'], body: ['color:#000'] }] }]
+        [{ block: '@media only screen and (max-width:1319px) and (min--moz-device-pixel-ratio:1.5),only screen and (max-width:1319px) and (-moz-min-device-pixel-ratio:1.5)', body: [{ selector: ['a'], body: ['color:#000'] }], isFlatBlock: false }]
       ],
       'font-face': [
         '@font-face{font-family: fontName;font-size:12px}',
-        [{ block: '@font-face', body: ['font-family:fontName', 'font-size:12px'] }]
+        [{ block: '@font-face', body: ['font-family:fontName', 'font-size:12px'], isFlatBlock: true }]
       ],
       'charset': [
         '@charset \'utf-8\';a{color:red}',