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

index 9e045b3..28740ee 100644 (file)
@@ -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);
   });
 };
index 0fea779..1bbbe3e 100644 (file)
@@ -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);