babylon.andOrNotEvaluator.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. var BABYLON;
  2. (function (BABYLON) {
  3. (function (Internals) {
  4. var AndOrNotEvaluator = (function () {
  5. function AndOrNotEvaluator() {
  6. }
  7. AndOrNotEvaluator.Eval = function (query, evaluateCallback) {
  8. if (!query.match(/\([^\(\)]*\)/g)) {
  9. query = AndOrNotEvaluator._HandleParenthesisContent(query, evaluateCallback);
  10. } else {
  11. query = query.replace(/\([^\(\)]*\)/g, function (r) {
  12. // remove parenthesis
  13. r = r.slice(1, r.length - 1);
  14. return AndOrNotEvaluator._HandleParenthesisContent(r, evaluateCallback);
  15. });
  16. }
  17. if (query === "true") {
  18. return true;
  19. }
  20. if (query === "false") {
  21. return false;
  22. }
  23. return AndOrNotEvaluator.Eval(query, evaluateCallback);
  24. };
  25. AndOrNotEvaluator._HandleParenthesisContent = function (parenthesisContent, evaluateCallback) {
  26. evaluateCallback = evaluateCallback || (function (r) {
  27. return r === "true" ? true : false;
  28. });
  29. var result;
  30. var or = parenthesisContent.split("||");
  31. for (var i in or) {
  32. var ori = AndOrNotEvaluator._SimplifyNegation(or[i].trim());
  33. var and = ori.split("&&");
  34. if (and.length > 1) {
  35. for (var j = 0; j < and.length; ++j) {
  36. var andj = AndOrNotEvaluator._SimplifyNegation(and[j].trim());
  37. if (andj !== "true" && andj !== "false") {
  38. if (andj[0] === "!") {
  39. result = !evaluateCallback(andj.substring(1));
  40. } else {
  41. result = evaluateCallback(andj);
  42. }
  43. } else {
  44. result = andj === "true" ? true : false;
  45. }
  46. if (!result) {
  47. ori = "false";
  48. break;
  49. }
  50. }
  51. }
  52. if (result || ori === "true") {
  53. result = true;
  54. break;
  55. }
  56. // result equals false (or undefined)
  57. if (ori !== "true" && ori !== "false") {
  58. if (ori[0] === "!") {
  59. result = !evaluateCallback(ori.substring(1));
  60. } else {
  61. result = evaluateCallback(ori);
  62. }
  63. } else {
  64. result = ori === "true" ? true : false;
  65. }
  66. }
  67. // the whole parenthesis scope is replaced by 'true' or 'false'
  68. return result ? "true" : "false";
  69. };
  70. AndOrNotEvaluator._SimplifyNegation = function (booleanString) {
  71. booleanString = booleanString.replace(/^[\s!]+/, function (r) {
  72. // remove whitespaces
  73. r = r.replace(/[\s]/g, function () {
  74. return "";
  75. });
  76. return r.length % 2 ? "!" : "";
  77. });
  78. booleanString = booleanString.trim();
  79. if (booleanString === "!true") {
  80. booleanString = "false";
  81. } else if (booleanString === "!false") {
  82. booleanString = "true";
  83. }
  84. return booleanString;
  85. };
  86. return AndOrNotEvaluator;
  87. })();
  88. Internals.AndOrNotEvaluator = AndOrNotEvaluator;
  89. })(BABYLON.Internals || (BABYLON.Internals = {}));
  90. var Internals = BABYLON.Internals;
  91. })(BABYLON || (BABYLON = {}));
  92. //# sourceMappingURL=babylon.andOrNotEvaluator.js.map