Merge "'lang' attrib in #mw-content-text should be set to variant code."
[lhc/web/wiklou.git] / includes / ImagePage.php
index fead0f5..7bbd584 100644 (file)
@@ -94,10 +94,47 @@ class ImagePage extends Article {
        /**
         * Handler for action=render
         * Include body text only; none of the image extras
+        * However, also include the shared description text
+        * so that cascading ForeignAPIRepo's work.
+        *
+        * @note This uses a div with the class "mw-shared-image-desc"
+        *    as opposed to the id "mw-shared-image-desc" since the text
+        *    from here may be cascadingly transcluded to other shared
+        *    repos, and we want all ids to be unique. On normal
+        *    view, the outermost shared description will still have
+        *    the id.
+        *
+        * This also differs from normal view in that "shareddescriptionfollows"
+        * message is not shown. I was not sure if it was appropriate to
+        * add that message here.
         */
        public function render() {
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               parent::view();
+               $out = $this->getContext()->getOutput();
+                $this->loadFile();
+
+                $descText = $this->mPage->getFile()->getDescriptionText();
+
+               $out->setArticleBodyOnly( true );
+
+               if ( !$descText ) {
+                       // If no description text, just do standard action=render
+                       parent::view();
+               } else {
+                       if ( $this->mPage->getID() !== 0 ) {
+                               // Local description exists. We need to output both
+                               parent::view();
+                               $out->addHTML( '<div class="mw-shared-image-desc">' . $descText . "</div>\n" );
+                       } else {
+                               // We don't want to output both a "noarticletext" message and the shared
+                               // description, so don't call parent::view().
+                               $out->addHTML( '<div class="mw-shared-image-desc">' . $descText . "</div>\n" );
+                               // Since we did not call parent::view(), have to call some methods it
+                               // normally takes care of. (Not that it matters much since skin not displayed)
+                               $out->setArticleFlag( true );
+                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                               $this->mPage->doViewUpdates( $this->getContext()->getUser() );
+                       }
+               }
        }
 
        public function view() {
@@ -153,7 +190,7 @@ class ImagePage extends Article {
                if ( $this->mPage->getID() ) {
                        # NS_FILE is in the user language, but this section (the actual wikitext)
                        # should be in page content language
-                       $pageLang = $this->getTitle()->getPageLanguage();
+                       $pageLang = $this->getTitle()->getPageViewLanguage();
                        $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
                                'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
                                'class' => 'mw-content-'.$pageLang->getDir() ) ) );
@@ -172,7 +209,7 @@ class ImagePage extends Article {
                        if ( !$fol->isDisabled() ) {
                                $out->addWikiText( $fol->plain() );
                        }
-                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+                       $out->addHTML( '<div id="shared-image-desc" class="mw-shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
                }
 
                $this->closeShowImage();
@@ -181,7 +218,7 @@ class ImagePage extends Article {
 
                $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
-                       wfMsg( 'imagelinks' ) ) . "\n" );
+                       wfMessage( 'imagelinks' )->text() ) . "\n" );
                $this->imageDupes();
                # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
                # Yet we return metadata about the target. Definitely an issue in the FileRepo
