From ca32f08966f1b51fcb19460f0996bb0c4048e6fe Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 3 Dec 2011 13:29:22 +0100 Subject: Update to MediaWiki 1.18.0 * also update ArchLinux skin to chagnes in MonoBook * Use only css to hide our menu bar when printing --- includes/specials/SpecialFileDuplicateSearch.php | 226 +++++++++++++---------- 1 file changed, 132 insertions(+), 94 deletions(-) (limited to 'includes/specials/SpecialFileDuplicateSearch.php') 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[] = "
  • " . $line . "
  • "; + } + $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( '
    ' . - $thumb->toHtml( array( 'desc-link' => false ) ) . '
    ' . - wfMsgExt( 'fileduplicatesearch-info', array( 'parse' ), - $wgLang->formatNum( $img->getWidth() ), - $wgLang->formatNum( $img->getHeight() ), - $wgLang->formatSize( $img->getSize() ), - $img->getMimeType() - ) . - '
    ' ); - } + 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( - "

    \n$1\n

    ", - array( 'fileduplicatesearch-result-1', $filename ) - ); - } elseif ( $count > 1 ) { + if( $this->file ) { + $this->hash = $this->file->getSha1(); + } elseif( $this->filename !== '' ) { $wgOut->wrapWikiMsg( - "

    \n$1\n

    ", - array( 'fileduplicatesearch-result-n', $filename, $wgLang->formatNum( $count - 1 ) ) + "

    \n$1\n

    ", + 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( '
    ' . + $thumb->toHtml( array( 'desc-link' => false ) ) . '
    ' . + wfMsgExt( 'fileduplicatesearch-info', array( 'parse' ), + $wgLang->formatNum( $img->getWidth() ), + $wgLang->formatNum( $img->getHeight() ), + $wgLang->formatSize( $img->getSize() ), + $img->getMimeType() + ) . + '
    ' ); + } + } + + $dupes = $this->getDupes(); + $numRows = count( $dupes ); + + # Show a short summary + if( $numRows == 1 ) { + $wgOut->wrapWikiMsg( + "

    \n$1\n

    ", + array( 'fileduplicatesearch-result-1', wfEscapeWikiText( $this->filename ) ) + ); + } elseif ( $numRows ) { + $wgOut->wrapWikiMsg( + "

    \n$1\n

    ", + 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"; } } -- cgit v1.2.2