50 private $filename =
'';
74 parent::__construct(
'FileDuplicateSearch' );
75 $this->linkBatchFactory = $linkBatchFactory;
76 $this->repoGroup = $repoGroup;
77 $this->searchEngineFactory = $searchEngineFactory;
86 private function getDupes() {
87 return $this->repoGroup->findBySha1( $this->hash );
93 private function showList( $dupes ) {
95 $html[] =
"<ol class='special'>";
97 foreach ( $dupes as $dupe ) {
98 $line = $this->formatResult( $dupe );
99 $html[] =
"<li>" . $line .
"</li>";
103 $this->
getOutput()->addHTML( implode(
"\n", $html ) );
110 $this->filename = $par ?? $this->
getRequest()->getText(
'filename' );
113 $title = Title::newFromText( $this->filename,
NS_FILE );
114 if ( $title && $title->getText() !=
'' ) {
115 $this->file = $this->repoGroup->findFile( $title );
120 # Create the input form
124 'name' =>
'filename',
125 'label-message' =>
'fileduplicatesearch-filename',
128 'default' => $this->filename,
131 $htmlForm = HTMLForm::factory(
'ooui', $formFields, $this->
getContext() );
133 $htmlForm->setMethod(
'get' );
134 $htmlForm->setSubmitTextMsg( $this->
msg(
'fileduplicatesearch-submit' ) );
138 $htmlForm->prepareForm()->displayForm(
false );
141 $this->hash = $this->file->getSha1();
142 } elseif ( $this->filename !==
'' ) {
144 "<p class='mw-fileduplicatesearch-noresults'>\n$1\n</p>",
149 if ( $this->hash !=
'' ) {
150 # Show a thumbnail of the file
153 $thumb = $img->transform( [
'width' => 120,
'height' => 120 ] );
155 $out->addModuleStyles(
'mediawiki.special' );
156 $out->addHTML(
'<div id="mw-fileduplicatesearch-icon">' .
157 $thumb->toHtml( [
'desc-link' =>
false ] ) .
'<br />' .
158 $this->msg(
'fileduplicatesearch-info' )
159 ->numParams( $img->getWidth(), $img->getHeight() )
160 ->sizeParams( $img->getSize() )
161 ->params( $img->getMimeType() )->parseAsBlock() .
166 $dupes = $this->getDupes();
167 $numRows = count( $dupes );
169 # Show a short summary
170 if ( $numRows == 1 ) {
172 "<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>",
175 } elseif ( $numRows ) {
177 "<p class='mw-fileduplicatesearch-result-n'>\n$1\n</p>",
183 $this->doBatchLookups( $dupes );
184 $this->showList( $dupes );
191 private function doBatchLookups( $list ) {
192 $batch = $this->linkBatchFactory->newLinkBatch();
193 foreach ( $list as $file ) {
194 $batch->addObj( $file->getTitle() );
195 if ( $file->isLocal() ) {
196 $uploader = $file->getUploader( File::FOR_THIS_USER, $this->
getAuthority() );
198 $batch->add(
NS_USER, $uploader->getName() );
211 private function formatResult( $result ) {
213 $nt = $result->getTitle();
214 $text = $this->languageConverter->convert( $nt->getText() );
215 $plink = $linkRenderer->makeLink(
220 $uploader = $result->getUploader( File::FOR_THIS_USER, $this->
getAuthority() );
221 if ( $result->isLocal() && $uploader ) {
222 $user = Linker::userLink( $uploader->getId(), $uploader->getName() );
223 $user .=
'<span style="white-space: nowrap;">';
224 $user .= Linker::userToolLinks( $uploader->getId(), $uploader->getName() );
226 } elseif ( $uploader ) {
227 $user = htmlspecialchars( $uploader->getName() );
229 $user =
'<span class="history-deleted">'
230 . $this->
msg(
'rev-deleted-user' )->escaped() .
'</span>';
233 $time = htmlspecialchars( $this->
getLanguage()->userTimeAndDate(
234 $result->getTimestamp(), $this->getUser() ) );
236 return "$plink . . $user . . $time";
248 $title = Title::newFromText( $search,
NS_FILE );
249 if ( !$title || $title->getNamespace() !==
NS_FILE ) {
253 $searchEngine = $this->searchEngineFactory->create();
254 $searchEngine->setLimitOffset( $limit, $offset );
256 $searchEngine->setNamespaces( [
NS_FILE ] );
257 $result = $searchEngine->defaultPrefixSearch( $search );
259 return array_map(
static function (
Title $t ) {
261 return $t->getText();
271class_alias( SpecialFileDuplicateSearch::class,
'SpecialFileDuplicateSearch' );
wfEscapeWikiText( $input)
Escapes the given text so that it may be output using addWikiText() without any linking,...
Implements some public methods and some protected utility functions which are required by multiple ch...
Parent class for all special pages.
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes!
getPageTitle( $subpage=false)
Get a self-referential title object.
getContext()
Gets the context this SpecialPage is executed in.
getRequest()
Get the WebRequest being used for this instance.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
getOutput()
Get the OutputPage being used for this instance.
getAuthority()
Shortcut to get the Authority executing this instance.
getContentLanguage()
Shortcut to get content language.
getLanguage()
Shortcut to get user's language.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages By default the message key is the canonical name of...
Prioritized list of file repositories.
Factory class for SearchEngine.