use once_cell::sync::Lazy;
use regex::Regex;
static UMD_BOLD: Lazy<Regex> = Lazy::new(|| {
Regex::new(r"''([^']{2,})''").unwrap()
});
static UMD_ITALIC: Lazy<Regex> = Lazy::new(|| {
Regex::new(r"'''([^']+)'''").unwrap()
});
pub fn apply_umd_emphasis(html: &str) -> String {
let result = UMD_ITALIC.replace_all(html, "<i>$1</i>");
let result = UMD_BOLD.replace_all(&result, "<b>$1</b>");
result.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_umd_bold() {
let input = "This is ''bold'' text.";
let output = apply_umd_emphasis(input);
assert_eq!(output, "This is <b>bold</b> text.");
}
#[test]
fn test_umd_italic() {
let input = "This is '''italic''' text.";
let output = apply_umd_emphasis(input);
assert_eq!(output, "This is <i>italic</i> text.");
}
#[test]
fn test_umd_both() {
let input = "''bold'' and '''italic'''";
let output = apply_umd_emphasis(input);
assert!(output.contains("<b>bold</b>"));
assert!(output.contains("<i>italic</i>"));
}
#[test]
fn test_discord_underline() {
let input = "This is {{UNDERLINE:underlined:UNDERLINE}} text.";
let output = apply_umd_emphasis(input);
assert!(output.contains("{{UNDERLINE:underlined:UNDERLINE}}"));
}
#[test]
fn test_strong_remains_strong() {
let input = "<strong>emphasis</strong>";
let output = apply_umd_emphasis(input);
assert_eq!(output, "<strong>emphasis</strong>");
}
#[test]
fn test_all_emphasis_types() {
let input = "''bold'' and '''italic'''";
let output = apply_umd_emphasis(input);
assert!(output.contains("<b>bold</b>"));
assert!(output.contains("<i>italic</i>"));
}
#[test]
fn test_no_false_matches() {
let input = "Don't match this: 'single' or four";
let output = apply_umd_emphasis(input);
assert_eq!(output, input);
}
}