-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;
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'),
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)__');
}
}
})