Completed
Push — master ( 7687c8...af4f20 )
by adam
06:10
created

PageListGetter::getRandom()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 6
Bugs 1 Features 1
Metric Value
c 6
b 1
f 1
dl 0
loc 23
ccs 0
cts 19
cp 0
rs 9.0856
cc 2
eloc 14
nc 2
nop 1
crap 6
1
<?php
2
3
namespace Mediawiki\Api\Service;
4
5
use Mediawiki\Api\MediawikiApi;
6
use Mediawiki\Api\SimpleRequest;
7
use Mediawiki\DataModel\Page;
8
use Mediawiki\DataModel\PageIdentifier;
9
use Mediawiki\DataModel\Pages;
10
use Mediawiki\DataModel\Revisions;
11
use Mediawiki\DataModel\Title;
12
13
/**
14
 * @access private
15
 *
16
 * @author Addshore
17
 */
18
class PageListGetter {
19
20
	/**
21
	 * @var MediawikiApi
22
	 */
23
	private $api;
24
25
	/**
26
	 * @param MediawikiApi $api
27
	 */
28
	public function __construct( MediawikiApi $api ) {
29
		$this->api = $api;
30
	}
31
32
	/**
33
	 * @since 0.3
34
	 *
35
	 * @todo deal with continuing somehow?
36
	 *
37
	 * @param string $name
38
	 * @param array $extraParams
39
	 *
40
	 * @returns Pages
41
	 */
42
	public function getPageListFromCategoryName( $name, array $extraParams = array() ) {
43
		//TODO implement recursive behaviour
44
45
		$pages = new Pages();
46
47
		$params = array(
48
			'list' => 'categorymembers',
49
			'cmtitle' => $name,
50
		);
51
52
		$result =
53
			$this->api->getRequest(
54
				new SimpleRequest( 'query', array_merge( $extraParams, $params ) )
55
			);
56
		if ( !array_key_exists( 'query', $result ) ) {
57
			return $pages;
58
		}
59
60
		foreach ( $result['query']['categorymembers'] as $member ) {
61
			$pages->addPage(
62
				new Page(
63
					new PageIdentifier(
64
						new Title( $member['title'], $member['ns'] ),
65
						$member['pageid']
66
					),
67
					new Revisions()
68
				)
69
			);
70
		}
71
72
		return $pages;
73
	}
74
75
	/**
76
	 * @todo deal with continuing somehow?
77
	 *
78
	 * @param string $pageName
79
	 * @param array $extraParams
80
	 *
81
	 * @return Pages
82
	 */
83
	public function getPageListFromPageTransclusions( $pageName, array $extraParams = array() ) {
84
		$params = array(
85
			'list' => 'embeddedin',
86
			'eititle' => $pageName,
87
		);
88
89
		$result =
90
			$this->api->getRequest(
91
				new SimpleRequest( 'query', array_merge( $extraParams, $params ) )
92
			);
93
94
		$pages = new Pages();
95
96
		if ( !array_key_exists( 'query', $result ) ) {
97
			return $pages;
98
		}
99
100
		foreach ( $result['query']['embeddedin'] as $member ) {
101
			$pages->addPage(
102
				new Page(
103
					new PageIdentifier(
104
						new Title( $member['title'], $member['ns'] ),
105
						$member['pageid']
106
					),
107
					new Revisions()
108
				)
109
			);
110
		}
111
112
		return $pages;
113
	}
114
115
	/**
116
	 * @since 0.5
117
	 *
118
	 * @param string $pageName
119
	 *
120
	 * @returns Pages
121
	 */
122
	public function getFromWhatLinksHere( $pageName ) {
123
		$continue = array();
124
		$limit = 500;
125
		$pages = new Pages();
126
127
		while ( true ) {
128
			$params = array(
129
				'prop' => 'info',
130
				'generator' => 'linkshere',
131
				'titles' => $pageName,
132
			);
133
			if ( !empty( $continue ) ) {
134
				$params = array_merge( $params, $continue );
135
			}
136
			$params['glhlimit'] = $limit;
137
			$result = $this->api->getRequest( new SimpleRequest( 'query', $params ) );
138
			if ( !array_key_exists( 'query', $result ) ) {
139
				return $pages;
140
			}
141
142
			foreach ( $result['query']['pages'] as $member ) {
143
				$pages->addPage(
144
					new Page(
145
						new PageIdentifier(
146
							new Title( $member['title'], $member['ns'] ),
147
							$member['pageid']
148
						),
149
						new Revisions()
150
					)
151
				);
152
			}
153
154
			if ( empty( $result['continue'] ) ) {
155
				return $pages;
156
			} else {
157
				$continue = $result['continue'];
158
			}
159
		}
160
	}
161
162
	/**
163
	 * @param array $extraParams
164
	 *
165
	 * @todo deal with continuing
166
	 *
167
	 * @return Pages
168
	 */
169
	public function getRandom( array $extraParams = array() ) {
170
		$params = array(
171
			'list' => 'random',
172
		);
173
		$result =
174
			$this->api->getRequest(
175
				new SimpleRequest( 'query', array_merge( $extraParams, $params ) )
176
			);
177
178
		$pages = new Pages();
179
180
		foreach ( $result['query']['random'] as $member ) {
181
			$pages->addPage(
182
				new Page(
183
					new PageIdentifier(
184
						new Title( $member['title'], $member['ns'] ),
185
						$member['pageid']
186
					),
187
					new Revisions()
188
				)
189
			);
190
		}
191
	}
192
193
}
194