Skip to content

Commit c7711e5

Browse files
committed
Add language to Item::CodeBlock in markdown
1 parent f8c71a2 commit c7711e5

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

examples/markdown/src/main.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use iced::highlighter;
66
use iced::task;
77
use iced::time::{self, milliseconds, Instant};
88
use iced::widget::{
9-
self, button, center_x, horizontal_space, hover, image, markdown, pop,
10-
right, row, scrollable, text_editor, toggler,
9+
self, button, center_x, container, horizontal_space, hover, image,
10+
markdown, pop, right, row, scrollable, text_editor, toggler,
1111
};
1212
use iced::window;
1313
use iced::{Animation, Element, Fill, Font, Subscription, Task, Theme};
@@ -294,20 +294,22 @@ impl<'a> markdown::Viewer<'a, Message> for CustomViewer<'a> {
294294
fn code_block(
295295
&self,
296296
settings: markdown::Settings,
297+
_language: Option<&'a str>,
297298
code: &'a str,
298299
lines: &'a [markdown::Text],
299300
) -> Element<'a, Message> {
300301
let code_block =
301-
markdown::code_block(settings, code, lines, Message::LinkClicked);
302+
markdown::code_block(settings, lines, Message::LinkClicked);
303+
304+
let copy = button(icon::copy().size(12))
305+
.padding(2)
306+
.on_press_with(|| Message::Copy(code.to_owned()))
307+
.style(button::text);
302308

303309
hover(
304310
code_block,
305-
right(
306-
button(icon::copy().size(12))
307-
.padding(settings.spacing / 2)
308-
.on_press_with(|| Message::Copy(code.to_owned()))
309-
.style(button::text),
310-
),
311+
right(container(copy).style(container::dark))
312+
.padding(settings.spacing / 2),
311313
)
312314
}
313315
}

widget/src/markdown.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ pub enum Item {
184184
///
185185
/// You can enable the `highlighter` feature for syntax highlighting.
186186
CodeBlock {
187+
/// The language of the code block, if any.
188+
language: Option<String>,
187189
/// The raw code of the code block.
188190
code: String,
189191
/// The styled lines of text in the code block.
@@ -464,6 +466,7 @@ fn parse_with<'a>(
464466

465467
let mut spans = Vec::new();
466468
let mut code = String::new();
469+
let mut code_language = None;
467470
let mut code_lines = Vec::new();
468471
let mut strong = false;
469472
let mut emphasis = false;
@@ -603,7 +606,7 @@ fn parse_with<'a>(
603606
None
604607
}
605608
pulldown_cmark::Tag::CodeBlock(
606-
pulldown_cmark::CodeBlockKind::Fenced(_language),
609+
pulldown_cmark::CodeBlockKind::Fenced(language),
607610
) if !metadata && !table => {
608611
#[cfg(feature = "highlighter")]
609612
{
@@ -613,16 +616,19 @@ fn parse_with<'a>(
613616
.highlighter
614617
.take()
615618
.filter(|highlighter| {
616-
highlighter.language == _language.as_ref()
619+
highlighter.language == language.as_ref()
617620
})
618-
.unwrap_or_else(|| Highlighter::new(&_language));
621+
.unwrap_or_else(|| Highlighter::new(&language));
619622

620623
highlighter.prepare();
621624

622625
highlighter
623626
});
624627
}
625628

629+
code_language =
630+
(!language.is_empty()).then(|| language.into_string());
631+
626632
let prev = if spans.is_empty() {
627633
None
628634
} else {
@@ -734,6 +740,7 @@ fn parse_with<'a>(
734740
state.borrow_mut(),
735741
&mut stack,
736742
Item::CodeBlock {
743+
language: code_language.take(),
737744
code: mem::take(&mut code),
738745
lines: code_lines.drain(..).collect(),
739746
},
@@ -1029,9 +1036,11 @@ where
10291036
viewer.heading(settings, level, text, index)
10301037
}
10311038
Item::Paragraph(text) => viewer.paragraph(settings, text),
1032-
Item::CodeBlock { code, lines } => {
1033-
viewer.code_block(settings, code, lines)
1034-
}
1039+
Item::CodeBlock {
1040+
language,
1041+
code,
1042+
lines,
1043+
} => viewer.code_block(settings, language.as_deref(), code, lines),
10351044
Item::List { start: None, items } => {
10361045
viewer.unordered_list(settings, items)
10371046
}
@@ -1171,7 +1180,6 @@ where
11711180
/// Displays a code block using the default look.
11721181
pub fn code_block<'a, Message, Theme, Renderer>(
11731182
settings: Settings,
1174-
_code: &'a str,
11751183
lines: &'a [Text],
11761184
on_link_click: impl Fn(Url) -> Message + Clone + 'a,
11771185
) -> Element<'a, Message, Theme, Renderer>
@@ -1266,10 +1274,14 @@ where
12661274
fn code_block(
12671275
&self,
12681276
settings: Settings,
1277+
language: Option<&'a str>,
12691278
code: &'a str,
12701279
lines: &'a [Text],
12711280
) -> Element<'a, Message, Theme, Renderer> {
1272-
code_block(settings, code, lines, Self::on_link_click)
1281+
let _language = language;
1282+
let _code = code;
1283+
1284+
code_block(settings, lines, Self::on_link_click)
12731285
}
12741286

12751287
/// Displays an unordered list.

0 commit comments

Comments
 (0)