babylon.andOrNotEvaluator.js 4.2 KB

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