X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fregistration%2FExtensionProcessor.php;h=ce262bd23e4797fd5e3263d435fec430395dd3fc;hb=c6d1ceb90a9684fa0da758d88ba1e994fad4cffc;hp=1212f9972cba8ce42424f2bd385ce7d71ed7d76c;hpb=6186cfef91f5f33f56beb886a542f06ea2350850;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/registration/ExtensionProcessor.php b/includes/registration/ExtensionProcessor.php index 1212f9972c..ce262bd23e 100644 --- a/includes/registration/ExtensionProcessor.php +++ b/includes/registration/ExtensionProcessor.php @@ -56,6 +56,16 @@ class ExtensionProcessor implements Processor { 'ValidSkinNames', ]; + /** + * Top-level attributes that come from MW core + * + * @var string[] + */ + protected static $coreAttributes = [ + 'SkinOOUIThemes', + 'TrackingCategories', + ]; + /** * Mapping of global settings to their specific merge strategies. * @@ -160,6 +170,14 @@ class ExtensionProcessor implements Processor { */ protected $attributes = []; + /** + * Extension attributes, keyed by name => + * settings. + * + * @var array + */ + protected $extAttributes = []; + /** * @param string $path * @param array $info @@ -186,14 +204,47 @@ class ExtensionProcessor implements Processor { $this->callbacks[$name] = $info['callback']; } + if ( $version === 2 ) { + $this->extractAttributes( $path, $info ); + } + foreach ( $info as $key => $val ) { + // If it's a global setting, if ( in_array( $key, self::$globalSettings ) ) { $this->storeToArray( $path, "wg$key", $val, $this->globals ); + continue; + } // Ignore anything that starts with a @ - } elseif ( $key[0] !== '@' && !in_array( $key, self::$notAttributes ) - && !in_array( $key, self::$creditsAttributes ) - ) { - $this->storeToArray( $path, $key, $val, $this->attributes ); + if ( $key[0] === '@' ) { + continue; + } + + if ( $version === 2 ) { + // Only whitelisted attributes are set + if ( in_array( $key, self::$coreAttributes ) ) { + $this->storeToArray( $path, $key, $val, $this->attributes ); + } + } else { + // version === 1 + if ( !in_array( $key, self::$notAttributes ) + && !in_array( $key, self::$creditsAttributes ) + ) { + // If it's not blacklisted, it's an attribute + $this->storeToArray( $path, $key, $val, $this->attributes ); + } + } + + } + } + + /** + * @param string $path + * @param array $info + */ + protected function extractAttributes( $path, array $info ) { + if ( isset( $info['attributes'] ) ) { + foreach ( $info['attributes'] as $extName => $value ) { + $this->storeToArray( $path, $extName, $value, $this->extAttributes ); } } } @@ -206,6 +257,22 @@ class ExtensionProcessor implements Processor { } } + // Merge $this->extAttributes into $this->attributes depending on what is loaded + foreach ( $this->extAttributes as $extName => $value ) { + // Only set the attribute if $extName is loaded (and hence present in credits) + if ( isset( $this->credits[$extName] ) ) { + foreach ( $value as $attrName => $attrValue ) { + $this->storeToArray( + '', // Don't provide a path since it's impossible to generate an error here + $extName . $attrName, + $attrValue, + $this->attributes + ); + } + unset( $this->extAttributes[$extName] ); + } + } + return [ 'globals' => $this->globals, 'defines' => $this->defines, @@ -241,8 +308,15 @@ class ExtensionProcessor implements Processor { protected function extractNamespaces( array $info ) { if ( isset( $info['namespaces'] ) ) { foreach ( $info['namespaces'] as $ns ) { - $id = $ns['id']; - $this->defines[$ns['constant']] = $id; + if ( defined( $ns['constant'] ) ) { + // If the namespace constant is already defined, use it. + // This allows namespace IDs to be overwritten locally. + $id = constant( $ns['constant'] ); + } else { + $id = $ns['id']; + $this->defines[ $ns['constant'] ] = $id; + } + if ( !( isset( $ns['conditional'] ) && $ns['conditional'] ) ) { // If it is not conditional, register it $this->attributes['ExtensionNamespaces'][$id] = $ns['name']; @@ -304,7 +378,7 @@ class ExtensionProcessor implements Processor { protected function extractExtensionMessagesFiles( $dir, array $info ) { if ( isset( $info['ExtensionMessagesFiles'] ) ) { - $this->globals["wgExtensionMessagesFiles"] += array_map( function( $file ) use ( $dir ) { + $this->globals["wgExtensionMessagesFiles"] += array_map( function ( $file ) use ( $dir ) { return "$dir/$file"; }, $info['ExtensionMessagesFiles'] ); }