summaryrefslogtreecommitdiff
path: root/bin/wiki/vendor/addwiki/mediawiki-api/src/Service/NamespaceGetter.php
blob: c3f000309e36f2368074885907b308fed54f4c44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php

namespace Mediawiki\Api\Service;

use Mediawiki\Api\SimpleRequest;
use Mediawiki\DataModel\NamespaceInfo;

/**
 * @access private
 *
 * @author gbirke
 */
class NamespaceGetter extends Service {

	/**
	 * Find a namespace by its canonical name
	 *
	 * @param string $canonicalName
	 * @return NamespaceInfo|null
	 */
	public function getNamespaceByCanonicalName( $canonicalName ) {
		$result = $this->getNamespaceResult()['query'];
		foreach ( $result['namespaces'] as $nsInfo ) {
			if ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $canonicalName ) {
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
			}
		}
		return null;
	}

	/**
	 * Find a namespace by its canonical name, local name or namespace alias
	 *
	 * @param string $name
	 * @return NamespaceInfo|null
	 */
	public function getNamespaceByName( $name ) {
		$result = $this->getNamespaceResult()['query'];
		foreach ( $result['namespaces'] as $nsInfo ) {
			if ( ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $name ) ||
				$nsInfo['*'] === $name ) {
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
			}
		}
		foreach ( $result['namespacealiases'] as $alias ) {
			if ( $alias['*'] === $name && !empty( $result['namespaces'][$alias['id']] ) ) {
				return $this->createNamespaceFromQuery(
					$result['namespaces'][$alias['id']],
					$result['namespacealiases']
				);
			}
		}
		return null;
	}

	/**
	 * @return NamespaceInfo[]
	 */
	public function getNamespaces() {
		$namespaces = [];
		$result = $this->getNamespaceResult()['query'];
		foreach ( $result['namespaces'] as $nsInfo ) {
			$namespaces[$nsInfo['id']] = $this->createNamespaceFromQuery(
				$nsInfo, $result['namespacealiases']
			);
		}
		return $namespaces;
	}

	private function createNamespaceFromQuery( $nsInfo, $namespaceAliases ) {
		return new NamespaceInfo(
			$nsInfo['id'],
			empty( $nsInfo['canonical'] ) ? '' : $nsInfo['canonical'],
			$nsInfo['*'],
			$nsInfo['case'],
			empty( $nsInfo['defaultcontentmodel'] ) ? null : $nsInfo['defaultcontentmodel'],
			$this->getAliases( $nsInfo['id'], $namespaceAliases )
		);
	}

	/**
	 * @param int $id
	 * @param array $namespaceAliases Alias list, as returned by the API
	 * @return string[]
	 */
	private function getAliases( $id, $namespaceAliases ) {
		$aliases = [];
		foreach ( $namespaceAliases as $alias ) {
			if ( $alias['id'] === $id ) {
				$aliases[] = $alias['*'];
			}
		}
		return $aliases;
	}

	/**
	 * @return array
	 */
	private function getNamespaceResult() {
		return $this->api->getRequest( new SimpleRequest(
			'query', [
				'meta' => 'siteinfo',
				'siprop' => 'namespaces|namespacealiases'
			]
		) );
	}

}