diff --git a/crates/markdown_preview/src/markdown_parser.rs b/crates/markdown_preview/src/markdown_parser.rs index 86bf7e94b4f8be6b7724b9e95b2583127861fff3..ba02a00932320e5ac5bb1ac1cd922e78e1f9c7e5 100644 --- a/crates/markdown_preview/src/markdown_parser.rs +++ b/crates/markdown_preview/src/markdown_parser.rs @@ -880,6 +880,10 @@ impl<'a> MarkdownParser<'a> { contents: paragraph, })); } + } else if local_name!("blockquote") == name.local { + if let Some(blockquote) = self.extract_html_blockquote(node, source_range) { + elements.push(ParsedMarkdownElement::BlockQuote(blockquote)); + } } else if local_name!("table") == name.local { if let Some(table) = self.extract_html_table(node, source_range) { elements.push(ParsedMarkdownElement::Table(table)); @@ -1002,6 +1006,24 @@ impl<'a> MarkdownParser<'a> { Some(image) } + fn extract_html_blockquote( + &self, + node: &Rc, + source_range: Range, + ) -> Option { + let mut children = Vec::new(); + self.consume_children(source_range.clone(), node, &mut children); + + if children.is_empty() { + None + } else { + Some(ParsedMarkdownBlockQuote { + children, + source_range, + }) + } + } + fn extract_html_table( &self, node: &Rc, @@ -1410,6 +1432,61 @@ mod tests { ); } + #[gpui::test] + async fn test_html_block_quote() { + let parsed = parse( + "
+

some description

+
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![block_quote( + vec![ParsedMarkdownElement::Paragraph(text( + "some description", + 0..76 + ))], + 0..76, + )] + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_nested_block_quote() { + let parsed = parse( + "
+

some description

+
+

second description

+
+
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![block_quote( + vec![ + ParsedMarkdownElement::Paragraph(text("some description", 0..173)), + block_quote( + vec![ParsedMarkdownElement::Paragraph(text( + "second description", + 0..173 + ))], + 0..173, + ) + ], + 0..173, + )] + }, + parsed + ); + } + #[gpui::test] async fn test_html_table() { let parsed = parse(