From ee356d306552160bf6f955dc6c122c5e42f3d3af Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Fri, 17 Oct 2014 22:31:37 +0100 Subject: [PATCH] Adds an option to store escaped metadata to UrlsProcessor. --- lib/text/urls-processor.js | 19 +++++++++++-- test/text/urls-processor-test.js | 46 ++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/lib/text/urls-processor.js b/lib/text/urls-processor.js index 3c49c312..3c8b3729 100644 --- a/lib/text/urls-processor.js +++ b/lib/text/urls-processor.js @@ -2,10 +2,12 @@ var EscapeStore = require('./escape-store'); var URL_PREFIX = 'url('; var URL_SUFFIX = ')'; +var lineBreak = require('os').EOL; -var UrlsProcessor = function UrlsProcessor(context) { +var UrlsProcessor = function UrlsProcessor(context, saveWaypoints) { this.urls = new EscapeStore('URL'); this.context = context; + this.saveWaypoints = saveWaypoints; }; // Strip urls by replacing them by a special @@ -16,6 +18,10 @@ UrlsProcessor.prototype.escape = function (data) { var nextEnd = 0; var cursor = 0; var tempData = []; + var breaksCount; + var lastBreakAt; + var indent; + var saveWaypoints = this.saveWaypoints; for (; nextEnd < data.length;) { nextStart = data.indexOf(URL_PREFIX, nextEnd); @@ -46,7 +52,16 @@ UrlsProcessor.prototype.escape = function (data) { } var url = data.substring(nextStart, nextEnd + 1); - var placeholder = this.urls.store(url); + + if (saveWaypoints) { + breaksCount = url.split(lineBreak).length - 1; + lastBreakAt = url.lastIndexOf(lineBreak); + indent = lastBreakAt > 0 ? + url.substring(lastBreakAt + lineBreak.length).length : + url.length; + } + + var placeholder = this.urls.store(url, saveWaypoints ? [breaksCount, indent] : null); tempData.push(data.substring(cursor, nextStart)); tempData.push(placeholder); diff --git a/test/text/urls-processor-test.js b/test/text/urls-processor-test.js index 893cb213..96282b5c 100644 --- a/test/text/urls-processor-test.js +++ b/test/text/urls-processor-test.js @@ -2,26 +2,28 @@ var vows = require('vows'); var assert = require('assert'); var UrlsProcessor = require('../../lib/text/urls-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 UrlsProcessor().escape(sourceCSS); + var result = new UrlsProcessor(null, saveWaypoints).escape(sourceCSS); assert.equal(result, targetCSS); }; } function restored (targetCSS) { return function (sourceCSS) { - var processor = new UrlsProcessor(); + var processor = new UrlsProcessor(null, 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(UrlsProcessor) .addBatch( - processorContext({ + processorContext('basic', { 'no urls': [ 'a{color:red}', 'a{color:red}', @@ -81,4 +83,38 @@ vows.describe(UrlsProcessor) ] }) ) + .addBatch( + processorContext('waypoints', { + 'no urls': [ + 'a{color:red}', + 'a{color:red}', + 'a{color:red}' + ], + 'unquoted': [ + 'div{background:url(some/file.png) repeat}', + 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,18)__ repeat}', + 'div{background:url(some/file.png) repeat}' + ], + 'single quoted': [ + 'div{background:url(\'some/file.png\') repeat}', + 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,20)__ repeat}', + 'div{background:url(some/file.png) repeat}' + ], + 'double quoted': [ + 'div{background:url("some/file.png") repeat}', + 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,20)__ repeat}', + 'div{background:url(some/file.png) repeat}' + ], + 'with line breaks': [ + 'div{background:url("' + lineBreak + 'some/' + lineBreak + 'file.png") repeat}', + 'div{background:__ESCAPED_URL_CLEAN_CSS0(2,10)__ repeat}', + 'div{background:url(some/file.png) repeat}' + ], + 'multiple': [ + 'div{background:url(one/file.png) repeat}p{background:url(second/file.png)}', + 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,17)__ repeat}p{background:__ESCAPED_URL_CLEAN_CSS1(0,20)__}', + 'div{background:url(one/file.png) repeat}p{background:url(second/file.png)}' + ] + }, true) + ) .export(module); -- 2.34.1