Improves EscapeStore.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Wed, 24 Sep 2014 20:19:06 +0000 (21:19 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 10 Oct 2014 20:22:44 +0000 (21:22 +0100)
* Uses prototypal OO.
* Adds specs.

lib/text/escape-store.js
test/text/escape-store-test.js

index db7405b..32a158d 100644 (file)
@@ -1,40 +1,47 @@
-module.exports = function EscapeStore(placeholderRoot) {
-  placeholderRoot = 'ESCAPED_' + placeholderRoot + '_CLEAN_CSS';
-
-  var placeholderBrace = '__';
-  var placeholderToData = {};
-  var dataToPlaceholder = {};
-  var count = 0;
-  var nextPlaceholder = function(metadata) {
-    return placeholderBrace + placeholderRoot + (count++) + metadata + placeholderBrace;
-  };
-
-  return {
-    store: function(data, metadata) {
-      var encodedMetadata = metadata ?
-        '(' + metadata.join(',') + ')' :
-        '';
-
-      var placeholder = nextPlaceholder(encodedMetadata);
-      placeholderToData[placeholder] = data;
-      dataToPlaceholder[data] = placeholder;
-
-      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];
-    }
-  };
+var placeholderBrace = '__';
+
+var EscapeStore = function EscapeStore(placeholderRoot) {
+  this.placeholderRoot = 'ESCAPED_' + placeholderRoot + '_CLEAN_CSS';
+  this.placeholderToData = {};
+  this.dataToPlaceholder = {};
+  this.count = 0;
+};
+
+EscapeStore.prototype._nextPlaceholder = function (metadata) {
+  return placeholderBrace + this.placeholderRoot + (this.count++) + metadata + placeholderBrace;
+};
+
+EscapeStore.prototype.store = function (data, metadata) {
+  var encodedMetadata = metadata ?
+    '(' + metadata.join(',') + ')' :
+    '';
+  var placeholder = this.dataToPlaceholder[data];
+
+  if (!placeholder) {
+    placeholder = this._nextPlaceholder(encodedMetadata);
+    this.placeholderToData[placeholder] = data;
+    this.dataToPlaceholder[data] = placeholder;
+  }
+
+  if (metadata)
+    placeholder = placeholder.replace(/\([^\)]+\)/, encodedMetadata);
+
+  return placeholder;
 };
+
+EscapeStore.prototype.nextMatch = function (data, cursor) {
+  var next = {};
+
+  next.start = data.indexOf(this.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;
+};
+
+EscapeStore.prototype.restore = function (placeholder) {
+  return this.placeholderToData[placeholder];
+};
+
+module.exports = EscapeStore;
index beec42e..d0ae788 100644 (file)
@@ -2,7 +2,7 @@ var vows = require('vows');
 var assert = require('assert');
 var EscapeStore = require('../../lib/text/escape-store');
 
-vows.describe('escape-store')
+vows.describe(EscapeStore)
   .addBatch({
     'no metadata': {
       topic: new EscapeStore('TEST'),
@@ -44,7 +44,7 @@ vows.describe('escape-store')
         escapeStore.store('data1', [0, 1, 2]);
         var placeholder = escapeStore.store('data1', [1, 2, 3]);
 
-        assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS1(1,2,3)__');
+        assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS0(1,2,3)__');
       }
     }
   })