From 4a7d3585d9baff43a74a802f58ab8dc4d16ff222 Mon Sep 17 00:00:00 2001 From: Peng Guanwen Date: Tue, 7 Nov 2023 04:43:15 +0800 Subject: [PATCH] Improve reshape condition (#2547) --- crates/typst-library/src/text/shaping.rs | 40 ++++++++++++++++------- tests/ref/layout/cjk-latin-spacing.png | Bin 6039 -> 8399 bytes tests/typ/layout/cjk-latin-spacing.typ | 13 ++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/crates/typst-library/src/text/shaping.rs b/crates/typst-library/src/text/shaping.rs index f7cf90bd6..05ed4633e 100644 --- a/crates/typst-library/src/text/shaping.rs +++ b/crates/typst-library/src/text/shaping.rs @@ -488,17 +488,35 @@ impl<'a> ShapedText<'a> { } // Find any glyph with the text index. - let mut idx = self - .glyphs - .binary_search_by(|g| { - let ordering = g.range.start.cmp(&text_index); - if ltr { - ordering - } else { - ordering.reverse() - } - }) - .ok()?; + let found = self.glyphs.binary_search_by(|g: &ShapedGlyph| { + let ordering = g.range.start.cmp(&text_index); + if ltr { + ordering + } else { + ordering.reverse() + } + }); + let mut idx = match found { + Ok(idx) => idx, + Err(idx) => { + // Handle the special case where we break before a '\n' + // + // For example: (assume `a` is a CJK character with three bytes) + // text: " a \n b " + // index: 0 1 2 3 4 5 + // text_index: ^ + // glyphs: 0 . 1 + // + // We will get found = Err(1), because '\n' does not have a glyph. + // But it's safe to break here. Thus the following condition: + // - glyphs[0].end == text_index == 3 + // - text[3] == '\n' + return (idx > 0 + && self.glyphs[idx - 1].range.end == text_index + && self.text[text_index - self.base..].starts_with('\n')) + .then_some(idx); + } + }; let next = match towards { Side::Left => usize::checked_sub, diff --git a/tests/ref/layout/cjk-latin-spacing.png b/tests/ref/layout/cjk-latin-spacing.png index bd4eed9b49f7912ce1e92815bbeee9f6059c3189..629145e46fc0ddc483f051e67acef75277167f6f 100644 GIT binary patch literal 8399 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 diff --git a/tests/typ/layout/cjk-latin-spacing.typ b/tests/typ/layout/cjk-latin-spacing.typ index 9cc94fd23..c6fff5d79 100644 --- a/tests/typ/layout/cjk-latin-spacing.typ +++ b/tests/typ/layout/cjk-latin-spacing.typ @@ -14,3 +14,16 @@ 中文,中ab文a中,文ab中文 +--- +// Issue #2538 +#set text(cjk-latin-spacing: auto) + +abc字 + +abc字#linebreak() + +abc字#linebreak() +母 + +abc字\ +母