TextContent: Normalize newlines in preSaveTransform()
authorBrad Jorsch <bjorsch@wikimedia.org>
Mon, 15 Aug 2016 15:26:44 +0000 (11:26 -0400)
committerBrad Jorsch <bjorsch@wikimedia.org>
Tue, 16 Aug 2016 14:21:32 +0000 (10:21 -0400)
This does the same normalization of newlines that
Parser::preSaveTransform() does. This should be appropriate for any text
content type, especially considering that EditPage uses
WebRequest::getText() which does a less-strict version of this same
transformation.

This also cleans up the code for doing that newline replacement
to be a bit less verbose.

Bug: T142805
Change-Id: I462afcda502f031a8b0360d982ce2398a0383a96

includes/content/TextContent.php
includes/parser/Parser.php
tests/phpunit/includes/content/TextContentTest.php

index 225522e..de650b9 100644 (file)
@@ -149,7 +149,7 @@ class TextContent extends AbstractContent {
 
        /**
         * Returns a Content object with pre-save transformations applied.
-        * This implementation just trims trailing whitespace.
+        * This implementation just trims trailing whitespace and normalizes newlines.
         *
         * @param Title $title
         * @param User $user
@@ -160,6 +160,7 @@ class TextContent extends AbstractContent {
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                $text = $this->getNativeData();
                $pst = rtrim( $text );
+               $pst = str_replace( [ "\r\n", "\r" ], "\n", $pst );
 
                return ( $text === $pst ) ? $this : new static( $pst, $this->getModel() );
        }
index 206ad00..4f579a9 100644 (file)
@@ -4364,11 +4364,7 @@ class Parser {
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
-               $pairs = [
-                       "\r\n" => "\n",
-                       "\r" => "\n",
-               ];
-               $text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
+               $text = str_replace( [ "\r\n", "\r" ], "\n", $text );
                if ( $options->getPreSaveTransform() ) {
                        $text = $this->pstPass2( $text, $user );
                }
index ac83428..b4ae765 100644 (file)
@@ -102,6 +102,11 @@ class TextContentTest extends MediaWikiLangTestCase {
                                " Foo \n ",
                                ' Foo',
                        ],
+                       [
+                               # 2: newline normalization
+                               "LF\n\nCRLF\r\n\r\nCR\r\rEND",
+                               "LF\n\nCRLF\n\nCR\n\nEND",
+                       ],
                ];
        }