38 lines
1.0 KiB
Rust
38 lines
1.0 KiB
Rust
use lazy_static::lazy_static;
|
|
use regex::Regex;
|
|
|
|
use super::ast::DiscordComponent;
|
|
|
|
pub fn parse_link(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> {
|
|
lazy_static! {
|
|
static ref LINK: Regex =
|
|
Regex::new(r#"^((?:https?|steam)://[^\s<]+[^<.,:;"'\]\s])"#).unwrap();
|
|
}
|
|
|
|
if let Some(caps) = LINK.captures(text) {
|
|
let mut link_range = caps.get(0).unwrap().range();
|
|
let orig_link = &text[link_range.clone()];
|
|
|
|
if orig_link.ends_with(')') {
|
|
let mut bracket_balance: i16 = 0;
|
|
for c in orig_link.chars() {
|
|
if c == '(' {
|
|
bracket_balance -= 1;
|
|
} else if c == ')' {
|
|
bracket_balance += 1;
|
|
}
|
|
}
|
|
|
|
if bracket_balance > 0 {
|
|
link_range = link_range.start..(link_range.end - 1);
|
|
}
|
|
}
|
|
|
|
let link = &text[link_range];
|
|
return Some((DiscordComponent::Link(link), link.len()));
|
|
}
|
|
|
|
// TODO(Charlotte): Parse links
|
|
None
|
|
}
|