parseEnvironment method

LatexNode? parseEnvironment()

Parses an environment

Implementation

LatexNode? parseEnvironment() {
  final beginToken = tokenStream.advance();
  if (beginToken is! BeginEnvironmentToken) return null;

  final envName = beginToken.name;
  final startOffset = beginToken.range.start;

  // HLog.d(_tag, "解析环境: $envName");

  LatexNode result;
  switch (envName) {
    case "matrix":
    case "pmatrix":
    case "bmatrix":
    case "Bmatrix":
    case "vmatrix":
    case "Vmatrix":
    case "matrix*":
    case "pmatrix*":
    case "bmatrix*":
    case "Bmatrix*":
    case "vmatrix*":
    case "Vmatrix*":
      result = _parseMatrix(envName, isSmall: false);
      break;

    case "smallmatrix":
    case "smallmatrix*":
      result = _parseMatrix(envName, isSmall: true);
      break;
    case "array":
      result = _parseArray();
      break;
    case "subarray":
      result = _parseSubarray();
      break;
    case "tabular":
      result = _parseTabular();
      break;
    case "align":
    case "aligned":
    case "align*":
    case "gather":
    case "gathered":
    case "gather*":
    case "flalign":
    case "flalign*":
      result = _parseAligned(envName);
      break;
    case "alignat":
    case "alignat*":
    case "alignedat":
      result = _parseAlignat(envName);
      break;
    case "split":
      result = _parseSplit();
      break;
    case "multline":
    case "multline*":
      result = _parseMultline(envName);
      break;
    case "eqnarray":
    case "eqnarray*":
      result = _parseEqnarray(envName);
      break;
    case "subequations":
      result = _parseSubequations();
      break;
    case "cases":
    case "cases*":
      result = _parseCases(envName, CasesStyle.normal);
      break;
    case "dcases":
    case "dcases*":
      result = _parseCases(envName, CasesStyle.display);
      break;
    case "rcases":
    case "rcases*":
      result = _parseCases(envName, CasesStyle.right);
      break;
    case "equation":
    case "equation*":
    case "displaymath":
      final content = _parseEnvironmentContent(envName);
      result = EnvironmentNode(envName, content);
      break;
    case "RTL":
      final content = _parseEnvironmentContent("RTL");
      result = TextDirectionNode(content, TextDirectionType.rtl);
      break;
    case "LTR":
      final content = _parseEnvironmentContent("LTR");
      result = TextDirectionNode(content, TextDirectionType.ltr);
      break;
    default:
      // Check if it's a custom environment
      final customEnv = context.customEnvironments[envName];
      if (customEnv != null) {
        result = _parseCustomEnvironment(envName, customEnv);
      } else {
        final content = _parseEnvironmentContent(envName);
        result = EnvironmentNode(envName, content);
      }
      break;
  }

  // Supplement the sourceRange for environment nodes that lack it
  if (result.sourceRange == null) {
    final range = tokenStream.rangeFrom(startOffset);
    return result.withSourceRange(range);
  }
  return result;
}