Use OutputPage::addWikiTextAsInterface() instead of untidy addWikiText()
[lhc/web/wiklou.git] / includes / ProtectionForm.php
index 53608e8..0d0654e 100644 (file)
@@ -196,7 +196,7 @@ class ProtectionForm {
        /**
         * Show the input form with optional error message
         *
-        * @param string $err Error message or null if there's no error
+        * @param string|null $err Error message or null if there's no error
         */
        function show( $err = null ) {
                $out = $this->mContext->getOutput();
@@ -204,9 +204,9 @@ class ProtectionForm {
                $out->addBacklinkSubtitle( $this->mTitle );
 
                if ( is_array( $err ) ) {
-                       $out->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
+                       $out->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n", $err );
                } elseif ( is_string( $err ) ) {
-                       $out->addHTML( "<p class='error'>{$err}</p>\n" );
+                       $out->addHTML( "<div class='error'>{$err}</div>\n" );
                }
 
                if ( $this->mTitle->getRestrictionTypes() === [] ) {
@@ -216,7 +216,9 @@ class ProtectionForm {
                                'protect-norestrictiontypes-title',
                                $this->mTitle->getPrefixedText()
                        ) );
-                       $out->addWikiText( $this->mContext->msg( 'protect-norestrictiontypes-text' )->plain() );
+                       $out->addWikiTextAsInterface(
+                               $this->mContext->msg( 'protect-norestrictiontypes-text' )->plain()
+                       );
 
                        // Show the log in case protection was possible once
                        $this->showLogExtract( $out );
@@ -246,7 +248,9 @@ class ProtectionForm {
                                $this->mContext->msg( 'protect-title-notallowed',
                                        $this->mTitle->getPrefixedText() )
                        );
-                       $out->addWikiText( $out->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
+                       $out->addWikiTextAsInterface( $out->formatPermissionsErrorMessage(
+                               $this->mPermErrors, 'protect'
+                       ) );
                } else {
                        $out->setPageTitle( $this->mContext->msg( 'protect-title', $this->mTitle->getPrefixedText() ) );
                        $out->addWikiMsg( 'protect-text',
@@ -349,7 +353,9 @@ class ProtectionForm {
                $user = $context->getUser();
                $output = $context->getOutput();
                $lang = $context->getLanguage();
-               $cascadingRestrictionLevels = $context->getConfig()->get( 'CascadingRestrictionLevels' );
+               $conf = $context->getConfig();
+               $cascadingRestrictionLevels = $conf->get( 'CascadingRestrictionLevels' );
+               $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
                $out = '';
                if ( !$this->disabled ) {
                        $output->addModules( 'mediawiki.legacy.protect' );
@@ -494,6 +500,13 @@ class ProtectionForm {
                                $this->mReasonSelection,
                                'mwProtect-reason', 4 );
 
+                       // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+                       // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+                       // Unicode codepoints (or 180 UTF-8 bytes for old schema).
+                       // Subtract arbitrary 75 to leave some space for the autogenerated null edit's summary
+                       // and other texts chosen by dropdown menus on this page.
+                       $maxlength = $oldCommentSchema ? 180 : CommentStore::COMMENT_CHARACTER_LIMIT - 75;
+
                        $out .= Xml::openElement( 'table', [ 'id' => 'mw-protect-table3' ] ) .
                                Xml::openElement( 'tbody' );
                        $out .= "
@@ -511,10 +524,7 @@ class ProtectionForm {
                                        </td>
                                        <td class='mw-input'>" .
                                                Xml::input( 'mwProtect-reason', 60, $this->mReason, [ 'type' => 'text',
-                                                       'id' => 'mwProtect-reason', 'maxlength' => 180 ] ) .
-                                                       // Limited maxlength as the database trims at 255 bytes and other texts
-                                                       // chosen by dropdown menus on this page are also included in this database field.
-                                                       // The byte limit of 180 bytes is enforced in javascript
+                                                       'id' => 'mwProtect-reason', 'maxlength' => $maxlength ] ) .
                                        "</td>
                                </tr>";
                        # Disallow watching is user is not logged in