use crate::types::Mode;
use crate::{
KatexContext, ParseError, Settings,
macros::MacroContextInterface as _,
parser::{
Parser,
parse_node::{ParseNode, ParseNodeTag},
},
types::{ParseErrorKind, Token},
};
pub fn parse_tree(
ctx: &KatexContext,
expr: &str,
settings: &Settings,
) -> Result<Vec<ParseNode>, ParseError> {
let mut parser = Parser::new(expr, settings, ctx);
parser.gullet.macros_mut().purge("\\df@tag");
let tree = parser.parse()?;
parser.gullet.macros_mut().purge("\\current@color");
parser.gullet.macros_mut().purge("\\color");
if parser.gullet.macros().get("\\df@tag").is_some() {
if !settings.display_mode {
return Err(ParseError::new(ParseErrorKind::TagNotAllowedInInlineMode));
}
let tree = vec![ParseNode::Tag(ParseNodeTag {
mode: Mode::Text,
loc: None,
body: tree,
tag: parser.subparse(vec![Token::new("\\df@tag", None)])?,
})];
return Ok(tree);
}
Ok(tree)
}