Completed
Push — mv ( 2424da...13ee4c )
by Jeroen De
06:33 queued 01:32
created

DisplayMapFunction   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 169
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 10

Test Coverage

Coverage 97.53%

Importance

Changes 0
Metric Value
wmc 19
lcom 1
cbo 10
dl 0
loc 169
ccs 79
cts 81
cp 0.9753
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getMapHtmlForKeyValueStrings() 0 22 1
A getMapHtmlForParameterList() 0 17 1
A getMapHtmlFromProcessor() 0 12 1
A extractServiceName() 0 19 3
A serviceIsInvalid() 0 3 1
A processedParametersToKeyValueArray() 0 9 2
A getHookDefinition() 0 7 1
A getParameterDefinitions() 0 14 1
A defaultMapZoom() 0 7 4
A getParameterWithValue() 0 9 1
A trackMap() 0 5 2
1
<?php
2
3
namespace Maps\MediaWiki\ParserHooks;
4
5
use Maps;
6
use Maps\ParameterExtractor;
7
use MapsDisplayMapRenderer;
8
use MapsMapper;
9
use MapsMappingServices;
10
use MWException;
11
use ParamProcessor;
12
use ParamProcessor\ProcessedParam;
13
use Parser;
14
15
/**
16
 * Class for the 'display_map' parser hooks.
17
 *
18
 * @licence GNU GPL v2+
19
 * @author Jeroen De Dauw < [email protected] >
20
 */
