]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/resourceloader/ResourceLoaderOOUIImageModule.php
MediaWiki 1.30.2-scripts2
[autoinstalls/mediawiki.git] / includes / resourceloader / ResourceLoaderOOUIImageModule.php
1 <?php
2 /**
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16  * http://www.gnu.org/copyleft/gpl.html
17  *
18  * @file
19  */
20
21 /**
22  * Secret special sauce.
23  *
24  * @since 1.26
25  */
26 class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
27         use ResourceLoaderOOUIModule;
28
29         protected function loadFromDefinition() {
30                 if ( $this->definition === null ) {
31                         // Do nothing if definition was already processed
32                         return;
33                 }
34
35                 $themes = self::getSkinThemeMap();
36
37                 // For backwards-compatibility, allow missing 'themeImages'
38                 $module = isset( $this->definition['themeImages'] ) ? $this->definition['themeImages'] : '';
39
40                 $definition = [];
41                 foreach ( $themes as $skin => $theme ) {
42                         // Find the path to the JSON file which contains the actual image definitions for this theme
43                         if ( $module ) {
44                                 $dataPath = $this->getThemeImagesPath( $theme, $module );
45                         } else {
46                                 // Backwards-compatibility for things that probably shouldn't have used this class...
47                                 $dataPath =
48                                         $this->definition['rootPath'] . '/' .
49                                         strtolower( $theme ) . '/' .
50                                         $this->definition['name'] . '.json';
51                         }
52                         $localDataPath = $this->localBasePath . '/' . $dataPath;
53
54                         // If there's no file for this module of this theme, that's okay, it will just use the defaults
55                         if ( !file_exists( $localDataPath ) ) {
56                                 continue;
57                         }
58                         $data = json_decode( file_get_contents( $localDataPath ), true );
59
60                         // Expand the paths to images (since they are relative to the JSON file that defines them, not
61                         // our base directory)
62                         $fixPath = function ( &$path ) use ( $dataPath ) {
63                                 $path = dirname( $dataPath ) . '/' . $path;
64                         };
65                         array_walk( $data['images'], function ( &$value ) use ( $fixPath ) {
66                                 if ( is_string( $value['file'] ) ) {
67                                         $fixPath( $value['file'] );
68                                 } elseif ( is_array( $value['file'] ) ) {
69                                         array_walk_recursive( $value['file'], $fixPath );
70                                 }
71                         } );
72
73                         // Convert into a definition compatible with the parent vanilla ResourceLoaderImageModule
74                         foreach ( $data as $key => $value ) {
75                                 switch ( $key ) {
76                                         // Images and color variants are defined per-theme, here converted to per-skin
77                                         case 'images':
78                                         case 'variants':
79                                                 $definition[$key][$skin] = $data[$key];
80                                                 break;
81
82                                         // Other options must be identical for each theme (or only defined in the default one)
83                                         default:
84                                                 if ( !isset( $definition[$key] ) ) {
85                                                         $definition[$key] = $data[$key];
86                                                 } elseif ( $definition[$key] !== $data[$key] ) {
87                                                         throw new Exception(
88                                                                 "Mismatched OOUI theme images definition: " .
89                                                                         "key '$key' of theme '$theme' for module '$module' " .
90                                                                         "does not match other themes"
91                                                         );
92                                                 }
93                                                 break;
94                                 }
95                         }
96                 }
97
98                 // Extra selectors to allow using the same icons for old-style MediaWiki UI code
99                 if ( substr( $module, 0, 5 ) === 'icons' ) {
100                         $definition['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before';
101                         $definition['selectorWithVariant'] = '
102                                 .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before,
103                                 /* Hack for Flow, see T110051 */
104                                 .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before,
105                                 .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before';
106                 }
107
108                 // Fields from module definition silently override keys from JSON files
109                 $this->definition += $definition;
110
111                 parent::loadFromDefinition();
112         }
113 }