summaryrefslogtreecommitdiff
path: root/crates/typst-library/src
diff options
context:
space:
mode:
authortingerrr <me@tinger.dev>2023-10-17 11:26:34 +0200
committerGitHub <noreply@github.com>2023-10-17 11:26:34 +0200
commit80175db3975e52adefd62e2b966764afb8a981ce (patch)
tree9e559046f5ca4d7d9c73354588eb7ab42b7e24cb /crates/typst-library/src
parent5f1ea5c48c855b67ba03a1099e367ffffa391073 (diff)
Filter out prohibited line breaks in `par` (#2376)
Diffstat (limited to 'crates/typst-library/src')
-rw-r--r--crates/typst-library/src/layout/par.rs29
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) {