From 9bbebe35bf84094619e4cd133cf0c630e4579e0c Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Mon, 21 Jul 2014 23:25:53 +0100 Subject: [PATCH] Turns comma splitter into a more generic splitter. * No longer accepts splitted value as constructor argument but in split method instead. * Accepts separator value to split over in constructor. --- lib/clean.js | 4 ++-- lib/properties/processable.js | 8 ++++---- lib/text/comma-splitter.js | 35 -------------------------------- lib/text/splitter.js | 35 ++++++++++++++++++++++++++++++++ test/text/comma-splitter-test.js | 17 ---------------- test/text/splitter-test.js | 20 ++++++++++++++++++ 6 files changed, 61 insertions(+), 58 deletions(-) delete mode 100644 lib/text/comma-splitter.js create mode 100644 lib/text/splitter.js delete mode 100644 test/text/comma-splitter-test.js create mode 100644 test/text/splitter-test.js diff --git a/lib/clean.js b/lib/clean.js index dd36bd6e..a36ad1ef 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -19,7 +19,7 @@ var ExpressionsProcessor = require('./text/expressions'); var FreeTextProcessor = require('./text/free'); var UrlsProcessor = require('./text/urls'); var NameQuotesProcessor = require('./text/name-quotes'); -var CommaSplitter = require('./text/comma-splitter'); +var Splitter = require('./text/splitter'); var SelectorsOptimizer = require('./selectors/optimizer'); @@ -309,7 +309,7 @@ var minify = function(data, callback) { // transparent rgba/hsla to 'transparent' unless in compatibility mode if (!options.compatibility) { replace(/:([^;]*)(?:rgba|hsla)\(\d+,\d+%?,\d+%?,0\)/g, function (match, prefix) { - if (new CommaSplitter(match).split().pop().indexOf('gradient(') > -1) + if (new Splitter(',').split(match).pop().indexOf('gradient(') > -1) return match; return ':' + prefix + 'transparent'; diff --git a/lib/properties/processable.js b/lib/properties/processable.js index 05685125..08bdd6a1 100644 --- a/lib/properties/processable.js +++ b/lib/properties/processable.js @@ -5,7 +5,7 @@ module.exports = (function () { var tokenModule = require('./token'); var validator = require('./validator'); - var CommaSplitter = require('../text/comma-splitter'); + var Splitter = require('../text/splitter'); // Functions that decide what value can override what. // The main purpose is to disallow removing CSS fallbacks. @@ -182,7 +182,7 @@ module.exports = (function () { if (token.value.indexOf(',') === -1) return splitfunc(token); - var values = new CommaSplitter(token.value).split(); + var values = new Splitter(',').split(token.value); var components = []; for (var i = 0, l = values.length; i < l; i++) { @@ -489,7 +489,7 @@ module.exports = (function () { commaSeparatedMulitpleValues: function (assembleFunction) { return function(prop, tokens, isImportant) { var tokenSplitLengths = tokens.map(function (token) { - return new CommaSplitter(token.value).split().length; + return new Splitter(',').split(token.value).length; }); var partsCount = Math.max.apply(Math, tokenSplitLengths); @@ -502,7 +502,7 @@ module.exports = (function () { merged.push([]); for (var j = 0; j < tokens.length; j++) { - var split = new CommaSplitter(tokens[j].value).split(); + var split = new Splitter(',').split(tokens[j].value); merged[i].push(split[i] || split[0]); } } diff --git a/lib/text/comma-splitter.js b/lib/text/comma-splitter.js deleted file mode 100644 index eae4f37b..00000000 --- a/lib/text/comma-splitter.js +++ /dev/null @@ -1,35 +0,0 @@ -var Splitter = function CommaSplitter (value) { - this.value = value; -}; - -Splitter.prototype.split = function () { - if (this.value.indexOf(',') === -1) - return [this.value]; - - if (this.value.indexOf('(') === -1) - return this.value.split(','); - - var level = 0; - var cursor = 0; - var lastStart = 0; - var len = this.value.length; - var tokens = []; - - while (cursor++ < len) { - if (this.value[cursor] == '(') { - level++; - } else if (this.value[cursor] == ')') { - level--; - } else if (this.value[cursor] == ',' && level === 0) { - tokens.push(this.value.substring(lastStart, cursor)); - lastStart = cursor + 1; - } - } - - if (lastStart < cursor + 1) - tokens.push(this.value.substring(lastStart)); - - return tokens; -}; - -module.exports = Splitter; diff --git a/lib/text/splitter.js b/lib/text/splitter.js new file mode 100644 index 00000000..22dc89f3 --- /dev/null +++ b/lib/text/splitter.js @@ -0,0 +1,35 @@ +var Splitter = function Splitter (separator) { + this.separator = separator; +}; + +Splitter.prototype.split = function (value) { + if (value.indexOf(this.separator) === -1) + return [value]; + + if (value.indexOf('(') === -1) + return value.split(this.separator); + + var level = 0; + var cursor = 0; + var lastStart = 0; + var len = value.length; + var tokens = []; + + while (cursor++ < len) { + if (value[cursor] == '(') { + level++; + } else if (value[cursor] == ')') { + level--; + } else if (value[cursor] == this.separator && level === 0) { + tokens.push(value.substring(lastStart, cursor)); + lastStart = cursor + 1; + } + } + + if (lastStart < cursor + 1) + tokens.push(value.substring(lastStart)); + + return tokens; +}; + +module.exports = Splitter; diff --git a/test/text/comma-splitter-test.js b/test/text/comma-splitter-test.js deleted file mode 100644 index 2e7539af..00000000 --- a/test/text/comma-splitter-test.js +++ /dev/null @@ -1,17 +0,0 @@ -var vows = require('vows'); -var assert = require('assert'); -var CommaSplitter = require('../../lib/text/comma-splitter'); - -var split = function (value, expectedValue) { - return function () { - assert.deepEqual(new CommaSplitter(value).split(), expectedValue); - }; -}; - -vows.describe('comma-splitter').addBatch({ - 'empty': split('', ['']), - 'simple': split('none', ['none']), - 'comma separated - level 0': split('#000,#fff,#0f0', ['#000', '#fff', '#0f0']), - 'comma separated - level 1': split('rgb(0,0,0),#fff', ['rgb(0,0,0)', '#fff']), - 'comma separated - level 2': split('linear-gradient(0,#fff,rgba(0,0,0)),red', ['linear-gradient(0,#fff,rgba(0,0,0))', 'red']) -}).export(module); diff --git a/test/text/splitter-test.js b/test/text/splitter-test.js new file mode 100644 index 00000000..3bbb86fe --- /dev/null +++ b/test/text/splitter-test.js @@ -0,0 +1,20 @@ +var vows = require('vows'); +var assert = require('assert'); +var Splitter = require('../../lib/text/splitter'); + +var split = function (value, expectedValue, separator) { + return function () { + assert.deepEqual(new Splitter(separator).split(value), expectedValue); + }; +}; + +vows.describe('splitter').addBatch({ + 'empty': split('', [''], ','), + 'simple': split('none', ['none'], ','), + 'comma separated - level 0': split('#000,#fff,#0f0', ['#000', '#fff', '#0f0'], ','), + 'comma separated - level 1': split('rgb(0,0,0),#fff', ['rgb(0,0,0)', '#fff'], ','), + 'comma separated - level 2': split('linear-gradient(0,#fff,rgba(0,0,0)),red', ['linear-gradient(0,#fff,rgba(0,0,0))', 'red'], ','), + 'space separated - level 0': split('#000 #fff #0f0', ['#000', '#fff', '#0f0'], ' '), + 'space separated - level 1': split('rgb(0, 0, 0) #fff', ['rgb(0, 0, 0)', '#fff'], ' '), + 'space separated - level 2': split('linear-gradient(0, #fff, rgba(0, 0, 0)) red', ['linear-gradient(0, #fff, rgba(0, 0, 0))', 'red'], ' ') +}).export(module); -- 2.34.1