From 279677eb5c57e63b76d97da00f7158636f5014d7 Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Wed, 17 Apr 2024 23:31:20 +0200 Subject: [PATCH] convert emojis --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + src/text/md.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 159ab8d..c4ca2ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,6 +242,15 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "emojis" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee61eb945bff65ee7d19d157d39c67c33290ff0742907413fd5eefd29edc979" +dependencies = [ + "phf", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -861,6 +870,7 @@ version = "0.1.0" dependencies = [ "aho-corasick", "chrono", + "emojis", "glob", "grass", "gray_matter", diff --git a/Cargo.toml b/Cargo.toml index 56b9ffc..08539b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] aho-corasick = "1.1.3" chrono = "0.4.35" +emojis = "0.6.1" glob = "0.3.1" grass = { version = "0.13.2", default-features = false, features = ["random"] } gray_matter = { version = "0.2.6", default-features = false, features = ["yaml"] } diff --git a/src/text/md.rs b/src/text/md.rs index 0779144..b7ae90e 100644 --- a/src/text/md.rs +++ b/src/text/md.rs @@ -35,6 +35,7 @@ static KATEX_B: Lazy = Lazy::new(|| pub fn parse(text: &str) -> String { let stream = Parser::new_ext(text, *OPTS) .map(make_math) + .map(make_emoji) .collect::>(); let stream = make_code(stream) @@ -99,3 +100,32 @@ fn make_ruby(event: Event) -> Vec { _ => vec![event], } } + +fn make_emoji(event: Event) -> Event { + match event { + Event::Text(ref text) => { + let mut buf = None; + let mut top = 0; + let mut old = 0; + + for (idx, _) in text.match_indices(':') { + let key = &text[old..idx]; + + if let Some(emoji) = emojis::get_by_shortcode(key) { + let buf = buf.get_or_insert_with(|| String::with_capacity(text.len())); + buf.push_str(&text[top..old-1]); + buf.push_str(emoji.as_str()); + top = idx; + } + + old = idx + 1; + } + + match buf { + None => event, + Some(buf) => Event::Text(buf.into()) + } + }, + _ => event, + } +}