Adds better text normalizing in source maps mode.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Thu, 27 Aug 2015 05:47:02 +0000 (06:47 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Thu, 27 Aug 2015 06:44:52 +0000 (07:44 +0100)
This is making me uneasy as we needed a slightly bigger hack to
push context to text processor's escape.

See #407.

lib/clean.js
lib/stringifier/source-maps.js
lib/text/free-text-processor.js

index 8b8db74..08016ae 100644 (file)
@@ -212,8 +212,8 @@ function minify(context, data) {
   run(urlsProcessor, 'escape');
   run(freeTextProcessor, 'escape');
 
-  function restoreEscapes(data) {
-    data = freeTextProcessor.restore(data);
+  function restoreEscapes(data, prefixContent) {
+    data = freeTextProcessor.restore(data, prefixContent);
     data = urlsProcessor.restore(data);
     data = options.rebase ? rebaseUrls(data, context) : data;
     data = expressionsProcessor.restore(data);
index 193e027..7748614 100644 (file)
@@ -9,12 +9,26 @@ function store(element, context) {
   var value = fromString ? element : element[0];
 
   if (value.indexOf('_') > -1)
-    value = context.restore(value);
+    value = context.restore(value, prefixContentFrom(context.output));
 
   track(value, fromString ? null : element, context);
   context.output.push(value);
 }
 
+function prefixContentFrom(values) {
+  var content = [];
+
+  for (var i = values.length - 1; i >= 0; i--) {
+    var value = values[i];
+    content.unshift(value);
+
+    if (value == '{' || value == ';')
+      break;
+  }
+
+  return content.join('');
+}
+
 function track(value, element, context) {
   if (element)
     trackAllMappings(element, context);
index dd31da8..8a42624 100644 (file)
@@ -34,10 +34,16 @@ FreeTextProcessor.prototype.escape = function (data) {
   });
 };
 
-function normalize(text, data, cursor) {
-  // FIXME: this is a hack
-  var lastSemicolon = data.lastIndexOf(';', cursor);
-  var lastOpenBrace = data.lastIndexOf('{', cursor);
+function normalize(text, data, prefixContext, cursor) {
+  // FIXME: this is even a bigger hack now - see #407
+  var searchIn = data;
+  if (prefixContext) {
+    searchIn = prefixContext + data.substring(0, data.indexOf('__ESCAPED_FREE_TEXT_CLEAN_CSS'));
+    cursor = searchIn.length;
+  }
+
+  var lastSemicolon = searchIn.lastIndexOf(';', cursor);
+  var lastOpenBrace = searchIn.lastIndexOf('{', cursor);
   var lastOne = 0;
 
   if (lastSemicolon > -1 && lastOpenBrace > -1)
@@ -47,7 +53,7 @@ function normalize(text, data, cursor) {
   else
     lastOne = lastSemicolon;
 
-  var context = data.substring(lastOne + 1, cursor);
+  var context = searchIn.substring(lastOne + 1, cursor);
 
   if (/\[[\w\d\-]+[\*\|\~\^\$]?=$/.test(context)) {
     text = text
@@ -68,7 +74,7 @@ function normalize(text, data, cursor) {
   return text;
 }
 
-FreeTextProcessor.prototype.restore = function (data) {
+FreeTextProcessor.prototype.restore = function (data, prefixContext) {
   var tempData = [];
   var cursor = 0;
 
@@ -78,7 +84,7 @@ FreeTextProcessor.prototype.restore = function (data) {
       break;
 
     tempData.push(data.substring(cursor, nextMatch.start));
-    var text = normalize(this.matches.restore(nextMatch.match), data, nextMatch.start);
+    var text = normalize(this.matches.restore(nextMatch.match), data, prefixContext, nextMatch.start);
     tempData.push(text);
 
     cursor = nextMatch.end;