dupes = null; $this->repo = null; } /** * @param $file File: * @return void */ public function setFile( $file ) { $this->displayImg = $file; $this->img = $file; $this->fileLoaded = true; } protected function loadFile() { if ( $this->fileLoaded ) { return true; } $this->fileLoaded = true; $this->displayImg = $this->img = false; wfRunHooks( 'ImagePageFindFile', array( $this, &$this->img, &$this->displayImg ) ); if ( !$this->img ) { $this->img = wfFindFile( $this->mTitle ); if ( !$this->img ) { $this->img = wfLocalFile( $this->mTitle ); } } if ( !$this->displayImg ) { $this->displayImg = $this->img; } $this->repo = $this->img->getRepo(); } /** * Handler for action=render * Include body text only; none of the image extras */ public function render() { global $wgOut; $wgOut->setArticleBodyOnly( true ); parent::view(); } public function view() { global $wgOut, $wgShowEXIF, $wgRequest, $wgUser; $diff = $wgRequest->getVal( 'diff' ); $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) ); if ( $this->mTitle->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) { return parent::view(); } $this->loadFile(); if ( $this->mTitle->getNamespace() == NS_FILE && $this->img->getRedirected() ) { if ( $this->mTitle->getDBkey() == $this->img->getName() || isset( $diff ) ) { // mTitle is the same as the redirect target so ask Article // to perform the redirect for us. $wgRequest->setVal( 'diffonly', 'true' ); return parent::view(); } else { // mTitle is not the same as the redirect target so it is // probably the redirect page itself. Fake the redirect symbol $wgOut->setPageTitle( $this->mTitle->getPrefixedText() ); $wgOut->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->img->getName() ), /* $appendSubtitle */ true, /* $forceKnown */ true ) ); $this->viewUpdates(); return; } } $this->showRedirectedFromHeader(); if ( $wgShowEXIF && $this->displayImg->exists() ) { // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata(). $formattedMetadata = $this->displayImg->formatMetadata(); $showmeta = $formattedMetadata !== false; } else { $showmeta = false; } if ( !$diff && $this->displayImg->exists() ) { $wgOut->addHTML( $this->showTOC( $showmeta ) ); } if ( !$diff ) { $this->openShowImage(); } # No need to display noarticletext, we use our own message, output in openShowImage() if ( $this->getID() ) { # When $wgBetterDirectionality is enabled, NS_FILE is in the user language, # but this section (the actual wikitext) should be in page content language $pageLang = $this->mTitle->getPageLanguage(); $wgOut->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content', 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(), 'class' => 'mw-content-'.$pageLang->getDir() ) ) ); parent::view(); $wgOut->addHTML( Xml::closeElement( 'div' ) ); } else { # Just need to set the right headers $wgOut->setArticleFlag( true ); $wgOut->setPageTitle( $this->mTitle->getPrefixedText() ); $this->viewUpdates(); } # Show shared description, if needed if ( $this->mExtraDescription ) { $fol = wfMessage( 'shareddescriptionfollows' ); if ( !$fol->isDisabled() ) { $wgOut->addWikiText( $fol->plain() ); } $wgOut->addHTML( '
\n" ); } $this->closeShowImage(); $this->imageHistory(); // TODO: Cleanup the following $wgOut->addHTML( Xml::element( 'h2', array( 'id' => 'filelinks' ), wfMsg( 'imagelinks' ) ) . "\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 $this->imageLinks(); # Allow extensions to add something after the image links $html = ''; wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) ); if ( $html ) { $wgOut->addHTML( $html ); } if ( $showmeta ) { $wgOut->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" ); $wgOut->addWikiText( $this->makeMetadataTable( $formattedMetadata ) ); $wgOut->addModules( array( 'mediawiki.action.view.metadata' ) ); } // Add remote Filepage.css if( !$this->repo->isLocal() ) { $css = $this->repo->getDescriptionStylesheetUrl(); if ( $css ) { $wgOut->addStyle( $css ); } } // always show the local local Filepage.css, bug 29277 $wgOut->addModuleStyles( 'filepage' ); } public function getRedirectTarget() { $this->loadFile(); if ( $this->img->isLocal() ) { return parent::getRedirectTarget(); } // Foreign image page $from = $this->img->getRedirected(); $to = $this->img->getName(); if ( $from == $to ) { return null; } return $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to ); } public function followRedirect() { $this->loadFile(); if ( $this->img->isLocal() ) { return parent::followRedirect(); } $from = $this->img->getRedirected(); $to = $this->img->getName(); if ( $from == $to ) { return false; } return Title::makeTitle( NS_FILE, $to ); } public function isRedirect( $text = false ) { $this->loadFile(); if ( $this->img->isLocal() ) { return parent::isRedirect( $text ); } return (bool)$this->img->getRedirected(); } public function isLocal() { $this->loadFile(); return $this->img->isLocal(); } public function getFile() { $this->loadFile(); return $this->img; } public function getDisplayedFile() { $this->loadFile(); return $this->displayImg; } public function getDuplicates() { $this->loadFile(); if ( !is_null( $this->dupes ) ) { return $this->dupes; } $hash = $this->img->getSha1(); if ( !( $hash ) ) { return $this->dupes = array(); } $dupes = RepoGroup::singleton()->findBySha1( $hash ); // Remove duplicates with self and non matching file sizes $self = $this->img->getRepoName() . ':' . $this->img->getName(); $size = $this->img->getSize(); foreach ( $dupes as $index => $file ) { $key = $file->getRepoName() . ':' . $file->getName(); if ( $key == $self ) { unset( $dupes[$index] ); } if ( $file->getSize() != $size ) { unset( $dupes[$index] ); } } return $this->dupes = $dupes; } /** * Create the TOC * * @param $metadata Boolean: whether or not to show the metadata link * @return String */ protected function showTOC( $metadata ) { $r = array( '' );
}
if ( $thumbnail ) {
$options = array(
'alt' => $this->displayImg->getTitle()->getPrefixedText(),
'file-link' => true,
);
$wgOut->addHTML( ' ' .
$thumbnail->toHtml( $options ) .
$anchorclose . " \n" );
}
if ( $isMulti ) {
$count = $this->displayImg->pageCount();
if ( $page > 1 ) {
$label = $wgOut->parse( wfMsg( 'imgmultipageprev' ), false );
$link = $sk->link(
$this->mTitle,
$label,
array(),
array( 'page' => $page - 1 ),
array( 'known', 'noclasses' )
);
$thumb1 = $sk->makeThumbLinkObj( $this->mTitle, $this->displayImg, $link, $label, 'none',
array( 'page' => $page - 1 ) );
} else {
$thumb1 = '';
}
if ( $page < $count ) {
$label = wfMsg( 'imgmultipagenext' );
$link = $sk->link(
$this->mTitle,
$label,
array(),
array( 'page' => $page + 1 ),
array( 'known', 'noclasses' )
);
$thumb2 = $sk->makeThumbLinkObj( $this->mTitle, $this->displayImg, $link, $label, 'none',
array( 'page' => $page + 1 ) );
} else {
$thumb2 = '';
}
global $wgScript;
$formParams = array(
'name' => 'pageselector',
'action' => $wgScript,
'onchange' => 'document.pageselector.submit();',
);
for ( $i = 1; $i <= $count; $i++ ) {
$options[] = Xml::option( $wgLang->formatNum( $i ), $i, $i == $page );
}
$select = Xml::tags( 'select',
array( 'id' => 'pageselector', 'name' => 'page' ),
implode( "\n", $options ) );
$wgOut->addHTML(
' |