katex-parser 0.1.0

A port of the KaTeX parser: lexing and parsing LaTeX math expressions with macro expansion into a typed AST, plus a Unicode rendering backend
Documentation
use crate::ast::{ArrayColumn, ParseNode, StyleLevel};
use crate::error::ParseError;
use crate::environments::registry::{ArrayEnvironmentOptions, EnvironmentContext, EnvironmentParser};

fn cases_columns() -> Vec<ArrayColumn> {
    vec![
        ArrayColumn::AlignColumn {
            alignment: "l".to_string(),
            pre_gap: 0.0,
            post_gap: 1.0,
        },
        ArrayColumn::AlignColumn {
            alignment: "l".to_string(),
            pre_gap: 0.0,
            post_gap: 0.0,
        },
    ]
}

pub(crate) fn cases_environment_handler(
    parser: &mut dyn EnvironmentParser,
    context: &EnvironmentContext,
    _args: &[ParseNode],
    _opt_args: &[Option<ParseNode>],
) -> Result<ParseNode, ParseError> {
    let array = parser.parse_array(ArrayEnvironmentOptions {
        columns: Some(cases_columns()),
        array_stretch: 1.2,
        hskip_before_and_after: false,
        cell_style: if context.env_name == "dcases" || context.env_name == "drcases" {
            StyleLevel::DisplayStyle
        } else {
            StyleLevel::TextStyle
        },
        max_columns: None,
        single_row: false,
        auto_tag: None,
        leqno: false,
        add_jot: false,
        column_separation_type: None,
    })?;
    let right_brace = context.env_name == "rcases" || context.env_name == "drcases";
    Ok(ParseNode::LeftRight {
        mode: context.mode,
        body: vec![array],
        left: if right_brace { "." } else { "\\{" }.to_string(),
        right: if right_brace { "\\}" } else { "." }.to_string(),
        right_color: None,
    })
}