From f830454ffad1cf60f1d6e56fe95514af96848a64 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector@hecrj.dev>
Date: Sun, 21 Jul 2024 18:16:32 +0200
Subject: Use `url` for `markdown` links

---
 widget/src/markdown.rs | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

(limited to 'widget/src/markdown.rs')

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,
-- 
cgit