Adds metadata support to EscapeStore.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Thu, 18 Sep 2014 09:25:08 +0000 (11:25 +0200)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 10 Oct 2014 20:22:43 +0000 (21:22 +0100)
lib/text/escape-store.js
test/text/escape-store-test.js

index 8c2f07f..24a38ae 100644 (file)
@@ -4,23 +4,24 @@ module.exports = function EscapeStore(placeholderRoot) {
   var placeholderToData = {};
   var dataToPlaceholder = {};
   var count = 0;
-  var nextPlaceholder = function() {
-    return '__' + placeholderRoot + (count++) + '__';
+  var nextPlaceholder = function(metadata) {
+    return '__' + placeholderRoot + (count++) + metadata + '__';
   };
-  var pattern = '(__' + placeholderRoot + '\\d{1,}__)';
+  var pattern = '(__' + placeholderRoot + '\\d{1,}\\(?[^_\\)]*\\)?__)';
 
   return {
     placeholderPattern: pattern,
 
     placeholderRegExp: new RegExp(pattern, 'g'),
 
-    store: function(data) {
-      var placeholder = dataToPlaceholder[data];
-      if (!placeholder) {
-        placeholder = nextPlaceholder();
-        placeholderToData[placeholder] = data;
-        dataToPlaceholder[data] = placeholder;
-      }
+    store: function(data, metadata) {
+      var encodedMetadata = metadata ?
+        '(' + metadata.join(',') + ')' :
+        '';
+
+      var placeholder = nextPlaceholder(encodedMetadata);
+      placeholderToData[placeholder] = data;
+      dataToPlaceholder[data] = placeholder;
 
       return placeholder;
     },
index 5d66e0a..9b3de0f 100644 (file)
@@ -4,7 +4,7 @@ var EscapeStore = require('../../lib/text/escape-store');
 
 vows.describe('escape-store')
   .addBatch({
-    'data': {
+    'no metadata': {
       topic: new EscapeStore('TEST'),
       store: function (escapeStore) {
         var placeholder = escapeStore.store('data');
@@ -14,6 +14,26 @@ vows.describe('escape-store')
         var data = escapeStore.restore('__ESCAPED_TEST_CLEAN_CSS0__');
         assert.equal(data, 'data');
       }
+    },
+    'with metadata': {
+      topic: new EscapeStore('TEST'),
+      store: function (escapeStore) {
+        var placeholder = escapeStore.store('data', ['brown', 'fox', 'jumped', 'over']);
+        assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS0(brown,fox,jumped,over)__');
+      },
+      restore: function (escapeStore) {
+        var data = escapeStore.restore('__ESCAPED_TEST_CLEAN_CSS0(brown,fox,jumped,over)__');
+        assert.equal(data, 'data');
+      }
+    },
+    'same data with different metadata': {
+      topic: new EscapeStore('TEST'),
+      'store first': function (escapeStore) {
+        escapeStore.store('data1', [0, 1, 2]);
+        var placeholder = escapeStore.store('data1', [1, 2, 3]);
+
+        assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS1(1,2,3)__');
+      }
     }
   })
   .export(module);