21
class DisplayMapFunction {
22
23
	private $renderer;
24
	private $defaultService;
25
	private $availableServices;
26
27 19
	public function __construct() {
28 19
		$this->renderer = new MapsDisplayMapRenderer();
29
30
		// TODO: inject
31 19
		$this->defaultService = $GLOBALS['egMapsDefaultService'];
32 19
		$this->availableServices = $GLOBALS['egMapsAvailableServices'];
33 19
	}
34
35
	/**
36
	 * @param Parser $parser
37
	 * @param string[] $parameters Values of the array can be named parameters ("key=value") or unnamed.
38
	 * They are not normalized, so can be "key =  value "
39
	 *
40
	 * @return string
41
	 * @throws MWException
42
	 */
43 17
	public function getMapHtmlForKeyValueStrings( Parser $parser, array $parameters ): string {
44 17
		$processor = new \ParamProcessor\Processor( new \ParamProcessor\Options() );
45
46
		// TODO: do not use global access
47 17
		$service = MapsMappingServices::getServiceInstance(
48 17
			$this->extractServiceName(
49 17
				Maps\ParameterExtractor::extractFromKeyValueStrings( $parameters )
50
			)
51
		);
52
53 17
		$parameterDefinitions = self::getHookDefinition( ';' )->getParameters();
54 17
		$service->addParameterInfo( $parameterDefinitions );
55 17
		$this->renderer->service = $service;
56
57 17
		$processor->setFunctionParams(
58 17
			$parameters,
59 17
			$parameterDefinitions,
60 17
			self::getHookDefinition( ';' )->getDefaultParameters()
61
		);
62
63 17
		return $this->getMapHtmlFromProcessor( $parser, $processor );
64
	}
65
66
	/**
67
	 * @param Parser $parser
68
	 * @param string[] $parameters Key value list of parameters. Unnamed parameters have numeric keys.
69
	 * Both keys and values have not been normalized.
70
	 *
71
	 * @return string
72
	 * @throws MWException
73
	 */
74 2
	public function getMapHtmlForParameterList( Parser $parser, array $parameters ) {
75 2
		$processor = new \ParamProcessor\Processor( new \ParamProcessor\Options() );
76
77
		// TODO: do not use global access
78 2
		$service = MapsMappingServices::getServiceInstance( $this->extractServiceName( $parameters ) );
79
80 2
		$parameterDefinitions = self::getHookDefinition( "\n" )->getParameters();
81 2
		$service->addParameterInfo( $parameterDefinitions );
82 2
		$this->renderer->service = $service;
83
84 2
		$processor->setParameters(
85 2
			$parameters,
86 2
			$parameterDefinitions
87
		);
88
89 2
		return $this->getMapHtmlFromProcessor( $parser, $processor );
90
	}
91
92 19
	private function getMapHtmlFromProcessor( Parser $parser, ParamProcessor\Processor $processor ) {
93 19
		$params = $processor->processParameters()->getParameters();
94
95 19
		$this->defaultMapZoom( $params );
96
97 19
		$this->trackMap( $parser );
98
99 19
		return $this->renderer->renderMap(
100 19
			$this->processedParametersToKeyValueArray( $params ),
101 19
			$parser
102
		);
103
	}
104
105 19
	private function extractServiceName( array $parameters ): string {
106 19
		$service = ( new ParameterExtractor() )->extract(
107 19
			[ 'mappingservice', 'service' ],
108 19
			$parameters
109
		);
110
111 19
		if ( $service === null ) {
112 11
			return $this->defaultService;
113
		}
114
115
		// TODO: do not use global access
116 8
		$service = MapsMappingServices::getMainServiceName( $service );
117
118 8
		if ( $this->serviceIsInvalid( $service ) ) {
119
			return $this->defaultService;
120
		}
121
122 8
		return $service;
123
	}
124
125 8
	private function serviceIsInvalid( string $service ) {
126 8
		return !in_array( $service, $this->availableServices );
127
	}
128
129 19
	private function processedParametersToKeyValueArray( array $params ): array {
130 19
		$parameters = [];
131
132 19
		foreach ( $params as $parameter ) {
133 19
			$parameters[$parameter->getName()] = $parameter->getValue();
134
		}
135
136 19
		return $parameters;
137
	}
138
139 19
	public static function getHookDefinition( string $locationDelimiter ): \ParserHooks\HookDefinition {
140 19
		return new \ParserHooks\HookDefinition(
141 19
			[ 'display_map', 'display_point', 'display_points', 'display_line' ],
142 19
			self::getParameterDefinitions( $locationDelimiter ),
143 19
			[ 'coordinates' ]
144
		);
145
	}
146
147 19
	private static function getParameterDefinitions( $locationDelimiter ): array {
148 19
		$params = MapsMapper::getCommonParameters();
149
150 19
		$params['coordinates'] = [
151 19
			'type' => 'string',
152
			'aliases' => [ 'coords', 'location', 'address', 'addresses', 'locations', 'points' ],
153
			'default' => [],
154
			'islist' => true,
155 19
			'delimiter' => $locationDelimiter,
156 19
			'message' => 'maps-displaymap-par-coordinates',
157
		];
158
159 19
		return $params;
160
	}
161
162
	/**
163
	 * @param ProcessedParam[] $parameters
164
	 */
165 19
	private function defaultMapZoom( array &$parameters ) {
166 19
		if ( array_key_exists( 'zoom', $parameters ) && $parameters['zoom']->wasSetToDefault() && count(
167 18
				$parameters['coordinates']->getValue()
168 19
			) > 1 ) {
169 2
			$parameters['zoom'] = $this->getParameterWithValue( $parameters['zoom'], false );
170
		}
171 19
	}
172
173 2
	private function getParameterWithValue( ProcessedParam $param, $value ) {
174 2
		return new ProcessedParam(
175 2
			$param->getName(),
176 2
			$value,
177 2
			$param->wasSetToDefault(),
178 2
			$param->getOriginalName(),
179 2
			$param->getOriginalValue()
180
		);
181
	}
182
183 19
	private function trackMap( Parser $parser ) {
184 19
		if ( $GLOBALS['egMapsEnableCategory'] ) {
185
			$parser->addTrackingCategory( 'maps-tracking-category' );
186
		}
187 19
	}
188
189
}
190