A world-class math input for the web
1import {
2 CaretJuxtapositionParselet,
3 CaretNode,
4 CaretParser,
5 TokensTag,
6} from "@caret-js/core";
7import { VariableNode } from "../nodes/variable";
8import { FunctionCallNode } from "../nodes/functionCall";
9import { ParenthesesChildTag } from "./parentheses";
10
11export class FunctionCallParselet extends CaretJuxtapositionParselet {
12 constructor(private funcNames: Set<string>) {
13 super();
14 }
15
16 canParse(left: CaretNode, right: CaretNode): boolean {
17 return (
18 left instanceof VariableNode &&
19 this.funcNames.has(left.name) &&
20 right.hasTag(ParenthesesChildTag)
21 );
22 }
23
24 parse(parser: CaretParser, left: VariableNode, right: CaretNode): CaretNode {
25 return FunctionCallNode.from(left.name, [right]).addTag(
26 new TokensTag([...(left.getTag(TokensTag)?.ownTokens ?? [])])
27 );
28 }
29}