123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- "use strict";
- var BABYLON = BABYLON || {};
- (function () {
- BABYLON.AndOrNotEvaluator = BABYLON.AndOrNotEvaluator || {};
- BABYLON.AndOrNotEvaluator.Eval = function (query, evaluateCallback) {
- if (!query.match(/\([^\(\)]*\)/g)) {
- query = BABYLON.AndOrNotEvaluator._HandleParenthesisContent(query, evaluateCallback);
- }
- else {
- query = query.replace(/\([^\(\)]*\)/g, function (r) {
- // remove parenthesis
- r = r.slice(1, r.length - 1);
- return BABYLON.AndOrNotEvaluator._HandleParenthesisContent(r, evaluateCallback);
- });
- }
- if (query === "true") {
- return true;
- }
- if (query === "false") {
- return false;
- }
- return BABYLON.AndOrNotEvaluator.Eval(query, evaluateCallback);
- };
- BABYLON.AndOrNotEvaluator._HandleParenthesisContent = function (parenthesisContent, evaluateCallback) {
- evaluateCallback = evaluateCallback || function (r) {
- /*switch(r)
- {
- case "true":
- return true;
- case "false":
- case "0":
- case "":
- case "undefined":
- case "null":
- default:
- return false;
- }*/
- return r === "true" ? true : false;
- };
- var result;
- var or = parenthesisContent.split("||");
- for (var i in or) {
- var ori = BABYLON.AndOrNotEvaluator._SimplifyNegation(or[i].trim());
- var and = ori.split("&&");
- if (and.length > 1) {
- for (var j = 0; j < and.length; ++j) {
- var andj = BABYLON.AndOrNotEvaluator._SimplifyNegation(and[j].trim());
- if (andj !== "true" && andj !== "false") {
- if (andj[0] === "!") {
- result = andj.substring(1);
- if (evaluateCallback) {
- result = evaluateCallback(result);
- }
- result = !result;
- }
- else {
- result = andj;
- if (evaluateCallback) {
- result = evaluateCallback(result);
- }
- }
- }
- else {
- result = andj === "true" ? true : false;
- }
- if (!result) { // no need to continue since 'false && ... && ...' will always return false
- ori = "false";
- break;
- }
- }
- }
- if (result || ori === "true") { // no need to continue since 'true || ... || ...' will always return true
- result = true;
- break;
- }
- // result equals false (or undefined)
- if (ori !== "true" && ori !== "false") {
- if (ori[0] === "!") {
- result = ori.substring(1);
- if (evaluateCallback) {
- result = evaluateCallback(result);
- }
- result = !result;
- }
- else {
- result = ori;
- if (evaluateCallback) {
- result = evaluateCallback(result);
- }
- }
- }
- else {
- result = ori === "true" ? true : false;
- }
- }
- // the whole parenthesis scope is replaced by 'true' or 'false'
- return result ? "true" : "false";
- };
- BABYLON.AndOrNotEvaluator._SimplifyNegation = function (booleanString) {
- booleanString = booleanString.replace(/^[\s!]+/, function (r) {
- // remove whitespaces
- r = r.replace(/[\s]/g, function (r) {
- return "";
- });
- return r.length % 2 ? "!" : "";
- });
- booleanString = booleanString.trim();
- if (booleanString === "!true") {
- booleanString = "false";
- }
- else if (booleanString === "!false") {
- booleanString = "true";
- }
- return booleanString;
- };
- })();
|