amis-formula 1.3.13 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/__mocks__/styleMock.js +6 -0
- package/__mocks__/svgMock.js +5 -0
- package/__tests__/__snapshots__/lexer.test.ts.snap +31 -0
- package/__tests__/__snapshots__/parser.test.ts.snap +2306 -0
- package/__tests__/evalute.test.ts +437 -0
- package/__tests__/fomula.test.ts +194 -0
- package/__tests__/jest.setup.js +22 -0
- package/__tests__/lexer.test.ts +55 -0
- package/__tests__/parser.test.ts +201 -0
- package/dist/evalutor.d.ts +5 -0
- package/dist/filter.d.ts +6 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +3032 -3841
- package/dist/lexer.d.ts +1 -29
- package/dist/parser.d.ts +1 -26
- package/dist/types.d.ts +83 -0
- package/package.json +1 -1
- package/rollup.config.js +3 -1
- package/scripts/genDoc.ts +162 -0
- package/scripts/lib.ts +55 -0
- package/src/evalutor.ts +1938 -0
- package/src/filter.ts +48 -0
- package/src/index.ts +35 -0
- package/src/lexer.ts +775 -0
- package/src/parser.ts +875 -0
- package/src/types.ts +119 -0
- package/tsconfig.json +36 -0
- package/.prettierrc +0 -20
- package/dist/util.d.ts +0 -36
package/src/filter.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {Evaluator} from './evalutor';
|
|
2
|
+
import {FilterMap} from './types';
|
|
3
|
+
|
|
4
|
+
const entityMap: {
|
|
5
|
+
[propName: string]: string;
|
|
6
|
+
} = {
|
|
7
|
+
'&': '&',
|
|
8
|
+
'<': '<',
|
|
9
|
+
'>': '>',
|
|
10
|
+
'"': '"',
|
|
11
|
+
"'": ''',
|
|
12
|
+
'/': '/'
|
|
13
|
+
};
|
|
14
|
+
const escapeHtml = (str: string) =>
|
|
15
|
+
String(str).replace(/[&<>"'\/]/g, function (s) {
|
|
16
|
+
return entityMap[s];
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* filter 是历史包袱,不建议使用。因为这是之前的语法,所以在公式解析里面做了兼容。
|
|
21
|
+
* 建议用 ${ LEFT(xxx) } 这种函数调用语法。
|
|
22
|
+
*/
|
|
23
|
+
export const filters: FilterMap = {
|
|
24
|
+
raw: input => input,
|
|
25
|
+
html: (input: string) => {
|
|
26
|
+
if (input == null) {
|
|
27
|
+
return input;
|
|
28
|
+
}
|
|
29
|
+
return escapeHtml(input);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export function registerFilter(
|
|
34
|
+
name: string,
|
|
35
|
+
fn: (input: any, ...args: any[]) => any
|
|
36
|
+
): void {
|
|
37
|
+
filters[name] = fn;
|
|
38
|
+
Evaluator.setDefaultFilters(filters);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function extendsFilters(value: FilterMap) {
|
|
42
|
+
Object.assign(filters, value);
|
|
43
|
+
Evaluator.setDefaultFilters(filters);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getFilters() {
|
|
47
|
+
return filters;
|
|
48
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {Evaluator} from './evalutor';
|
|
2
|
+
import {parse} from './parser';
|
|
3
|
+
import {lexer} from './lexer';
|
|
4
|
+
import {registerFilter, filters, getFilters, extendsFilters} from './filter';
|
|
5
|
+
import type {
|
|
6
|
+
FilterContext,
|
|
7
|
+
ASTNode,
|
|
8
|
+
ParserOptions,
|
|
9
|
+
EvaluatorOptions
|
|
10
|
+
} from './types';
|
|
11
|
+
export {
|
|
12
|
+
parse,
|
|
13
|
+
lexer,
|
|
14
|
+
Evaluator,
|
|
15
|
+
FilterContext,
|
|
16
|
+
filters,
|
|
17
|
+
getFilters,
|
|
18
|
+
registerFilter,
|
|
19
|
+
extendsFilters
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function evaluate(
|
|
23
|
+
astOrString: string | ASTNode,
|
|
24
|
+
data: any,
|
|
25
|
+
options?: ParserOptions & EvaluatorOptions
|
|
26
|
+
) {
|
|
27
|
+
let ast: ASTNode = astOrString as ASTNode;
|
|
28
|
+
if (typeof astOrString === 'string') {
|
|
29
|
+
ast = parse(astOrString, options);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return new Evaluator(data, options).evalute(ast);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
Evaluator.setDefaultFilters(getFilters());
|