Adds #nextMatch method to EscapeStore.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 19 Sep 2014 08:48:12 +0000 (10:48 +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 24a38ae..db7405b 100644 (file)
@@ -1,19 +1,15 @@
 module.exports = function EscapeStore(placeholderRoot) {
   placeholderRoot = 'ESCAPED_' + placeholderRoot + '_CLEAN_CSS';
 
+  var placeholderBrace = '__';
   var placeholderToData = {};
   var dataToPlaceholder = {};
   var count = 0;
   var nextPlaceholder = function(metadata) {
-    return '__' + placeholderRoot + (count++) + metadata + '__';
+    return placeholderBrace + placeholderRoot + (count++) + metadata + placeholderBrace;
   };
-  var pattern = '(__' + placeholderRoot + '\\d{1,}\\(?[^_\\)]*\\)?__)';
 
   return {
-    placeholderPattern: pattern,
-
-    placeholderRegExp: new RegExp(pattern, 'g'),
-
     store: function(data, metadata) {
       var encodedMetadata = metadata ?
         '(' + metadata.join(',') + ')' :
@@ -26,6 +22,17 @@ module.exports = function EscapeStore(placeholderRoot) {
       return placeholder;
     },
 
+    nextMatch: function (data, cursor) {
+      var next = {};
+
+      next.start = data.indexOf(placeholderRoot, cursor) - placeholderBrace.length;
+      next.end = data.indexOf(placeholderBrace, next.start + placeholderBrace.length) + placeholderBrace.length;
+      if (next.start > -1 && next.end > -1)
+        next.match = data.substring(next.start, next.end);
+
+      return next;
+    },
+
     restore: function(placeholder) {
       return placeholderToData[placeholder];
     }
index 9b3de0f..beec42e 100644 (file)
@@ -10,6 +10,12 @@ vows.describe('escape-store')
         var placeholder = escapeStore.store('data');
         assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS0__');
       },
+      match: function (escapeStore) {
+        var next = escapeStore.nextMatch('prefix__ESCAPED_TEST_CLEAN_CSS0__suffix');
+        assert.equal(next.start, 6);
+        assert.equal(next.end, 33);
+        assert.equal(next.match, '__ESCAPED_TEST_CLEAN_CSS0__');
+      },
       restore: function (escapeStore) {
         var data = escapeStore.restore('__ESCAPED_TEST_CLEAN_CSS0__');
         assert.equal(data, 'data');
@@ -21,6 +27,12 @@ vows.describe('escape-store')
         var placeholder = escapeStore.store('data', ['brown', 'fox', 'jumped', 'over']);
         assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS0(brown,fox,jumped,over)__');
       },
+      match: function (escapeStore) {
+        var next = escapeStore.nextMatch('prefix__ESCAPED_TEST_CLEAN_CSS0(brown,fox,jumped,over)__suffix');
+        assert.equal(next.start, 6);
+        assert.equal(next.end, 56);
+        assert.equal(next.match, '__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');