@@ -195,7 +232,10 @@ class ImagePage extends Article {
                }
 
                if ( $showmeta ) {
-                       $out->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
+                       $out->addHTML( Xml::element(
+                               'h2',
+                               array( 'id' => 'metadata' ),
+                               wfMessage( 'metadata' )->text() ) . "\n" );
                        $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
                        $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
@@ -227,12 +267,12 @@ class ImagePage extends Article {
         */
        protected function showTOC( $metadata ) {
                $r = array(
-                       '<li><a href="#file">' . wfMsgHtml( 'file-anchor-link' ) . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMsgHtml( 'filehist' ) . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMsgHtml( 'imagelinks' ) . '</a></li>',
+                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
                );
                if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMsgHtml( 'metadata' ) . '</a></li>';
+                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
                }
 
                wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
@@ -250,7 +290,7 @@ class ImagePage extends Article {
         */
        protected function makeMetadataTable( $metadata ) {
                $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMsgNoTrans( 'metadata-help' );
+               $r .= wfMessage( 'metadata-help' )->plain();
                $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
                foreach ( $metadata as $type => $stuff ) {
                        foreach ( $stuff as $v ) {
@@ -322,7 +362,7 @@ class ImagePage extends Article {
                        $height_orig = $this->displayImg->getHeight( $page );
                        $height = $height_orig;
 
-                       $longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
+                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
 
                        wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
 
@@ -330,7 +370,7 @@ class ImagePage extends Article {
                                # image
 
                                # "Download high res version" link below the image
-                               # $msgsize = wfMsgHtml( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime );
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight ) {
                                        # Calculate the thumbnail size.
@@ -346,7 +386,7 @@ class ImagePage extends Article {
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
                                        }
-                                       $msgbig = wfMsgHtml( 'show-big-image' );
+                                       $msgbig = wfMessage( 'show-big-image' )->escaped();
                                        if ( $this->displayImg->getRepo()->canTransformVia404() ) {
                                                $thumbSizes = $wgImageLimits;
                                        } else {
@@ -411,7 +451,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $out->parse( wfMsg( 'imgmultipageprev' ), false );
+                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -425,7 +465,7 @@ class ImagePage extends Article {
                                        }
 
                                        if ( $page < $count ) {
-                                               $label = wfMsg( 'imgmultipagenext' );
+                                               $label = wfMessage( 'imgmultipagenext' )->text();
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -457,8 +497,8 @@ class ImagePage extends Article {
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                               wfMsgExt( 'imgmultigoto', array( 'parseinline', 'replaceafter' ), $select ) .
-                                               Xml::submitButton( wfMsg( 'imgmultigo' ) ) .
+                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
                                                Xml::closeElement( 'form' ) .
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
                                        );
@@ -485,7 +525,7 @@ class ImagePage extends Article {
                                $medialink = "[[Media:$filename|$linktext]]";
 
                                if ( !$this->displayImg->isSafeFile() ) {
-                                       $warning = wfMsgNoTrans( 'mediawarning' );
+                                       $warning = wfMessage( 'mediawarning' )->plain();
                                        // dirmark is needed here to separate the file name, which
                                        // most likely ends in Latin characters, from the description,
                                        // which may begin with the file type. In RTL environment
@@ -507,6 +547,25 @@ EOT
                                }
                        }
 
+                       // Add cannot animate thumbnail warning
+                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
+                               // Include the extension so wiki admins can
+                               // customize it on a per file-type basis
+                               // (aka say things like use format X instead).
+                               // additionally have a specific message for
+                               // file-no-thumb-animation-gif
+                               $ext = $this->displayImg->getExtension();
+                               $noAnimMesg = wfMessageFallback(
+                                       'file-no-thumb-animation-' . $ext,
+                                       'file-no-thumb-animation'
+                               )->plain();
+
+                               $out->addWikiText( <<<EOT
+<div class="mw-noanimatethumb">{$noAnimMesg}</div>
+EOT
+                               );
+                       }
+
                        if ( !$this->displayImg->isLocal() ) {
                                $this->printSharedImageText();
                        }
@@ -593,9 +652,9 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-'  ) {
+               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-'  ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
+               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -632,19 +691,22 @@ EOT
                }
 
                $out = $this->getContext()->getOutput();
-               $out->addHTML( "<br /><ul>\n" );
+               $out->addHTML( "<ul>\n" );
 
                # "Upload a new version of this file" link
-               if ( UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
-                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
+               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+               if ( $canUpload && UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
+                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMessage( 'uploadnewversion-linktext' )->text() );
                        $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               } else {
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
                # External editing link
                if ( $wgUseExternalEditor ) {
                        $elink = Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'edit-externally' ),
+                               wfMessage( 'edit-externally' )->escaped(),
                                array(),
                                array(
                                        'action' => 'edit',
@@ -654,8 +716,8 @@ EOT
                        );
                        $out->addHTML(
                                '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
-                               wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
-                               "</small></li>\n"
+                                       wfMessage( 'edit-externally-help' )->parse() .
+                                       "</small></li>\n"
                        );
                }
 
@@ -778,7 +840,7 @@ EOT
                                        $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
                                        $ul .= Html::rawElement(
                                                'li',
-                                               array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                               array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
                                                $link2
                                                ) . "\n";
                                }
@@ -788,7 +850,7 @@ EOT
                        }
                        $out->addHTML( Html::rawElement(
                                        'li',
-                                       array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                       array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
                                        $liContents
                                ) . "\n"
                        );
@@ -829,7 +891,7 @@ EOT
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
+                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
@@ -944,18 +1006,18 @@ class ImageHistoryList extends ContextSource {
         * @return string
         */
        public function beginImageHistoryList( $navLinks = '' ) {
-               return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
+               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() ) . "\n"
                        . "<div id=\"mw-imagepage-section-filehistory\">\n"
-                       . $this->getOutput()->parse( wfMsgNoTrans( 'filehist-help' ) )
+                       . $this->msg( 'filehist-help' )->parseAsBlock()
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
                        . '<tr><td></td>'
                        . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
-                       . '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
-                       . ( $this->showThumb ? '<th>' . wfMsgHtml( 'filehist-thumb' ) . '</th>' : '' )
-                       . '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
-                       . '<th>' . wfMsgHtml( 'filehist-user' ) . '</th>'
-                       . '<th>' . wfMsgHtml( 'filehist-comment' ) . '</th>'
+                       . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
+                       . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
+                       . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
                        . "</tr>\n";
        }
 
@@ -997,7 +1059,7 @@ class ImageHistoryList extends ContextSource {
                                }
                                $row .= Linker::linkKnown(
                                        $this->title,
-                                       wfMsgHtml( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' ),
+                                       $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
                                        array(), $q
                                );
                        }
@@ -1008,7 +1070,7 @@ class ImageHistoryList extends ContextSource {
                                        $row .= '<br />';
                                }
                                // If file is top revision or locked from this user, don't link
-                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
+                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
                                        $del = Linker::revDeleteLinkDisabled( $canHide );
                                } else {
                                        list( $ts, ) = explode( '!', $img, 2 );
@@ -1028,16 +1090,16 @@ class ImageHistoryList extends ContextSource {
                // Reversion link/current indicator
                $row .= '<td>';
                if ( $iscur ) {
-                       $row .= wfMsgHtml( 'filehist-current' );
-               } elseif ( $local && $this->title->quickUserCan( 'edit' )
-                       && $this->title->quickUserCan( 'upload' )
+                       $row .= $this->msg( 'filehist-current' )->escaped();
+               } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
+                       && $this->title->quickUserCan( 'upload', $user )
                ) {
                        if ( $file->isDeleted( File::DELETED_FILE ) ) {
-                               $row .= wfMsgHtml( 'filehist-revert' );
+                               $row .= $this->msg( 'filehist-revert' )->escaped();
                        } else {
                                $row .= Linker::linkKnown(
                                        $this->title,
-                                       wfMsgHtml( 'filehist-revert' ),
+                                       $this->msg( 'filehist-revert' )->escaped(),
                                        array(),
                                        array(
                                                'action' => 'revert',
@@ -1054,9 +1116,9 @@ class ImageHistoryList extends ContextSource {
                        $selected = "class='filehistory-selected'";
                }
                $row .= "<td $selected style='white-space: nowrap;'>";
-               if ( !$file->userCan( File::DELETED_FILE ) ) {
+               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
                        # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">' . $lang->timeanddate( $timestamp, true ) . '</span>';
+                       $row .= '<span class="history-deleted">' . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
                } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
                        if ( $local ) {
                                $this->preventClickjacking();
@@ -1064,7 +1126,7 @@ class ImageHistoryList extends ContextSource {
                                # Make a link to review the image
                                $url = Linker::linkKnown(
                                        $revdel,
-                                       $lang->timeanddate( $timestamp, true ),
+                                       $lang->userTimeAndDate( $timestamp, $user ),
                                        array(),
                                        array(
                                                'target' => $this->title->getPrefixedText(),
@@ -1073,12 +1135,12 @@ class ImageHistoryList extends ContextSource {
                                        )
                                );
                        } else {
-                               $url = $lang->timeanddate( $timestamp, true );
+                               $url = $lang->userTimeAndDate( $timestamp, $user );
                        }
                        $row .= '<span class="history-deleted">' . $url . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->timeanddate( $timestamp, true ) );
+                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->userTimeAndDate( $timestamp, $user ) );
                }
                $row .= "</td>";
 
@@ -1090,9 +1152,9 @@ class ImageHistoryList extends ContextSource {
                // Image dimensions + size
                $row .= '<td>';
                $row .= htmlspecialchars( $file->getDimensionsString() );
-               $row .= $this->getContext()->msg( 'word-separator' )->plain();
+               $row .= $this->msg( 'word-separator' )->plain();
                $row .= '<span style="white-space: nowrap;">';
-               $row .= $this->getContext()->msg( 'parentheses' )->rawParams( Linker::formatSize( $file->getSize() ) )->plain();
+               $row .= $this->msg( 'parentheses' )->rawParams( Linker::formatSize( $file->getSize() ) )->plain();
                $row .= '</span>';
                $row .= '</td>';
 
@@ -1100,11 +1162,11 @@ class ImageHistoryList extends ContextSource {
                $row .= '<td>';
                // Hide deleted usernames
                if ( $file->isDeleted( File::DELETED_USER ) ) {
-                       $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+                       $row .= '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        if ( $local ) {
                                $row .= Linker::userLink( $userId, $userText );
-                               $row .= $this->getContext()->msg( 'word-separator' )->plain();
+                               $row .= $this->msg( 'word-separator' )->plain();
                                $row .= '<span style="white-space: nowrap;">';
                                $row .= Linker::userToolLinks( $userId, $userText );
                                $row .= '</span>';
@@ -1116,7 +1178,7 @@ class ImageHistoryList extends ContextSource {
 
                // Don't show deleted descriptions
                if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $row .= '<td><span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span></td>';
+                       $row .= '<td><span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
                } else {
                        $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::formatComment( $description, $this->title ) . '</td>';
                }
@@ -1134,7 +1196,10 @@ class ImageHistoryList extends ContextSource {
         */
        protected function getThumbForLine( $file ) {
                $lang = $this->getLanguage();
-               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
+               $user = $this->getUser();
+               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE,$user )
+                       && !$file->isDeleted( File::DELETED_FILE ) )
+               {
                        $params = array(
                                'width' => '120',
                                'height' => '120',
@@ -1143,20 +1208,20 @@ class ImageHistoryList extends ContextSource {
 
                        $thumbnail = $file->transform( $params );
                        $options = array(
-                               'alt' => wfMsg( 'filehist-thumbtext',
-                                       $lang->timeanddate( $timestamp, true ),
-                                       $lang->date( $timestamp, true ),
-                                       $lang->time( $timestamp, true ) ),
+                               'alt' => $this->msg( 'filehist-thumbtext',
+                                       $lang->userTimeAndDate( $timestamp, $user ),
+                                       $lang->userDate( $timestamp, $user ),
+                                       $lang->userTime( $timestamp, $user ) )->text(),
                                'file-link' => true,
                        );
 
                        if ( !$thumbnail ) {
-                               return wfMsgHtml( 'filehist-nothumb' );
+                               return $this->msg( 'filehist-nothumb' )->escaped();
                        }
 
                        return $thumbnail->toHtml( $options );
                } else {
-                       return wfMsgHtml( 'filehist-nothumb' );
+                       return $this->msg( 'filehist-nothumb' )->escaped();
                }
        }