diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cli.rs | 6 | ||||
-rw-r--r-- | src/features/line_numbers.rs | 92 | ||||
-rw-r--r-- | src/features/side_by_side.rs | 32 | ||||
-rw-r--r-- | src/format.rs | 143 | ||||
-rw-r--r-- | src/handlers/blame.rs | 5 | ||||
-rw-r--r-- | src/tests/integration_test_utils.rs | 4 | ||||
-rw-r--r-- | src/wrapping.rs | 16 |
7 files changed, 208 insertions, 90 deletions
@@ -162,9 +162,9 @@ To display line numbers, use --line-numbers. Line numbers are displayed in two columns. Here's what it looks like by default: - 1 ⋮ 1 │ unchanged line - 2 ⋮ │ removed line - ⋮ 2 │ added line + 1 ⋮ 1 │ unchanged line + 2 ⋮ │ removed line + ⋮ 2 │ added line In that output, the line numbers for the old (minus) version of the file appear in the left column, and the line numbers for the new (plus) version of the file appear in the right column. In an diff --git a/src/features/line_numbers.rs b/src/features/line_numbers.rs index 65cf4022..379882f3 100644 --- a/src/features/line_numbers.rs +++ b/src/features/line_numbers.rs @@ -261,10 +261,7 @@ fn format_and_paint_line_number_field<'a>( min_field_width }; - let alignment_spec = placeholder - .alignment_spec - .as_ref() - .unwrap_or(&Align::Center); + let alignment_spec = placeholder.alignment_spec.unwrap_or(Align::Center); match placeholder.placeholder { Some(Placeholder::NumberMinus) => { ansi_strings.push(styles[Minus].paint(format_line_number( @@ -298,7 +295,7 @@ fn format_and_paint_line_number_field<'a>( /// Return line number formatted according to `alignment` and `width`. fn format_line_number( line_number: Option<usize>, - alignment: &Align, + alignment: Align, width: usize, precision: Option<usize>, plus_file: Option<&str>, @@ -306,12 +303,11 @@ fn format_line_number( ) -> String { let pad = |n| format::pad(n, width, alignment, precision); match (line_number, config.hyperlinks, plus_file) { - (None, _, _) => pad(""), + (None, _, _) => " ".repeat(width), (Some(n), true, Some(file)) => { - hyperlinks::format_osc8_file_hyperlink(file, line_number, &pad(&n.to_string()), config) - .to_string() + hyperlinks::format_osc8_file_hyperlink(file, line_number, &pad(n), config).to_string() } - (Some(n), _, _) => pad(&n.to_string()), + (Some(n), _, _) => pad(n), } } @@ -649,8 +645,8 @@ pub mod tests { .expect_after_header( r#" #indent_mark - 1 ⋮ │a = 1 - 2 ⋮ │b = 23456"#, + 1 ⋮ │a = 1 + 2 ⋮ │b = 23456"#, ); } @@ -675,8 +671,8 @@ pub mod tests { .expect_after_header( r#" #indent_mark - ⋮ 1 │a = 1 - ⋮ 2 │b = 234567"#, + ⋮ 1 │a = 1 + ⋮ 2 │b = 234567"#, ); } @@ -700,9 +696,9 @@ pub mod tests { let output = run_delta(ONE_MINUS_ONE_PLUS_LINE_DIFF, &config); let output = strip_ansi_codes(&output); let mut lines = output.lines().skip(crate::config::HEADER_LEN); - assert_eq!(lines.next().unwrap(), " 1 ⋮ 1 │a = 1"); - assert_eq!(lines.next().unwrap(), " 2 ⋮ │b = 2"); - assert_eq!(lines.next().unwrap(), " ⋮ 2 │bb = 2"); + assert_eq!(lines.next().unwrap(), " 1 ⋮ 1 │a = 1"); + assert_eq!(lines.next().unwrap(), " 2 ⋮ │b = 2"); + assert_eq!(lines.next().unwrap(), " ⋮ 2 │bb = 2"); } #[test] @@ -725,9 +721,9 @@ pub mod tests { let output = run_delta(ONE_MINUS_ONE_PLUS_LINE_DIFF, &config); let output = strip_ansi_codes(&output); let mut lines = output.lines().skip(crate::config::HEADER_LEN); - assert_eq!(lines.next().unwrap(), " 1 1 ⋮ 1 │a = 1"); - assert_eq!(lines.next().unwrap(), " 2 2 ⋮ │b = 2"); - assert_eq!(lines.next().unwrap(), " ⋮ 2 │bb = 2"); + assert_eq!(lines.next().unwrap(), " 1 1 ⋮ 1 │a = 1"); + assert_eq!(lines.next().unwrap(), " 2 2 ⋮ │b = 2"); + assert_eq!(lines.next().unwrap(), " ⋮ 2 │bb = 2"); } #[test] @@ -747,7 +743,7 @@ pub mod tests { let output = run_delta(UNEQUAL_DIGIT_DIFF, &config); let output = strip_ansi_codes(&output); let mut lines = output.lines().skip(crate::config::HEADER_LEN); - assert_eq!(lines.next().unwrap(), "10000⋮9999 │a = 1"); + assert_eq!(lines.next().unwrap(), "10000⋮ 9999│a = 1"); assert_eq!(lines.next().unwrap(), "10001⋮ │b = 2"); assert_eq!(lines.next().unwrap(), " ⋮10000│bb = 2"); } @@ -758,8 +754,8 @@ pub mod tests { let output = run_delta(TWO_MINUS_LINES_DIFF, &config); let mut lines = output.lines().skip(5); let (line_1, line_2) = (lines.next().unwrap(), lines.next().unwrap()); - assert_eq!(strip_ansi_codes(line_1), " 1 ⋮ │-a = 1"); - assert_eq!(strip_ansi_codes(line_2), " 2 ⋮ │-b = 23456"); + assert_eq!(strip_ansi_codes(line_1), " 1 ⋮ │-a = 1"); + assert_eq!(strip_ansi_codes(line_2), " 2 ⋮ │-b = 23456"); } #[test] @@ -768,13 +764,13 @@ pub mod tests { let output = run_delta(TWO_LINE_DIFFS, &config); let output = strip_ansi_codes(&output); let mut lines = output.lines().skip(4); - assert_eq!(lines.next().unwrap(), " 1 ⋮ 1 │a = 1"); - assert_eq!(lines.next().unwrap(), " 2 ⋮ │b = 2"); - assert_eq!(lines.next().unwrap(), " ⋮ 2 │bb = 2"); + assert_eq!(lines.next().unwrap(), " 1 ⋮ 1 │a = 1"); + assert_eq!(lines.next().unwrap(), " 2 ⋮ │b = 2"); + assert_eq!(lines.next().unwrap(), " ⋮ 2 │bb = 2"); assert_eq!(lines.next().unwrap(), ""); - assert_eq!(lines.next().unwrap(), "499 ⋮499 │a = 3"); - assert_eq!(lines.next().unwrap(), "500 ⋮ │b = 4"); - assert_eq!(lines.next().unwrap(), " ⋮500 │bb = 4"); + assert_eq!(lines.next().unwrap(), " 499⋮ 499│a = 3"); + assert_eq!(lines.next().unwrap(), " 500⋮ │b = 4"); + assert_eq!(lines.next().unwrap(), " ⋮ 500│bb = 4"); } #[test] @@ -783,9 +779,9 @@ pub mod tests { .with_input(DIFF_PLUS_MINUS_WITH_1_CONTEXT_DIFF) .expect_after_header( r#" - │ 1 │abc │ 1 │abc - │ 2 │a = left side │ 2 │a = right side - │ 3 │xyz │ 3 │xyz"#, + │ 1 │abc │ 1 │abc + │ 2 │a = left side │ 2 │a = right side + │ 3 │xyz │ 3 │xyz"#, ); } @@ -804,10 +800,10 @@ pub mod tests { .with_input(DIFF_PLUS_MINUS_WITH_1_CONTEXT_DIFF) .expect_after_header( r#" - │ 1 │abc │ 1 │abc - │ 2 │a = left @│ 2 │a = right@ + │ 1 │abc │ 1 │abc + │ 2 │a = left @│ 2 │a = right@ │ │side │ │ side - │ 3 │xyz │ 3 │xyz"#, + │ 3 │xyz │ 3 │xyz"#, ); let cfg = &[ @@ -825,43 +821,43 @@ pub mod tests { .with_input(DIFF_WITH_LONGER_MINUS_1_CONTEXT) .expect_after_header( r#" - │ 1 │abc │ 1 │abc - │ 2 │a = one side │ 2 │a = one longer@ + │ 1 │abc │ 1 │abc + │ 2 │a = one side │ 2 │a = one longer@ │ │ │ │ side - │ 3 │xyz │ 3 │xyz"#, + │ 3 │xyz │ 3 │xyz"#, ); DeltaTest::with_args(cfg) .with_input(DIFF_WITH_LONGER_PLUS_1_CONTEXT) .expect_after_header( r#" - │ 1 │abc │ 1 │abc - │ 2 │a = one longer@│ 2 │a = one side + │ 1 │abc │ 1 │abc + │ 2 │a = one longer@│ 2 │a = one side │ │ side │ │ - │ 3 │xyz │ 3 │xyz"#, + │ 3 │xyz │ 3 │xyz"#, ); DeltaTest::with_args(cfg) .with_input(DIFF_MISMATCH_LONGER_MINUS_1_CONTEXT) .expect_after_header( r#" - │ 1 │abc │ 1 │abc - │ 2 │a = left side @│ │ + │ 1 │abc │ 1 │abc + │ 2 │a = left side @│ │ │ │which is longer│ │ - │ │ │ 2 │a = other one - │ 3 │xyz │ 3 │xyz"#, + │ │ │ 2 │a = other one + │ 3 │xyz │ 3 │xyz"#, ); DeltaTest::with_args(cfg) .with_input(DIFF_MISMATCH_LONGER_PLUS_1_CONTEXT) .expect_after_header( r#" - │ 1 │abc │ 1 │abc - │ 2 │a = other one │ │ - │ │ │ 2 │a = right side@ + │ 1 │abc │ 1 │abc + │ 2 │a = other one │ │ + │ │ │ 2 │a = right side@ │ │ │ │ which is long@ │ │ │ │er - │ 3 │xyz │ 3 │xyz"#, + │ 3 │xyz │ 3 │xyz"#, ); } diff --git a/src/features/side_by_side.rs b/src/features/side_by_side.rs index ed55b3b6..1a7d4553 100644 --- a/src/features/side_by_side.rs +++ b/src/features/side_by_side.rs @@ -601,8 +601,8 @@ pub mod tests { .with_input(TWO_MINUS_LINES_DIFF) .expect_after_header( r#" - │ 1 │a = 1 │ │ - │ 2 │b = 23456 │ │"#, + │ 1 │a = 1 │ │ + │ 2 │b = 23456 │ │"#, ); } @@ -620,8 +620,8 @@ pub mod tests { .with_input(TWO_MINUS_LINES_DIFF) .expect_after_header( r#" - │ 1 │a = 1 │ │ - │ 2 │b = 234>│ │"#, + │ 1 │a = 1 │ │ + │ 2 │b = 234>│ │"#, ); } @@ -636,8 +636,8 @@ pub mod tests { .with_input(TWO_PLUS_LINES_DIFF) .expect_after_header( r#" - │ │ │ 1 │a = 1 - │ │ │ 2 │b = 234567 "#, + │ │ │ 1 │a = 1 + │ │ │ 2 │b = 234567 "#, ); } @@ -652,8 +652,8 @@ pub mod tests { .explain_ansi() .with_input(TWO_PLUS_LINES_DIFF) .expect_after_header(r#" - (blue)│(88) (blue)│(normal) (blue)│(28) 1 (blue)│(231 22)a (203)=(231) (141)1(normal 22) (normal) - (blue)│(88) (blue)│(normal) (blue)│(28) 2 (blue)│(231 22)b (203)=(231) (141)234567(normal 22) (normal)"#); + (blue)│(88) (blue)│(normal) (blue)│(28) 1 (blue)│(231 22)a (203)=(231) (141)1(normal 22) (normal) + (blue)│(88) (blue)│(normal) (blue)│(28) 2 (blue)│(231 22)b (203)=(231) (141)234567(normal 22) (normal)"#); DeltaTest::with_args(&[ "--side-by-side", @@ -664,8 +664,8 @@ pub mod tests { .explain_ansi() .with_input(TWO_PLUS_LINES_DIFF) .expect_after_header(r#" - (blue)│(88) (blue)│(normal) (blue) │(28) 1 (blue)│(231 22)a (203)=(231) (141)1(normal) - (blue)│(88) (blue)│(normal) (blue) │(28) 2 (blue)│(231 22)b (203)=(231) (141)234567(normal)"#); + (blue)│(88) (blue)│(normal) (blue) │(28) 1 (blue)│(231 22)a (203)=(231) (141)1(normal) + (blue)│(88) (blue)│(normal) (blue) │(28) 2 (blue)│(231 22)b (203)=(231) (141)234567(normal)"#); } #[test] @@ -683,8 +683,8 @@ pub mod tests { let output = run_delta(TWO_PLUS_LINES_DIFF, &config); let mut lines = output.lines().skip(crate::config::HEADER_LEN); let (line_1, line_2) = (lines.next().unwrap(), lines.next().unwrap()); - assert_eq!("│ │ │ 1 │a = 1 ", strip_ansi_codes(line_1)); - assert_eq!("│ │ │ 2 │b = 2345>", strip_ansi_codes(line_2)); + assert_eq!("│ │ │ 1 │a = 1 ", strip_ansi_codes(line_1)); + assert_eq!("│ │ │ 2 │b = 2345>", strip_ansi_codes(line_2)); } #[test] @@ -695,8 +695,8 @@ pub mod tests { let mut lines = output.lines().skip(crate::config::HEADER_LEN); let (line_1, line_2) = (lines.next().unwrap(), lines.next().unwrap()); let sac = strip_ansi_codes; // alias to help with `cargo fmt`-ing: - assert_eq!("│ │ │ 1 │a = 1", sac(line_1)); - assert_eq!("│ │ │ 2 │b = 234567", sac(line_2)); + assert_eq!("│ │ │ 1 │a = 1", sac(line_1)); + assert_eq!("│ │ │ 2 │b = 234567", sac(line_2)); } #[test] @@ -710,8 +710,8 @@ pub mod tests { .with_input(ONE_MINUS_ONE_PLUS_LINE_DIFF) .expect_after_header( r#" - │ 1 │a = 1 │ 1 │a = 1 - │ 2 │b = 2 │ 2 │bb = 2 "#, + │ 1 │a = 1 │ 1 │a = 1 + │ 2 │b = 2 │ 2 │bb = 2 "#, ); } } diff --git a/src/format.rs b/src/format.rs index ab0e856f..a4efddaf 100644 --- a/src/format.rs +++ b/src/format.rs @@ -25,7 +25,7 @@ impl<'a> TryFrom<Option<&'a str>> for Placeholder<'a> { } } -#[derive(Debug, PartialEq)] +#[derive(Debug, Copy, Clone, PartialEq)] pub enum Align { Left, Center, @@ -165,21 +165,102 @@ pub fn parse_line_number_format<'a>( format_data } +pub trait CenterRightNumbers { + // There is no such thing as "Center Align" with discrete terminal cells. In + // some cases a decision has to be made whether to use the left or the right + // cell, e.g. when centering one char in 4 cells: "_X__" or "__X_". + // + // The format!() center/^ default is center left, but when padding numbers + // these are now aligned to the center right by having this trait return " " + // instead of "". This is prepended to the format string. In the case of " " + // the trailing " " must then be removed so everything is shifted to the right. + // This asumes no special padding characters, i.e. the default of space. + fn center_right_space(&self, alignment: Align, width: usize) -> &'static str; +} + +impl CenterRightNumbers for &str { + fn center_right_space(&self, _alignment: Align, _width: usize) -> &'static str { + // Disables center-right formatting and aligns strings center-left + "" + } +} + +impl CenterRightNumbers for String { + fn center_right_space(&self, alignment: Align, width: usize) -> &'static str { + self.as_str().center_right_space(alignment, width) + } +} + +impl<'a> CenterRightNumbers for &std::borrow::Cow<'a, str> { + fn center_right_space(&self, alignment: Align, width: usize) -> &'static str { + self.as_ref().center_right_space(alignment, width) + } +} + +// Returns the base-10 width of `n`, i.e. `floor(log10(n)) + 1` and 0 is treated as 1. +pub fn log10_plus_1(mut n: usize) -> usize { + let mut len = 0; + // log10 for integers is only in nightly and this is faster than + // casting to f64 and back. + loop { + if n <= 9 { + break len + 1; + } + if n <= 99 { + break len + 2; + } + if n <= 999 { + break len + 3; + } + if n <= 9999 { + break len + 4; + } + + len += 4; + n /= 10000; + } +} + +impl CenterRightNumbers for usize { + fn center_right_space(&self, alignment: Align, width: usize) -> &'static str { + if alignment != Align::Center { + return ""; + } + + let width_of_number = log10_plus_1(*self); + if width > width_of_number && (width % 2 != width_of_number % 2) { + " " + } else { + "" + } + } +} + // Note that in this case of a string `s`, `precision` means "max width". // See https://doc.rust-lang.org/std/fmt/index.html -pub fn pad(s: &str, width: usize, alignment: &Align, precision: Option<usize>) -> String { - match precision { +pub fn pad<T: std::fmt::Display + CenterRightNumbers>( + s: T, + width: usize, + alignment: Align, + precision: Option<usize>, +) -> String { + let space = s.center_right_space(alignment, width); + let mut result = match precision { None => match alignment { - Align::Left => format!("{0:<1$}", s, width), - Align::Center => format!("{0:^1$}", s, width), - Align::Right => format!("{0:>1$}", s, width), + Align::Left => format!("{0}{1:<2$}", space, s, width), + Align::Center => format!("{0}{1:^2$}", space, s, width), + Align::Right => format!("{0}{1:>2$}", space, s, width), }, Some(precision) => match alignment { - Align::Left => format!("{0:<1$.2$}", s, width, precision), - Align::Center => format!("{0:^1$.2$}", s, width, precision), - Align::Right => format!("{0:>1$.2$}", s, width, precision), + Align::Left => format!("{0}{1:<2$.3$}", space, s, width, precision), + Align::Center => format!("{0}{1:^2$.3$}", space, s, width, precision), + Align::Right => format!("{0}{1:>2$.3$}", space, s, width, precision), }, + }; + if space == " " { + result.pop(); } + result } #[cfg(test)] @@ -187,6 +268,50 @@ mod tests { use super::*; #[test] + fn test_log10_plus_1() { + let nrs = [ + 1, 9, 10, 11, 99, 100, 101, 999, 1_000, 1_001, 9_999, 10_000, 10_001, 99_999, 100_000, + 100_001, 0, + ]; + let widths = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 1]; + for (n, w) in nrs.iter().zip(widths.iter()) { + assert_eq!(log10_plus_1(*n), *w); + } + + #[cfg(target_pointer_width = "64")] + { + assert_eq!(log10_plus_1(744_073_709_551_615), 5 * 3); + assert_eq!(log10_plus_1(18_446_744_073_709_551_615), 2 + 6 * 3); + } + } + + #[test] + fn test_center_right_space_trait() { + assert_eq!("abc".center_right_space(Align::Center, 6), ""); + assert_eq!("abc".center_right_space(Align::Center, 7), ""); + assert_eq!(123.center_right_space(Align::Center, 6), " "); + assert_eq!(123.center_right_space(Align::Center, 7), ""); + } + + #[test] + fn test_pad_center_align() { + assert_eq!(pad("abc", 6, Align::Center, None), " abc "); + assert_eq!(pad(1, 1, Align::Center, None), "1"); + assert_eq!(pad(1, 2, Align::Center, None), " 1"); + assert_eq!(pad(1, 3, Align::Center, None), " 1 "); + assert_eq!(pad(1, 4, Align::Center, None), " 1 "); + + assert_eq!(pad(1001, 3, Align::Center, None), "1001"); + assert_eq!(pad(1001, 4, Align::Center, None), "1001"); + assert_eq!(pad(1001, 5, Align::Center, None), " 1001"); + + assert_eq!(pad(1, 4, Align::Left, None), "1 "); + assert_eq!(pad(1, 4, Align::Right, None), " 1"); + assert_eq!(pad("abc", 5, Align::Left, None), "abc "); + assert_eq!(pad("abc", 5, Align::Right, None), " abc"); + } + + #[test] fn test_placeholder_regex() { let regex = make_placeholder_regex(&["placeholder"]); assert_eq!( diff --git a/src/handlers/blame.rs b/src/handlers/blame.rs index bc6dd7c7..876fcb40 100644 --- a/src/handlers/blame.rs +++ b/src/handlers/blame.rs @@ -246,10 +246,7 @@ pub fn format_blame_metadata( for placeholder in format_data { s.push_str(placeholder.prefix.as_str()); - let alignment_spec = placeholder - .alignment_spec - .as_ref() - .unwrap_or(&format::Align::Left); + let alignment_spec = placeholder.alignment_spec.unwrap_or(format::Align::Left); let width = placeholder.width.unwrap_or(15); let field = match placeholder.placeholder { diff --git a/src/tests/integration_test_utils.rs b/src/tests/integration_test_utils.rs index 6c75efd0..5b98f8f1 100644 --- a/src/tests/integration_test_utils.rs +++ b/src/tests/integration_test_utils.rs @@ -368,8 +368,8 @@ ignored! 2 r#" #indent_mark @@ -1,1 +1,1 @@ fn foo() { - 1 ⋮ │-1 - ⋮ 1 │+2"#, + 1 ⋮ │-1 + ⋮ 1 │+2"#, ); DeltaTest::with_args(&[]) diff --git a/src/wrapping.rs b/src/wrapping.rs index 37f7a6fb..4b6473bb 100644 --- a/src/wrapping.rs +++ b/src/wrapping.rs @@ -966,12 +966,12 @@ index 223ca50..e69de29 100644 .with_input(HUNK_MP_DIFF) .expect_after_header( r#" - │ 4 │ abcdefghijklmn+ │ 15 │ abcdefghijklmn+ + │ 4 │ abcdefghijklmn+ │ 15 │ abcdefghijklmn+ │ │ opqrstuvwxzy 0+ │ │ opqrstuvwxzy 0+ │ │ 123456789 0123+ │ │ 123456789 0123+ │ │ 456789 0123456+ │ │ 456789 0123456+ │ │ 789 0123456789> │ │ 789 0123456789> - │ 5 │-a = 0123456789+ │ 16 │+b = 0123456789+ + │ 5 │-a = 0123456789+ │ 16 │+b = 0123456789+ │ │ 0123456789 01+ │ │ 0123456789 01+ │ │ 23456789 01234+ │ │ 23456789 01234+ │ │ 56789 01234567+ │ │ 56789 01234567+ @@ -999,7 +999,7 @@ index 223ca50..e69de29 100644 )) .expect_after_header( r#" - │ 1 │.........1.........2< │ 1 │.........1.........2+ + │ 1 │.........1.........2< │ 1 │.........1.........2+ │ │ >.... │ │.........3.........4+ │ │ │ │.........5.........6"#, ); @@ -1014,7 +1014,7 @@ index 223ca50..e69de29 100644 )) .expect_after_header( r#" - │ 1 │.........1.........2+ │ 1 │.........1.........2< + │ 1 │.........1.........2+ │ 1 │.........1.........2< │ │.........3.........4+ │ │ >.... │ │.........5.........6 │ │"#, ); @@ -1039,7 +1039,7 @@ index 223ca50..e69de29 100644 )) .expect_after_header( r#" - │ 1 │.........1.........2....│ 1 │.........1.........2...+ + │ 1 │.........1.........2....│ 1 │.........1.........2...+ │ │ │ │......3.........4......+ │ │ │ │...5.........6 "#, ); @@ -1053,7 +1053,7 @@ index 223ca50..e69de29 100644 )) .expect_after_header( r#" - │ 1 │.........1.........2...+│ 1 │.........1.........2.... + │ 1 │.........1.........2...+│ 1 │.........1.........2.... │ │......3.........4......+│ │ │ │...5.........6 │ │"#, ); @@ -1082,7 +1082,7 @@ index 223ca50..e69de29 100644 )) .expect_after_header( r#" - │ 1 │.........1.........2.... │ 1 │.........1.........2.........+ + │ 1 │.........1.........2.... │ 1 │.........1.........2.........+ │ │ │ │3.........4.........5........+ │ │ │ │.6 "#, ); @@ -1097,7 +1097,7 @@ index 223ca50..e69de29 100644 )) .expect_after_header( r#" - │ 1 │.........1.........2.... │ 1 │.........1.........2.........+ + │ 1 │.........1.........2.... │ 1 │.........1.........2.........+ │ │ │ │3.........4.........5........>"#, ); } |