parseScriptsAndLimits static method

(LatexNode?, LatexNode?, LimitsMode) parseScriptsAndLimits(
  1. LatexParserContext ctx,
  2. LatexTokenStream stream
)

Parses following \limits/\nolimits and sub/superscripts. Returns a tuple of (subscript, superscript, limitsMode).

Implementation

static (LatexNode?, LatexNode?, LimitsMode) parseScriptsAndLimits(
  LatexParserContext ctx,
  LatexTokenStream stream,
) {
  LatexNode? subscript;
  LatexNode? superscript;
  LimitsMode limitsMode = LimitsMode.auto;

  while (!stream.isEOF()) {
    final token = stream.peek();

    if (token is WhitespaceToken) {
      final nextToken = stream.peekSkipping((it) => it is WhitespaceToken);
      bool shouldContinue = false;

      if (nextToken is CommandToken &&
          (nextToken.name == "limits" || nextToken.name == "nolimits")) {
        shouldContinue = true;
      } else if (nextToken is SubscriptToken && subscript == null) {
        shouldContinue = true;
      } else if (nextToken is SuperscriptToken && superscript == null) {
        shouldContinue = true;
      }

      if (!shouldContinue) {
        break;
      }

      while (stream.peek() is WhitespaceToken) {
        stream.advance();
      }
    } else if (token is CommandToken && token.name == "limits") {
      stream.advance();
      limitsMode = LimitsMode.limits;
    } else if (token is CommandToken && token.name == "nolimits") {
      stream.advance();
      limitsMode = LimitsMode.noLimits;
    } else if (token is SubscriptToken && subscript == null) {
      stream.advance();
      subscript = parseScriptContent(ctx, stream);
    } else if (token is SuperscriptToken && superscript == null) {
      stream.advance();
      superscript = parseScriptContent(ctx, stream);
    } else {
      break;
    }
  }

  return (subscript, superscript, limitsMode);
}