From be7c2b6b5950c3eef7dfe175131d1c56cfba639d Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 15 Mar 2026 19:21:43 +0100 Subject: [PATCH] feat(calc): strip underscore digit separators --- crates/plugins/plugin-calc/src/lib.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/plugins/plugin-calc/src/lib.rs b/crates/plugins/plugin-calc/src/lib.rs index e5ab747..ba6d3c3 100644 --- a/crates/plugins/plugin-calc/src/lib.rs +++ b/crates/plugins/plugin-calc/src/lib.rs @@ -15,6 +15,10 @@ impl Default for CalcPlugin { } } +fn preprocess(expr: &str) -> String { + expr.replace('_', "") +} + fn should_eval(query: &str) -> bool { query .chars() @@ -34,7 +38,9 @@ impl Plugin for CalcPlugin { if !should_eval(query) { return vec![]; } - let expr = query.strip_prefix('=').unwrap_or(query); + let raw = query.strip_prefix('=').unwrap_or(query); + let expr_owned = preprocess(raw); + let expr = expr_owned.as_str(); match evalexpr::eval_number(expr) { Ok(n) if n.is_finite() => { let value_str = if n.fract() == 0.0 { @@ -43,7 +49,6 @@ impl Plugin for CalcPlugin { format!("{n}") }; let display = format!("= {value_str}"); - let expr_owned = expr.to_string(); vec![SearchResult { id: ResultId::new("calc-result"), title: ResultTitle::new(display), @@ -81,4 +86,11 @@ mod tests { let p = CalcPlugin::new(); assert!(p.search("1/0").await.is_empty()); } + + #[tokio::test] + async fn calc_underscore_separator() { + let p = CalcPlugin::new(); + let results = p.search("1_000 * 2").await; + assert_eq!(results[0].title.as_str(), "= 2000"); + } }