54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
var placeholderBrace = '__';
|
|
|
|
function EscapeStore(placeholderRoot) {
|
|
this.placeholderRoot = 'ESCAPED_' + placeholderRoot + '_CLEAN_CSS';
|
|
this.placeholderToData = {};
|
|
this.dataToPlaceholder = {};
|
|
this.count = 0;
|
|
this.restoreMatcher = new RegExp(this.placeholderRoot + '(\\d+)');
|
|
}
|
|
|
|
EscapeStore.prototype._nextPlaceholder = function (metadata) {
|
|
return {
|
|
index: this.count,
|
|
value: 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) {
|
|
var nextPlaceholder = this._nextPlaceholder(encodedMetadata);
|
|
placeholder = nextPlaceholder.value;
|
|
this.placeholderToData[nextPlaceholder.index] = data;
|
|
this.dataToPlaceholder[data] = nextPlaceholder.value;
|
|
}
|
|
|
|
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) {
|
|
var index = this.restoreMatcher.exec(placeholder)[1];
|
|
return this.placeholderToData[index];
|
|
};
|
|
|
|
module.exports = EscapeStore;
|