diff options
| author | tingerrr <me@tinger.dev> | 2023-10-17 11:26:34 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-17 11:26:34 +0200 |
| commit | 80175db3975e52adefd62e2b966764afb8a981ce (patch) | |
| tree | 9e559046f5ca4d7d9c73354588eb7ab42b7e24cb /crates | |
| parent | 5f1ea5c48c855b67ba03a1099e367ffffa391073 (diff) | |
Filter out prohibited line breaks in `par` (#2376)
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/typst-library/src/layout/par.rs | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/crates/typst-library/src/layout/par.rs b/crates/typst-library/src/layout/par.rs index b18d6229..9542e37c 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) { |
