From 016ad53a2f4f5a79ef4164eaf57a13e5147eb53a Mon Sep 17 00:00:00 2001 From: Timothy Clem Date: Thu, 18 Jun 2020 07:40:48 -0700 Subject: [PATCH] Trim end of lines as well --- tags/src/lib.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/tags/src/lib.rs b/tags/src/lib.rs index d57e3fb5..1959c753 100644 --- a/tags/src/lib.rs +++ b/tags/src/lib.rs @@ -494,18 +494,27 @@ fn line_range(text: &[u8], index: usize, max_line_len: usize) -> Range { let start = memrchr(b'\n', &text[0..index]).map_or(0, |i| i + 1); let max_line_len = max_line_len.min(text.len() - start); let end = start + memchr(b'\n', &text[start..(start + max_line_len)]).unwrap_or(max_line_len); - trim_start(text, start..end) + trim_end(text, trim_start(text, start..end)) } fn trim_start(text: &[u8], r: Range) -> Range { for (index, c) in text[r.start..r.end].iter().enumerate() { - if !c.is_ascii_whitespace(){ + if !c.is_ascii_whitespace() { return (r.start+index)..r.end } } return r } +fn trim_end(text: &[u8], r: Range) -> Range { + for (index, c) in text[r.start..r.end].iter().rev().enumerate() { + if !c.is_ascii_whitespace() { + return r.start..(r.end-index) + } + } + return r +} + #[cfg(test)] mod tests { use super::*; @@ -528,8 +537,15 @@ mod tests { let text = b" foo\nbar\n"; assert_eq!(line_range(text, 0, 10), 3..6); - let text = b"\t func foo\nbar\n"; + let text = b"\t func foo \nbar\n"; assert_eq!(line_range(text, 0, 10), 2..10); - assert_eq!(line_range(text, 11, 10), 11..14); + + let r = line_range(text, 0, 14); + assert_eq!(r, 2..10); + assert_eq!(str::from_utf8(&text[r]).unwrap_or(""), "func foo"); + + let r = line_range(text, 12, 14); + assert_eq!(r, 12..15); + assert_eq!(str::from_utf8(&text[r]).unwrap_or(""), "bar"); } }