discord-message-format/src/parse_inline_style.rs

85 lines
2.5 KiB
Rust

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<inner>.+?)\*\*").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<inner>.+?)_").unwrap();
static ref ITALIC_ASTERISK: Regex = Regex::new(r"^\*(?P<inner>.+?)\*").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<inner>.+?)~~").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<inner>.+?)__").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<inner>.+?)\|\|").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
}