From a078cb104c01d59442bc52f192e14807723f1278 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 10 Sep 2024 11:16:27 -0400 Subject: [PATCH] Disable definition lists in Markdown (#17648) This PR disables definition list support in `pulldown_cmark`, as it is has been causing a number of issues. I opened an issue upstream with the panic we were seeing: https://github.com/pulldown-cmark/pulldown-cmark/issues/957. Release Notes: - N/A --- crates/language/src/markdown.rs | 2 ++ crates/markdown/src/parser.rs | 5 ++++- crates/markdown_preview/src/markdown_parser.rs | 4 +++- crates/rich_text/src/rich_text.rs | 4 +++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/language/src/markdown.rs b/crates/language/src/markdown.rs index 98b9ba53b1..b9393a16ab 100644 --- a/crates/language/src/markdown.rs +++ b/crates/language/src/markdown.rs @@ -166,6 +166,7 @@ pub async fn parse_markdown_block( let mut list_stack = Vec::new(); let mut options = pulldown_cmark::Options::all(); + options.remove(pulldown_cmark::Options::ENABLE_DEFINITION_LIST); options.remove(pulldown_cmark::Options::ENABLE_YAML_STYLE_METADATA_BLOCKS); for event in Parser::new_ext(markdown, options) { @@ -384,6 +385,7 @@ public: void format(const int &, const std::tm &, int &dest) "#; let mut options = pulldown_cmark::Options::all(); + options.remove(pulldown_cmark::Options::ENABLE_DEFINITION_LIST); options.remove(pulldown_cmark::Options::ENABLE_YAML_STYLE_METADATA_BLOCKS); let parser = pulldown_cmark::Parser::new_ext(input, options); diff --git a/crates/markdown/src/parser.rs b/crates/markdown/src/parser.rs index 3dd11be983..7d349e29ef 100644 --- a/crates/markdown/src/parser.rs +++ b/crates/markdown/src/parser.rs @@ -5,10 +5,13 @@ use pulldown_cmark::{Alignment, HeadingLevel, LinkType, MetadataBlockKind, Optio use std::ops::Range; pub fn parse_markdown(text: &str) -> Vec<(Range, MarkdownEvent)> { + let mut options = Options::all(); + options.remove(pulldown_cmark::Options::ENABLE_DEFINITION_LIST); + let mut events = Vec::new(); let mut within_link = false; let mut within_metadata = false; - for (pulldown_event, mut range) in Parser::new_ext(text, Options::all()).into_offset_iter() { + for (pulldown_event, mut range) in Parser::new_ext(text, options).into_offset_iter() { if within_metadata { if let pulldown_cmark::Event::End(pulldown_cmark::TagEnd::MetadataBlock { .. }) = pulldown_event diff --git a/crates/markdown_preview/src/markdown_parser.rs b/crates/markdown_preview/src/markdown_parser.rs index 4a607f4d72..7e503fb609 100644 --- a/crates/markdown_preview/src/markdown_parser.rs +++ b/crates/markdown_preview/src/markdown_parser.rs @@ -11,7 +11,9 @@ pub async fn parse_markdown( file_location_directory: Option, language_registry: Option>, ) -> ParsedMarkdown { - let options = Options::all(); + let mut options = Options::all(); + options.remove(pulldown_cmark::Options::ENABLE_DEFINITION_LIST); + let parser = Parser::new_ext(markdown_input, options); let parser = MarkdownParser::new( parser.into_offset_iter().collect(), diff --git a/crates/rich_text/src/rich_text.rs b/crates/rich_text/src/rich_text.rs index 2c4b2ca8ee..80b7786c24 100644 --- a/crates/rich_text/src/rich_text.rs +++ b/crates/rich_text/src/rich_text.rs @@ -195,7 +195,9 @@ pub fn render_markdown_mut( let mut current_language = None; let mut list_stack = Vec::new(); - let options = Options::all(); + let mut options = Options::all(); + options.remove(pulldown_cmark::Options::ENABLE_DEFINITION_LIST); + for (event, source_range) in Parser::new_ext(block, options).into_offset_iter() { let prev_len = text.len(); match event {