From: Jakub Pawlowicz Date: Fri, 17 Oct 2014 21:26:07 +0000 (+0100) Subject: Adds an option to store escaped metadata to FreeTextProcessor. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=99658c825ce5966ef46939f0ef1bbebe1ca930b8;p=clean-css.git Adds an option to store escaped metadata to FreeTextProcessor. --- diff --git a/lib/text/free-text-processor.js b/lib/text/free-text-processor.js index 9e045b3b..28740ee7 100644 --- a/lib/text/free-text-processor.js +++ b/lib/text/free-text-processor.js @@ -1,8 +1,11 @@ var EscapeStore = require('./escape-store'); var QuoteScanner = require('../utils/quote-scanner'); -var FreeTextProcessor = function FreeTextProcessor() { +var lineBreak = require('os').EOL; + +var FreeTextProcessor = function FreeTextProcessor(saveWaypoints) { this.matches = new EscapeStore('FREE_TEXT'); + this.saveWaypoints = saveWaypoints; }; // Strip content tags by replacing them by the a special @@ -10,9 +13,23 @@ var FreeTextProcessor = function FreeTextProcessor() { // instead of regexps to speed up the process. FreeTextProcessor.prototype.escape = function(data) { var self = this; + var breaksCount; + var lastBreakAt; + var indent; + var metadata; + var saveWaypoints = this.saveWaypoints; return new QuoteScanner(data).each(function(match, store) { - var placeholder = self.matches.store(match); + if (saveWaypoints) { + breaksCount = match.split(lineBreak).length - 1; + lastBreakAt = match.lastIndexOf(lineBreak); + indent = lastBreakAt > 0 ? + match.substring(lastBreakAt + lineBreak.length).length : + match.length; + metadata = [breaksCount, indent]; + } + + var placeholder = self.matches.store(match, metadata); store.push(placeholder); }); }; diff --git a/test/text/free-text-processor-test.js b/test/text/free-text-processor-test.js index 0fea779c..1bbbe3e7 100644 --- a/test/text/free-text-processor-test.js +++ b/test/text/free-text-processor-test.js @@ -2,26 +2,28 @@ var vows = require('vows'); var assert = require('assert'); var FreeTextProcessor = require('../../lib/text/free-text-processor'); -function processorContext(context) { +var lineBreak = require('os').EOL; + +function processorContext(name, context, saveWaypoints) { var vowContext = {}; function escaped (targetCSS) { return function (sourceCSS) { - var result = new FreeTextProcessor().escape(sourceCSS); + var result = new FreeTextProcessor(saveWaypoints).escape(sourceCSS); assert.equal(result, targetCSS); }; } function restored (targetCSS) { return function (sourceCSS) { - var processor = new FreeTextProcessor(); + var processor = new FreeTextProcessor(saveWaypoints); var result = processor.restore(processor.escape(sourceCSS)); assert.equal(result, targetCSS); }; } for (var key in context) { - vowContext[key] = { + vowContext[name + ' - ' + key] = { topic: context[key][0], escaped: escaped(context[key][1]), restored: restored(context[key][2]) @@ -33,7 +35,7 @@ function processorContext(context) { vows.describe(FreeTextProcessor) .addBatch( - processorContext({ + processorContext('basic', { 'no quotes': [ 'a{color:red;display:block}', 'a{color:red;display:block}', @@ -66,4 +68,28 @@ vows.describe(FreeTextProcessor) ] }) ) + .addBatch( + processorContext('waypoints', { + 'no quotes': [ + 'a{color:red;display:block}', + 'a{color:red;display:block}', + 'a{color:red;display:block}' + ], + 'single quoted': [ + 'a{color:red;content:\'1234\';display:block}', + 'a{color:red;content:__ESCAPED_FREE_TEXT_CLEAN_CSS0(0,6)__;display:block}', + 'a{color:red;content:\'1234\';display:block}' + ], + 'double quoted': [ + 'a{color:red;content:"1234";display:block}', + 'a{color:red;content:__ESCAPED_FREE_TEXT_CLEAN_CSS0(0,6)__;display:block}', + 'a{color:red;content:"1234";display:block}' + ], + 'with breaks': [ + 'a{color:red;content:"1234' + lineBreak + '56";display:block}', + 'a{color:red;content:__ESCAPED_FREE_TEXT_CLEAN_CSS0(1,3)__;display:block}', + 'a{color:red;content:"1234' + lineBreak + '56";display:block}' + ] + }, true) + ) .export(module);