From d80ce65ad5efb64fcce313a4c44b7f46fc5e7798 Mon Sep 17 00:00:00 2001 From: Klimperfix Date: Sat, 4 Oct 2025 12:30:22 +0200 Subject: macro-sani: skipping the algorithm, if no macro is in the string. --- src/bibiman/sanitize/optimized_sanitize.rs | 94 +++++++++++++++++------------- 1 file changed, 53 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/bibiman/sanitize/optimized_sanitize.rs b/src/bibiman/sanitize/optimized_sanitize.rs index 8788d39..3a9dc67 100644 --- a/src/bibiman/sanitize/optimized_sanitize.rs +++ b/src/bibiman/sanitize/optimized_sanitize.rs @@ -42,56 +42,68 @@ enum Token { } pub fn optimized_sanitize(input_text: &str) -> String { - let mut out: Vec<&str> = Vec::with_capacity(input_text.chars().count()); - let mut bracket_counter: u32 = 0; - let mut bc_up: bool = false; - let mut counter_actions: HashMap = HashMap::new(); - let mut lex = Token::lexer(input_text); - while let Some(sometoken) = lex.next() { - match sometoken { - Ok(token) => match token { - Token::ForcedSpace => { - out.push(" "); - bc_up = false; - } - Token::OpenCurlyBracket => { - if bc_up { - bracket_counter = bracket_counter.saturating_add(1); - } else { - out.push("{") + let mut char_counter: usize = 0; + let mut contains_macro: bool = false; + for char in input_text.chars() { + if char == '\\' { + contains_macro = true; + } + char_counter = char_counter.saturating_add(1); + } + if !contains_macro { + input_text.to_string() + } else { + let mut out: Vec<&str> = Vec::with_capacity(char_counter); + let mut bracket_counter: u32 = 0; + let mut bc_up: bool = false; + let mut counter_actions: HashMap = HashMap::new(); + let mut lex = Token::lexer(input_text); + while let Some(sometoken) = lex.next() { + match sometoken { + Ok(token) => match token { + Token::ForcedSpace => { + out.push(" "); + bc_up = false; } - } - Token::ClosedCurlyBracket => { - if bracket_counter == 0 { - out.push("}") - } else { - match counter_actions.remove(&bracket_counter) { - None => out.push("}"), - Some(a) => out.push(a), + Token::OpenCurlyBracket => { + if bc_up { + bracket_counter = bracket_counter.saturating_add(1); + } else { + out.push("{") } - bracket_counter = bracket_counter - 1; } - } - Token::LaTeXMacro => { - let texmacro = lex.slice(); - if let Some(x) = LOOKUP.get(&texmacro) { - if let Some(end) = x.1 { - bc_up = true; - counter_actions.insert(bracket_counter + 1, end); + Token::ClosedCurlyBracket => { + if bracket_counter == 0 { + out.push("}") + } else { + match counter_actions.remove(&bracket_counter) { + None => out.push("}"), + Some(a) => out.push(a), + } + bracket_counter = bracket_counter - 1; + } + } + Token::LaTeXMacro => { + let texmacro = lex.slice(); + if let Some(x) = LOOKUP.get(&texmacro) { + if let Some(end) = x.1 { + bc_up = true; + counter_actions.insert(bracket_counter + 1, end); + } + out.push(x.0); + } else { + out.push(texmacro) } - out.push(x.0); - } else { - out.push(texmacro) } + }, + Err(_) => { + out.push(lex.slice()); + bc_up = false; } - }, - Err(_) => { - out.push(lex.slice()); - bc_up = false; } } + out.into_iter().collect::() } - out.into_iter().collect::() } #[cfg(test)] -- cgit v1.2.3