summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorA-Walrus <58790821+A-Walrus@users.noreply.github.com>2024-03-04 11:47:38 +0200
committerGitHub <noreply@github.com>2024-03-04 09:47:38 +0000
commitb005dc37e5f7e2f519edc1f607f6ba3ab810ec26 (patch)
treeda5f4b6ce75c6ecaa2bd22df5888bb5b73979b33 /crates
parent879bd1a1cef506514123703f8031a8c203a2c0eb (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.rs17
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() {