Detecting type of line breaks
Thank @Sam-Graham. I tried to produce an optimized way. Also, the output of the function is directly usable (see below example):
function getLineBreakChar(string) {
const indexOfLF = string.indexOf('\n', 1); // No need to check first-character
if (indexOfLF === -1) {
if (string.indexOf('\r') !== -1) return '\r';
return '\n';
}
if (string[indexOfLF - 1] === '\r') return '\r\n';
return '\n';
}
Note1: Supposed string
is healthy (only contains one type of line-breaks).
Note2: Supposed you want LF
to be default encoding (when no line-break found).
Usage example:
fs.writeFileSync(filePath,
string.substring(0, a) +
getLineBreakChar(string) +
string.substring(b)
);
A utility (may be helpful):
function getLineBreakName(lineBreakChar) {
return lineBreakChar === '\n' ? 'LF' : lineBreakChar === '\r' ? 'CR' : 'CRLF';
}
You would want to look first for an LF. like source.indexOf('\n')
and then see if the character behind it is a CR like source[source.indexOf('\n')-1] === '\r'
. This way, you just find the first example of a newline and match to it. In summary,
function whichLineEnding(source) {
var temp = source.indexOf('\n');
if (source[temp - 1] === '\r')
return 'CRLF'
return 'LF'
}
There are two popularish examples of libraries doing this in the npm modules: node-newline and crlf-helper The first does a split on the entire string which is very inefficient in your case. The second uses a regex which in your case would not be quick enough.
However, from your edit, if you want to determine which is more plentiful. Then I would use the code from node-newline as it does handle that case.