From cc96f31a63306e1b2b4daceaf5969aeaaf4ded2a Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Wed, 3 Dec 2014 18:50:45 +0000 Subject: [PATCH] Fixes rouge whitespace handling. --- lib/selectors/tokenizer.js | 12 ++++++ test/selectors/tokenizer-source-maps-test.js | 18 ++++----- test/selectors/tokenizer-test.js | 41 ++++++++++++++++++-- test/source-map-test.js | 36 +++++++++++++++-- 4 files changed, 90 insertions(+), 17 deletions(-) diff --git a/lib/selectors/tokenizer.js b/lib/selectors/tokenizer.js index 345dac98..6348106c 100644 --- a/lib/selectors/tokenizer.js +++ b/lib/selectors/tokenizer.js @@ -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); diff --git a/test/selectors/tokenizer-source-maps-test.js b/test/selectors/tokenizer-source-maps-test.js index f8b2c230..4725436c 100644 --- a/test/selectors/tokenizer-source-maps-test.js +++ b/test/selectors/tokenizer-source-maps-test.js @@ -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' } }] } diff --git a/test/selectors/tokenizer-test.js b/test/selectors/tokenizer-test.js index 0d4df9eb..ed718721 100644 --- a/test/selectors/tokenizer-test.js +++ b/test/selectors/tokenizer-test.js @@ -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__{}', diff --git a/test/source-map-test.js b/test/source-map-test.js index 4ac736d8..a888470d 100644 --- a/test/source-map-test.js +++ b/test/source-map-test.js @@ -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', -- 2.34.1