diff --git a/.gitignore b/.gitignore index ac00b3a..1904e5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ target dist result +.envrc +.direnv diff --git a/Cargo.lock b/Cargo.lock index aff16da..e6521be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -613,9 +613,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gloo-net" @@ -686,9 +686,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "html-escape" @@ -780,7 +780,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] @@ -856,9 +856,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "leptos" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98f0fe11faa66358ff8c2ee48881c54f8f216ecddabfc5b69cdc2e90c8e337b" +checksum = "e21fa20494987b6c5522a150c4075770fda9085c1ba714856015530e63b7180e" dependencies = [ "cfg-if", "leptos_config", @@ -885,9 +885,9 @@ dependencies = [ [[package]] name = "leptos_config" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f0e1a9a583d943b19c740c82a3ec69224c979af90f40738d93ec59ee1475bb" +checksum = "22604a419f1c6eb8fb0e2ab3563b23a53500f942b09cbeddc5bfa8f223bf839a" dependencies = [ "config", "regex", @@ -898,9 +898,9 @@ dependencies = [ [[package]] name = "leptos_dom" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111391d1ccbc3355344f90f0893f4137db13a7f98d53fede0a3613c522ebaf19" +checksum = "a89ef6c9802c3f3b94286c88b0c18299bad87f9ce8559a6b8e8f64bd70d4df8f" dependencies = [ "async-recursion", "cfg-if", @@ -928,9 +928,9 @@ dependencies = [ [[package]] name = "leptos_hot_reload" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6902fabee84955a85a6cdebf8ddfbfb134091087b172e32ebb26e571d4640ca" +checksum = "fce5cdf38f701bed1ea8ce7f09840a1d8d18ad2401a74bed1b67c1a729005a82" dependencies = [ "anyhow", "camino", @@ -946,9 +946,9 @@ dependencies = [ [[package]] name = "leptos_macro" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68201041cc5af68f7eb35015336827a36c543d87dcf2403117d7244db1f14a0" +checksum = "26347fd31cea6d93f7facdae0d9abfc302ee2f6f1df75132831b85d26b8192ad" dependencies = [ "attribute-derive", "cfg-if", @@ -969,9 +969,9 @@ dependencies = [ [[package]] name = "leptos_reactive" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282e84ae3e3eb30ab1eb1c881bfeea8a3cb6d6c683dc99f26f2f69ee240b148d" +checksum = "3eb42529421c5777d2045e2e6b5809fc1f568eeacc2e4f88cc8d7b24651842a7" dependencies = [ "base64", "cfg-if", @@ -996,9 +996,9 @@ dependencies = [ [[package]] name = "leptos_server" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67f3810352bab860bcfa85f1760de4bd6e82cd72b14a97779d9168d37661bbf" +checksum = "38a65659b37d296ce80518c84168cb62057256bb99a85669304a8025b48cbced" dependencies = [ "inventory", "lazy_static", @@ -1317,9 +1317,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -1556,7 +1556,7 @@ dependencies = [ [[package]] name = "rust-web-markdown" version = "0.1.0" -source = "git+https://github.com/rambip/rust-web-markdown/#0629ab179f1d376fa8f6e6086ae8d7219f987885" +source = "git+https://github.com/rambip/rust-web-markdown/#137a1d47542929c919309ac3364ebf08104a80fc" dependencies = [ "katex", "lazy_static", @@ -1683,9 +1683,9 @@ dependencies = [ [[package]] name = "server_fn" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0186f969a1f9572af27159b8273252abf9a6a38934130fe6f3ae0e439d48cf14" +checksum = "91803d0fe7d4edae5c8a01d18201a301c39b5743859916f62813f1ce3cdd9963" dependencies = [ "ciborium", "const_format", @@ -1707,9 +1707,9 @@ dependencies = [ [[package]] name = "server_fn_macro" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbc70e4f185ff2b5c11f02a91baf830f33e456e0571d0680d1d76999ed242ed" +checksum = "6d48924ee63629b7bd3a40e54d860e85409fbc6309d9976f56aa09ff3e0ee814" dependencies = [ "const_format", "proc-macro-error", @@ -1722,9 +1722,9 @@ dependencies = [ [[package]] name = "server_fn_macro_default" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aaf8cf1f5dde82d3f37548732a4852f65d5279b4ae40add5a2a3c9e559f662" +checksum = "87efab27df8d2a86033c07c937c83d9ad9ef71b915d2a91eba1566814ffc0e87" dependencies = [ "server_fn_macro", "syn 2.0.39", @@ -2016,18 +2016,18 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "typed-builder" -version = "0.16.2" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34085c17941e36627a879208083e25d357243812c30e7d7387c3b954f30ade16" +checksum = "e47c0496149861b7c95198088cbf36645016b1a0734cf350c50e2a38e070f38a" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.16.2" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03ca4cb38206e2bef0700092660bb74d696f808514dae47fa1467cbfe26e96e" +checksum = "982ee4197351b5c9782847ef5ec1fdcaf50503fb19d68f9771adae314e72b492" dependencies = [ "proc-macro2", "quote", diff --git a/src/lib.rs b/src/lib.rs index e43234c..c64e02f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,13 @@ use rust_web_markdown::{ render_markdown, ElementAttributes, HtmlElement, Context, - MdComponentProps as VMdComponentProps + MdComponentProps as VMdComponentProps, + CowStr }; pub type MdComponentProps = VMdComponentProps; pub use rust_web_markdown::{ - LinkDescription, MarkdownMouseEvent, Options, + LinkDescription, Options, }; use web_sys::MouseEvent; @@ -15,6 +16,7 @@ use leptos::*; use leptos::html::AnyElement; use std::collections::HashMap; +use core::ops::Range; #[cfg(feature="debug")] @@ -24,6 +26,18 @@ pub mod debug { pub struct EventInfo(pub WriteSignal>); } +#[derive(Clone, Debug)] +pub struct MarkdownMouseEvent { + /// the original mouse event triggered when a text element was clicked on + pub mouse_event: MouseEvent, + + /// the corresponding range in the markdown source, as a slice of [`u8`][u8] + pub position: Range, + + // TODO: add a clonable tag for the type of the element + // pub tag: pulldown_cmark::Tag<'a>, +} + impl<'a> Context<'a, 'static> for &'a __MdProps { type View = View; @@ -39,7 +53,6 @@ impl<'a> Context<'a, 'static> for &'a __MdProps { frontmatter: self.frontmatter.as_ref(), hard_line_breaks: self.hard_line_breaks.get(), wikilinks: self.wikilinks.get(), - on_click: self.on_click.as_ref(), parse_options: self.parse_options.as_ref(), render_links: self.render_links.as_ref(), theme: self.theme.as_deref(), @@ -133,15 +146,15 @@ impl<'a> Context<'a, 'static> for &'a __MdProps { children.into_iter().collect() } - fn el_a(self, children: Self::View, href: &str) -> Self::View { + fn el_a(self, children: Self::View, href: String) -> Self::View { view! {{children}}.into_view() } - fn el_img(self, src: &str, alt: &str) -> Self::View { + fn el_img(self, src: String, alt: String) -> Self::View { view! {{alt.to_string()}/}.into_view() } - fn el_text(self, text: &str) -> Self::View { + fn el_text(self, text: CowStr<'a>) -> Self::View { text.to_string().into_view() } @@ -192,6 +205,25 @@ impl<'a> Context<'a, 'static> for &'a __MdProps { ) -> Self::Handler { Callback::new(f) } + + fn make_md_handler(self, position: Range, stop_propagation: bool) -> Self::Handler { + match self.on_click { + Some(f) => { + let position = position.clone(); + Callback::new(move |e: MouseEvent| { + if stop_propagation { + e.stop_propagation() + } + let report = MarkdownMouseEvent { + position: position.clone(), + mouse_event: e + }; + Callable::call(&f, report) + }) + } + None => Callback::new(move |_| ()) + } + } }