Fix BiDi bug with mixed explicit dir in paragraph (#3532)

Co-authored-by: Laurenz <laurmaedje@gmail.com>
This commit is contained in:
A-Walrus 2024-03-04 11:47:38 +02:00 committed by GitHub
parent 879bd1a1ce
commit b005dc37e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 24 additions and 0 deletions

View File

@ -432,6 +432,8 @@ fn collect<'a>(
segments.push((Segment::Spacing((-hang).into()), *styles));
}
let outer_dir = TextElem::dir_in(*styles);
while let Some(mut child) = iter.next() {
let outer = styles;
let mut styles = *styles;
@ -445,11 +447,26 @@ fn collect<'a>(
Segment::Text(1)
} else if let Some(elem) = child.to_packed::<TextElem>() {
let prev = full.len();
let dir = TextElem::dir_in(styles);
if dir != outer_dir {
// Insert "Explicit Directional Isolate".
match dir {
Dir::LTR => full.push('\u{2066}'),
Dir::RTL => full.push('\u{2067}'),
_ => {}
}
}
if let Some(case) = TextElem::case_in(styles) {
full.push_str(&case.apply(elem.text()));
} else {
full.push_str(elem.text());
}
if dir != outer_dir {
// Insert "Pop Directional Isolate".
full.push('\u{2069}');
}
Segment::Text(full.len() - prev)
} else if let Some(elem) = child.to_packed::<HElem>() {
if elem.amount().is_zero() {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -47,6 +47,13 @@ Lריווח #h(1cm) R
// Test whether L1 whitespace resetting destroys stuff.
الغالب #h(70pt) ن#" "ة
---
// Test explicit dir
#set text(dir: rtl)
#text("8:00 - 9:00",dir:ltr) בבוקר
#linebreak()
ב #text("12:00 - 13:00",dir:ltr) בצהריים
---
// Test setting a vertical direction.
// Ref: false