summaryrefslogtreecommitdiffstats
path: root/src/paint.rs
diff options
context:
space:
mode:
authorCatherine Noll <noll.catherine@gmail.com>2020-06-09 15:21:42 -0400
committerDan Davison <dandavison7@gmail.com>2020-06-25 12:35:07 -0400
commit3c33aec4f8d811ddab20dc8934550b50081184c2 (patch)
tree06c4f013c92fa925b937753f33b0634974129368 /src/paint.rs
parentbe9d18f1adda8aa4e54161527a07f2ed1694ce05 (diff)
Command line option to apply line number style to unchanged lines
Diffstat (limited to 'src/paint.rs')
-rw-r--r--src/paint.rs137
1 files changed, 87 insertions, 50 deletions
diff --git a/src/paint.rs b/src/paint.rs
index 97ed4834..328f35d2 100644
--- a/src/paint.rs
+++ b/src/paint.rs
@@ -166,34 +166,7 @@ impl<'a> Painter<'a> {
let mut handled_prefix = false;
let mut ansi_strings = if config.show_line_numbers && line_numbers.is_some() {
- let (minus, plus) = line_numbers.unwrap();
- let (minus_before, minus_number, minus_after) =
- get_line_number_components(minus, &config.number_minus_format);
- let (plus_before, plus_number, plus_after) =
- get_line_number_components(plus, &config.number_plus_format);
- vec![
- config
- .number_minus_format_style
- .ansi_term_style
- .paint(minus_before),
- config
- .number_minus_style
- .ansi_term_style
- .paint(minus_number),
- config
- .number_minus_format_style
- .ansi_term_style
- .paint(minus_after),
- config
- .number_plus_format_style
- .ansi_term_style
- .paint(plus_before),
- config.number_plus_style.paint(plus_number),
- config
- .number_plus_format_style
- .ansi_term_style
- .paint(plus_after),
- ]
+ get_formatted_line_number_components(line_numbers, config)
} else {
Vec::new()
};
@@ -623,7 +596,7 @@ mod superimpose_style_sections {
lazy_static! {
static ref LINE_NUMBER_REGEXP: Regex =
- Regex::new(r"(?P<before>.*)(?P<ln>%ln)(?P<after>.*)").unwrap();
+ Regex::new(r"(?P<before>.*?)(?P<ln>(%(lm|lp)))(?P<after>.*)").unwrap();
}
fn format_line_number(line_number: Option<usize>) -> String {
@@ -633,25 +606,89 @@ fn format_line_number(line_number: Option<usize>) -> String {
}
}
-fn get_line_number_components(
- number: Option<usize>,
- number_format: &str,
-) -> (String, String, String) {
- let captures = match LINE_NUMBER_REGEXP.captures(number_format) {
- Some(captures) => captures,
- None => return (number_format.to_string(), "".to_string(), "".to_string()),
- };
-
- let before = captures.name("before").unwrap().as_str();
- let placeholder = captures.name("ln");
- let after = captures.name("after").unwrap().as_str();
- let number = match placeholder {
- Some(_) => number,
- None => None,
- };
- (
- before.to_string(),
- format_line_number(number),
- after.to_string(),
- )
+fn get_zero_or_default_style(
+ minus: Option<usize>,
+ plus: Option<usize>,
+ zero_style: Option<Style>,
+ default_style: Style,
+) -> Style {
+ match (zero_style, minus, plus) {
+ (Some(z), Some(_), Some(_)) => z,
+ _ => default_style,
+ }
+}
+
+fn format_number_components <'a>(
+ minus: Option<usize>,
+ plus: Option<usize>,
+ format_string: &'a str,
+ number_format_style: &Style,
+ number_minus_style: &Style,
+ number_plus_style: &Style,
+) -> Vec<ansi_term::ANSIGenericString<'a, str>> {
+ let mut formatted_number_strings = Vec::new();
+
+ for cap in LINE_NUMBER_REGEXP.captures_iter(&format_string) {
+ let number_placeholder = cap.name("ln");
+ let before = cap.name("before");
+ let after = cap.name("after");
+
+ match before {
+ Some(s) => formatted_number_strings.push(
+ number_format_style.paint(s.as_str())
+ ),
+ _ => (),
+ }
+
+ match number_placeholder {
+ Some(s) if Some(s.as_str()) == Some("%lm") => formatted_number_strings.push(
+ number_minus_style.paint(format_line_number(minus))
+ ),
+ Some(s) if Some(s.as_str()) == Some("%lp") => formatted_number_strings.push(
+ number_plus_style.paint(format_line_number(plus))
+ ),
+ Some(s) => formatted_number_strings.push(
+ number_format_style.paint(s.as_str())
+ ),
+ _ => (),
+ }
+
+ match after {
+ Some(s) => formatted_number_strings.push(
+ number_format_style.paint(s.as_str())
+ ),
+ _ => (),
+ }
+
+ }
+ formatted_number_strings
+}
+
+fn get_formatted_line_number_components <'a>(
+ line_numbers: &'a Option<(Option<usize>, Option<usize>)>,
+ config: &'a config::Config,
+) -> Vec<ansi_term::ANSIGenericString<'a, str>> {
+
+ let (minus, plus) = line_numbers.unwrap();
+
+ let number_minus_style = get_zero_or_default_style(
+ minus,
+ plus,
+ config.number_zero_style,
+ config.number_minus_style,
+ );
+
+ let number_plus_style = get_zero_or_default_style(
+ minus,
+ plus,
+ config.number_zero_style,
+ config.number_plus_style,
+ );
+
+ let mut formatted_numbers = Vec::new();
+
+ formatted_numbers.extend(format_number_components(minus, plus, &config.number_left_format, &config.number_left_format_style, &number_minus_style, &number_plus_style));
+ formatted_numbers.extend(format_number_components(minus, plus,&config.number_right_format, &config.number_right_format_style, &number_minus_style, &number_plus_style));
+
+ formatted_numbers
}