From 847b710480d388b890f13c2c0a20c4e8b7e16cc2 Mon Sep 17 00:00:00 2001 From: A-Walrus <58790821+A-Walrus@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:49:38 +0300 Subject: [PATCH] Fix raw bidi text (#3885) --- crates/typst/src/layout/inline/mod.rs | 10 +++++----- crates/typst/src/text/raw.rs | 1 + tests/ref/layout/par-bidi.png | Bin 25731 -> 31441 bytes tests/typ/layout/par-bidi.typ | 10 ++++++++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/crates/typst/src/layout/inline/mod.rs b/crates/typst/src/layout/inline/mod.rs index 3587c250b..fd1e60db9 100644 --- a/crates/typst/src/layout/inline/mod.rs +++ b/crates/typst/src/layout/inline/mod.rs @@ -450,10 +450,10 @@ fn collect<'a>( let prev = full.len(); let dir = TextElem::dir_in(styles); if dir != outer_dir { - // Insert "Explicit Directional Isolate". + // Insert "Explicit Directional Embedding". match dir { - Dir::LTR => full.push('\u{2066}'), - Dir::RTL => full.push('\u{2067}'), + Dir::LTR => full.push('\u{202A}'), + Dir::RTL => full.push('\u{202B}'), _ => {} } } @@ -465,8 +465,8 @@ fn collect<'a>( } if dir != outer_dir { - // Insert "Pop Directional Isolate". - full.push('\u{2069}'); + // Insert "Pop Directional Formatting". + full.push('\u{202C}'); } Segment::Text(full.len() - prev) } else if let Some(elem) = child.to_packed::() { diff --git a/crates/typst/src/text/raw.rs b/crates/typst/src/text/raw.rs index f0105363f..dc288a662 100644 --- a/crates/typst/src/text/raw.rs +++ b/crates/typst/src/text/raw.rs @@ -443,6 +443,7 @@ impl ShowSet for Packed { fn show_set(&self, styles: StyleChain) -> Styles { let mut out = Styles::new(); out.set(TextElem::set_overhang(false)); + out.set(TextElem::set_lang(Lang::ENGLISH)); out.set(TextElem::set_hyphenate(Hyphenate(Smart::Custom(false)))); out.set(TextElem::set_size(TextSize(Em::new(0.8).into()))); out.set(TextElem::set_font(FontList(vec![FontFamily::new("DejaVu Sans Mono")]))); diff --git a/tests/ref/layout/par-bidi.png b/tests/ref/layout/par-bidi.png index 4750ccb88edec4f95d0d7c58d91d2c394795b750..af66a719f9291be39c83b9ab5d0a8b93d60dcb47 100644 GIT binary patch delta 8461 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 delta 2763 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 diff --git a/tests/typ/layout/par-bidi.typ b/tests/typ/layout/par-bidi.typ index edbd75e16..4ff83802b 100644 --- a/tests/typ/layout/par-bidi.typ +++ b/tests/typ/layout/par-bidi.typ @@ -54,6 +54,16 @@ Lריווח #h(1cm) R #linebreak() ב #text("12:00 - 13:00",dir:ltr) בצהריים +--- +// Mixing raw +#set text(lang: "he") +לדוג. `if a == b:` זה תנאי +#set raw(lang:"python") +לדוג. `if a == b:` זה תנאי + +#show raw: set text(dir:rtl) +לתכנת בעברית `אם א == ב:` + --- // Test setting a vertical direction. // Ref: false