+
+ /**
+ * 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 );
+ if ( !$dataPath ) {
+ return false;
+ }
+ } 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->getLocalPath( $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 ) {
+ if ( $dataPath instanceof ResourceLoaderFilePath ) {
+ $path = new ResourceLoaderFilePath(
+ dirname( $dataPath->getPath() ) . '/' . $path,
+ $dataPath->getLocalBasePath(),
+ $dataPath->getRemoteBasePath()
+ );
+ } else {
+ $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;
+ }