From a1ec5e88e878b15dbadc6c7acd2e4f1241b500f5 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Thu, 31 Mar 2022 09:32:21 -0700 Subject: [PATCH] Fix side-by-side display when source contains CRLF Fixes #212 --- CHANGELOG.md | 2 ++ src/side_by_side.rs | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccb035c39..4ebb8efde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ specified. Fixed a crash when a text file ended with a multibyte character. +Fixed side-by-side display when source files contained CRLF. + ### Parsing Fixed an issue in C and C++ where blank lines were highlighted after diff --git a/src/side_by_side.rs b/src/side_by_side.rs index f1e2d6fab..c55d2a7fa 100644 --- a/src/side_by_side.rs +++ b/src/side_by_side.rs @@ -17,12 +17,20 @@ use crate::{ const SPACER: &str = " "; -/// Split `s` by newlines. Always returns a non-empty vec. +/// Split `s` on \n or \r\n. Always returns a non-empty vec. /// /// This differs from `str::lines`, which considers `""` to be zero /// lines and `"foo\n"` to be one line. fn split_on_newlines(s: &str) -> Vec<&str> { - s.split('\n').collect() + s.split('\n') + .map(|l| { + if let Some(l) = l.strip_suffix('\r') { + l + } else { + l + } + }) + .collect() } fn format_line_num_padded(line_num: LineNumber, column_width: usize) -> String { @@ -621,6 +629,11 @@ mod tests { assert_eq!(split_on_newlines("foo\nbar"), vec!["foo", "bar"]); } + #[test] + fn test_split_line_with_crlf() { + assert_eq!(split_on_newlines("foo\r\nbar"), vec!["foo", "bar"]); + } + #[test] fn test_split_line_with_trailing_newline() { assert_eq!(split_on_newlines("foo\nbar\n"), vec!["foo", "bar", ""]);