85 lines
2.5 KiB
Rust
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
|
||
|
}
|