Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

trananhtung/detect-newline

Open more actions menu

Repository files navigation

detect-newline

All Contributors

Crates.io Documentation CI License

Detect and normalize line endings\n (LF), \r\n (CRLF), and \r (CR). Zero dependencies and no_std. A Rust take on Node's detect-newline, plus the conversion and line-splitting you usually reach for next.

use detect_newline::{detect, dominant, to_lf, lines, Newline};

assert_eq!(detect("a\r\nb"), Some(Newline::CrLf));        // first ending found
assert_eq!(dominant("a\nb\nc\r\nd"), Some(Newline::Lf));  // most common
assert_eq!(to_lf("a\r\nb\rc"), "a\nb\nc");                // normalize
assert_eq!(lines("a\r\nb\rc").collect::<Vec<_>>(), ["a", "b", "c"]); // CR-aware

Why detect-newline?

The Rust standard library's str::lines splits on \n/\r\n but not a lone \r, and there's no built-in way to detect a string's line-ending style or normalize a mixed string to one. This crate is the small, focused piece — pick a window of text apart by line ending, decide which one a file uses, and convert between them.

[dependencies]
detect-newline = "0.1"

API

Item Purpose
detect(text) The first line ending, or None
dominant(text) The most frequent line ending (ties → first occurrence)
count(text) Counts { lf, crlf, cr } of each style
normalize(text, to) / to_lf / to_crlf / to_cr Convert every ending to one style
lines(text) Iterate lines, splitting on \n, \r\n, and lone \r
has_trailing_newline(text) / strip_trailing_newline(text) Trailing-ending helpers
Newline Lf (default), CrLf, Cr

Behavior

  • \r\n is always one line ending, never a \r followed by a \n — in detection, counting, normalization, and splitting alike.
  • detect returns the first ending found; dominant returns the most frequent, breaking ties toward whichever style occurs first.
  • normalize operates on character boundaries (safe for any UTF-8) and is idempotent.
  • lines mirrors str::lines but also splits a lone \r; a single trailing line ending does not yield a final empty line.

no_std

#![no_std] (needs only alloc for String) with zero dependencies.

Contributors ✨

This project follows the all-contributors specification. Contributions of any kind are welcome — code, docs, bug reports, ideas, reviews! See the emoji key for how each contribution is recognized, and open a PR or issue to get involved.

Thanks goes to these wonderful people:

Tung Tran
Tung Tran

💻 🚧

License

Licensed under either of Apache-2.0 or MIT at your option.

About

Detect and normalize line endings (LF, CRLF, CR). A zero-dependency, no_std Rust take on Node's detect-newline.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.