Adds faster tokenizer extraction.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sat, 4 Oct 2014 22:56:48 +0000 (23:56 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 10 Oct 2014 20:22:45 +0000 (21:22 +0100)
lib/selectors/tokenizer.js

index a0906fa..7b6e9a9 100644 (file)
@@ -2,6 +2,15 @@ var Chunker = require('../utils/chunker');
 var Splitter = require('../utils/splitter');
 
 var flatBlock = /(^@(font\-face|page|\-ms\-viewport|\-o\-viewport|viewport)|\\@.+?)/;
+var WHITESPACE = /\s/g;
+var MULTI_WHITESPACE = /\s{2,}/g;
+var WHITESPACE_COLON = / ?: ?/g;
+var WHITESPACE_SEMICOLON = / ?; ?/g;
+var WHITESPACE_COMMA = / ?, ?/g;
+var WHITESPACE_PREFIX = /([\(,]) /g;
+var WHITESPACE_SUFFIX = / ([\),])/g;
+var MULTI_SEMICOLON = /;{2,}/g;
+var TRAILING_SEMICOLON = /;$/;
 
 function Tokenizer(minifyContext) {
   this.minifyContext = minifyContext;
@@ -24,29 +33,36 @@ Tokenizer.prototype.toTokens = function (data) {
 };
 
 function extractProperties(string) {
-  return string
-    .replace(/\s{2,}/g, ' ')
-    .replace(/ ?: ?/g, ':')
-    .replace(/([\(,]) /g, '$1')
-    .replace(/ ([\),])/g, '$1')
-    .split(';')
-    .map(function (value) { return value.trim(); })
-    .filter(function (value) { return value.length > 0; });
+  var extracted = string
+    .replace(WHITESPACE, ' ')
+    .replace(MULTI_WHITESPACE, ' ')
+    .replace(WHITESPACE_COLON, ':')
+    .replace(WHITESPACE_PREFIX, '$1')
+    .replace(WHITESPACE_SUFFIX, '$1')
+    .replace(WHITESPACE_SEMICOLON, ';')
+    .replace(MULTI_SEMICOLON, ';')
+    .trim()
+    .replace(TRAILING_SEMICOLON, '');
+
+  return extracted.length > 0 ?
+    extracted.split(';') :
+    [];
 }
 
 function extractSelectors(string) {
-  string = string
-    .replace(/(\s{2,}|\s)/g, ' ')
-    .replace(/, /g, ',');
+  var extracted = string
+    .replace(WHITESPACE, ' ')
+    .replace(MULTI_WHITESPACE, ' ')
+    .replace(WHITESPACE_COMMA, ',')
+    .trim();
 
-  return new Splitter(',').split(string)
-    .map(function (value) { return value.trim(); });
+  return new Splitter(',').split(extracted);
 }
 
 function extractBlock(string) {
   return string
-    .replace(/\s/g, ' ')
-    .replace(/\s{2,}/g, ' ')
+    .replace(WHITESPACE, ' ')
+    .replace(MULTI_WHITESPACE, ' ')
     .trim();
 }