Skip to content
This repository was archived by the owner on Dec 1, 2023. It is now read-only.

Commit df4d2f3

Browse files
committed
add simple expression parsing
1 parent 9b32356 commit df4d2f3

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

src/fields.vue

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import FieldSelect from './components/Select.vue';
1919
import FieldRange from './components/Range.vue';
2020
import FieldNumber from './components/Number.vue';
21-
import {get, set, each, warn, assign, evaluate, isArray, isString, isUndefined} from './util';
21+
import {assign, each, evaluate, get, isArray, isString, isUndefined, set, warn} from './util';
2222
2323
export default {
2424
@@ -74,17 +74,13 @@
7474
}
7575
},
7676
77-
evaluate(expr, values = this.values, config = this.config) {
77+
evaluate(expr, values = this.values) {
7878
7979
if (isString(expr)) {
8080
81-
const context = {$match, $values: values};
81+
const context = {$match, $values: values, $get: key => get(values, key)};
8282
83-
each(config, ({name = key}, key) =>
84-
set(context, name, get(values, name))
85-
);
86-
87-
return evaluate(this, expr, assign(context, values));
83+
return evaluate(this, expr, context);
8884
}
8985
9086
return expr.call(this, values, this);
@@ -133,4 +129,4 @@
133129
return subject && (new RegExp(pattern, flags).test(subject));
134130
}
135131
136-
</script>
132+
</script>

src/util.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,19 @@ export function set(obj, key, val) {
6868
_set(obj, parts.shift(), val);
6969
}
7070

71+
const quotedStringRe = /([^"']+)((.)(?:[^\3\\]|\\.)*?\3|.)?/g;
72+
const expressionRe = /((?:\d|true|false|null|undefined|(?:this\.|\$)[\S]+|\W)*)([\w][\w+.]*)?/g;
73+
const expressions = {};
7174
export function evaluate(self, expr, context) {
7275

76+
expressions[expr] = expressions[expr] || expr.replace(quotedStringRe, (match, unquoted, quoted = '') =>
77+
unquoted.replace(expressionRe, (match, prefix = '', expr) =>
78+
match ? `${prefix}${expr ? `$get('${expr}')` : ''}` : ''
79+
) + quoted
80+
);
81+
7382
try {
74-
return (Function('c', `with(c){return ${expr}}`)).call(self, context);
83+
return (Function('c', `with(c){return ${expressions[expr]}}`)).call(self, context);
7584
} catch (e) {
7685
warn(e);
7786
}

0 commit comments

Comments
 (0)