chore: extend fix to != and ++ ligatures, match existing test style
This commit is contained in:
parent
d391a3a166
commit
5d1db4992a
2 changed files with 32 additions and 3 deletions
11
src/shape.rs
11
src/shape.rs
|
|
@ -829,11 +829,16 @@ impl ShapeSpan {
|
||||||
// The unicode-linebreak crate treats the pipe character '|' as a break opportunity (BA/AL class).
|
// 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.
|
// 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.
|
// When these words are shaped independently, the font shaping engine cannot form ligatures that cross the word boundary.
|
||||||
// We manually check for the '|>' sequence during segmentation and skip the break opportunity to ensure they remain in the same shaping run.
|
// We manually check for known ligature sequences during segmentation and skip the break opportunity
|
||||||
|
// to ensure they remain in the same shaping run.
|
||||||
if end_lb > 0 && end_lb < span.len() {
|
if end_lb > 0 && end_lb < span.len() {
|
||||||
let b = span.as_bytes();
|
let b = span.as_bytes();
|
||||||
if b[end_lb - 1] == b'|' && b[end_lb] == b'>' {
|
match (b[end_lb - 1], b[end_lb]) {
|
||||||
continue;
|
(b'|', b'>') | // |>
|
||||||
|
(b'!', b'=') | // !=
|
||||||
|
(b'+', b'+') // ++
|
||||||
|
=> continue,
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -102,4 +102,28 @@ fn test_ligature_segmentation() {
|
||||||
"Expected '|>' to be a single word (preserved for ligature), but found {} words.",
|
"Expected '|>' to be a single word (preserved for ligature), but found {} words.",
|
||||||
span.words.len()
|
span.words.len()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Test !=
|
||||||
|
buffer.set_text("!=", &Attrs::new(), Shaping::Advanced, None);
|
||||||
|
buffer.shape_until_scroll(false);
|
||||||
|
let line = &buffer.lines[0];
|
||||||
|
let shape = line.shape_opt().expect("ShapeLine not found");
|
||||||
|
assert_eq!(
|
||||||
|
shape.spans[0].words.len(),
|
||||||
|
1,
|
||||||
|
"Expected '!=' to be a single word, but found {} words.",
|
||||||
|
shape.spans[0].words.len()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test ++
|
||||||
|
buffer.set_text("++", &Attrs::new(), Shaping::Advanced, None);
|
||||||
|
buffer.shape_until_scroll(false);
|
||||||
|
let line = &buffer.lines[0];
|
||||||
|
let shape = line.shape_opt().expect("ShapeLine not found");
|
||||||
|
assert_eq!(
|
||||||
|
shape.spans[0].words.len(),
|
||||||
|
1,
|
||||||
|
"Expected '++' to be a single word, but found {} words.",
|
||||||
|
shape.spans[0].words.len()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue