mlem/src/emoji.rs

46 lines
1.5 KiB
Rust
Raw Normal View History

2024-04-02 21:48:02 +02:00
use regex::Regex;
use std::{ffi::OsString, fs::read_dir};
pub fn emoji_pass(
markdown: &str,
2024-04-08 17:45:35 +02:00
emoji_web_directory: &Option<String>,
emoji_local_directory: &Option<String>,
2024-04-02 21:48:02 +02:00
) -> String {
2024-04-08 17:45:35 +02:00
if emoji_web_directory.is_none() | emoji_local_directory.is_none() {
return markdown.to_string();
}
2024-04-02 21:48:02 +02:00
let mut markdown = markdown.to_owned();
let re_emojis = Regex::new(r":\w+:").unwrap();
for emoji in re_emojis.find_iter(&markdown.clone()) {
let emoji_file_name =
2024-04-08 17:45:35 +02:00
get_emoji_file_name(&get_emoji_name(emoji.as_str()), &emoji_local_directory.as_ref().unwrap());
2024-04-02 21:48:02 +02:00
if emoji_file_name.is_none() {
continue;
}
let html_string = format!(
2024-04-08 17:45:35 +02:00
"<img class=\"emoji\" src=\"{}/{}\"><img>",
emoji_web_directory.as_ref().unwrap(),
2024-04-02 21:48:02 +02:00
emoji_file_name.unwrap().to_str().unwrap()
);
markdown = markdown.replacen(emoji.as_str(), &html_string, 1);
}
markdown
}
fn get_emoji_name(emoji_match: &str) -> String {
emoji_match.replace(':', "")
}
fn get_emoji_file_name(emoji_name: &String, emoji_local_directory: &String) -> Option<OsString> {
let all_emojis = read_dir(emoji_local_directory).expect("Failed to read emoji dir");
for e in all_emojis {
let e = e.unwrap();
if OsString::from(emoji_name) == e.path().file_stem().unwrap() {
return Some(e.file_name());
}
}
eprintln!("WARNING: No emoji found for {emoji_name} did you add it to your emoji dir?");
None
}