Fixes rouge whitespace handling.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Wed, 3 Dec 2014 18:50:45 +0000 (18:50 +0000)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Mon, 8 Dec 2014 09:42:55 +0000 (09:42 +0000)
lib/selectors/tokenizer.js
test/selectors/tokenizer-source-maps-test.js
test/selectors/tokenizer-test.js
test/source-map-test.js

index 345dac9..6348106 100644 (file)
@@ -107,6 +107,18 @@ function tokenize(context) {
 
     chunk = context.chunk;
 
+    if (context.cursor != nextSpecial && what != 'bodyEnd') {
+      var spacing = chunk.substring(context.cursor, nextSpecial);
+      var leadingWhitespace = /^\s+/.exec(spacing);
+
+      if (leadingWhitespace) {
+        context.cursor += leadingWhitespace[0].length;
+
+        if (addSourceMap)
+          SourceMaps.track(leadingWhitespace[0], context);
+      }
+    }
+
     if (what == 'special') {
       var firstOpenBraceAt = chunk.indexOf('{', nextSpecial);
       var firstSemicolonAt = chunk.indexOf(';', nextSpecial);
index f8b2c23..4725436 100644 (file)
@@ -52,7 +52,7 @@ vows.describe('source-maps/analyzer')
         [{
           kind: 'selector',
           value: [
-            { value: ' a', metadata: { line: 1, column: 1, source: undefined } },
+            { value: 'a', metadata: { line: 1, column: 1, source: undefined } },
             { value: '\n\ndiv', metadata: { line: 3, column: 0, source: undefined } }
           ],
           body: []
@@ -75,7 +75,7 @@ vows.describe('source-maps/analyzer')
         [{
           kind: 'selector',
           value: [
-            { value: ' a', metadata: { line: 1, column: 1, source: undefined } },
+            { value: 'a', metadata: { line: 1, column: 1, source: undefined } },
             { value: '\n\ndiv\na', metadata: { line: 3, column: 0, source: undefined } },
             { value: '\n p', metadata: { line: 5, column: 1, source: undefined } }
           ],
@@ -107,12 +107,12 @@ vows.describe('source-maps/analyzer')
           },
           {
             kind: 'selector',
-            value: [{ value: '\n\ndiv', metadata: { line: 3, column: 0, source: undefined } }],
+            value: [{ value: 'div', metadata: { line: 3, column: 0, source: undefined } }],
             body: []
           },
           {
             kind: 'selector',
-            value: [{ value: '\n \n  p', metadata: { line: 5, column: 2, source: undefined } }],
+            value: [{ value: 'p', metadata: { line: 5, column: 2, source: undefined } }],
             body: []
           }
         ]
@@ -177,7 +177,7 @@ vows.describe('source-maps/analyzer')
           },
           {
             kind: 'selector',
-            value: [{ value: '\n div', metadata: { line: 2, column: 1, source: undefined } }],
+            value: [{ value: 'div', metadata: { line: 2, column: 1, source: undefined } }],
             body: [{ value: 'color:blue', metadata: { line: 2, column: 5, source: undefined } }]
           }
         ]
@@ -192,7 +192,7 @@ vows.describe('source-maps/analyzer')
           },
           {
             kind: 'selector',
-            value: [{ value: '\n div', metadata: { line: 3, column: 1, source: undefined } }],
+            value: [{ value: 'div', metadata: { line: 3, column: 1, source: undefined } }],
             body: [{ value: 'color:blue', metadata: { line: 3, column: 5, source: undefined } }]
           }
         ]
@@ -216,7 +216,7 @@ vows.describe('source-maps/analyzer')
           },
           {
             kind: 'selector',
-            value: [{ value: '\n\na', metadata: { line: 4, column: 0, source: undefined } }],
+            value: [{ value: 'a', metadata: { line: 4, column: 0, source: undefined } }],
             body: [{ value: 'color:red', metadata: { line: 4, column: 2, source: undefined } }]
           }
         ]
