Fix whitespace removal with escaped joining characters
authorsilverwind <me@silverwind.io>
Sun, 28 Feb 2016 02:04:29 +0000 (03:04 +0100)
committersilverwind <me@silverwind.io>
Sun, 28 Feb 2016 02:04:29 +0000 (03:04 +0100)
lib/selectors/clean-up.js
test/selectors/simple-test.js

index 3c105ec..6bb17b9 100644 (file)
@@ -6,6 +6,15 @@ function selectorSorter(s1, s2) {
   return s1[0] > s2[0] ? 1 : -1;
 }
 
+function whitespaceReplacements(_, p1, p2, p3) {
+  if (p1 && p2 && p3.length)
+    return p1 + p2 + ' ';
+  else if (p1 && p2)
+    return p1 + p2;
+  else
+    return p2;
+}
+
 var CleanUp = {
   selectors: function (selectors, removeUnsupported, adjacentSpace) {
     var list = [];
@@ -16,7 +25,7 @@ var CleanUp = {
       var reduced = selector[0]
         .replace(/\s+/g, ' ')
         .replace(/ ?, ?/g, ',')
-        .replace(/\s*([>\+\~])\s*/g, '$1')
+        .replace(/\s*(\\)?([>+~])(\s*)/g, whitespaceReplacements)
         .trim();
 
       if (adjacentSpace && reduced.indexOf('nav') > 0)
index 665bc31..2fcd721 100644 (file)
@@ -77,6 +77,22 @@ vows.describe('simple optimizations')
       'mixed': [
         ' label   ~  \n*  +  span , div>*.class, section\n\n{color:red}',
         [['div>.class'], ['label~*+span'], ['section']]
+      ],
+      'escaped joining character #1': [
+        '.class\\~ div{color: red}',
+        [['.class\\~ div']]
+      ],
+      'escaped joining character #2': [
+        '.class\\+\\+ div{color: red}',
+        [['.class\\+\\+ div']]
+      ],
+      'escaped joining character #3': [
+        '.class\\>  \\~div{color: red}',
+        [['.class\\> \\~div']]
+      ],
+      'escaped characters': [
+        '.a\\+\\+b{color: red}',
+        [['.a\\+\\+b']]
       ]
     })
   )