amis
Version:
一种MIS页面生成工具
64 lines (54 loc) • 1.69 kB
text/typescript
export interface Enginer {
test: (tpl: string) => boolean;
compile: (tpl: string, data: object, ...rest: Array<any>) => string;
}
const enginers: {
[propName: string]: Enginer;
} = {};
export function reigsterTplEnginer(name: string, enginer: Enginer) {
enginers[name] = enginer;
}
export function filter(tpl: string, data: object = {}, ...rest: Array<any>): string {
if (!tpl || typeof tpl !== 'string') {
return '';
}
let keys = Object.keys(enginers);
for (let i = 0, len = keys.length; i < len; i++) {
let enginer = enginers[keys[i]];
if (enginer.test(tpl)) {
return enginer.compile(tpl, data, ...rest);
}
}
return tpl;
}
export function evalExpression(expression: string, data?: object): boolean {
if (!expression || typeof expression !== 'string') {
return false;
}
/* jshint evil:true */
try {
let debug = false;
const idx = expression.indexOf('debugger');
if (~idx) {
debug = true;
expression = expression.replace(/debugger;?/, '');
}
const fn = new Function('data', `with(data) {${debug ? 'debugger;' : ''}return !!(${expression});}`);
data = data || {};
return fn.call(data, data);
} catch (e) {
console.warn(e);
return false;
}
}
export function evalJS(js: string, data: object): any {
/* jshint evil:true */
try {
const fn = new Function('data', `with(data) {${~js.indexOf('return') ? '' : 'return '}${js};}`);
data = data || {};
return fn.call(data, data);
} catch (e) {
console.warn(e);
return null;
}
}