diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2011-12-03 13:29:22 +0100 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2011-12-03 13:29:22 +0100 |
commit | ca32f08966f1b51fcb19460f0996bb0c4048e6fe (patch) | |
tree | ec04cc15b867bc21eedca904cea9af0254531a11 /includes/specials/SpecialFileDuplicateSearch.php | |
parent | a22fbfc60f36f5f7ee10d5ae6fe347340c2ee67c (diff) |
Update to MediaWiki 1.18.0
* also update ArchLinux skin to chagnes in MonoBook
* Use only css to hide our menu bar when printing
Diffstat (limited to 'includes/specials/SpecialFileDuplicateSearch.php')
-rw-r--r-- | includes/specials/SpecialFileDuplicateSearch.php | 226 |
1 files changed, 132 insertions, 94 deletions
diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php index 172e92ad..a296fd95 100644 --- a/includes/specials/SpecialFileDuplicateSearch.php +++ b/includes/specials/SpecialFileDuplicateSearch.php @@ -29,123 +29,161 @@ * @ingroup SpecialPage */ class FileDuplicateSearchPage extends QueryPage { - var $hash, $filename; + protected $hash = '', $filename = ''; - function __construct( $hash, $filename ) { - $this->hash = $hash; - $this->filename = $filename; + /** + * @var File $file selected reference file, if present + */ + protected $file = null; + + function __construct( $name = 'FileDuplicateSearch' ) { + parent::__construct( $name ); } - function getName() { return 'FileDuplicateSearch'; } - function isExpensive() { return false; } function isSyndicated() { return false; } + function isCacheable() { return false; } + function isCached() { return false; } function linkParameters() { return array( 'filename' => $this->filename ); } - function getSQL() { - $dbr = wfGetDB( DB_SLAVE ); - $image = $dbr->tableName( 'image' ); - $hash = $dbr->addQuotes( $this->hash ); - - return "SELECT 'FileDuplicateSearch' AS type, - img_name AS title, - img_sha1 AS value, - img_user_text, - img_timestamp - FROM $image - WHERE img_sha1 = $hash - "; + /** + * Fetch dupes from all connected file repositories. + * + * @return Array of File objects + */ + function getDupes() { + return RepoGroup::singleton()->findBySha1( $this->hash ); } - function formatResult( $skin, $result ) { - global $wgContLang, $wgLang; + /** + * + * @param $dupes Array of File objects + */ + function showList( $dupes ) { + global $wgOut; + $skin = $this->getSkin(); - $nt = Title::makeTitle( NS_FILE, $result->title ); - $text = $wgContLang->convert( $nt->getText() ); - $plink = $skin->link( - Title::newFromText( $nt->getPrefixedText() ), - $text - ); + $html = array(); + $html[] = $this->openList( 0 ); - $user = $skin->link( Title::makeTitle( NS_USER, $result->img_user_text ), $result->img_user_text ); - $time = $wgLang->timeanddate( $result->img_timestamp ); + foreach ( $dupes as $dupe ) { + $line = $this->formatResult( $skin, $dupe ); + $html[] = "<li>" . $line . "</li>"; + } + $html[] = $this->closeList(); - return "$plink . . $user . . $time"; + $wgOut->addHtml( implode( "\n", $html ) ); } -} -/** - * Output the HTML search form, and constructs the FileDuplicateSearch object. - */ -function wfSpecialFileDuplicateSearch( $par = null ) { - global $wgRequest, $wgOut, $wgLang, $wgContLang, $wgScript; - - $hash = ''; - $filename = isset( $par ) ? $par : $wgRequest->getText( 'filename' ); - - $title = Title::makeTitleSafe( NS_FILE, $filename ); - if( $title && $title->getText() != '' ) { - $dbr = wfGetDB( DB_SLAVE ); - $image = $dbr->tableName( 'image' ); - $encFilename = $dbr->addQuotes( htmlspecialchars( $title->getDBkey() ) ); - $sql = "SELECT img_sha1 from $image where img_name = $encFilename"; - $res = $dbr->query( $sql ); - $row = $dbr->fetchRow( $res ); - if( $row !== false ) { - $hash = $row[0]; - } + function getQueryInfo() { + return array( + 'tables' => array( 'image' ), + 'fields' => array( + 'img_name AS title', + 'img_sha1 AS value', + 'img_user_text', + 'img_timestamp' + ), + 'conds' => array( 'img_sha1' => $this->hash ) + ); } - # Create the input form - $wgOut->addHTML( - Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) . - Html::hidden( 'title', SpecialPage::getTitleFor( 'FileDuplicateSearch' )->getPrefixedDbKey() ) . - Xml::openElement( 'fieldset' ) . - Xml::element( 'legend', null, wfMsg( 'fileduplicatesearch-legend' ) ) . - Xml::inputLabel( wfMsg( 'fileduplicatesearch-filename' ), 'filename', 'filename', 50, $filename ) . ' ' . - Xml::submitButton( wfMsg( 'fileduplicatesearch-submit' ) ) . - Xml::closeElement( 'fieldset' ) . - Xml::closeElement( 'form' ) - ); - - if( $hash != '' ) { - $align = $wgContLang->alignEnd(); - - # Show a thumbnail of the file - $img = wfFindFile( $title ); - if ( $img ) { - $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) ); - if( $thumb ) { - $wgOut->addHTML( '<div style="float:' . $align . '" id="mw-fileduplicatesearch-icon">' . - $thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' . - wfMsgExt( 'fileduplicatesearch-info', array( 'parse' ), - $wgLang->formatNum( $img->getWidth() ), - $wgLang->formatNum( $img->getHeight() ), - $wgLang->formatSize( $img->getSize() ), - $img->getMimeType() - ) . - '</div>' ); - } + function execute( $par ) { + global $wgRequest, $wgOut, $wgLang, $wgScript; + + $this->setHeaders(); + $this->outputHeader(); + + $this->filename = isset( $par ) ? $par : $wgRequest->getText( 'filename' ); + $this->file = null; + $this->hash = ''; + $title = Title::newFromText( $this->filename, NS_FILE ); + if( $title && $title->getText() != '' ) { + $this->file = wfFindFile( $title ); } - # Do the query - $wpp = new FileDuplicateSearchPage( $hash, $filename ); - list( $limit, $offset ) = wfCheckLimits(); - $count = $wpp->doQuery( $offset, $limit ); + # Create the input form + $wgOut->addHTML( + Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) . + Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) . + Xml::openElement( 'fieldset' ) . + Xml::element( 'legend', null, wfMsg( 'fileduplicatesearch-legend' ) ) . + Xml::inputLabel( wfMsg( 'fileduplicatesearch-filename' ), 'filename', 'filename', 50, $this->filename ) . ' ' . + Xml::submitButton( wfMsg( 'fileduplicatesearch-submit' ) ) . + Xml::closeElement( 'fieldset' ) . + Xml::closeElement( 'form' ) + ); - # Show a short summary - if( $count == 1 ) { - $wgOut->wrapWikiMsg( - "<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>", - array( 'fileduplicatesearch-result-1', $filename ) - ); - } elseif ( $count > 1 ) { + if( $this->file ) { + $this->hash = $this->file->getSha1(); + } elseif( $this->filename !== '' ) { $wgOut->wrapWikiMsg( - "<p class='mw-fileduplicatesearch-result-n'>\n$1\n</p>", - array( 'fileduplicatesearch-result-n', $filename, $wgLang->formatNum( $count - 1 ) ) + "<p class='mw-fileduplicatesearch-noresults'>\n$1\n</p>", + array( 'fileduplicatesearch-noresults', wfEscapeWikiText( $this->filename ) ) ); } + + if( $this->hash != '' ) { + # Show a thumbnail of the file + $img = $this->file; + if ( $img ) { + $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) ); + if( $thumb ) { + $wgOut->addHTML( '<div id="mw-fileduplicatesearch-icon">' . + $thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' . + wfMsgExt( 'fileduplicatesearch-info', array( 'parse' ), + $wgLang->formatNum( $img->getWidth() ), + $wgLang->formatNum( $img->getHeight() ), + $wgLang->formatSize( $img->getSize() ), + $img->getMimeType() + ) . + '</div>' ); + } + } + + $dupes = $this->getDupes(); + $numRows = count( $dupes ); + + # Show a short summary + if( $numRows == 1 ) { + $wgOut->wrapWikiMsg( + "<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>", + array( 'fileduplicatesearch-result-1', wfEscapeWikiText( $this->filename ) ) + ); + } elseif ( $numRows ) { + $wgOut->wrapWikiMsg( + "<p class='mw-fileduplicatesearch-result-n'>\n$1\n</p>", + array( 'fileduplicatesearch-result-n', wfEscapeWikiText( $this->filename ), + $wgLang->formatNum( $numRows - 1 ) ) + ); + } + + $this->showList( $dupes ); + } + } + + /** + * + * @param Skin $skin + * @param File $result + * @return string + */ + function formatResult( $skin, $result ) { + global $wgContLang, $wgLang; + + $nt = $result->getTitle(); + $text = $wgContLang->convert( $nt->getText() ); + $plink = $skin->link( + Title::newFromText( $nt->getPrefixedText() ), + $text + ); + + $userText = $result->getUser( 'text' ); + $user = $skin->link( Title::makeTitle( NS_USER, $userText ), $userText ); + $time = $wgLang->timeanddate( $result->getTimestamp() ); + + return "$plink . . $user . . $time"; } } |