escape-store.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. var placeholderBrace = '__';
  2. function EscapeStore(placeholderRoot) {
  3. this.placeholderRoot = 'ESCAPED_' + placeholderRoot + '_CLEAN_CSS';
  4. this.placeholderToData = {};
  5. this.dataToPlaceholder = {};
  6. this.count = 0;
  7. this.restoreMatcher = new RegExp(this.placeholderRoot + '(\\d+)');
  8. }
  9. EscapeStore.prototype._nextPlaceholder = function (metadata) {
  10. return {
  11. index: this.count,
  12. value: placeholderBrace + this.placeholderRoot + this.count++ + metadata + placeholderBrace
  13. };
  14. };
  15. EscapeStore.prototype.store = function (data, metadata) {
  16. var encodedMetadata = metadata ?
  17. '(' + metadata.join(',') + ')' :
  18. '';
  19. var placeholder = this.dataToPlaceholder[data];
  20. if (!placeholder) {
  21. var nextPlaceholder = this._nextPlaceholder(encodedMetadata);
  22. placeholder = nextPlaceholder.value;
  23. this.placeholderToData[nextPlaceholder.index] = data;
  24. this.dataToPlaceholder[data] = nextPlaceholder.value;
  25. }
  26. if (metadata)
  27. placeholder = placeholder.replace(/\([^\)]+\)/, encodedMetadata);
  28. return placeholder;
  29. };
  30. EscapeStore.prototype.nextMatch = function (data, cursor) {
  31. var next = {};
  32. next.start = data.indexOf(this.placeholderRoot, cursor) - placeholderBrace.length;
  33. next.end = data.indexOf(placeholderBrace, next.start + placeholderBrace.length) + placeholderBrace.length;
  34. if (next.start > -1 && next.end > -1)
  35. next.match = data.substring(next.start, next.end);
  36. return next;
  37. };
  38. EscapeStore.prototype.restore = function (placeholder) {
  39. var index = this.restoreMatcher.exec(placeholder)[1];
  40. return this.placeholderToData[index];
  41. };
  42. module.exports = EscapeStore;