X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fresourceloader%2FResourceLoaderOOUIImageModule.php;h=34079c3b7bc196cb53fb97e1562dea55778693b0;hp=5c9e1d94ae0a5867a76113a1ee50dcc0a8a00ae5;hb=dfec83932fd38a9086eb5a2e212889ad00f35b0e;hpb=78418f5728259c024ac3b2016e1edd0ab794c9c0 diff --git a/includes/resourceloader/ResourceLoaderOOUIImageModule.php b/includes/resourceloader/ResourceLoaderOOUIImageModule.php index 5c9e1d94ae..34079c3b7b 100644 --- a/includes/resourceloader/ResourceLoaderOOUIImageModule.php +++ b/includes/resourceloader/ResourceLoaderOOUIImageModule.php @@ -19,7 +19,8 @@ */ /** - * Secret special sauce. + * Loads the module definition from JSON files in the format that OOUI uses, converting it to the + * format we use. (Previously known as secret special sauce.) * * @since 1.26 */ @@ -35,40 +36,16 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { $themes = self::getSkinThemeMap(); // For backwards-compatibility, allow missing 'themeImages' - $module = isset( $this->definition['themeImages'] ) ? $this->definition['themeImages'] : ''; + $module = $this->definition['themeImages'] ?? ''; $definition = []; foreach ( $themes as $skin => $theme ) { - // Find the path to the JSON file which contains the actual image definitions for this theme - if ( $module ) { - $dataPath = $this->getThemeImagesPath( $theme, $module ); - } else { - // 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; + $data = $this->loadOOUIDefinition( $theme, $module ); - // If there's no file for this module of this theme, that's okay, it will just use the defaults - if ( !file_exists( $localDataPath ) ) { + if ( !$data ) { + // If there's no file for this module of this theme, that's okay, it will just use the defaults 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 ) { @@ -107,4 +84,59 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { parent::loadFromDefinition(); } + + /** + * Load the module definition from the JSON file(s) for the given theme and module. + * + * @since 1.34 + * @param string $theme + * @param string $module + * @return array + */ + protected function loadOOUIDefinition( $theme, $module ) { + // Find the path to the JSON file which contains the actual image definitions for this theme + if ( $module ) { + $dataPath = $this->getThemeImagesPath( $theme, $module ); + } else { + // Backwards-compatibility for things that probably shouldn't have used this class... + $dataPath = + $this->definition['rootPath'] . '/' . + strtolower( $theme ) . '/' . + $this->definition['name'] . '.json'; + } + + return $this->readJSONFile( $dataPath ); + } + + /** + * Read JSON from a file, and transform all paths in it to be relative to the module's base path. + * + * @since 1.34 + * @param string $dataPath Path relative to the module's base bath + * @return array|false + */ + protected function readJSONFile( $dataPath ) { + $localDataPath = $this->localBasePath . '/' . $dataPath; + + if ( !file_exists( $localDataPath ) ) { + return false; + } + + $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 ); + } + } ); + + return $data; + } }