Simplify Unicode-aware trimming

This commit is contained in:
AnthonyMikh 2019-09-25 23:13:19 +03:00 committed by GitHub
parent e9a93be53a
commit 4fc5650d17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -529,18 +529,21 @@ impl EmitterWriter {
let left = margin.left(line_len);
let right = margin.right(line_len);
// On long lines, we strip the source line, accounting for unicode.
let mut taken = 0;
let code: String = source_string.chars().skip(left).take_while(|ch| {
// Make sure that the trimming on the right will fall within the terminal width.
// FIXME: `unicode_width` sometimes disagrees with terminals on how wide a `char` is.
// For now, just accept that sometimes the code line will be longer than desired.
let next = unicode_width::UnicodeWidthChar::width(*ch).unwrap_or(1);
if taken + next > right - left {
return false;
}
taken += next;
true
}).collect();
// Make sure that the trimming on the right will fall within the terminal width.
// FIXME: `unicode_width` sometimes disagrees with terminals on how wide a `char` is.
// For now, just accept that sometimes the code line will be longer than desired.
let code: String = source_string.chars().skip(left)
.map(|ch| {
let width = unicode_width::UnicodeWidthChar::width(*ch).unwrap_or(1);
(width, ch)
})
.scan(0, |len, (width, ch)| {
*len += width;
Some(*len, ch)
})
.take_while(|&(prefix_len, _ch)| prefix_len <= right - left)
.map(|(_prefix_len, ch)| ch)
.collect();
buffer.puts(line_offset, code_offset, &code, Style::Quotation);
if margin.was_cut_left() {
// We have stripped some code/whitespace from the beginning, make it clear.