discord-message-format/src/parse_link.rs

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
}