Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
MediaHandlerFactory
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 3
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getHandlerClass
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getHandler
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2/**
3 * Media-handling base classes and generic functionality.
4 *
5 * @license GPL-2.0-or-later
6 * @file
7 * @ingroup Media
8 */
9
10namespace MediaWiki\Media;
11
12use MediaWiki\Language\Language;
13use MediaWiki\Language\LanguageFactory;
14use Psr\Log\LoggerInterface;
15
16/**
17 * Class to construct MediaHandler objects
18 *
19 * @since 1.28
20 */
21class MediaHandlerFactory {
22
23    /**
24     * Default, MediaWiki core media handlers
25     */
26    private const CORE_HANDLERS = [
27        'image/jpeg' => JpegHandler::class,
28        'image/png' => PNGHandler::class,
29        'image/gif' => GIFHandler::class,
30        'image/tiff' => TiffHandler::class,
31        'image/webp' => WebPHandler::class,
32        'image/x-ms-bmp' => BmpHandler::class,
33        'image/x-bmp' => BmpHandler::class,
34        'image/x-xcf' => XCFHandler::class,
35        'image/svg+xml' => SvgHandler::class, // official
36        'image/svg' => SvgHandler::class, // compat
37        'image/vnd.djvu' => DjVuHandler::class, // official
38        'image/x.djvu' => DjVuHandler::class, // compat
39        'image/x-djvu' => DjVuHandler::class, // compat
40        'image/jp2' => Jpeg2000Handler::class,
41        'image/jpx' => Jpeg2000Handler::class,
42    ];
43
44    /** @var array */
45    private $registry;
46
47    public function __construct(
48        private LanguageFactory $langFactory,
49        private LoggerInterface $logger,
50        array $registry
51    ) {
52        $this->registry = $registry + self::CORE_HANDLERS;
53    }
54
55    /**
56     * @param string $type
57     * @return class-string<MediaHandler>|false
58     */
59    protected function getHandlerClass( $type ) {
60        return $this->registry[$type] ?? false;
61    }
62
63    /**
64     * @param string $type mimetype
65     * @param Language|string|null $lang Language object or language code
66     * @return MediaHandler|false
67     */
68    public function getHandler(
69        $type,
70        Language|string|null $lang = null
71    ) {
72        $class = $this->getHandlerClass( $type );
73        if ( $class !== false ) {
74            /** @var MediaHandler $handler */
75            $handler = new $class;
76            if ( !$handler->isEnabled() ) {
77                $this->logger->debug(
78                    '{class} is not enabled.',
79                    [ 'class' => $class ]
80                );
81                $handler = false;
82            } elseif ( $lang !== null ) {
83                if ( !$lang instanceof Language ) {
84                    $lang = $this->langFactory->getLanguage( $lang );
85                }
86                $handler->setLanguage( $lang );
87            }
88        } else {
89            $this->logger->debug(
90                'no handler found for {type}.',
91                [ 'type' => $type ]
92            );
93            $handler = false;
94        }
95
96        return $handler;
97    }
98}
99
100/** @deprecated class alias since 1.46 */
101class_alias( MediaHandlerFactory::class, 'MediaHandlerFactory' );