A world-class math input for the web
1import {
2 CaretNode,
3 CaretParser,
4 CaretPostfixParselet,
5 TokensTag,
6} from "@caret-js/core";
7import { SubSupToken } from "../tokens/subsup";
8import { SubscriptNode } from "../nodes/subscript";
9import { ExponentNode } from "../nodes/exponent";
10
11export class SubSupParselet extends CaretPostfixParselet {
12 parse(parser: CaretParser, left: CaretNode): CaretNode {
13 const token = parser.consume();
14 this.assert(token instanceof SubSupToken, "Expected SubSupToken");
15
16 const child = left;
17
18 let sub = undefined;
19 if (token.subscript) {
20 sub = parser.parseSubStrand(token.subscript);
21 }
22
23 let sup = undefined;
24 if (token.superscript) {
25 sup = parser.parseSubStrand(token.superscript);
26 }
27
28 if (sub && sup) {
29 return ExponentNode.from(SubscriptNode.from(child, sub), sup).addTag(
30 new TokensTag([token])
31 );
32 }
33
34 if (sub) {
35 return SubscriptNode.from(child, sub).addTag(new TokensTag([token]));
36 }
37
38 if (sup) {
39 return ExponentNode.from(child, sup).addTag(new TokensTag([token]));
40 }
41
42 return child;
43 }
44}