Completed
Pull Request — master (#41)
by Gabriel
03:01
created

NamespaceGetter::getAliases()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 9
rs 9.6666
cc 3
eloc 6
nc 3
nop 2
1
<?php
2
3
namespace Mediawiki\Api\Service;
4
5
use Mediawiki\Api\MediawikiApi;
6
use Mediawiki\Api\SimpleRequest;
7
use Mediawiki\DataModel\NamespaceInfo;
8
9
/**
10
 * @author gbirke
11
 */
12
class NamespaceGetter
13
{
14
	private $api;
15
16
	public function __construct( MediawikiApi $api ) {
17
18
		$this->api = $api;
19
	}
20
21
	/**
22
	 * Find a namespace by its canonical name
23
	 *
24
	 * @param string $canonicalName
25
	 * @return NamespaceInfo|null
26
	 */
27
	public function getNamespaceByCanonicalName( $canonicalName ) {
28
		$result = $this->getNamespaceResult()['query'];
29
		foreach ( $result['namespaces'] as $nsInfo ) {
30
			if ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $canonicalName ) {
31
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
32
			}
33
		}
34
		return null;
35
	}
36
37
	/**
38
	 * Find a namespace by its canonical name, local name or namespace alias
39
	 *
40
	 * @param string $name
41
	 * @return NamespaceInfo|null
42
	 */
43
	public function getNamespaceByName( $name ) {
44
		$result = $this->getNamespaceResult()['query'];
45
		foreach ( $result['namespaces'] as $nsInfo ) {
46
			if ( ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $name ) ||
47
				$nsInfo['*'] === $name ) {
48
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
49
			}
50
		}
51
		foreach ( $result['namespacealiases'] as $alias ) {
52
			if ( $alias['*'] === $name && !empty( $result['namespaces'][$alias['id']] ) ) {
53
				return $this->createNamespaceFromQuery(
54
					$result['namespaces'][$alias['id']],
55
					$result['namespacealiases']
56
				);
57
			}
58
		}
59
		return null;
60
	}
61
62
	/**
63
	 * @return NamespaceInfo[]
64
	 */
65
	public function getNamespaces() {
66
		$namespaces = [];
67
		$result =  $this->getNamespaceResult()['query'];
68
		foreach ( $result['namespaces'] as $nsInfo ) {
69
			$namespaces[$nsInfo['id']] = $this->createNamespaceFromQuery(
70
				$nsInfo, $result['namespacealiases']
71
			);
72
		}
73
		return $namespaces;
74
	}
75
76
	private function createNamespaceFromQuery( $nsInfo, $namespaceAliases ) {
77
		return new NamespaceInfo(
78
			$nsInfo['id'],
79
			empty( $nsInfo['canonical'] ) ? '' : $nsInfo['canonical'],
80
			$nsInfo['*'],
81
			$nsInfo['case'],
82
			empty( $nsInfo['defaultcontentmodel'] ) ? null : $nsInfo['defaultcontentmodel'],
83
			$this->getAliases( $nsInfo['id'], $namespaceAliases )
84
		);
85
	}
86
87
	/**
88
	 * @param int $id
89
	 * @param array $namespaceAliases Alias list, as returned by the API
90
	 * @return string[]
91
	 */
92
	private function getAliases( $id, $namespaceAliases ) {
93
		$aliases = [];
94
		foreach ( $namespaceAliases as $alias ) {
95
			if ( $alias['id'] === $id ) {
96
				$aliases[] = $alias['*'];
97
			}
98
		}
99
		return $aliases;
100
	}
101
102
	/**
103
	 * @return array
104
	 */
105
	private function getNamespaceResult() {
106
		return $this->api->getRequest( new SimpleRequest(
107
			'query', [
108
				'meta' => 'siteinfo',
109
				'siprop' => 'namespaces|namespacealiases'
110
			]
111
		) );
112
	}
113
114
}
115