From 80175db3975e52adefd62e2b966764afb8a981ce Mon Sep 17 00:00:00 2001 From: tingerrr Date: Tue, 17 Oct 2023 11:26:34 +0200 Subject: [PATCH] Filter out prohibited line breaks in `par` (#2376) --- crates/typst-library/src/layout/par.rs | 29 ++++++++++++++++---------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/crates/typst-library/src/layout/par.rs b/crates/typst-library/src/layout/par.rs index b18d62299..9542e37c8 100644 --- a/crates/typst-library/src/layout/par.rs +++ b/crates/typst-library/src/layout/par.rs @@ -1189,18 +1189,25 @@ impl Iterator for Breakpoints<'_> { let lb = LINEBREAK_DATA.as_borrowed(); - // Get the next "word". - self.end = self.linebreaks.next()?; - self.mandatory = - self.p.bidi.text[..self.end].chars().next_back().map_or(false, |c| { - matches!( - lb.get(c), + loop { + // Get the next "word". + self.end = self.linebreaks.next()?; + self.mandatory = false; + + // Fix for: https://github.com/unicode-org/icu4x/issues/4146 + if let Some(c) = self.p.bidi.text[..self.end].chars().next_back() { + self.mandatory = match lb.get(c) { + LineBreak::Glue | LineBreak::WordJoiner | LineBreak::ZWJ => continue, LineBreak::MandatoryBreak - | LineBreak::CarriageReturn - | LineBreak::LineFeed - | LineBreak::NextLine - ) || self.end == self.p.bidi.text.len() - }); + | LineBreak::CarriageReturn + | LineBreak::LineFeed + | LineBreak::NextLine => true, + _ => self.end == self.p.bidi.text.len(), + }; + }; + + break; + } // Hyphenate the next word. if self.p.hyphenate != Some(false) {