Fixes #313 - processing comment marks in urls.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Mon, 14 Jul 2014 21:41:46 +0000 (22:41 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Mon, 14 Jul 2014 21:46:34 +0000 (22:46 +0100)
History.md
lib/text/quote-scanner.js
test/unit-test.js

index aa9ea35..5361d12 100644 (file)
@@ -1,6 +1,7 @@
 [2.2.8 / 2014-xx-xx](https://github.com/GoalSmashers/clean-css/compare/v2.2.7...v2.2.8)
 ==================
 
+* Fixed issue [#313](https://github.com/GoalSmashers/clean-css/issues/313) - processing comment marks in urls.
 * Fixed issue [#315](https://github.com/GoalSmashers/clean-css/issues/315) - rgba/hsla -> transparent in gradients.
 
 [2.2.7 / 2014-07-10](https://github.com/GoalSmashers/clean-css/compare/v2.2.6...v2.2.7)
index 83dc49f..cd2abf6 100644 (file)
@@ -3,21 +3,35 @@
     this.data = data;
   };
 
-  var findCommentEnd = function(data, matched, cursor) {
+  var findQuoteEnd = function(data, matched, cursor, oldCursor) {
     var commentStartMark = '/*';
     var commentEndMark = '*/';
     var escapeMark = '\\';
+    var blockEndMark = '}';
+    var dataPrefix = data.substring(oldCursor, cursor);
+    var commentEndedAt = dataPrefix.lastIndexOf(commentEndMark, cursor);
+    var commentStartedAt = dataPrefix.lastIndexOf(commentStartMark, cursor);
     var commentStarted = false;
 
+    if (commentEndedAt >= cursor && commentStartedAt > -1)
+      commentStarted = true;
+    if (commentStartedAt < cursor && commentStartedAt > commentEndedAt)
+      commentStarted = true;
+
+    if (commentStarted) {
+      var commentEndsAt = data.indexOf(commentEndMark, cursor);
+      if (commentEndsAt > -1)
+        return commentEndsAt;
+
+      commentEndsAt = data.indexOf(blockEndMark, cursor);
+      return commentEndsAt > -1 ? commentEndsAt - 1 : data.length;
+    }
+
     while (true) {
       if (data[cursor] === undefined)
         break;
-      if (!commentStarted && data[cursor] == commentEndMark[1] && data[cursor - 1] == commentEndMark[0])
-        break;
       if (data[cursor] == matched && data[cursor - 1] != escapeMark)
         break;
-      if (data[cursor] == commentStartMark[1] && data[cursor - 1] == commentStartMark[0])
-        commentStarted = true;
 
       cursor++;
     }
@@ -56,7 +70,7 @@
       if (nextStart == -1)
         break;
 
-      nextEnd = findCommentEnd(data, matchedMark, nextStart + 1);
+      nextEnd = findQuoteEnd(data, matchedMark, nextStart + 1, cursor);
       if (nextEnd == -1)
         break;
 
index e729407..27d95f7 100644 (file)
@@ -1384,7 +1384,8 @@ title']{display:block}",
     'of an unknown file with extra whitespace': [
       "@import url(  /fake.css );",
       "@import url(/fake.css);"
-    ]
+    ],
+    'of comment chars within import url': "@import 'necolas/normalize.css@*/normalize.css';"
   }, { processImport: false }),
   '@import with no import and no advanced': cssContext({
     'empty body': [