diff --git a/src/monorepo/preview.rs b/src/monorepo/preview.rs index b7e3439f..218b1230 100644 --- a/src/monorepo/preview.rs +++ b/src/monorepo/preview.rs @@ -127,10 +127,10 @@ fn format_preview_comment(packages: &[CheckPackage]) -> String { body.push_str("|---------|---------|------|------|\n"); for pkg in packages { body.push_str(&format!( - "| {} | `{}` | `{}` | {} |\n", + "| {} | {} | {} | {} |\n", escape_md_cell(&pkg.name), - escape_md_cell(&pkg.current_version), - escape_md_cell(&pkg.next_version), + code_cell(&pkg.current_version), + code_cell(&pkg.next_version), escape_md_cell(&pkg.bump_type), )); } @@ -155,5 +155,20 @@ pub(super) fn escape_md_cell(s: &str) -> String { out } +pub(super) fn code_cell(s: &str) -> String { + let flat = s.replace(['\n', '\r'], " ").replace('|', "\\|"); + if flat.is_empty() { + return flat; + } + let longest_run = flat.split(|c| c != '`').map(str::len).max().unwrap_or(0); + let fence = "`".repeat(longest_run + 1); + let pad = if flat.starts_with('`') || flat.ends_with('`') { + " " + } else { + "" + }; + format!("{fence}{pad}{flat}{pad}{fence}") +} + #[cfg(test)] mod tests; diff --git a/src/monorepo/preview/tests.rs b/src/monorepo/preview/tests.rs index d57e285d..1f7e75c6 100644 --- a/src/monorepo/preview/tests.rs +++ b/src/monorepo/preview/tests.rs @@ -162,7 +162,10 @@ fn hostile_package_fields_cannot_break_the_table() { .lines() .find(|l| l.starts_with("| a")) .unwrap_or_else(|| panic!("{body}")); - assert_eq!(row, r"| a\|b <img> | `1.2.0` | `1.3.0\`` | minor |"); + assert_eq!( + row, + r"| a\|b <img> | `1.2.0` | `` 1.3.0` `` | minor |" + ); } mod forge_from_repo { @@ -219,3 +222,28 @@ mod forge_from_repo { ); } } + +#[test] +fn code_cell_wraps_a_plain_version_in_one_backtick() { + assert_eq!(code_cell("1.2.3"), "`1.2.3`"); +} + +#[test] +fn code_cell_lengthens_the_fence_past_an_inner_backtick_run() { + assert_eq!(code_cell("1.2`3"), "``1.2`3``"); + assert_eq!(code_cell("a``b"), "```a``b```"); +} + +#[test] +fn code_cell_pads_a_value_that_starts_or_ends_with_a_backtick() { + assert_eq!(code_cell("`x"), "`` `x ``"); + assert_eq!(code_cell("x`"), "`` x` ``"); +} + +#[test] +fn code_cell_keeps_the_row_intact_and_the_rest_literal() { + assert_eq!(code_cell("a|b"), r"`a\|b`"); + assert_eq!(code_cell("a\nb"), "`a b`"); + assert_eq!(code_cell(r"a\b"), r"`a\b`"); + assert_eq!(code_cell(""), ""); +}