feat(calc): strip underscore digit separators
This commit is contained in:
@@ -15,6 +15,10 @@ impl Default for CalcPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn preprocess(expr: &str) -> String {
|
||||||
|
expr.replace('_', "")
|
||||||
|
}
|
||||||
|
|
||||||
fn should_eval(query: &str) -> bool {
|
fn should_eval(query: &str) -> bool {
|
||||||
query
|
query
|
||||||
.chars()
|
.chars()
|
||||||
@@ -34,7 +38,9 @@ impl Plugin for CalcPlugin {
|
|||||||
if !should_eval(query) {
|
if !should_eval(query) {
|
||||||
return vec![];
|
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) {
|
match evalexpr::eval_number(expr) {
|
||||||
Ok(n) if n.is_finite() => {
|
Ok(n) if n.is_finite() => {
|
||||||
let value_str = if n.fract() == 0.0 {
|
let value_str = if n.fract() == 0.0 {
|
||||||
@@ -43,7 +49,6 @@ impl Plugin for CalcPlugin {
|
|||||||
format!("{n}")
|
format!("{n}")
|
||||||
};
|
};
|
||||||
let display = format!("= {value_str}");
|
let display = format!("= {value_str}");
|
||||||
let expr_owned = expr.to_string();
|
|
||||||
vec![SearchResult {
|
vec![SearchResult {
|
||||||
id: ResultId::new("calc-result"),
|
id: ResultId::new("calc-result"),
|
||||||
title: ResultTitle::new(display),
|
title: ResultTitle::new(display),
|
||||||
@@ -81,4 +86,11 @@ mod tests {
|
|||||||
let p = CalcPlugin::new();
|
let p = CalcPlugin::new();
|
||||||
assert!(p.search("1/0").await.is_empty());
|
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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user