use lazy_static::lazy_static;
use regex::Regex;
lazy_static! {
static ref DEFAULT_SKIP_PATTERNS: Vec<Regex> = vec![
Regex::new(r"https?://[^\s]+").expect("Valid URL regex"),
Regex::new(r"#[0-9a-fA-F]{3,8}").expect("Valid hex color regex"),
Regex::new(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}").expect("Valid email regex"),
Regex::new(r"/[^\s]*").expect("Valid Unix path regex"),
Regex::new(r"[A-Za-z]:\\[^\s]*").expect("Valid Windows path regex"),
Regex::new(r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}")
.expect("Valid UUID regex"),
Regex::new(r"[A-Za-z0-9+/]{20,}={0,2}").expect("Valid Base64 regex"),
Regex::new(r"\b[0-9a-fA-F]{7,40}\b").expect("Valid git hash regex"),
Regex::new(r"\[([^\]]+)\]\(([^)]+)\)").expect("Valid markdown link regex"),
];
}
pub fn get_default_skip_patterns() -> &'static Vec<Regex> {
&DEFAULT_SKIP_PATTERNS
}
pub fn compile_user_patterns(patterns: &[String]) -> Result<Vec<Regex>, regex::Error> {
patterns.iter().map(|pattern| Regex::new(pattern)).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_url_pattern() {
let patterns = get_default_skip_patterns();
let url_pattern = &patterns[0];
assert!(url_pattern.is_match("https://www.example.com"));
assert!(url_pattern.is_match("http://github.com/user/repo"));
assert!(!url_pattern.is_match("not a url"));
}
#[test]
fn test_hex_color_pattern() {
let patterns = get_default_skip_patterns();
let hex_pattern = &patterns[1];
assert!(hex_pattern.is_match("#deadbeef"));
assert!(hex_pattern.is_match("#fff"));
assert!(hex_pattern.is_match("#123456"));
assert!(!hex_pattern.is_match("deadbeef")); assert!(!hex_pattern.is_match("#gg")); }
#[test]
fn test_email_pattern() {
let patterns = get_default_skip_patterns();
let email_pattern = &patterns[2];
assert!(email_pattern.is_match("user@example.com"));
assert!(email_pattern.is_match("test.email+tag@domain.co.uk"));
assert!(!email_pattern.is_match("not an email"));
}
#[test]
fn test_compile_user_patterns() {
let user_patterns = vec![
r"\b[A-Z]{2,}\b".to_string(), r"TODO:.*".to_string(), ];
let compiled = compile_user_patterns(&user_patterns).unwrap();
assert_eq!(compiled.len(), 2);
assert!(compiled[0].is_match("HTML"));
assert!(compiled[1].is_match("TODO: fix this"));
}
#[test]
fn test_invalid_user_pattern() {
let invalid_patterns = vec![r"[invalid".to_string()];
assert!(compile_user_patterns(&invalid_patterns).is_err());
}
}