From: Jakub Pawlowicz Date: Wed, 24 Sep 2014 20:19:06 +0000 (+0100) Subject: Improves EscapeStore. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=6343360c9828cf9b3d3367f4f1f99d3526256b69;p=clean-css.git Improves EscapeStore. * Uses prototypal OO. * Adds specs. --- diff --git a/lib/text/escape-store.js b/lib/text/escape-store.js index db7405b4..32a158da 100644 --- a/lib/text/escape-store.js +++ b/lib/text/escape-store.js @@ -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; diff --git a/test/text/escape-store-test.js b/test/text/escape-store-test.js index beec42e2..d0ae7887 100644 --- a/test/text/escape-store-test.js +++ b/test/text/escape-store-test.js @@ -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)__'); } } })