summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml1
-rw-r--r--examples/markdown/src/main.rs4
-rw-r--r--widget/Cargo.toml5
-rw-r--r--widget/src/markdown.rs23
4 files changed, 24 insertions, 9 deletions
diff --git a/Cargo.toml b/Cargo.toml
index d301b36d..7eea63dd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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,