Implicitly marking parameter $... as nullable is deprecated in php8.4, the explicit nullable type must be used instead Created with autofix from Ide15839e98a6229c22584d1c1c88c690982e1d7a Break one long line in SpecialPage.php Bug: T376276 Change-Id: I807257b2ba1ab2744ab74d9572c9c3d3ac2a968e
112 lines
3 KiB
PHP
112 lines
3 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Search;
|
|
|
|
use File;
|
|
use MediaWiki\HookContainer\HookContainer;
|
|
use MediaWiki\HookContainer\HookRunner;
|
|
use MediaWiki\MediaWikiServices;
|
|
use MediaWiki\Page\PageIdentity;
|
|
use MediaWiki\Search\Entity\SearchResultThumbnail;
|
|
use RepoGroup;
|
|
|
|
/**
|
|
* Find thumbnails for search results
|
|
*
|
|
* @since 1.40
|
|
*/
|
|
class SearchResultThumbnailProvider {
|
|
|
|
public const THUMBNAIL_SIZE = 60;
|
|
|
|
/** @var RepoGroup */
|
|
private $repoGroup;
|
|
|
|
/** @var HookRunner */
|
|
private $hookRunner;
|
|
|
|
/**
|
|
* @param RepoGroup $repoGroup
|
|
* @param HookContainer $hookContainer
|
|
*/
|
|
public function __construct( RepoGroup $repoGroup, HookContainer $hookContainer ) {
|
|
$this->repoGroup = $repoGroup;
|
|
$this->hookRunner = new HookRunner( $hookContainer );
|
|
}
|
|
|
|
/**
|
|
* Returns a list of fileNames for a given list of PageIdentity objects (within NS_FILE)
|
|
*
|
|
* @param PageIdentity[] $identitiesByPageId key-value array of where key
|
|
* is pageId, value is PageIdentity
|
|
* @return array
|
|
*/
|
|
private function getFileNamesByPageId( array $identitiesByPageId ): array {
|
|
$fileIdentitiesByPageId = array_filter(
|
|
$identitiesByPageId,
|
|
static function ( PageIdentity $pageIdentity ) {
|
|
return $pageIdentity->getNamespace() === NS_FILE;
|
|
}
|
|
);
|
|
|
|
return array_map(
|
|
static function ( PageIdentity $pageIdentity ) {
|
|
return $pageIdentity->getDBkey();
|
|
},
|
|
$fileIdentitiesByPageId
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Returns a SearchResultThumbnail instance for a given File/size combination.
|
|
*
|
|
* @param File $file
|
|
* @param int|null $size
|
|
* @return SearchResultThumbnail|null
|
|
*/
|
|
public function buildSearchResultThumbnailFromFile( File $file, ?int $size = null ): ?SearchResultThumbnail {
|
|
$size ??= self::THUMBNAIL_SIZE;
|
|
|
|
$thumb = $file->transform( [ 'width' => $size ] );
|
|
if ( !$thumb || $thumb->isError() ) {
|
|
return null;
|
|
}
|
|
|
|
$urlUtils = MediaWikiServices::getInstance()->getUrlUtils();
|
|
return new SearchResultThumbnail(
|
|
$thumb->getFile()->getMimeType(),
|
|
null,
|
|
$thumb->getWidth(),
|
|
$thumb->getHeight(),
|
|
null,
|
|
$urlUtils->expand( $thumb->getUrl(), PROTO_RELATIVE ) ?? false,
|
|
$file->getName()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param PageIdentity[] $pageIdentities array that contains $pageId => PageIdentity.
|
|
* @param int|null $size size of thumbnail height and width in points
|
|
* @return SearchResultThumbnail[] array of $pageId => SearchResultThumbnail
|
|
*/
|
|
public function getThumbnails( array $pageIdentities, ?int $size = 60 ): array {
|
|
// add filenames for NS_FILE pages by default
|
|
$fileNamesByPageId = $this->getFileNamesByPageId( $pageIdentities );
|
|
$results = [];
|
|
foreach ( $fileNamesByPageId as $pageId => $fileName ) {
|
|
$file = $this->repoGroup->findFile( $fileName );
|
|
if ( !$file ) {
|
|
continue;
|
|
}
|
|
$thumbnail = $this->buildSearchResultThumbnailFromFile( $file, $size );
|
|
if ( $thumbnail ) {
|
|
$results[$pageId] = $thumbnail;
|
|
}
|
|
}
|
|
|
|
// allow extensions to inject additional thumbnails
|
|
$this->hookRunner->onSearchResultProvideThumbnail( $pageIdentities, $results, $size );
|
|
|
|
return $results;
|
|
}
|
|
}
|