Treat lone LF followed by lone CR as two separate line endings

This commit is contained in:
Sebastian Bergmann 2026-05-23 06:27:12 +02:00
parent fb73a7e90f
commit b54c4ddf23
No known key found for this signature in database
2 changed files with 29 additions and 6 deletions

View File

@ -450,7 +450,6 @@ final readonly class Exporter
$value,
[
"\r\n" => '\r\n' . "\n",
"\n\r" => '\n\r' . "\n",
"\r" => '\r' . "\n",
"\n" => '\n' . "\n",
],

View File

@ -145,7 +145,9 @@ Array &0 [
EOF,
2,
],
// \n\r and \r is converted to \n
// A real newline is inserted after each line ending so the
// escaped text wraps readably; \r\n stays one break while a lone
// \n followed by a lone \r are two separate line endings.
'export multiline text' => ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext",
<<<'EOF'
'this\n
@ -157,8 +159,27 @@ very\n
very\n
very\n
very\r
long\n\r
long\n
\r
text'
EOF,
0,
],
// A lone \n (Unix) followed by a lone \r (old Mac) are two
// distinct line endings and must each produce their own break.
'lone newline followed by lone carriage return' => ["a\n\rb",
<<<'EOF'
'a\n
\r
b'
EOF,
0,
],
// \r\n (Windows) is a single line ending and stays one break.
'carriage return followed by newline' => ["a\r\nb",
<<<'EOF'
'a\r\n
b'
EOF,
0,
],
@ -180,7 +201,8 @@ very\n
very\n
very\n
very\r
long\n\r
long\n
\r
text',
'object' => stdClass Object #%d (
'foo' => 'bar',
@ -468,7 +490,8 @@ very\n
very\n
very\n
very\r
long\n\r
long\n
\r
text',
'object' => stdClass Object #%d (
'foo' => 'bar',
@ -493,7 +516,8 @@ very\n
very\n
very\n
very\r
long\n\r
long\n
\r
text',
'object' => stdClass Object #%d,
'objectagain' => stdClass Object #%d,