From 7e69ee0942551904e82418d141b0fce4c86819fe Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Tue, 18 Feb 2025 15:37:36 -0500 Subject: [PATCH] Sort frame items by logical index --- crates/typst-layout/src/inline/line.rs | 24 +++++++++++++++--------- tests/ref/issue-5775-cite-order-rtl.png | Bin 0 -> 8218 bytes 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 tests/ref/issue-5775-cite-order-rtl.png diff --git a/crates/typst-layout/src/inline/line.rs b/crates/typst-layout/src/inline/line.rs index 7ba1e5e2a..7fcc344f7 100644 --- a/crates/typst-layout/src/inline/line.rs +++ b/crates/typst-layout/src/inline/line.rs @@ -501,16 +501,16 @@ pub fn commit( // Build the frames and determine the height and baseline. let mut frames = vec![]; - for item in line.items.iter() { - let mut push = |offset: &mut Abs, frame: Frame| { + for item in line.items.indexed_iter() { + let mut push = |offset: &mut Abs, frame: Frame, idx: usize| { let width = frame.width(); top.set_max(frame.baseline()); bottom.set_max(frame.size().y - frame.baseline()); - frames.push((*offset, frame)); + frames.push((*offset, frame, idx)); *offset += width; }; - match item { + match &*item.item { Item::Absolute(v, _) => { offset += *v; } @@ -522,7 +522,7 @@ pub fn commit( layout_box(elem, engine, loc.relayout(), styles, region) })?; apply_baseline_shift(&mut frame, *styles); - push(&mut offset, frame); + push(&mut offset, frame, item.idx); } else { offset += amount; } @@ -534,15 +534,15 @@ pub fn commit( justification_ratio, extra_justification, ); - push(&mut offset, frame); + push(&mut offset, frame, item.idx); } Item::Frame(frame) => { - push(&mut offset, frame.clone()); + push(&mut offset, frame.clone(), item.idx); } Item::Tag(tag) => { let mut frame = Frame::soft(Size::zero()); frame.push(Point::zero(), FrameItem::Tag((*tag).clone())); - frames.push((offset, frame)); + frames.push((offset, frame, item.idx)); } Item::Skip(_) => {} } @@ -561,8 +561,9 @@ pub fn commit( add_par_line_marker(&mut output, marker, engine, locator, top); } + frames.sort_by_key(|(_, _, idx)| *idx); // Construct the line's frame. - for (offset, frame) in frames { + for (offset, frame, _) in frames { let x = offset + p.config.align.position(remaining); let y = top - frame.baseline(); output.push_frame(Point::new(x, y), frame); @@ -647,6 +648,11 @@ impl<'a> Items<'a> { self.0.iter().map(|item| &*item.item) } + /// Iterate over the items with indices + pub fn indexed_iter(&self) -> impl Iterator> { + self.0.iter() + } + /// Access the first item. pub fn first(&self) -> Option<&Item<'a>> { self.0.first().map(|item| &*item.item) diff --git a/tests/ref/issue-5775-cite-order-rtl.png b/tests/ref/issue-5775-cite-order-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb1e86f83225757e6cf69c462b53d67f9875411 GIT binary patch literal 8218 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