diff options
author | Dan Davison <dandavison7@gmail.com> | 2020-07-18 15:34:43 -0400 |
---|---|---|
committer | Dan Davison <dandavison7@gmail.com> | 2020-07-22 17:57:57 -0400 |
commit | b2257cfae7eacc73e47299d90d9a8d479b3e362c (patch) | |
tree | 56b60ad41ce689042ce64c4793eec35100d8c322 /src/delta.rs | |
parent | 29bf022218f72157e1921412ae6ede598733b6fb (diff) |
Format files and commits as OSC 8 hyperlinks
Closes #257
Diffstat (limited to 'src/delta.rs')
-rw-r--r-- | src/delta.rs | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/src/delta.rs b/src/delta.rs index c5ad0b41..803e36eb 100644 --- a/src/delta.rs +++ b/src/delta.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::io::BufRead; use std::io::Write; @@ -7,6 +8,8 @@ use unicode_segmentation::UnicodeSegmentation; use crate::config::Config; use crate::draw; +use crate::features; +use crate::format; use crate::paint::Painter; use crate::parse; use crate::style::DecorationStyle; @@ -60,7 +63,7 @@ where { let mut painter = Painter::new(writer, config); let mut minus_file = "".to_string(); - let mut plus_file; + let mut plus_file = "".to_string(); let mut state = State::Unknown; let mut source = Source::Unknown; @@ -115,7 +118,7 @@ where painter.set_highlighter(); if should_handle(&state, config) { painter.emit()?; - handle_hunk_header_line(&mut painter, &line, &raw_line, config)?; + handle_hunk_header_line(&mut painter, &line, &raw_line, &plus_file, config)?; continue; } } else if source == Source::DiffUnified && line.starts_with("Only in ") @@ -155,7 +158,11 @@ where continue; } else { painter.emit()?; - writeln!(painter.writer, "{}", raw_line)?; + writeln!( + painter.writer, + "{}", + format::format_raw_line(&raw_line, config) + )?; } } @@ -240,10 +247,25 @@ fn handle_commit_meta_header_line( draw::write_no_decoration } }; + let (formatted_line, formatted_raw_line) = if config.hyperlinks { + ( + Cow::from( + features::hyperlinks::format_commit_line_with_osc8_commit_hyperlink(line, config), + ), + Cow::from( + features::hyperlinks::format_commit_line_with_osc8_commit_hyperlink( + raw_line, config, + ), + ), + ) + } else { + (Cow::from(line), Cow::from(raw_line)) + }; + draw_fn( painter.writer, - &format!("{}{}", line, if pad { " " } else { "" }), - &format!("{}{}", raw_line, if pad { " " } else { "" }), + &format!("{}{}", formatted_line, if pad { " " } else { "" }), + &format!("{}{}", formatted_raw_line, if pad { " " } else { "" }), &config.decorations_width, config.commit_style, decoration_ansi_term_style, @@ -332,6 +354,7 @@ fn handle_hunk_header_line( painter: &mut Painter, line: &str, raw_line: &str, + plus_file: &str, config: &Config, ) -> std::io::Result<()> { if config.hunk_header_style.is_omitted { @@ -425,16 +448,28 @@ fn handle_hunk_header_line( }; // Emit a single line number, or prepare for full line-numbering if config.line_numbers { - painter.line_numbers_data.initialize_hunk(line_numbers); + painter + .line_numbers_data + .initialize_hunk(line_numbers, plus_file.to_string()); } else { let plus_line_number = line_numbers[line_numbers.len() - 1].0; + let formatted_plus_line_number = if config.hyperlinks { + features::hyperlinks::format_osc8_file_hyperlink( + plus_file, + Some(plus_line_number), + &format!("{}", plus_line_number), + config, + ) + } else { + Cow::from(format!("{}", plus_line_number)) + }; match config.hunk_header_style.decoration_ansi_term_style() { Some(style) => writeln!( painter.writer, "{}", - style.paint(format!("{}", plus_line_number)) + style.paint(formatted_plus_line_number) )?, - None => writeln!(painter.writer, "{}", plus_line_number)?, + None => writeln!(painter.writer, "{}", formatted_plus_line_number)?, } } Ok(()) |