import { CaretNode, CaretParser, CaretPostfixParselet, TokensTag, } from "@caret-js/core"; import { SubSupToken } from "../tokens/subsup"; import { SubscriptNode } from "../nodes/subscript"; import { ExponentNode } from "../nodes/exponent"; export class SubSupParselet extends CaretPostfixParselet { parse(parser: CaretParser, left: CaretNode): CaretNode { const token = parser.consume(); this.assert(token instanceof SubSupToken, "Expected SubSupToken"); const child = left; let sub = undefined; if (token.subscript) { sub = parser.parseSubStrand(token.subscript); } let sup = undefined; if (token.superscript) { sup = parser.parseSubStrand(token.superscript); } if (sub && sup) { return ExponentNode.from(SubscriptNode.from(child, sub), sup).addTag( new TokensTag([token]) ); } if (sub) { return SubscriptNode.from(child, sub).addTag(new TokensTag([token])); } if (sup) { return ExponentNode.from(child, sup).addTag(new TokensTag([token])); } return child; } }