diff --git a/Cargo.lock b/Cargo.lock index dbe8740089b1293b6ae1d55c7c9ce0b202928b46..d6630b7318c2e6566b80636b554417fb7df1cf22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10203,6 +10203,7 @@ dependencies = [ "language", "linkify", "log", + "markdown", "markup5ever_rcdom", "mermaid-rs-renderer", "pretty_assertions", diff --git a/crates/markdown/src/parser.rs b/crates/markdown/src/parser.rs index 21738147eed1b5b02da1c85207736160bd37ceb3..f530b88908380be13de2005bb8b3ec2b7e6e31b5 100644 --- a/crates/markdown/src/parser.rs +++ b/crates/markdown/src/parser.rs @@ -10,7 +10,7 @@ use collections::HashSet; use crate::path_range::PathWithRange; -const PARSE_OPTIONS: Options = Options::ENABLE_TABLES +pub const PARSE_OPTIONS: Options = Options::ENABLE_TABLES .union(Options::ENABLE_FOOTNOTES) .union(Options::ENABLE_STRIKETHROUGH) .union(Options::ENABLE_TASKLISTS) diff --git a/crates/markdown_preview/Cargo.toml b/crates/markdown_preview/Cargo.toml index 55912c66a017fa22902f9b05e5fa924230710d69..4baa308f1088341aada1eb2917c2133b8df8c143 100644 --- a/crates/markdown_preview/Cargo.toml +++ b/crates/markdown_preview/Cargo.toml @@ -25,6 +25,7 @@ html5ever.workspace = true language.workspace = true linkify.workspace = true log.workspace = true +markdown.workspace = true markup5ever_rcdom.workspace = true pretty_assertions.workspace = true pulldown-cmark.workspace = true diff --git a/crates/markdown_preview/src/markdown_parser.rs b/crates/markdown_preview/src/markdown_parser.rs index 59f18647d3ca8ac4937b2e411c8b9bb8e33550b7..ffd697d0e1bafc2feeccf3a3a7836a224d983860 100644 --- a/crates/markdown_preview/src/markdown_parser.rs +++ b/crates/markdown_preview/src/markdown_parser.rs @@ -7,8 +7,9 @@ use collections::FxHashMap; use gpui::{DefiniteLength, FontWeight, px, relative}; use html5ever::{ParseOpts, local_name, parse_document, tendril::TendrilSink}; use language::LanguageRegistry; +use markdown::parser::PARSE_OPTIONS; use markup5ever_rcdom::RcDom; -use pulldown_cmark::{Alignment, Event, Options, Parser, Tag, TagEnd}; +use pulldown_cmark::{Alignment, Event, Parser, Tag, TagEnd}; use std::{ cell::RefCell, collections::HashMap, mem, ops::Range, path::PathBuf, rc::Rc, sync::Arc, vec, }; @@ -19,10 +20,7 @@ pub async fn parse_markdown( file_location_directory: Option, language_registry: Option>, ) -> ParsedMarkdown { - let mut options = Options::all(); - options.remove(pulldown_cmark::Options::ENABLE_DEFINITION_LIST); - - let parser = Parser::new_ext(markdown_input, options); + let parser = Parser::new_ext(markdown_input, PARSE_OPTIONS); let parser = MarkdownParser::new( parser.into_offset_iter().collect(), file_location_directory, @@ -3076,6 +3074,26 @@ More text ); } + #[gpui::test] + async fn test_dollar_signs_are_plain_text() { + // Dollar signs should be preserved as plain text, not treated as math delimiters. + // Regression test for https://github.com/zed-industries/zed/issues/50170 + let parsed = parse("$100$ per unit").await; + assert_eq!(parsed.children, vec![p("$100$ per unit", 0..14)]); + } + + #[gpui::test] + async fn test_dollar_signs_in_list_items() { + let parsed = parse("- $18,000 budget\n- $20,000 budget\n").await; + assert_eq!( + parsed.children, + vec![ + list_item(0..16, 1, Unordered, vec![p("$18,000 budget", 2..16)]), + list_item(17..33, 1, Unordered, vec![p("$20,000 budget", 19..33)]), + ] + ); + } + #[gpui::test] async fn test_code_block() { let parsed = parse(