Adds an option to store escaped metadata to UrlsProcessor.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 17 Oct 2014 21:31:37 +0000 (22:31 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Mon, 8 Dec 2014 09:39:14 +0000 (09:39 +0000)
lib/text/urls-processor.js
test/text/urls-processor-test.js

index 3c49c31..3c8b372 100644 (file)
@@ -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);
 
index 893cb21..96282b5 100644 (file)
@@ -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);