expressions.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. module.exports = function Expressions() {
  2. var expressions = [];
  3. var findEnd = function(data, start) {
  4. var end = start + 'expression'.length;
  5. var level = 0;
  6. var quoted = false;
  7. while(true) {
  8. var next = data[end++];
  9. if (quoted) {
  10. quoted = next != '\'' && next != '"';
  11. } else {
  12. quoted = next == '\'' || next == '"';
  13. if (next == '(')
  14. level++;
  15. if (next == ')')
  16. level--;
  17. }
  18. if (level === 0 || !next)
  19. break;
  20. }
  21. return end;
  22. };
  23. return {
  24. // Escapes expressions by replacing them by the __EXPRESSION__
  25. // marker for further restoring. It's done via string scanning
  26. // instead of regexps to speed up the process.
  27. escape: function(data) {
  28. var nextStart = 0;
  29. var nextEnd = 0;
  30. var cursor = 0;
  31. var tempData = [];
  32. for (; nextEnd < data.length; ) {
  33. nextStart = data.indexOf('expression(', nextEnd);
  34. if (nextStart == -1)
  35. break;
  36. nextEnd = findEnd(data, nextStart);
  37. tempData.push(data.substring(cursor, nextStart));
  38. tempData.push('__EXPRESSION__');
  39. expressions.push(data.substring(nextStart, nextEnd));
  40. cursor = nextEnd;
  41. }
  42. return tempData.length > 0 ?
  43. tempData.join('') + data.substring(cursor, data.length) :
  44. data;
  45. },
  46. restore: function(data) {
  47. return data.replace(/__EXPRESSION__/g, function() {
  48. return expressions.shift();
  49. });
  50. }
  51. };
  52. };