diff --git a/Cargo.lock b/Cargo.lock index cd2894a..c19a7e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1534,6 +1534,15 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "linkify" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dfa36d52c581e9ec783a7ce2a5e0143da6237be5811a0b3153fedfdbe9f780" +dependencies = [ + "memchr", +] + [[package]] name = "lnurl-pay" version = "0.3.0" @@ -1762,6 +1771,7 @@ version = "0.1.5" dependencies = [ "axum 0.7.5", "clap", + "linkify", "nostr-sdk", "rss", "serde", diff --git a/Cargo.toml b/Cargo.toml index d736206..18392f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,4 @@ tracing = "0.1.40" tower-http = { version = "0.5.2", features = ["tracing", "trace"] } service_conventions = "0.0.14" +linkify = "0.10.0" diff --git a/src/lib.rs b/src/lib.rs index 53809bb..262b12d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ use nostr_sdk::prelude::*; use rss::{Guid, Item, ItemBuilder}; pub fn event_to_item(e: Event) -> Item { - let c = e.content.clone(); + let c = linkify_content(e.content.clone()); let mut guid = Guid::default(); let event_bech32 = e.id.to_bech32().unwrap(); let event_link = format!("https://snort.social/e/{event_bech32}"); @@ -25,6 +25,19 @@ fn event_is_reply(e: &Event) -> bool { }) } +pub fn linkify_content(content: String) -> String { + let finder = linkify::LinkFinder::new(); + let links: Vec<_> = finder.links(&content).collect(); + let mut new_content = content.clone(); + + for l in links { + let link_str = l.as_str(); + let anchor = format!("{link_str}"); + new_content = new_content.replace(link_str, &anchor); + } + new_content +} + pub fn filter_out_replies(v: Vec) -> Vec { return v.into_iter().filter(|e| !event_is_reply(&e)).collect(); }