Calculate content width based on visible lines

ida_star
Wilfred Hughes 2021-07-31 17:21:55 +07:00
parent e67732bab9
commit 34f084d8f1
3 changed files with 49 additions and 4 deletions

@ -12,6 +12,11 @@ Difftastic will now prefer matching up comments that are similar
Contiguous syntax logic now considers close delimiter positions, so
`[ \n ];` now treats the `;` atom as contiguous.
### Display
Display width calculations are now based on the longest line visible
in the diff, not the longest line in the file.
## 0.6
### Parsing

@ -333,8 +333,45 @@ pub fn format_line_num_padded(line_num: usize, column_width: usize) -> String {
format!("{:width$} ", line_num + 1, width = column_width - 1)
}
pub fn lhs_printable_width(lhs: &str, lhs_column_width: usize, terminal_width: usize) -> usize {
let longest_line_length = lhs.lines().map(str::len).max().unwrap_or(1);
fn longest_visible_line_lhs(s: &str, groups: &[LineGroup]) -> usize {
let lines: Vec<_> = s.lines().collect();
let mut longest = 0;
for group in groups {
if let Some(lhs_lines) = &group.lhs_lines {
for line_num in lhs_lines.start.0..lhs_lines.end.0 {
let current_len = lines[line_num].len();
longest = max(longest, current_len);
}
}
}
longest
}
fn longest_visible_line_rhs(s: &str, groups: &[LineGroup]) -> usize {
let lines: Vec<_> = s.lines().collect();
let mut longest = 1;
for group in groups {
if let Some(rhs_lines) = &group.rhs_lines {
for line_num in rhs_lines.start.0..rhs_lines.end.0 {
let current_len = lines[line_num].len();
longest = max(longest, current_len);
}
}
}
longest
}
pub fn lhs_printable_width(
lhs: &str,
groups: &[LineGroup],
lhs_column_width: usize,
terminal_width: usize,
) -> usize {
let longest_line_length = longest_visible_line_lhs(lhs, groups);
let longest_line = longest_line_length + lhs_column_width;
let space_available = terminal_width / 2 - SPACER.len();
@ -343,11 +380,12 @@ pub fn lhs_printable_width(lhs: &str, lhs_column_width: usize, terminal_width: u
pub fn rhs_printable_width(
rhs: &str,
groups: &[LineGroup],
lhs_width: usize,
rhs_column_width: usize,
terminal_width: usize,
) -> usize {
let longest_line_length = rhs.lines().map(str::len).max().unwrap_or(1);
let longest_line_length = longest_visible_line_rhs(rhs, groups);
let longest_line = longest_line_length + rhs_column_width;
let space_available = (terminal_width - SPACER.len()) - lhs_width;

@ -161,9 +161,11 @@ fn main() {
let lhs_column_width = format_line_num(groups.last().unwrap().max_visible_lhs().0).len();
let rhs_column_width = format_line_num(groups.last().unwrap().max_visible_rhs().0).len();
let lhs_formatted_length = lhs_printable_width(&lhs_src, lhs_column_width, terminal_width);
let lhs_formatted_length =
lhs_printable_width(&lhs_src, &groups, lhs_column_width, terminal_width);
let rhs_formatted_length = rhs_printable_width(
&rhs_src,
&groups,
lhs_formatted_length,
rhs_column_width,
terminal_width,