diff options
author | 2024-07-21 18:16:32 +0200 | |
---|---|---|
committer | 2024-07-21 18:16:32 +0200 | |
commit | f830454ffad1cf60f1d6e56fe95514af96848a64 (patch) | |
tree | acbecbb810bbd4a498daabcf5ca9839520474f5a | |
parent | 5443e4d8289873895587d856dbcf46f980bda6ab (diff) | |
download | iced-f830454ffad1cf60f1d6e56fe95514af96848a64.tar.gz iced-f830454ffad1cf60f1d6e56fe95514af96848a64.tar.bz2 iced-f830454ffad1cf60f1d6e56fe95514af96848a64.zip |
Use `url` for `markdown` links
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | examples/markdown/src/main.rs | 4 | ||||
-rw-r--r-- | widget/Cargo.toml | 5 | ||||
-rw-r--r-- | widget/src/markdown.rs | 23 |
4 files changed, 24 insertions, 9 deletions
@@ -172,6 +172,7 @@ tiny-skia = "0.11" tokio = "1.0" tracing = "0.1" unicode-segmentation = "1.0" +url = "2.5" wasm-bindgen-futures = "0.4" wasm-timer = "0.2" web-sys = "=0.3.67" diff --git a/examples/markdown/src/main.rs b/examples/markdown/src/main.rs index ee5b5aab..47fcfc72 100644 --- a/examples/markdown/src/main.rs +++ b/examples/markdown/src/main.rs @@ -16,7 +16,7 @@ struct Markdown { #[derive(Debug, Clone)] enum Message { Edit(text_editor::Action), - LinkClicked(String), + LinkClicked(markdown::Url), } impl Markdown { @@ -52,7 +52,7 @@ impl Markdown { } } Message::LinkClicked(link) => { - let _ = open::that_in_background(link); + let _ = open::that_in_background(link.to_string()); } } } diff --git a/widget/Cargo.toml b/widget/Cargo.toml index 2f483b79..98a81145 100644 --- a/widget/Cargo.toml +++ b/widget/Cargo.toml @@ -24,7 +24,7 @@ svg = ["iced_renderer/svg"] canvas = ["iced_renderer/geometry"] qr_code = ["canvas", "dep:qrcode"] wgpu = ["iced_renderer/wgpu"] -markdown = ["dep:pulldown-cmark"] +markdown = ["dep:pulldown-cmark", "dep:url"] highlighter = ["dep:iced_highlighter"] advanced = [] @@ -49,3 +49,6 @@ pulldown-cmark.optional = true iced_highlighter.workspace = true iced_highlighter.optional = true + +url.workspace = true +url.optional = true diff --git a/widget/src/markdown.rs b/widget/src/markdown.rs index ae4020bc..1df35036 100644 --- a/widget/src/markdown.rs +++ b/widget/src/markdown.rs @@ -10,17 +10,19 @@ use crate::core::theme::{self, Theme}; use crate::core::{self, Element, Length}; use crate::{column, container, rich_text, row, span, text}; +pub use url::Url; + /// A Markdown item. #[derive(Debug, Clone)] pub enum Item { /// A heading. - Heading(Vec<text::Span<'static, String>>), + Heading(Vec<text::Span<'static, Url>>), /// A paragraph. - Paragraph(Vec<text::Span<'static, String>>), + Paragraph(Vec<text::Span<'static, Url>>), /// A code block. /// /// You can enable the `highlighter` feature for syntax highligting. - CodeBlock(Vec<text::Span<'static, String>>), + CodeBlock(Vec<text::Span<'static, Url>>), /// A list. List { /// The first number of the list, if it is ordered. @@ -96,7 +98,16 @@ pub fn parse( pulldown_cmark::Tag::Link { dest_url, .. } if !metadata && !table => { - link = Some(dest_url); + match Url::parse(&dest_url) { + Ok(url) + if url.scheme() == "http" + || url.scheme() == "https" => + { + link = Some(url); + } + _ => {} + } + None } pulldown_cmark::Tag::List(first_item) if !metadata && !table => { @@ -248,7 +259,7 @@ pub fn parse( }; let span = if let Some(link) = link.as_ref() { - span.color(palette.primary).link(link.to_string()) + span.color(palette.primary).link(link.clone()) } else { span }; @@ -278,7 +289,7 @@ pub fn parse( /// You can obtain the items with [`parse`]. pub fn view<'a, Message, Renderer>( items: impl IntoIterator<Item = &'a Item>, - on_link: impl Fn(String) -> Message + Copy + 'a, + on_link: impl Fn(Url) -> Message + Copy + 'a, ) -> Element<'a, Message, Theme, Renderer> where Message: 'a, |