From: Jakub Pawlowicz Date: Thu, 27 Aug 2015 05:47:02 +0000 (+0100) Subject: Adds better text normalizing in source maps mode. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=699f0ccb078119655dd0834777abd755d90f76b0;p=clean-css.git Adds better text normalizing in source maps mode. This is making me uneasy as we needed a slightly bigger hack to push context to text processor's escape. See #407. --- diff --git a/lib/clean.js b/lib/clean.js index 8b8db74a..08016ae1 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -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); diff --git a/lib/stringifier/source-maps.js b/lib/stringifier/source-maps.js index 193e027d..77486140 100644 --- a/lib/stringifier/source-maps.js +++ b/lib/stringifier/source-maps.js @@ -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); diff --git a/lib/text/free-text-processor.js b/lib/text/free-text-processor.js index dd31da83..8a426244 100644 --- a/lib/text/free-text-processor.js +++ b/lib/text/free-text-processor.js @@ -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;