fix: prevent line break splitting |> ligature sequence

The unicode-linebreak crate treats the pipe character '|' as a break opportunity (BA/AL class). This causes ShapeSpan::build to split text like '|>' into separate ShapeWords. When these words are shaped independently, the font shaping engine cannot form ligatures that cross the word boundary.

This patch manually checks for the '|>' sequence during segmentation and skips the break opportunity, ensuring they remain in the same shaping run.

Added a unit test 'ligature_segmentation' to verify that '|>' remains a single word.
This commit is contained in:
Adam Kowalski 2026-01-08 21:13:59 -08:00 committed by Jeremy Soller
parent ee702e5090
commit 8c8c41b05b
2 changed files with 38 additions and 0 deletions

View file

@ -826,6 +826,14 @@ impl ShapeSpan {
let mut start_word = 0;
for (end_lb, _) in unicode_linebreak::linebreaks(span) {
// Workaround for broken |> ligature in code fonts
if end_lb > 0 && end_lb < span.len() {
let b = span.as_bytes();
if b[end_lb - 1] == b'|' && b[end_lb] == b'>' {
continue;
}
}
let mut start_lb = end_lb;
for (i, c) in span[start_word..end_lb].char_indices().rev() {
// TODO: Not all whitespace characters are linebreakable, e.g. 00A0 (No-break