@@ -267,7 +267,7 @@ vows.describe('source-maps/analyzer')
             body: [
               {
                 kind: 'selector',
-                value: [{ value: '\na', metadata: { line: 4, column: 0, source: undefined } }],
+                value: [{ value: 'a', metadata: { line: 4, column: 0, source: undefined } }],
                 body: [{ value: 'color:red', metadata: { line: 5, column: 0, source: undefined } }]
               },
               {
@@ -459,7 +459,7 @@ vows.describe('source-maps/analyzer')
           {
             kind: 'selector',
             value: [
-              { value: '\na', metadata: { line: 2, column: 0, source: 'two.css' } }
+              { value: 'a', metadata: { line: 2, column: 0, source: 'two.css' } }
             ],
             body: [{ value: 'color:red', metadata: { line: 2, column: 2, source: 'two.css' } }]
           }
index 0d4df9e..ed71872 100644 (file)
@@ -36,6 +36,19 @@ vows.describe(Tokenizer)
           value: '__ESCAPED_COMMENT_CLEAN_CSS0__'
         }]
       ],
+      'an escaped content followed by a break': [
+        '__ESCAPED_COMMENT_CLEAN_CSS0__\n',
+        [
+          {
+            kind: 'text',
+            value: '__ESCAPED_COMMENT_CLEAN_CSS0__'
+          },
+          {
+            kind: 'text',
+            value: '\n'
+          }
+        ]
+      ],
       'an empty selector': [
         'a{}',
         [{
@@ -125,6 +138,24 @@ vows.describe(Tokenizer)
           }
         ]
       ],
+      'two comments and a selector separated by newline': [
+        '__ESCAPED_COMMENT_CLEAN_CSS0__\n__ESCAPED_COMMENT_CLEAN_CSS1__\ndiv{}',
+        [
+          {
+            kind: 'text',
+            value: '__ESCAPED_COMMENT_CLEAN_CSS0__'
+          },
+          {
+            kind: 'text',
+            value: '__ESCAPED_COMMENT_CLEAN_CSS1__'
+          },
+          {
+            kind: 'selector',
+            value: [{ value: 'div' }],
+            body: []
+          }
+        ]
+      ],
       'media query': [
         '@media (min-width:980px){}',
         [{
@@ -188,10 +219,12 @@ vows.describe(Tokenizer)
       ],
       'charset after a line break': [
         '\n@charset \n\'utf-8\';',
-        [{
-          kind: 'at-rule',
-          value: '\n@charset \n\'utf-8\';'
-        }]
+        [
+          {
+            kind: 'at-rule',
+            value: '@charset \n\'utf-8\';'
+          }
+        ]
       ],
       'keyframes with quoted attribute': [
         '@keyframes __ESCAPED_FREE_TEXT_CLEAN_CSS0__{}',
index 4ac736d..a888470 100644 (file)
@@ -265,6 +265,34 @@ vows.describe('source-map')
         };
         assert.deepEqual(mapping, minified.sourceMap._mappings[4]);
       }
+    },
+    'double comments': {
+      'topic': new CleanCSS({ sourceMap: true }).minify('/* COMMENT 1 */\n/* COMMENT 2 */\ndiv{color:red}'),
+      'should have 2 mappings': function(minified) {
+        assert.equal(2, minified.sourceMap._mappings.length);
+      },
+      'should have _div__ mapping': function (minified) {
+        var mapping = {
+          generatedLine: 1,
+          generatedColumn: 0,
+          originalLine: 3,
+          originalColumn: 0,
+          source: '__stdin__.css',
+          name: null
+        };
+        assert.deepEqual(mapping, minified.sourceMap._mappings[0]);
+      },
+      'should have _color:red_ mapping': function (minified) {
+        var mapping = {
+          generatedLine: 1,
+          generatedColumn: 4,
+          originalLine: 3,
+          originalColumn: 4,
+          source: '__stdin__.css',
+          name: null
+        };
+        assert.deepEqual(mapping, minified.sourceMap._mappings[1]);
+      }
     }
   })
   .addBatch({
@@ -381,8 +409,8 @@ vows.describe('source-map')
       },
       'should have second selector mapping': function (minified) {
         var mapping = {
-          generatedLine: 2,
-          generatedColumn: 0,
+          generatedLine: 1,
+          generatedColumn: 14,
           originalLine: 1,
           originalColumn: 0,
           source: 'styles.less',
@@ -392,8 +420,8 @@ vows.describe('source-map')
       },
       'should have _color:blue_ mapping': function (minified) {
         var mapping = {
-          generatedLine: 2,
-          generatedColumn: 6,
+          generatedLine: 1,
+          generatedColumn: 20,
           originalLine: 3,
           originalColumn: 4,
           source: 'styles.less',