Turns comma splitter into a more generic splitter.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Mon, 21 Jul 2014 22:25:53 +0000 (23:25 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Wed, 23 Jul 2014 22:43:41 +0000 (23:43 +0100)
* No longer accepts splitted value as constructor argument but in split method instead.
* Accepts separator value to split over in constructor.

lib/clean.js
lib/properties/processable.js
lib/text/comma-splitter.js [deleted file]
lib/text/splitter.js [new file with mode: 0644]
test/text/comma-splitter-test.js [deleted file]
test/text/splitter-test.js [new file with mode: 0644]

index dd36bd6..a36ad1e 100644 (file)
@@ -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';
index 0568512..08bdd6a 100644 (file)
@@ -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 (file)
index eae4f37..0000000
+++ /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 (file)
index 0000000..22dc89f
--- /dev/null
@@ -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 (file)
index 2e7539a..0000000
+++ /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 (file)
index 0000000..3bbb86f
--- /dev/null
@@ -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);