From c57d719a0a8aa3d0a56d2d96cbb2be36cbd539b2 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Tue, 19 Jul 2022 19:09:21 -0500 Subject: [PATCH 1/2] Add support for the "g" flag --- src/commands/sed.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/commands/sed.rs b/src/commands/sed.rs index ab124f8..386d77b 100644 --- a/src/commands/sed.rs +++ b/src/commands/sed.rs @@ -26,8 +26,16 @@ impl Trigger for Sed { }; if let (Some(find), Some(replace)) = (captures.name("r"), captures.name("w")) { // TODO: karx plz add flags - //let flags = matches.name("f").map(|m| m.as_str()); - let result = message.replace(find.as_str(), replace.as_str()); + let (global, ignore_case) = captures + .name("f") + .map(|m| m.as_str()) + .map(|s| (s.contains('g'), s.contains('i'))) + .unwrap_or_default(); + let result = if global { + message.replace(find.as_str(), replace.as_str()) + } else { + message.replacen(find.as_str(), replace.as_str(), 1) + }; if foreign_author { Ok(format!( "(edited by {}) <{}> {}", From 9e1ffc001d4e04884f1ae0b9d66d9ab8d393d8e7 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Tue, 19 Jul 2022 19:26:46 -0500 Subject: [PATCH 2/2] Add support for the "i" flag --- Cargo.toml | 1 + src/commands/sed.rs | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 362f975..5d0e85e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ rusqlite = { version = "0.28", features = ["bundled"] } futures-util = "0.3" irc = { version = "0.15", default-features = false, features = ["tls-rust"] } async-trait = "0.1" +regex = "1.6.0" [features] # debug IRC commands diff --git a/src/commands/sed.rs b/src/commands/sed.rs index 386d77b..943d6cc 100644 --- a/src/commands/sed.rs +++ b/src/commands/sed.rs @@ -1,6 +1,8 @@ use crate::bot::{Context, Trigger}; use async_trait::async_trait; +use fancy_regex::escape; use fancy_regex::Captures; +use regex::RegexBuilder; pub struct Sed; @@ -25,16 +27,21 @@ impl Trigger for Sed { return Ok("No previous messages found.".into()); }; if let (Some(find), Some(replace)) = (captures.name("r"), captures.name("w")) { - // TODO: karx plz add flags let (global, ignore_case) = captures .name("f") .map(|m| m.as_str()) .map(|s| (s.contains('g'), s.contains('i'))) .unwrap_or_default(); + + let escaped = escape(find.as_str()); + let re = RegexBuilder::new(&escaped) + .case_insensitive(ignore_case) + .build() + .unwrap(); // Of course it's valid, we just escaped special chars let result = if global { - message.replace(find.as_str(), replace.as_str()) + re.replace_all(&message, replace.as_str()) } else { - message.replacen(find.as_str(), replace.as_str(), 1) + re.replace(&message, replace.as_str()) }; if foreign_author { Ok(format!(