From 109e20c7b47a9b4ed181f526ba28225db2037821 Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 15:03:00 +1200 Subject: [PATCH 1/9] initial mostly working thing --- asklyphe-frontend/src/bangs.rs | 106 +++++++++++++++++++++++++ asklyphe-frontend/src/main.rs | 1 + asklyphe-frontend/src/routes/search.rs | 6 ++ 3 files changed, 113 insertions(+) create mode 100644 asklyphe-frontend/src/bangs.rs diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs new file mode 100644 index 0000000..5055223 --- /dev/null +++ b/asklyphe-frontend/src/bangs.rs @@ -0,0 +1,106 @@ +use tracing::{debug, error}; +use once_cell::sync::Lazy; +use std::collections::BTreeMap; + +pub static BANG_PREFIX: &str = "!"; + +pub static BUILTIN_BANGS: Lazy> = Lazy::new(|| { + let mut bangs = BTreeMap::new(); + bangs.insert("Google", ("https://google.com/search?q={}", &["g", "google"] as &[&str])); + + bangs.insert("DuckDuckGo", ("https://duckduckgo.com/?q={}", &["d", "ddg", "duckduckgo"] as &[&str])); + + bangs.insert("Wikipedia", ("https://wikipedia.org/w/index.php?search={}", &["w", "wiki", "wikipedia"] as &[&str])); + bangs +}); + +enum Bangs { + Google, + DuckDuckGo, + Wikipedia, +} + +impl Bangs { + pub fn get_suffix(self) -> &'static [&'static str] { + match self { + Bangs::Google => &["g", "google"], + Bangs::DuckDuckGo => &["d", "ddg", "duckduckgo"], + Bangs::Wikipedia => &["w", "wiki", "wikipedia"], + } + } + + pub fn get_url_format(self) -> &'static str { + match self { + Bangs::Google => "https://google.com/search?q={}", + Bangs::DuckDuckGo => "https://duckduckgo.com/?q={}", + Bangs::Wikipedia => "https://wikipedia.org/w/index.php?search={}", + } + } + +} + +pub fn do_bangs_or_whatever(query: &String) -> Option { + #[derive(Debug, Clone)] + struct Bang<'a> { + pub name: &'a str, + pub start_idx: usize, + pub end_idx: usize, + } + impl<'a> Bang<'_> { + fn init(name: &'a str, start_idx: usize, end_idx: usize) -> Bang { + Bang {name, start_idx, end_idx} + } + } + error!("Hello, World!, you searched \"{}\"", query); + return match query.match_indices(BANG_PREFIX).map(|idx| { + let bang_start_idx = idx.0; + match bang_start_idx == 0 || query.chars().nth(bang_start_idx - 1).unwrap().is_ascii_whitespace() { + true => match query.get(bang_start_idx + 1 .. query.len()) { + Some(rest) => + { + debug!("rest is {}", rest); + match BUILTIN_BANGS.iter().map( + |bang_full| + match bang_full.1.1.iter() + .filter(|short| rest.starts_with(**short)) + .max_by(|a, b| a.len().cmp(&b.len())) { + Some(bang_text) => { + let bang_end_idx = bang_start_idx + 1 + bang_text.len(); + match query.chars().nth(bang_end_idx).unwrap_or(' ').is_ascii_whitespace() { + true => Some(Bang::init(bang_full.1.0, bang_start_idx, bang_end_idx)), + false => None + } + } + None => None, + } + ).filter(|i| i.is_some()).map(|bang| bang.unwrap()) + .collect::>().last() + { + Some(bang) => { + debug!("got:'{:?}'", bang); + Some(bang.clone()) + }, + None => None + } + }, + None => None + } + false => None + } + }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).collect::>().first() { + Some(bang) => { + let query_trimmed = format!( + "{}{}", + query.get(0..bang.start_idx).unwrap(), + if bang.end_idx == query.len() { + "" + } else { + query.get(bang.end_idx..query.len()).unwrap() + }); + debug!("Old query: \"{}\"", query); + debug!("New query: \"{}\"", query_trimmed); + None + }, + None => None + } +} diff --git a/asklyphe-frontend/src/main.rs b/asklyphe-frontend/src/main.rs index 2b87121..e99fe51 100644 --- a/asklyphe-frontend/src/main.rs +++ b/asklyphe-frontend/src/main.rs @@ -14,6 +14,7 @@ pub mod searchbot; pub mod wikipedia; pub mod unit_converter; +pub mod bangs; pub mod routes; use std::{env, process}; diff --git a/asklyphe-frontend/src/routes/search.rs b/asklyphe-frontend/src/routes/search.rs index f1d43b7..78172c5 100644 --- a/asklyphe-frontend/src/routes/search.rs +++ b/asklyphe-frontend/src/routes/search.rs @@ -18,6 +18,7 @@ use crate::unit_converter; use crate::unit_converter::UnitConversion; use crate::wikipedia::WikipediaSummary; use crate::{wikipedia, Opts, ALPHA, BUILT_ON, GIT_COMMIT, VERSION, YEAR}; +use crate::bangs; use askama::Template; use asklyphe_common::nats; use asklyphe_common::nats::bingservice::{ @@ -170,6 +171,10 @@ pub async fn search_js( unit_query = unit_query.replace("metre", "meter"); let unit_comp = unit_converter::convert_unit(&unit_query); complications.unit_converter = unit_comp; + /*if let Some(bang, result_query) = bangs::do_bangs_or_whatever(&query) { + error!("Would redirect to '{}', but it's not implemented", format!(bang, result_query)); + }*/ + let _ = bangs::do_bangs_or_whatever(&query); } else { complications.disabled = true; query = query.replace("-complications", ""); @@ -282,6 +287,7 @@ pub async fn search_nojs( unit_query = unit_query.replace("metre", "meter"); let unit_comp = unit_converter::convert_unit(&unit_query); complications.unit_converter = unit_comp; + let bang = bangs::do_bangs_or_whatever(&query); } else { complications.disabled = true; query = query.replace("-complications", ""); -- 2.39.5 From 245744a3175b222e78c1d9d5fa716c80778635a8 Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 15:46:18 +1200 Subject: [PATCH 2/9] properly format bang urls --- asklyphe-frontend/src/bangs.rs | 53 +++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 5055223..8307961 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -39,18 +39,20 @@ impl Bangs { } +#[derive(Debug, Clone)] +struct BangLoc<'a> { + pub url: &'a str, + pub start_idx: usize, + pub end_idx: usize, +} +impl<'a> BangLoc<'_> { + fn init(url: &'a str, start_idx: usize, end_idx: usize) -> BangLoc { + BangLoc {url, start_idx, end_idx} + } +} + pub fn do_bangs_or_whatever(query: &String) -> Option { - #[derive(Debug, Clone)] - struct Bang<'a> { - pub name: &'a str, - pub start_idx: usize, - pub end_idx: usize, - } - impl<'a> Bang<'_> { - fn init(name: &'a str, start_idx: usize, end_idx: usize) -> Bang { - Bang {name, start_idx, end_idx} - } - } + // TODO: make this a little more procedural and not as confusing error!("Hello, World!, you searched \"{}\"", query); return match query.match_indices(BANG_PREFIX).map(|idx| { let bang_start_idx = idx.0; @@ -67,7 +69,7 @@ pub fn do_bangs_or_whatever(query: &String) -> Option { Some(bang_text) => { let bang_end_idx = bang_start_idx + 1 + bang_text.len(); match query.chars().nth(bang_end_idx).unwrap_or(' ').is_ascii_whitespace() { - true => Some(Bang::init(bang_full.1.0, bang_start_idx, bang_end_idx)), + true => Some(BangLoc::init(bang_full.1.0, bang_start_idx, bang_end_idx + 1)), false => None } } @@ -89,17 +91,22 @@ pub fn do_bangs_or_whatever(query: &String) -> Option { } }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).collect::>().first() { Some(bang) => { - let query_trimmed = format!( - "{}{}", - query.get(0..bang.start_idx).unwrap(), - if bang.end_idx == query.len() { - "" - } else { - query.get(bang.end_idx..query.len()).unwrap() - }); - debug!("Old query: \"{}\"", query); - debug!("New query: \"{}\"", query_trimmed); - None + debug!("Initial query: \"{}\"", query); + let query_split = query.split_once(query.get(bang.start_idx..bang.end_idx).unwrap()).unwrap(); + debug!("Split query: {:?}", query_split); + let query_trimmed = format!("{}{}", query_split.0, query_split.1); + debug!("Trimmed query: \"{}\"", query_trimmed); + + let bang_url_split = bang.url.split_once("{}").unwrap(); + debug!("Split bang URL: {:?}", bang_url_split); + let bang_url = format!( + "{}{}{}", + bang_url_split.0, + query_trimmed, + bang_url_split.1 + ); + debug!("Final URL: \"{}\"", bang_url); + Some(bang_url) }, None => None } -- 2.39.5 From bac21898c9636695ad27b6ce786d454814239591 Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 18:40:38 +1200 Subject: [PATCH 3/9] just make the bangs better --- asklyphe-frontend/src/bangs.rs | 169 +++++++++++-------------- asklyphe-frontend/src/routes/search.rs | 5 +- 2 files changed, 81 insertions(+), 93 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 8307961..83eb1e8 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -1,113 +1,98 @@ use tracing::{debug, error}; use once_cell::sync::Lazy; use std::collections::BTreeMap; +use url_encoded_data; pub static BANG_PREFIX: &str = "!"; -pub static BUILTIN_BANGS: Lazy> = Lazy::new(|| { +#[derive(Debug)] +struct Bang<'a> { + pub url: &'a str, + pub keys: &'a [&'a str] +} + +impl<'a> Bang<'_> { + fn new(url: &'a str, keys: &'a [&'a str]) -> Bang<'a> { + Bang {url, keys} + } +} + +static BUILTIN_BANGS: Lazy> = Lazy::new(|| { let mut bangs = BTreeMap::new(); - bangs.insert("Google", ("https://google.com/search?q={}", &["g", "google"] as &[&str])); + bangs.insert("Google", Bang::new("https://google.com/search?q={}", &["g", "google"] as &[&str])); - bangs.insert("DuckDuckGo", ("https://duckduckgo.com/?q={}", &["d", "ddg", "duckduckgo"] as &[&str])); + bangs.insert("DuckDuckGo", Bang::new("https://duckduckgo.com/?q={}", &["d", "ddg", "duckduckgo"] as &[&str])); - bangs.insert("Wikipedia", ("https://wikipedia.org/w/index.php?search={}", &["w", "wiki", "wikipedia"] as &[&str])); + bangs.insert("Wikipedia", Bang::new("https://wikipedia.org/w/index.php?search={}", &["w", "wiki", "wikipedia"] as &[&str])); bangs }); -enum Bangs { - Google, - DuckDuckGo, - Wikipedia, -} - -impl Bangs { - pub fn get_suffix(self) -> &'static [&'static str] { - match self { - Bangs::Google => &["g", "google"], - Bangs::DuckDuckGo => &["d", "ddg", "duckduckgo"], - Bangs::Wikipedia => &["w", "wiki", "wikipedia"], - } - } - - pub fn get_url_format(self) -> &'static str { - match self { - Bangs::Google => "https://google.com/search?q={}", - Bangs::DuckDuckGo => "https://duckduckgo.com/?q={}", - Bangs::Wikipedia => "https://wikipedia.org/w/index.php?search={}", - } - } - -} - #[derive(Debug, Clone)] -struct BangLoc<'a> { - pub url: &'a str, +struct BangLoc<'b> { + pub url: &'b str, pub start_idx: usize, - pub end_idx: usize, + pub len: usize } -impl<'a> BangLoc<'_> { - fn init(url: &'a str, start_idx: usize, end_idx: usize) -> BangLoc { - BangLoc {url, start_idx, end_idx} + +impl<'b> BangLoc<'_> { + fn new(url: &'b str, start_idx: usize, len: usize) -> BangLoc<'b> { + BangLoc {url, start_idx, len} } } -pub fn do_bangs_or_whatever(query: &String) -> Option { - // TODO: make this a little more procedural and not as confusing - error!("Hello, World!, you searched \"{}\"", query); - return match query.match_indices(BANG_PREFIX).map(|idx| { - let bang_start_idx = idx.0; - match bang_start_idx == 0 || query.chars().nth(bang_start_idx - 1).unwrap().is_ascii_whitespace() { - true => match query.get(bang_start_idx + 1 .. query.len()) { - Some(rest) => - { - debug!("rest is {}", rest); - match BUILTIN_BANGS.iter().map( - |bang_full| - match bang_full.1.1.iter() - .filter(|short| rest.starts_with(**short)) - .max_by(|a, b| a.len().cmp(&b.len())) { - Some(bang_text) => { - let bang_end_idx = bang_start_idx + 1 + bang_text.len(); - match query.chars().nth(bang_end_idx).unwrap_or(' ').is_ascii_whitespace() { - true => Some(BangLoc::init(bang_full.1.0, bang_start_idx, bang_end_idx + 1)), - false => None - } - } - None => None, - } - ).filter(|i| i.is_some()).map(|bang| bang.unwrap()) - .collect::>().last() - { - Some(bang) => { - debug!("got:'{:?}'", bang); - Some(bang.clone()) - }, - None => None - } - }, - None => None - } - false => None +#[derive(Debug)] +pub struct BangRedirect { + pub url: String +} + +pub fn do_bangs_or_whatever(query: &String) -> Option { + error!("Hello, World!"); + if !query.contains(BANG_PREFIX) { + return None; + } + let bangs = query.match_indices(BANG_PREFIX).filter(|(bang_start_idx, _)| { + if *bang_start_idx == 0 || query.chars().nth(*bang_start_idx - 1).unwrap().is_whitespace() { + true + } else { + false } - }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).collect::>().first() { - Some(bang) => { - debug!("Initial query: \"{}\"", query); - let query_split = query.split_once(query.get(bang.start_idx..bang.end_idx).unwrap()).unwrap(); - debug!("Split query: {:?}", query_split); - let query_trimmed = format!("{}{}", query_split.0, query_split.1); - debug!("Trimmed query: \"{}\"", query_trimmed); + }).map(|(bang_start_idx, _)| { + let rest = query.get(bang_start_idx + 1..query.len()).unwrap(); + BUILTIN_BANGS.iter().map(|(_, bang)| { + let key = bang.keys.iter() + .filter(|key| rest.starts_with(**key)) + .filter( + |key| rest.chars() + .nth(key.len()) + .unwrap_or(' ') + .is_whitespace()) + .max_by(|a, b| a.len().cmp(&b.len()))?; + Some(BangLoc::new(bang.url, bang_start_idx, key.len())) + }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).next() + }).filter(|bang| bang.is_some()) + .map(|bang| bang.unwrap()) + .collect::>(); + debug!("Result: {:?}", bangs); - let bang_url_split = bang.url.split_once("{}").unwrap(); - debug!("Split bang URL: {:?}", bang_url_split); - let bang_url = format!( - "{}{}{}", - bang_url_split.0, - query_trimmed, - bang_url_split.1 - ); - debug!("Final URL: \"{}\"", bang_url); - Some(bang_url) - }, - None => None - } + let bang = bangs.first()?; + let end_idx = bang.start_idx + 1 + bang.len; + debug!("Initial query: \"{}\"", query); + let query_split = query.split_once(query.get(bang.start_idx..end_idx).unwrap()).unwrap(); + debug!("Split query: {:?}", query_split); + let query_trimmed = format!("{}{}", query_split.0, query_split.1); + debug!("Trimmed query: \"{}\"", query_trimmed); + let query_encoded = url_encoded_data::stringify(&[("", query_trimmed.as_str())]); + let query_encoded = query_encoded.get(1..query_encoded.len()).unwrap().to_owned(); + debug!("Encoded query: {:?}", query_encoded); + + let bang_url_split = bang.url.split_once("{}").unwrap(); + debug!("Split bang URL: {:?}", bang_url_split); + let bang_url = format!( + "{}{}{}", + bang_url_split.0, + query_encoded, + bang_url_split.1 + ); + debug!("Final URL: \"{}\"", bang_url); + Some(BangRedirect{url: bang_url}) } diff --git a/asklyphe-frontend/src/routes/search.rs b/asklyphe-frontend/src/routes/search.rs index 78172c5..af33081 100644 --- a/asklyphe-frontend/src/routes/search.rs +++ b/asklyphe-frontend/src/routes/search.rs @@ -19,6 +19,7 @@ use crate::unit_converter::UnitConversion; use crate::wikipedia::WikipediaSummary; use crate::{wikipedia, Opts, ALPHA, BUILT_ON, GIT_COMMIT, VERSION, YEAR}; use crate::bangs; +use crate::bangs::BangRedirect; use askama::Template; use asklyphe_common::nats; use asklyphe_common::nats::bingservice::{ @@ -69,6 +70,7 @@ pub struct Complications { disabled: bool, wikipedia: Option, unit_converter: Option, + bang: Option } pub async fn search( @@ -174,7 +176,8 @@ pub async fn search_js( /*if let Some(bang, result_query) = bangs::do_bangs_or_whatever(&query) { error!("Would redirect to '{}', but it's not implemented", format!(bang, result_query)); }*/ - let _ = bangs::do_bangs_or_whatever(&query); + let bang_redirect = bangs::do_bangs_or_whatever(&query); + complications.bang = bang_redirect; } else { complications.disabled = true; query = query.replace("-complications", ""); -- 2.39.5 From 64a771f8cc2b135f65cbe7f8d4ba1126ce4caa3f Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 19:21:13 +1200 Subject: [PATCH 4/9] make it work fully --- asklyphe-frontend/src/bangs.rs | 15 +++++++-------- asklyphe-frontend/src/routes/search.rs | 15 +++++++++------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 83eb1e8..682bd32 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -46,7 +46,6 @@ pub struct BangRedirect { } pub fn do_bangs_or_whatever(query: &String) -> Option { - error!("Hello, World!"); if !query.contains(BANG_PREFIX) { return None; } @@ -72,27 +71,27 @@ pub fn do_bangs_or_whatever(query: &String) -> Option { }).filter(|bang| bang.is_some()) .map(|bang| bang.unwrap()) .collect::>(); - debug!("Result: {:?}", bangs); + let bang = bangs.first()?; let end_idx = bang.start_idx + 1 + bang.len; - debug!("Initial query: \"{}\"", query); + let query_split = query.split_once(query.get(bang.start_idx..end_idx).unwrap()).unwrap(); - debug!("Split query: {:?}", query_split); + let query_trimmed = format!("{}{}", query_split.0, query_split.1); - debug!("Trimmed query: \"{}\"", query_trimmed); + let query_encoded = url_encoded_data::stringify(&[("", query_trimmed.as_str())]); let query_encoded = query_encoded.get(1..query_encoded.len()).unwrap().to_owned(); - debug!("Encoded query: {:?}", query_encoded); + let bang_url_split = bang.url.split_once("{}").unwrap(); - debug!("Split bang URL: {:?}", bang_url_split); + let bang_url = format!( "{}{}{}", bang_url_split.0, query_encoded, bang_url_split.1 ); - debug!("Final URL: \"{}\"", bang_url); + Some(BangRedirect{url: bang_url}) } diff --git a/asklyphe-frontend/src/routes/search.rs b/asklyphe-frontend/src/routes/search.rs index af33081..4509740 100644 --- a/asklyphe-frontend/src/routes/search.rs +++ b/asklyphe-frontend/src/routes/search.rs @@ -70,7 +70,6 @@ pub struct Complications { disabled: bool, wikipedia: Option, unit_converter: Option, - bang: Option } pub async fn search( @@ -173,11 +172,11 @@ pub async fn search_js( unit_query = unit_query.replace("metre", "meter"); let unit_comp = unit_converter::convert_unit(&unit_query); complications.unit_converter = unit_comp; - /*if let Some(bang, result_query) = bangs::do_bangs_or_whatever(&query) { - error!("Would redirect to '{}', but it's not implemented", format!(bang, result_query)); - }*/ + let bang_redirect = bangs::do_bangs_or_whatever(&query); - complications.bang = bang_redirect; + if let Some(redirect) = bang_redirect { + return Redirect::to(&redirect.url).into_response(); + } } else { complications.disabled = true; query = query.replace("-complications", ""); @@ -290,7 +289,11 @@ pub async fn search_nojs( unit_query = unit_query.replace("metre", "meter"); let unit_comp = unit_converter::convert_unit(&unit_query); complications.unit_converter = unit_comp; - let bang = bangs::do_bangs_or_whatever(&query); + + let bang_redirect = bangs::do_bangs_or_whatever(&query); + if let Some(redirect) = bang_redirect { + return Redirect::to(&redirect.url).into_response(); + } } else { complications.disabled = true; query = query.replace("-complications", ""); -- 2.39.5 From 87458f30b6ca60c6d928e99bd18512f1b1e7829a Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 19:40:35 +1200 Subject: [PATCH 5/9] bangs: fix redict including extra space sometimes --- asklyphe-frontend/src/bangs.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 682bd32..8ce78a8 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -74,9 +74,22 @@ pub fn do_bangs_or_whatever(query: &String) -> Option { let bang = bangs.first()?; - let end_idx = bang.start_idx + 1 + bang.len; + let end_idx = { + let mut end_idx = bang.start_idx + 1 + bang.len; + if end_idx < query.len() { + end_idx += 1; + } + end_idx + }; - let query_split = query.split_once(query.get(bang.start_idx..end_idx).unwrap()).unwrap(); + let start_idx = if end_idx == query.len() && bang.start_idx > 0 { + bang.start_idx - 1 + } else { + bang.start_idx + }; + + + let query_split = query.split_once(query.get(start_idx..end_idx).unwrap()).unwrap(); let query_trimmed = format!("{}{}", query_split.0, query_split.1); -- 2.39.5 From 43aae463e869ba192b59436d6ad8834bba28511f Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 19:57:38 +1200 Subject: [PATCH 6/9] use a more sensible name --- asklyphe-frontend/src/bangs.rs | 2 +- asklyphe-frontend/src/routes/search.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 8ce78a8..91b4828 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -45,7 +45,7 @@ pub struct BangRedirect { pub url: String } -pub fn do_bangs_or_whatever(query: &String) -> Option { +pub fn redirect_bang(query: &String) -> Option { if !query.contains(BANG_PREFIX) { return None; } diff --git a/asklyphe-frontend/src/routes/search.rs b/asklyphe-frontend/src/routes/search.rs index 4509740..f1814f5 100644 --- a/asklyphe-frontend/src/routes/search.rs +++ b/asklyphe-frontend/src/routes/search.rs @@ -173,7 +173,7 @@ pub async fn search_js( let unit_comp = unit_converter::convert_unit(&unit_query); complications.unit_converter = unit_comp; - let bang_redirect = bangs::do_bangs_or_whatever(&query); + let bang_redirect = bangs::redirect_bang(&query); if let Some(redirect) = bang_redirect { return Redirect::to(&redirect.url).into_response(); } @@ -290,7 +290,7 @@ pub async fn search_nojs( let unit_comp = unit_converter::convert_unit(&unit_query); complications.unit_converter = unit_comp; - let bang_redirect = bangs::do_bangs_or_whatever(&query); + let bang_redirect = bangs::redirect_bang(&query); if let Some(redirect) = bang_redirect { return Redirect::to(&redirect.url).into_response(); } -- 2.39.5 From f06b84bf661b01b52c8d9830afb983567d1de530 Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 20:11:15 +1200 Subject: [PATCH 7/9] a little cleanup --- asklyphe-frontend/src/bangs.rs | 10 +++------- asklyphe-frontend/src/routes/search.rs | 5 ++--- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 91b4828..16a444f 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -40,12 +40,7 @@ impl<'b> BangLoc<'_> { } } -#[derive(Debug)] -pub struct BangRedirect { - pub url: String -} - -pub fn redirect_bang(query: &String) -> Option { +pub fn redirect_bang(query: &String) -> Option { if !query.contains(BANG_PREFIX) { return None; } @@ -93,6 +88,7 @@ pub fn redirect_bang(query: &String) -> Option { let query_trimmed = format!("{}{}", query_split.0, query_split.1); + // A hack to get URL escaping without using a proper URL layout, hopefully has no other issues apart from prepending '=' to the string let query_encoded = url_encoded_data::stringify(&[("", query_trimmed.as_str())]); let query_encoded = query_encoded.get(1..query_encoded.len()).unwrap().to_owned(); @@ -106,5 +102,5 @@ pub fn redirect_bang(query: &String) -> Option { bang_url_split.1 ); - Some(BangRedirect{url: bang_url}) + Some(bang_url) } diff --git a/asklyphe-frontend/src/routes/search.rs b/asklyphe-frontend/src/routes/search.rs index f1814f5..7304718 100644 --- a/asklyphe-frontend/src/routes/search.rs +++ b/asklyphe-frontend/src/routes/search.rs @@ -19,7 +19,6 @@ use crate::unit_converter::UnitConversion; use crate::wikipedia::WikipediaSummary; use crate::{wikipedia, Opts, ALPHA, BUILT_ON, GIT_COMMIT, VERSION, YEAR}; use crate::bangs; -use crate::bangs::BangRedirect; use askama::Template; use asklyphe_common::nats; use asklyphe_common::nats::bingservice::{ @@ -175,7 +174,7 @@ pub async fn search_js( let bang_redirect = bangs::redirect_bang(&query); if let Some(redirect) = bang_redirect { - return Redirect::to(&redirect.url).into_response(); + return Redirect::to(&redirect).into_response(); } } else { complications.disabled = true; @@ -292,7 +291,7 @@ pub async fn search_nojs( let bang_redirect = bangs::redirect_bang(&query); if let Some(redirect) = bang_redirect { - return Redirect::to(&redirect.url).into_response(); + return Redirect::to(&redirect).into_response(); } } else { complications.disabled = true; -- 2.39.5 From 3696d4cb6dd485f59c4824af361bb97a85e21dc6 Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 20:12:03 +1200 Subject: [PATCH 8/9] spaces to follow at least a little code style :( --- asklyphe-frontend/src/bangs.rs | 134 ++++++++++++++++----------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index 16a444f..eed4aad 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -7,100 +7,100 @@ pub static BANG_PREFIX: &str = "!"; #[derive(Debug)] struct Bang<'a> { - pub url: &'a str, - pub keys: &'a [&'a str] + pub url: &'a str, + pub keys: &'a [&'a str] } impl<'a> Bang<'_> { - fn new(url: &'a str, keys: &'a [&'a str]) -> Bang<'a> { - Bang {url, keys} - } + fn new(url: &'a str, keys: &'a [&'a str]) -> Bang<'a> { + Bang {url, keys} + } } static BUILTIN_BANGS: Lazy> = Lazy::new(|| { - let mut bangs = BTreeMap::new(); - bangs.insert("Google", Bang::new("https://google.com/search?q={}", &["g", "google"] as &[&str])); + let mut bangs = BTreeMap::new(); + bangs.insert("Google", Bang::new("https://google.com/search?q={}", &["g", "google"] as &[&str])); - bangs.insert("DuckDuckGo", Bang::new("https://duckduckgo.com/?q={}", &["d", "ddg", "duckduckgo"] as &[&str])); + bangs.insert("DuckDuckGo", Bang::new("https://duckduckgo.com/?q={}", &["d", "ddg", "duckduckgo"] as &[&str])); - bangs.insert("Wikipedia", Bang::new("https://wikipedia.org/w/index.php?search={}", &["w", "wiki", "wikipedia"] as &[&str])); - bangs + bangs.insert("Wikipedia", Bang::new("https://wikipedia.org/w/index.php?search={}", &["w", "wiki", "wikipedia"] as &[&str])); + bangs }); #[derive(Debug, Clone)] struct BangLoc<'b> { - pub url: &'b str, - pub start_idx: usize, - pub len: usize + pub url: &'b str, + pub start_idx: usize, + pub len: usize } impl<'b> BangLoc<'_> { - fn new(url: &'b str, start_idx: usize, len: usize) -> BangLoc<'b> { - BangLoc {url, start_idx, len} - } + fn new(url: &'b str, start_idx: usize, len: usize) -> BangLoc<'b> { + BangLoc {url, start_idx, len} + } } pub fn redirect_bang(query: &String) -> Option { - if !query.contains(BANG_PREFIX) { - return None; - } - let bangs = query.match_indices(BANG_PREFIX).filter(|(bang_start_idx, _)| { - if *bang_start_idx == 0 || query.chars().nth(*bang_start_idx - 1).unwrap().is_whitespace() { - true - } else { - false - } - }).map(|(bang_start_idx, _)| { - let rest = query.get(bang_start_idx + 1..query.len()).unwrap(); - BUILTIN_BANGS.iter().map(|(_, bang)| { - let key = bang.keys.iter() - .filter(|key| rest.starts_with(**key)) - .filter( - |key| rest.chars() - .nth(key.len()) - .unwrap_or(' ') - .is_whitespace()) - .max_by(|a, b| a.len().cmp(&b.len()))?; - Some(BangLoc::new(bang.url, bang_start_idx, key.len())) - }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).next() - }).filter(|bang| bang.is_some()) - .map(|bang| bang.unwrap()) - .collect::>(); + if !query.contains(BANG_PREFIX) { + return None; + } + let bangs = query.match_indices(BANG_PREFIX).filter(|(bang_start_idx, _)| { + if *bang_start_idx == 0 || query.chars().nth(*bang_start_idx - 1).unwrap().is_whitespace() { + true + } else { + false + } + }).map(|(bang_start_idx, _)| { + let rest = query.get(bang_start_idx + 1..query.len()).unwrap(); + BUILTIN_BANGS.iter().map(|(_, bang)| { + let key = bang.keys.iter() + .filter(|key| rest.starts_with(**key)) + .filter( + |key| rest.chars() + .nth(key.len()) + .unwrap_or(' ') + .is_whitespace()) + .max_by(|a, b| a.len().cmp(&b.len()))?; + Some(BangLoc::new(bang.url, bang_start_idx, key.len())) + }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).next() + }).filter(|bang| bang.is_some()) + .map(|bang| bang.unwrap()) + .collect::>(); - let bang = bangs.first()?; - let end_idx = { - let mut end_idx = bang.start_idx + 1 + bang.len; - if end_idx < query.len() { - end_idx += 1; - } - end_idx - }; + let bang = bangs.first()?; + let end_idx = { + let mut end_idx = bang.start_idx + 1 + bang.len; + if end_idx < query.len() { + end_idx += 1; + } + end_idx + }; - let start_idx = if end_idx == query.len() && bang.start_idx > 0 { - bang.start_idx - 1 - } else { - bang.start_idx - }; + let start_idx = if end_idx == query.len() && bang.start_idx > 0 { + bang.start_idx - 1 + } else { + bang.start_idx + }; - let query_split = query.split_once(query.get(start_idx..end_idx).unwrap()).unwrap(); + let query_split = query.split_once(query.get(start_idx..end_idx).unwrap()).unwrap(); - let query_trimmed = format!("{}{}", query_split.0, query_split.1); + let query_trimmed = format!("{}{}", query_split.0, query_split.1); - // A hack to get URL escaping without using a proper URL layout, hopefully has no other issues apart from prepending '=' to the string - let query_encoded = url_encoded_data::stringify(&[("", query_trimmed.as_str())]); - let query_encoded = query_encoded.get(1..query_encoded.len()).unwrap().to_owned(); + // A hack to get URL escaping without using a proper URL layout, hopefully has no other issues apart from prepending '=' to the string + let query_encoded = url_encoded_data::stringify(&[("", query_trimmed.as_str())]); + let query_encoded = query_encoded.get(1..query_encoded.len()).unwrap().to_owned(); - let bang_url_split = bang.url.split_once("{}").unwrap(); + let bang_url_split = bang.url.split_once("{}").unwrap(); - let bang_url = format!( - "{}{}{}", - bang_url_split.0, - query_encoded, - bang_url_split.1 - ); + let bang_url = format!( + "{}{}{}", + bang_url_split.0, + query_encoded, + bang_url_split.1 + ); - Some(bang_url) + Some(bang_url) } -- 2.39.5 From 24067eca99ad8e286057b853c24d622aa9a17c6d Mon Sep 17 00:00:00 2001 From: Book-reader Date: Thu, 8 May 2025 20:18:00 +1200 Subject: [PATCH 9/9] I was just writing the PR and realised that aliases is a better name than keys --- asklyphe-frontend/src/bangs.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/asklyphe-frontend/src/bangs.rs b/asklyphe-frontend/src/bangs.rs index eed4aad..ddd383b 100644 --- a/asklyphe-frontend/src/bangs.rs +++ b/asklyphe-frontend/src/bangs.rs @@ -8,12 +8,12 @@ pub static BANG_PREFIX: &str = "!"; #[derive(Debug)] struct Bang<'a> { pub url: &'a str, - pub keys: &'a [&'a str] + pub aliases: &'a [&'a str] } impl<'a> Bang<'_> { - fn new(url: &'a str, keys: &'a [&'a str]) -> Bang<'a> { - Bang {url, keys} + fn new(url: &'a str, aliases: &'a [&'a str]) -> Bang<'a> { + Bang {url, aliases} } } @@ -53,15 +53,15 @@ pub fn redirect_bang(query: &String) -> Option { }).map(|(bang_start_idx, _)| { let rest = query.get(bang_start_idx + 1..query.len()).unwrap(); BUILTIN_BANGS.iter().map(|(_, bang)| { - let key = bang.keys.iter() - .filter(|key| rest.starts_with(**key)) + let alias = bang.aliases.iter() + .filter(|alias| rest.starts_with(**alias)) .filter( - |key| rest.chars() - .nth(key.len()) + |alias| rest.chars() + .nth(alias.len()) .unwrap_or(' ') .is_whitespace()) .max_by(|a, b| a.len().cmp(&b.len()))?; - Some(BangLoc::new(bang.url, bang_start_idx, key.len())) + Some(BangLoc::new(bang.url, bang_start_idx, alias.len())) }).filter(|bang| bang.is_some()).map(|bang| bang.unwrap()).next() }).filter(|bang| bang.is_some()) .map(|bang| bang.unwrap()) -- 2.39.5