X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fresourceloader%2FResourceLoaderOOUIImageModule.php;h=ee87d8d8e892f217112cfc047e40a495780473b0;hb=886b625f1f69c9c8a6d5d1688af75cb5ce3c6165;hp=8493f9fdc3f40940054307027fc6b0b3504f1442;hpb=04fdc78370dbc042116488d6826e19bf3910273b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/resourceloader/ResourceLoaderOOUIImageModule.php b/includes/resourceloader/ResourceLoaderOOUIImageModule.php index 8493f9fdc3..ee87d8d8e8 100644 --- a/includes/resourceloader/ResourceLoaderOOUIImageModule.php +++ b/includes/resourceloader/ResourceLoaderOOUIImageModule.php @@ -24,53 +24,70 @@ * @since 1.26 */ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { + use ResourceLoaderOOUIModule; + protected function loadFromDefinition() { if ( $this->definition === null ) { + // Do nothing if definition was already processed return; } - // Core default themes - $themes = array( 'default' => 'mediawiki' ); - $themes += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' ); + $themes = self::getSkinThemeMap(); - $name = $this->definition['name']; - $rootPath = $this->definition['rootPath']; + // For backwards-compatibility, allow missing 'themeImages' + $module = isset( $this->definition['themeImages'] ) ? $this->definition['themeImages'] : ''; - $definition = array(); + $definition = []; foreach ( $themes as $skin => $theme ) { - // TODO Allow extensions to specify this path somehow - $dataPath = $this->localBasePath . '/' . $rootPath . '/' . $theme . '/' . $name . '.json'; - - if ( file_exists( $dataPath ) ) { - $data = json_decode( file_get_contents( $dataPath ), true ); - $fixPath = function ( &$path ) use ( $rootPath, $theme ) { - // TODO Allow extensions to specify this path somehow - $path = $rootPath . '/' . $theme . '/' . $path; - }; - array_walk( $data['images'], function ( &$value ) use ( $fixPath ) { - if ( is_string( $value['file'] ) ) { - $fixPath( $value['file'] ); - } elseif ( is_array( $value['file'] ) ) { - array_walk_recursive( $value['file'], $fixPath ); - } - } ); + // Find the path to the JSON file which contains the actual image definitions for this theme + if ( $module ) { + $dataPath = $this->getThemeImagesPath( $theme, $module ); } else { - $data = array(); + // Backwards-compatibility for things that probably shouldn't have used this class... + $dataPath = + $this->definition['rootPath'] . '/' . + strtolower( $theme ) . '/' . + $this->definition['name'] . '.json'; + } + $localDataPath = $this->localBasePath . '/' . $dataPath; + + // If there's no file for this module of this theme, that's okay, it will just use the defaults + if ( !file_exists( $localDataPath ) ) { + continue; } + $data = json_decode( file_get_contents( $localDataPath ), true ); + // Expand the paths to images (since they are relative to the JSON file that defines them, not + // our base directory) + $fixPath = function ( &$path ) use ( $dataPath ) { + $path = dirname( $dataPath ) . '/' . $path; + }; + array_walk( $data['images'], function ( &$value ) use ( $fixPath ) { + if ( is_string( $value['file'] ) ) { + $fixPath( $value['file'] ); + } elseif ( is_array( $value['file'] ) ) { + array_walk_recursive( $value['file'], $fixPath ); + } + } ); + + // Convert into a definition compatible with the parent vanilla ResourceLoaderImageModule foreach ( $data as $key => $value ) { switch ( $key ) { + // Images and color variants are defined per-theme, here converted to per-skin case 'images': case 'variants': $definition[$key][$skin] = $data[$key]; break; + // Other options must be identical for each theme (or only defined in the default one) default: if ( !isset( $definition[$key] ) ) { $definition[$key] = $data[$key]; } elseif ( $definition[$key] !== $data[$key] ) { throw new Exception( - "Mismatched OOUI theme definitions are not supported: trying to load $key of $theme theme" + "Mismatched OOUI theme images definition: " . + "key '$key' of theme '$theme' for module '$module' " . + "does not match other themes" ); } break; @@ -78,7 +95,17 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { } } - // Fields from definition silently override keys from JSON files + // Extra selectors to allow using the same icons for old-style MediaWiki UI code + if ( substr( $module, 0, 5 ) === 'icons' ) { + $definition['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before'; + $definition['selectorWithVariant'] = ' + .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before, + /* Hack for Flow, see T110051 */ + .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, + .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before'; + } + + // Fields from module definition silently override keys from JSON files $this->definition += $definition; parent::loadFromDefinition();