diff options
| author | A-Walrus <58790821+A-Walrus@users.noreply.github.com> | 2024-03-04 11:47:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-04 09:47:38 +0000 |
| commit | b005dc37e5f7e2f519edc1f607f6ba3ab810ec26 (patch) | |
| tree | da5f4b6ce75c6ecaa2bd22df5888bb5b73979b33 /crates | |
| parent | 879bd1a1cef506514123703f8031a8c203a2c0eb (diff) | |
Fix BiDi bug with mixed explicit dir in paragraph (#3532)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/typst/src/layout/inline/mod.rs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/crates/typst/src/layout/inline/mod.rs b/crates/typst/src/layout/inline/mod.rs index 667421fd..cb1afa1e 100644 --- a/crates/typst/src/layout/inline/mod.rs +++ b/crates/typst/src/layout/inline/mod.rs @@ -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() { |
