From f5d0249a43558a42eb7286211d167646f9eed475 Mon Sep 17 00:00:00 2001 From: clover caruso Date: Thu, 24 Sep 2026 10:50:33 -0700 Subject: [PATCH] feat: align paragraphs left, center or right as stored Paragraph alignment was read from the file but every paragraph laid out left-aligned. Lines now offset within the wrap width for center (1) and right (2), the values OneNote stores. Assisted-by: claude-opus-5.5 --- crates/canvas/src/layout.rs | 40 ++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/crates/canvas/src/layout.rs b/crates/canvas/src/layout.rs index 7c6c3387294827fe25d4f9fe8bff995c3952fc80..b1303952e983f44e0011b6f030457dc05e818648 100644 --- a/crates/canvas/src/layout.rs +++ b/crates/canvas/src/layout.rs @@ -176,7 +176,12 @@ impl TextEngine { } let mut shaped = builder.build(text); shaped.break_all_lines(Some(width)); - shaped.align(Alignment::Start, AlignmentOptions::default()); + let alignment = match paragraph.spans()[0].format.alignment { + Some(1) => Alignment::Center, + Some(2) => Alignment::End, + _ => Alignment::Start, + }; + shaped.align(alignment, AlignmentOptions::default()); Ok(shaped) } @@ -549,6 +554,39 @@ mod tests { assert_eq!(fonts.len(), 1); } + #[test] + fn paragraph_alignment_offsets_lines_within_the_wrap_width() { + let mut engine = TextEngine::default(); + let mut offset = |alignment| { + let layout = engine + .layout( + &Paragraph::new( + "Short".into(), + Format { + alignment, + ..Format::default() + }, + ), + 200.0, + ) + .unwrap(); + let (line, _) = layout.lines().next().unwrap(); + let advance = line.metrics().advance; + let x = line + .items() + .find_map(|item| match item { + PositionedLayoutItem::GlyphRun(run) => Some(run.offset()), + _ => None, + }) + .unwrap(); + (x, advance) + }; + let (left, advance) = offset(None); + assert_eq!(left, 0.0); + assert!(((offset(Some(1)).0) - (200.0 - advance) / 2.0).abs() < 0.01); + assert!(((offset(Some(2)).0) - (200.0 - advance)).abs() < 0.01); + } + #[test] fn highlights_share_line_geometry_without_changing_wraps() { let paragraph = Paragraph::from_runs([ -- 2.54.0