A world-class math input for the web
at main 44 lines 1.1 kB view raw
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}