diff --git a/contributors/people.toml b/contributors/people.toml index 072e5a8c9..a10cfcc5c 100644 --- a/contributors/people.toml +++ b/contributors/people.toml @@ -72,3 +72,7 @@ sync_github_name = false real_name = "Manuel Carmona" display_name = "manucarcor" [people.odedigo] + +[people.webdevtodayjason] +display_name = "Jason Brashear" +sync_github_name = false diff --git a/crates/formats/src/latex.rs b/crates/formats/src/latex.rs index 58100bf74..d9e799046 100644 --- a/crates/formats/src/latex.rs +++ b/crates/formats/src/latex.rs @@ -416,6 +416,8 @@ pub fn escape_text(s: &str) -> String { '>' => o.push_str("\\textgreater{}"), '|' => o.push_str("\\textbar{}"), '\u{A0}' => o.push('~'), + // An opening bracket here would become an optional item or line-break argument. + '[' if !line_has_text => o.push_str("{[}"), // Keep TeX from joining `--`, ``` `` ``` and `''` into dashes and quotes. '-' if prev == '-' => o.push_str("{}-"), '`' => o.push_str("\\textasciigrave{}"), @@ -3029,6 +3031,15 @@ Caf\'e na\"ive \c{c}a \v{s}\'{e} and {\bfseries grouped bold} after. assert!(md.contains("π r^2"), "{md}"); } + #[test] + fn leading_brackets_stay_text() { + // `\item [x]` and `\\ [1]` would read the bracket as an optional argument. + assert_eq!(escape_text("[x] a\n [1] b [c]"), "{[}x] a\\\\\n {[}1] b [c]"); + let doc = crate::markdown::import("- [x] done"); + let back = import(export(&doc).as_bytes()); + assert_eq!(back.plain_text(Default::default()), "[x] done"); + } + #[test] fn special_characters_round_trip() { let text = "50% of $5 & #1_a {b} ~c^ \\d |f| -- ``g'' tab\there";