use super::utilities::read_braced_from_chars;
pub fn process_line(line: &str) -> String {
let mut result = String::new();
let mut chars = line.chars().peekable();
while let Some(ch) = chars.next() {
if ch == '\\' {
let mut cmd = String::new();
while let Some(&c) = chars.peek() {
if c.is_alphabetic() {
cmd.push(chars.next().unwrap());
} else {
break;
}
}
process_command(&cmd, &mut chars, &mut result);
} else if ch == '$' {
result.push(ch);
while let Some(&c) = chars.peek() {
result.push(chars.next().unwrap());
if c == '$' {
break;
}
}
} else {
result.push(ch);
}
}
result
}
fn process_command(cmd: &str, chars: &mut std::iter::Peekable<std::str::Chars>, result: &mut String) {
match cmd {
"textbf" => {
if let Some(content) = read_braced_from_chars(chars) {
let processed = process_line(&content);
result.push_str(&processed);
}
}
"textit" | "emph" => {
if let Some(content) = read_braced_from_chars(chars) {
let processed = process_line(&content);
result.push_str(&processed);
}
}
"texttt" => {
if let Some(content) = read_braced_from_chars(chars) {
result.push_str(&content);
}
}
"underline" => {
if let Some(content) = read_braced_from_chars(chars) {
let processed = process_line(&content);
result.push_str(&processed);
}
}
"font" => {
while let Some(&c) = chars.peek() {
if c == '\\' {
break;
}
chars.next();
}
}
"usepackage" => {
read_braced_from_chars(chars);
}
_ => {
if let Some(content) = read_braced_from_chars(chars) {
let processed = process_line(&content);
result.push_str(&processed);
}
}
}
}