]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - extensions/LocalisationUpdate/finder/Finder.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / extensions / LocalisationUpdate / finder / Finder.php
1 <?php
2 /**
3  * @file
4  * @author Niklas Laxström
5  * @license GPL-2.0+
6  */
7
8 namespace LocalisationUpdate;
9
10 /**
11  * Interface for classes which provide list of components, which should be
12  * included for l10n updates.
13  */
14 class Finder {
15         /**
16          * @param array $php See $wgExtensionMessagesFiles
17          * @param array $json See $wgMessagesDirs
18          * @param string $core Absolute path to MediaWiki core
19          */
20         public function __construct( $php, $json, $core ) {
21                 $this->php = $php;
22                 $this->json = $json;
23                 $this->core = $core;
24         }
25
26         /**
27          * @return array
28          */
29         public function getComponents() {
30                 $components = [];
31
32                 // For older versions of Mediawiki, pull json updates even though its still using php
33                 if ( !isset( $this->json['core'] ) ) {
34                         $components['core'] = [
35                                 'repo' => 'mediawiki',
36                                 'orig' => "file://{$this->core}/languages/messages/Messages*.php",
37                                 'path' => 'languages/messages/i18n/*.json',
38                         ];
39                 }
40
41                 foreach ( $this->json as $key => $value ) {
42                         // Json should take priority if both exist
43                         unset( $this->php[$key] );
44
45                         foreach ( (array)$value as $subkey => $subvalue ) {
46                                 // Mediawiki core files
47                                 $matches = [];
48                                 if ( preg_match( '~/(?P<path>(?:includes|languages|resources)/.*)$~', $subvalue, $matches ) ) {
49                                         $components["$key-$subkey"] = [
50                                                 'repo' => 'mediawiki',
51                                                 'orig' => "file://$value/*.json",
52                                                 'path' => "{$matches['path']}/*.json",
53                                         ];
54                                         continue;
55                                 }
56
57                                 $item = $this->getItem( 'extensions', $subvalue );
58                                 if ( $item !== null ) {
59                                         $item['repo'] = 'extension';
60                                         $components["$key-$subkey"] = $item;
61                                         continue;
62                                 }
63
64                                 $item = $this->getItem( 'skins', $subvalue );
65                                 if ( $item !== null ) {
66                                         $item['repo'] = 'skin';
67                                         $components["$key-$subkey"] = $item;
68                                         continue;
69                                 }
70                         }
71                 }
72
73                 foreach ( $this->php as $key => $value ) {
74                         $matches = [];
75                         $ok = preg_match( '~/extensions/(?P<name>[^/]+)/(?P<path>.*\.i18n\.php)$~', $value, $matches );
76                         if ( !$ok ) {
77                                 continue;
78                         }
79
80                         $components[$key] = [
81                                 'repo' => 'extension',
82                                 'name' => $matches['name'],
83                                 'orig' => "file://$value",
84                                 'path' => $matches['path'],
85                         ];
86                 }
87
88                 return $components;
89         }
90
91         /**
92          * @param string $dir extensions or skins
93          * @param string $subvalue
94          * @return array|null
95          */
96         private function getItem( $dir, $subvalue ) {
97                 // This ignores magic, alias etc. non message files
98                 $matches = [];
99                 if ( !preg_match( "~/$dir/(?P<name>[^/]+)/(?P<path>.*)$~", $subvalue, $matches ) ) {
100                         return null;
101                 }
102
103                 return [
104                         'name' => $matches['name'],
105                         'orig' => "file://$subvalue/*.json",
106                         'path' => "{$matches['path']}/*.json",
107                 ];
108         }
109 }