Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-core/src/line_ending.rs')
| -rw-r--r-- | helix-core/src/line_ending.rs | 99 |
1 files changed, 18 insertions, 81 deletions
diff --git a/helix-core/src/line_ending.rs b/helix-core/src/line_ending.rs index 36c02a94..18ea5f9f 100644 --- a/helix-core/src/line_ending.rs +++ b/helix-core/src/line_ending.rs @@ -1,32 +1,26 @@ use crate::{Rope, RopeSlice}; #[cfg(target_os = "windows")] -pub const NATIVE_LINE_ENDING: LineEnding = LineEnding::Crlf; +pub const DEFAULT_LINE_ENDING: LineEnding = LineEnding::Crlf; #[cfg(not(target_os = "windows"))] -pub const NATIVE_LINE_ENDING: LineEnding = LineEnding::LF; +pub const DEFAULT_LINE_ENDING: LineEnding = LineEnding::LF; /// Represents one of the valid Unicode line endings. -#[derive(PartialEq, Eq, Copy, Clone, Debug)] +#[derive(PartialEq, Copy, Clone, Debug)] pub enum LineEnding { Crlf, // CarriageReturn followed by LineFeed LF, // U+000A -- LineFeed - #[cfg(feature = "unicode-lines")] - VT, // U+000B -- VerticalTab - #[cfg(feature = "unicode-lines")] - FF, // U+000C -- FormFeed - #[cfg(feature = "unicode-lines")] - CR, // U+000D -- CarriageReturn - #[cfg(feature = "unicode-lines")] - Nel, // U+0085 -- NextLine - #[cfg(feature = "unicode-lines")] - LS, // U+2028 -- Line Separator - #[cfg(feature = "unicode-lines")] - PS, // U+2029 -- ParagraphSeparator + VT, // U+000B -- VerticalTab + FF, // U+000C -- FormFeed + CR, // U+000D -- CarriageReturn + Nel, // U+0085 -- NextLine + LS, // U+2028 -- Line Separator + PS, // U+2029 -- ParagraphSeparator } impl LineEnding { #[inline] - pub const fn len_chars(&self) -> usize { + pub fn len_chars(&self) -> usize { match self { Self::Crlf => 2, _ => 1, @@ -34,40 +28,28 @@ impl LineEnding { } #[inline] - pub const fn as_str(&self) -> &'static str { + pub fn as_str(&self) -> &'static str { match self { Self::Crlf => "\u{000D}\u{000A}", Self::LF => "\u{000A}", - #[cfg(feature = "unicode-lines")] Self::VT => "\u{000B}", - #[cfg(feature = "unicode-lines")] Self::FF => "\u{000C}", - #[cfg(feature = "unicode-lines")] Self::CR => "\u{000D}", - #[cfg(feature = "unicode-lines")] Self::Nel => "\u{0085}", - #[cfg(feature = "unicode-lines")] Self::LS => "\u{2028}", - #[cfg(feature = "unicode-lines")] Self::PS => "\u{2029}", } } #[inline] - pub const fn from_char(ch: char) -> Option<LineEnding> { + pub fn from_char(ch: char) -> Option<LineEnding> { match ch { '\u{000A}' => Some(LineEnding::LF), - #[cfg(feature = "unicode-lines")] '\u{000B}' => Some(LineEnding::VT), - #[cfg(feature = "unicode-lines")] '\u{000C}' => Some(LineEnding::FF), - #[cfg(feature = "unicode-lines")] '\u{000D}' => Some(LineEnding::CR), - #[cfg(feature = "unicode-lines")] '\u{0085}' => Some(LineEnding::Nel), - #[cfg(feature = "unicode-lines")] '\u{2028}' => Some(LineEnding::LS), - #[cfg(feature = "unicode-lines")] '\u{2029}' => Some(LineEnding::PS), // Not a line ending _ => None, @@ -83,17 +65,11 @@ impl LineEnding { match g { "\u{000D}\u{000A}" => Some(LineEnding::Crlf), "\u{000A}" => Some(LineEnding::LF), - #[cfg(feature = "unicode-lines")] "\u{000B}" => Some(LineEnding::VT), - #[cfg(feature = "unicode-lines")] "\u{000C}" => Some(LineEnding::FF), - #[cfg(feature = "unicode-lines")] "\u{000D}" => Some(LineEnding::CR), - #[cfg(feature = "unicode-lines")] "\u{0085}" => Some(LineEnding::Nel), - #[cfg(feature = "unicode-lines")] "\u{2028}" => Some(LineEnding::LS), - #[cfg(feature = "unicode-lines")] "\u{2029}" => Some(LineEnding::PS), // Not a line ending _ => None, @@ -119,20 +95,13 @@ pub fn str_is_line_ending(s: &str) -> bool { LineEnding::from_str(s).is_some() } -#[inline] -pub fn rope_is_line_ending(r: RopeSlice) -> bool { - r.chunks().all(str_is_line_ending) -} - /// Attempts to detect what line ending the passed document uses. pub fn auto_detect_line_ending(doc: &Rope) -> Option<LineEnding> { // Return first matched line ending. Not all possible line endings // are being matched, as they might be special-use only for line in doc.lines().take(100) { match get_line_ending(&line) { - None => {} - #[cfg(feature = "unicode-lines")] - Some(LineEnding::VT) | Some(LineEnding::FF) | Some(LineEnding::PS) => {} + None | Some(LineEnding::VT) | Some(LineEnding::FF) | Some(LineEnding::PS) => {} ending => return ending, } } @@ -159,19 +128,6 @@ pub fn get_line_ending(line: &RopeSlice) -> Option<LineEnding> { LineEnding::from_str(g2).or_else(|| LineEnding::from_str(g1)) } -#[cfg(not(feature = "unicode-lines"))] -/// Returns the passed line's line ending, if any. -pub fn get_line_ending_of_str(line: &str) -> Option<LineEnding> { - if line.ends_with("\u{000D}\u{000A}") { - Some(LineEnding::Crlf) - } else if line.ends_with('\u{000A}') { - Some(LineEnding::LF) - } else { - None - } -} - -#[cfg(feature = "unicode-lines")] /// Returns the passed line's line ending, if any. pub fn get_line_ending_of_str(line: &str) -> Option<LineEnding> { if line.ends_with("\u{000D}\u{000A}") { @@ -203,13 +159,6 @@ pub fn line_end_char_index(slice: &RopeSlice, line: usize) -> usize { .unwrap_or(0) } -pub fn line_end_byte_index(slice: &RopeSlice, line: usize) -> usize { - slice.line_to_byte(line + 1) - - get_line_ending(&slice.line(line)) - .map(|le| le.as_str().len()) - .unwrap_or(0) -} - /// Fetches line `line_idx` from the passed rope slice, sans any line ending. pub fn line_without_line_ending<'a>(slice: &'a RopeSlice, line_idx: usize) -> RopeSlice<'a> { let start = slice.line_to_char(line_idx); @@ -262,7 +211,6 @@ mod line_ending_tests { #[test] fn str_to_line_ending() { - #[cfg(feature = "unicode-lines")] assert_eq!(LineEnding::from_str("\r"), Some(LineEnding::CR)); assert_eq!(LineEnding::from_str("\n"), Some(LineEnding::LF)); assert_eq!(LineEnding::from_str("\r\n"), Some(LineEnding::Crlf)); @@ -272,7 +220,6 @@ mod line_ending_tests { #[test] fn rope_slice_to_line_ending() { let r = Rope::from_str("hello\r\n"); - #[cfg(feature = "unicode-lines")] assert_eq!( LineEnding::from_rope_slice(&r.slice(5..6)), Some(LineEnding::CR) @@ -291,7 +238,6 @@ mod line_ending_tests { #[test] fn get_line_ending_rope_slice() { let r = Rope::from_str("Hello\rworld\nhow\r\nare you?"); - #[cfg(feature = "unicode-lines")] assert_eq!(get_line_ending(&r.slice(..6)), Some(LineEnding::CR)); assert_eq!(get_line_ending(&r.slice(..12)), Some(LineEnding::LF)); assert_eq!(get_line_ending(&r.slice(..17)), Some(LineEnding::Crlf)); @@ -301,28 +247,19 @@ mod line_ending_tests { #[test] fn get_line_ending_str() { let text = "Hello\rworld\nhow\r\nare you?"; - #[cfg(feature = "unicode-lines")] assert_eq!(get_line_ending_of_str(&text[..6]), Some(LineEnding::CR)); assert_eq!(get_line_ending_of_str(&text[..12]), Some(LineEnding::LF)); assert_eq!(get_line_ending_of_str(&text[..17]), Some(LineEnding::Crlf)); - assert_eq!(get_line_ending_of_str(text), None); + assert_eq!(get_line_ending_of_str(&text[..]), None); } #[test] fn line_end_char_index_rope_slice() { let r = Rope::from_str("Hello\rworld\nhow\r\nare you?"); let s = &r.slice(..); - #[cfg(not(feature = "unicode-lines"))] - { - assert_eq!(line_end_char_index(s, 0), 11); - assert_eq!(line_end_char_index(s, 1), 15); - assert_eq!(line_end_char_index(s, 2), 25); - } - #[cfg(feature = "unicode-lines")] - { - assert_eq!(line_end_char_index(s, 0), 5); - assert_eq!(line_end_char_index(s, 1), 11); - assert_eq!(line_end_char_index(s, 2), 15); - } + assert_eq!(line_end_char_index(s, 0), 5); + assert_eq!(line_end_char_index(s, 1), 11); + assert_eq!(line_end_char_index(s, 2), 15); + assert_eq!(line_end_char_index(s, 3), 25); } } |