From 56d34d4ced5b8d11658d7f1715555976a201d8e2 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Thu, 22 Oct 2026 19:08:57 +0000 Subject: [PATCH] Accept an explicit leading plus sign in Unit::parse Found while testing crates/doc/src/lib.rs:379 (number_unit, reached from parse_measure at :374) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/doc/src/lib.rs | 4 +++- crates/doc/src/tests_units.rs | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/doc/src/lib.rs b/crates/doc/src/lib.rs index 1ba52a0e3..49342ca54 100644 --- a/crates/doc/src/lib.rs +++ b/crates/doc/src/lib.rs @@ -378,7 +378,9 @@ fn parse_measure(s: &str, default: Unit) -> Option { /// A number with an optional unit suffix (`12`, `3 mm`, `2in`) → (the number, its unit). fn number_unit(s: &str) -> Option<(f64, Option)> { let s = s.trim(); - let num_end = s.find(|c: char| !(c.is_ascii_digit() || c == '.' || c == '-')).unwrap_or(s.len()); + // A leading `+` is a sign (`+5`), like `-`. + let sign = usize::from(s.starts_with('+')); + let num_end = s.get(sign..)?.find(|c: char| !(c.is_ascii_digit() || c == '.' || c == '-')).map_or(s.len(), |i| i + sign); let v: f64 = s.get(..num_end)?.trim().parse().ok()?; let unit = match s.get(num_end..)?.trim() { "" => None, diff --git a/crates/doc/src/tests_units.rs b/crates/doc/src/tests_units.rs index a5dbe9fb3..5b3319f18 100644 --- a/crates/doc/src/tests_units.rs +++ b/crates/doc/src/tests_units.rs @@ -23,6 +23,14 @@ fn every_unit_round_trips_through_its_field_text() { } } +#[test] +fn an_explicit_leading_plus_is_accepted() { + assert_eq!(Unit::Points.parse("+5"), Some(5.0)); + assert_eq!(Unit::Millimeters.parse("+5mm"), Some(Unit::Millimeters.to_pt(5.0))); + assert_eq!(Unit::Points.parse("+5+3"), Some(8.0)); + assert_eq!(Unit::Points.parse("5+-3"), Some(2.0)); +} + #[test] fn typed_units_win_over_the_fields_unit() { let mm = 72.0 / 25.4;