From c7711e59ab74f9cd5a31229b8fc4191ca1322917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Wed, 5 Feb 2025 01:33:16 +0100 Subject: [PATCH] Add `language` to `Item::CodeBlock` in `markdown` --- examples/markdown/src/main.rs | 20 +++++++++++--------- widget/src/markdown.rs | 28 ++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/examples/markdown/src/main.rs b/examples/markdown/src/main.rs index 20957bcd13..512d4b44d6 100644 --- a/examples/markdown/src/main.rs +++ b/examples/markdown/src/main.rs @@ -6,8 +6,8 @@ use iced::highlighter; use iced::task; use iced::time::{self, milliseconds, Instant}; use iced::widget::{ - self, button, center_x, horizontal_space, hover, image, markdown, pop, - right, row, scrollable, text_editor, toggler, + self, button, center_x, container, horizontal_space, hover, image, + markdown, pop, right, row, scrollable, text_editor, toggler, }; use iced::window; use iced::{Animation, Element, Fill, Font, Subscription, Task, Theme}; @@ -294,20 +294,22 @@ impl<'a> markdown::Viewer<'a, Message> for CustomViewer<'a> { fn code_block( &self, settings: markdown::Settings, + _language: Option<&'a str>, code: &'a str, lines: &'a [markdown::Text], ) -> Element<'a, Message> { let code_block = - markdown::code_block(settings, code, lines, Message::LinkClicked); + markdown::code_block(settings, lines, Message::LinkClicked); + + let copy = button(icon::copy().size(12)) + .padding(2) + .on_press_with(|| Message::Copy(code.to_owned())) + .style(button::text); hover( code_block, - right( - button(icon::copy().size(12)) - .padding(settings.spacing / 2) - .on_press_with(|| Message::Copy(code.to_owned())) - .style(button::text), - ), + right(container(copy).style(container::dark)) + .padding(settings.spacing / 2), ) } } diff --git a/widget/src/markdown.rs b/widget/src/markdown.rs index ba4860d410..7ae89368d0 100644 --- a/widget/src/markdown.rs +++ b/widget/src/markdown.rs @@ -184,6 +184,8 @@ pub enum Item { /// /// You can enable the `highlighter` feature for syntax highlighting. CodeBlock { + /// The language of the code block, if any. + language: Option, /// The raw code of the code block. code: String, /// The styled lines of text in the code block. @@ -464,6 +466,7 @@ fn parse_with<'a>( let mut spans = Vec::new(); let mut code = String::new(); + let mut code_language = None; let mut code_lines = Vec::new(); let mut strong = false; let mut emphasis = false; @@ -603,7 +606,7 @@ fn parse_with<'a>( None } pulldown_cmark::Tag::CodeBlock( - pulldown_cmark::CodeBlockKind::Fenced(_language), + pulldown_cmark::CodeBlockKind::Fenced(language), ) if !metadata && !table => { #[cfg(feature = "highlighter")] { @@ -613,9 +616,9 @@ fn parse_with<'a>( .highlighter .take() .filter(|highlighter| { - highlighter.language == _language.as_ref() + highlighter.language == language.as_ref() }) - .unwrap_or_else(|| Highlighter::new(&_language)); + .unwrap_or_else(|| Highlighter::new(&language)); highlighter.prepare(); @@ -623,6 +626,9 @@ fn parse_with<'a>( }); } + code_language = + (!language.is_empty()).then(|| language.into_string()); + let prev = if spans.is_empty() { None } else { @@ -734,6 +740,7 @@ fn parse_with<'a>( state.borrow_mut(), &mut stack, Item::CodeBlock { + language: code_language.take(), code: mem::take(&mut code), lines: code_lines.drain(..).collect(), }, @@ -1029,9 +1036,11 @@ where viewer.heading(settings, level, text, index) } Item::Paragraph(text) => viewer.paragraph(settings, text), - Item::CodeBlock { code, lines } => { - viewer.code_block(settings, code, lines) - } + Item::CodeBlock { + language, + code, + lines, + } => viewer.code_block(settings, language.as_deref(), code, lines), Item::List { start: None, items } => { viewer.unordered_list(settings, items) } @@ -1171,7 +1180,6 @@ where /// Displays a code block using the default look. pub fn code_block<'a, Message, Theme, Renderer>( settings: Settings, - _code: &'a str, lines: &'a [Text], on_link_click: impl Fn(Url) -> Message + Clone + 'a, ) -> Element<'a, Message, Theme, Renderer> @@ -1266,10 +1274,14 @@ where fn code_block( &self, settings: Settings, + language: Option<&'a str>, code: &'a str, lines: &'a [Text], ) -> Element<'a, Message, Theme, Renderer> { - code_block(settings, code, lines, Self::on_link_click) + let _language = language; + let _code = code; + + code_block(settings, lines, Self::on_link_click) } /// Displays an unordered list.