cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
186 lines (185 loc) • 5.8 kB
JavaScript
import { isArray, map, keys, hasOwn, isObject, isArrayLike, isString, isRegExp, isNumber } from "../../../zrender/lib/core/util.mjs";
import { throwError } from "./log.mjs";
import { getRawValueParser, createFilterComparator } from "../data/helper/dataValueHelper.mjs";
var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = {
value: "eq",
"<": "lt",
"<=": "lte",
">": "gt",
">=": "gte",
"=": "eq",
"!=": "ne",
"<>": "ne"
};
var RegExpEvaluator = function() {
function RegExpEvaluator2(rVal) {
var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null;
if (condValue == null) {
var errMsg = "";
throwError(errMsg);
}
}
RegExpEvaluator2.prototype.evaluate = function(lVal) {
var type = typeof lVal;
return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + "") : false;
};
return RegExpEvaluator2;
}();
var ConstConditionInternal = function() {
function ConstConditionInternal2() {
}
ConstConditionInternal2.prototype.evaluate = function() {
return this.value;
};
return ConstConditionInternal2;
}();
var AndConditionInternal = function() {
function AndConditionInternal2() {
}
AndConditionInternal2.prototype.evaluate = function() {
var children = this.children;
for (var i = 0; i < children.length; i++) {
if (!children[i].evaluate()) {
return false;
}
}
return true;
};
return AndConditionInternal2;
}();
var OrConditionInternal = function() {
function OrConditionInternal2() {
}
OrConditionInternal2.prototype.evaluate = function() {
var children = this.children;
for (var i = 0; i < children.length; i++) {
if (children[i].evaluate()) {
return true;
}
}
return false;
};
return OrConditionInternal2;
}();
var NotConditionInternal = function() {
function NotConditionInternal2() {
}
NotConditionInternal2.prototype.evaluate = function() {
return !this.child.evaluate();
};
return NotConditionInternal2;
}();
var RelationalConditionInternal = function() {
function RelationalConditionInternal2() {
}
RelationalConditionInternal2.prototype.evaluate = function() {
var needParse = !!this.valueParser;
var getValue = this.getValue;
var tarValRaw = getValue(this.valueGetterParam);
var tarValParsed = needParse ? this.valueParser(tarValRaw) : null;
for (var i = 0; i < this.subCondList.length; i++) {
if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) {
return false;
}
}
return true;
};
return RelationalConditionInternal2;
}();
function parseOption(exprOption, getters) {
if (exprOption === true || exprOption === false) {
var cond = new ConstConditionInternal();
cond.value = exprOption;
return cond;
}
var errMsg = "";
if (!isObjectNotArray(exprOption)) {
throwError(errMsg);
}
if (exprOption.and) {
return parseAndOrOption("and", exprOption, getters);
} else if (exprOption.or) {
return parseAndOrOption("or", exprOption, getters);
} else if (exprOption.not) {
return parseNotOption(exprOption, getters);
}
return parseRelationalOption(exprOption, getters);
}
function parseAndOrOption(op, exprOption, getters) {
var subOptionArr = exprOption[op];
var errMsg = "";
if (!isArray(subOptionArr)) {
throwError(errMsg);
}
if (!subOptionArr.length) {
throwError(errMsg);
}
var cond = op === "and" ? new AndConditionInternal() : new OrConditionInternal();
cond.children = map(subOptionArr, function(subOption) {
return parseOption(subOption, getters);
});
if (!cond.children.length) {
throwError(errMsg);
}
return cond;
}
function parseNotOption(exprOption, getters) {
var subOption = exprOption.not;
var errMsg = "";
if (!isObjectNotArray(subOption)) {
throwError(errMsg);
}
var cond = new NotConditionInternal();
cond.child = parseOption(subOption, getters);
if (!cond.child) {
throwError(errMsg);
}
return cond;
}
function parseRelationalOption(exprOption, getters) {
var errMsg = "";
var valueGetterParam = getters.prepareGetValue(exprOption);
var subCondList = [];
var exprKeys = keys(exprOption);
var parserName = exprOption.parser;
var valueParser = parserName ? getRawValueParser(parserName) : null;
for (var i = 0; i < exprKeys.length; i++) {
var keyRaw = exprKeys[i];
if (keyRaw === "parser" || getters.valueGetterAttrMap.get(keyRaw)) {
continue;
}
var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw;
var condValueRaw = exprOption[keyRaw];
var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw;
var evaluator = createFilterComparator(op, condValueParsed) || op === "reg" && new RegExpEvaluator(condValueParsed);
if (!evaluator) {
throwError(errMsg);
}
subCondList.push(evaluator);
}
if (!subCondList.length) {
throwError(errMsg);
}
var cond = new RelationalConditionInternal();
cond.valueGetterParam = valueGetterParam;
cond.valueParser = valueParser;
cond.getValue = getters.getValue;
cond.subCondList = subCondList;
return cond;
}
function isObjectNotArray(val) {
return isObject(val) && !isArrayLike(val);
}
var ConditionalExpressionParsed = function() {
function ConditionalExpressionParsed2(exprOption, getters) {
this._cond = parseOption(exprOption, getters);
}
ConditionalExpressionParsed2.prototype.evaluate = function() {
return this._cond.evaluate();
};
return ConditionalExpressionParsed2;
}();
function parseConditionalExpression(exprOption, getters) {
return new ConditionalExpressionParsed(exprOption, getters);
}
export { parseConditionalExpression };