babylon.andOrNotEvaluator.js 4.3 KB

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