Annotation For src/utils.rs
Logged in as anonymous

Origin for each line in src/utils.rs from check-in c996f5c871:

f5ed284f8c 2025-06-21    1: use crate::Cursor;
f5ed284f8c 2025-06-21    2: 
f5ed284f8c 2025-06-21    3: use lazy_static::lazy_static;
f5ed284f8c 2025-06-21    4: use regex::Regex;
0f47e23e21 2026-01-12    5: use scraper::Html;
0f47e23e21 2026-01-12    6: use stacked_errors::{
0f47e23e21 2026-01-12    7: 	bail,
0f47e23e21 2026-01-12    8: 	Result,
0f47e23e21 2026-01-12    9: };
f5ed284f8c 2025-06-21   10: 
f5ed284f8c 2025-06-21   11: lazy_static! {
f5ed284f8c 2025-06-21   12: 	pub static ref RE_SPECIAL: Regex = Regex::new(r"([\-_*\[\]()~`>#+|{}\.!])").unwrap();
f5ed284f8c 2025-06-21   13: 	pub static ref RE_DOMAIN: Regex = Regex::new(r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$").unwrap();
f5ed284f8c 2025-06-21   14: }
f5ed284f8c 2025-06-21   15: 
f5ed284f8c 2025-06-21   16: /// `Attachment` object to store number attachment data and corresponding file name
f5ed284f8c 2025-06-21   17: #[derive(Debug)]
f5ed284f8c 2025-06-21   18: pub struct Attachment {
f5ed284f8c 2025-06-21   19: 	pub data: Cursor<Vec<u8>>,
f5ed284f8c 2025-06-21   20: 	pub name: String,
0f47e23e21 2026-01-12   21: }
0f47e23e21 2026-01-12   22: 
0f47e23e21 2026-01-12   23: /// Pass any text here to be validated as HTML, breaks on validation errors
0f47e23e21 2026-01-12   24: pub fn validate (text: &str) -> Result<&str> {
0f47e23e21 2026-01-12   25: 	let fragment = Html::parse_fragment(text);
0f47e23e21 2026-01-12   26: 	if !fragment.errors.is_empty() {
0f47e23e21 2026-01-12   27: 		bail!(fragment.errors.join("\n"));
0f47e23e21 2026-01-12   28: 	}
c996f5c871 2026-01-12   29: 	Ok(text)
f5ed284f8c 2025-06-21   30: }