use lazy_static::lazy_static; use regex::Regex; use super::ast::DiscordComponent; use super::parse_basic::parse; pub fn parse_bold(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> { lazy_static! { static ref BOLD: Regex = Regex::new(r"^\*\*(?P.+?)\*\*").unwrap(); } if let Some(caps) = BOLD.captures(text) { let inner = caps.name("inner").unwrap().as_str(); let whole_len = caps.get(0).unwrap().as_str().len(); return Some((DiscordComponent::Bold(parse(inner)), whole_len)); } None } pub fn parse_italic(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> { lazy_static! { static ref ITALIC_UNDERSCORE: Regex = Regex::new(r"^_(?P.+?)_").unwrap(); static ref ITALIC_ASTERISK: Regex = Regex::new(r"^\*(?P.+?)\*").unwrap(); } if let Some(caps) = ITALIC_UNDERSCORE .captures(text) .or_else(|| ITALIC_ASTERISK.captures(text)) { let inner = caps.name("inner").unwrap().as_str(); let whole_len = caps.get(0).unwrap().as_str().len(); return Some((DiscordComponent::Italic(parse(inner)), whole_len)); } None } pub fn parse_strikethrough(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> { lazy_static! { static ref STRIKETHROUGH: Regex = Regex::new(r"^~~(?P.+?)~~").unwrap(); } if let Some(caps) = STRIKETHROUGH.captures(text) { let inner = caps.name("inner").unwrap().as_str(); let whole_len = caps.get(0).unwrap().as_str().len(); return Some((DiscordComponent::Strikethrough(parse(inner)), whole_len)); } None } pub fn parse_underline(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> { lazy_static! { static ref UNDERLINE: Regex = Regex::new(r"^__(?P.+?)__").unwrap(); } if let Some(caps) = UNDERLINE.captures(text) { let inner = caps.name("inner").unwrap().as_str(); let whole_len = caps.get(0).unwrap().as_str().len(); return Some((DiscordComponent::Underline(parse(inner)), whole_len)); } None } pub fn parse_spoiler(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> { lazy_static! { static ref SPOILER: Regex = Regex::new(r"^\|\|(?P.+?)\|\|").unwrap(); } if let Some(caps) = SPOILER.captures(text) { let inner = caps.name("inner").unwrap().as_str(); let whole_len = caps.get(0).unwrap().as_str().len(); return Some((DiscordComponent::Spoiler(parse(inner)), whole_len)); } None }