Completed
Push — master ( b300ed...d6d747 )
by Jeroen De
03:47
created

LeafletService   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 181
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 94.37%

Importance

Changes 0
Metric Value
wmc 18
lcom 1
cbo 1
dl 0
loc 181
ccs 67
cts 71
cp 0.9437
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A getName() 0 3 1
A getAliases() 0 3 1
A hasAlias() 0 3 1
B getParameterInfo() 0 98 1
A getDefaultZoom() 0 3 1
A newMapId() 0 7 1
A getResourceModules() 0 3 1
A getDependencyHtml() 0 14 4
A getDependencies() 0 11 1
A getLayerDependencies() 0 18 6
1
<?php
2
3
namespace Maps;
4
5
use Html;
6
use ParamProcessor\ParameterTypes;
7
8
/**
9
 * @licence GNU GPL v2+
10
 */
11
class LeafletService implements MappingService {
12
13
	private $addedDependencies = [];
14
15 22
	public function getName(): string {
16 22
		return 'leaflet';
17
	}
18
19 21
	public function getAliases(): array {
20 21
		return [ 'leafletmaps', 'leaflet' ]; // TODO: main name should not be in here?
21
	}
22
23
	public function hasAlias( string $alias ): bool {
24
		return in_array( $alias, [ 'leafletmaps', 'leaflet' ] );
25
	}
26
27 15
	public function getParameterInfo(): array {
28 15
		$params = MapsFunctions::getCommonParameters();
29
30 15
		$params['zoom'] = [
31
			'type' => ParameterTypes::INTEGER,
32
			'range' => [ 0, 20 ],
33
			'default' => false,
34
			'message' => 'maps-par-zoom'
35
		];
36
37 15
		$params['defzoom'] = [
38 15
			'type' => ParameterTypes::INTEGER,
39
			'range' => [ 0, 20 ],
40 15
			'default' => self::getDefaultZoom(),
41 15
			'message' => 'maps-leaflet-par-defzoom'
42
		];
43
44 15
		$params['layers'] = [
45 15
			'aliases' => 'layer',
46 15
			'type' => 'string',
47 15
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableLayers'], true, true ),
48 15
			'default' => $GLOBALS['egMapsLeafletLayers'],
49 15
			'message' => 'maps-leaflet-par-layers',
50
			'islist' => true,
51
		];
52
53 15
		$params['overlaylayers'] = [
54 15
			'type' => ParameterTypes::STRING,
55 15
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableOverlayLayers'], true, true ),
56 15
			'default' => $GLOBALS['egMapsLeafletOverlayLayers'],
57 15
			'message' => 'maps-leaflet-par-overlaylayers',
58
			'islist' => true,
59
		];
60
61 15
		$params['resizable'] = [
62 15
			'type' => ParameterTypes::BOOLEAN,
63 15
			'default' => $GLOBALS['egMapsResizableByDefault'],
64 15
			'message' => 'maps-par-resizable'
65
		];
66
67 15
		$params['enablefullscreen'] = [
68
			'aliases' => [ 'fullscreen' ],
69
			'type' => ParameterTypes::BOOLEAN,
70
			'default' => false,
71
			'message' => 'maps-par-enable-fullscreen',
72
		];
73
74 15
		$params['scrollwheelzoom'] = [
75
			'aliases' => [ 'scrollzoom' ],
76
			'type' => ParameterTypes::BOOLEAN,
77
			'default' => true,
78
			'message' => 'maps-par-scrollwheelzoom',
79
		];
80
81 15
		$params['markercluster'] = [
82
			'type' => ParameterTypes::BOOLEAN,
83
			'default' => false,
84
			'message' => 'maps-par-markercluster',
85
		];
86
87 15
		$params['clustermaxzoom'] = [
88
			'type' => ParameterTypes::INTEGER,
89
			'default' => 20,
90
			'message' => 'maps-par-clustermaxzoom',
91
		];
92
93 15
		$params['clusterzoomonclick'] = [
94
			'type' => ParameterTypes::BOOLEAN,
95
			'default' => true,
96
			'message' => 'maps-par-clusterzoomonclick',
97
		];
98
99 15
		$params['clustermaxradius'] = [
100
			'type' => ParameterTypes::INTEGER,
101
			'default' => 80,
102
			'message' => 'maps-par-maxclusterradius',
103
		];
104
105 15
		$params['clusterspiderfy'] = [
106
			'type' => ParameterTypes::BOOLEAN,
107
			'default' => true,
108
			'message' => 'maps-leaflet-par-clusterspiderfy',
109
		];
110
111 15
		$params['geojson'] = [
112
			'type' => 'jsonfile',
113
			'default' => '',
114
			'message' => 'maps-displaymap-par-geojson',
115
		];
116
117 15
		$params['clicktarget'] = [
118
			'type' => ParameterTypes::STRING,
119
			'default' => '',
120
			'message' => 'maps-leaflet-par-clicktarget',
121
		];
122
123 15
		return $params;
124
	}
125
126
	/**
127
	 * @since 3.0
128
	 */
129 15
	public function getDefaultZoom() {
130 15
		return $GLOBALS['egMapsLeafletZoom'];
131
	}
132
133 15
	public function newMapId(): string {
134 15
		static $mapsOnThisPage = 0;
135
136 15
		$mapsOnThisPage++;
137
138 15
		return 'map_leaflet_' . $mapsOnThisPage;
139
	}
140
141 15
	public function getResourceModules(): array {
142 15
		return [ 'ext.maps.leaflet.loader', 'ext.sm.leafletajax' ];
143
	}
144
145 15
	public function getDependencyHtml( array $params ): string {
146 15
		$dependencies = [];
147
148
		// Only add dependencies that have not yet been added.
149 15
		foreach ( $this->getDependencies( $params ) as $dependency ) {
150 15
			if ( !in_array( $dependency, $this->addedDependencies ) ) {
151 15
				$dependencies[] = $dependency;
152 15
				$this->addedDependencies[] = $dependency;
153
			}
154
		}
155
156
		// If there are dependencies, put them all together in a string, otherwise return false.
157 15
		return $dependencies !== [] ? implode( '', $dependencies ) : false;
158
	}
159
160 15
	private function getDependencies( array $params ): array {
161 15
		$leafletPath = $GLOBALS['wgScriptPath'] . '/extensions/Maps/resources/leaflet/leaflet';
162
163 15
		return array_merge(
164
			[
165 15
				Html::linkedStyle( "$leafletPath/leaflet.css" ),
166 15
				Html::linkedScript( "$leafletPath/leaflet.js" ),
167
			],
168 15
			$this->getLayerDependencies( $params )
169
		);
170
	}
171
172 15
	private function getLayerDependencies( array $params ) {
173 15
		global $egMapsLeafletLayerDependencies, $egMapsLeafletAvailableLayers,
174 15
			   $egMapsLeafletLayersApiKeys;
175
176 15
		$layerDependencies = [];
177
178 15
		foreach ( $params['layers'] as $layerName ) {
179 15
			if ( array_key_exists( $layerName, $egMapsLeafletAvailableLayers )
180 15
				&& $egMapsLeafletAvailableLayers[$layerName]
181 15
				&& array_key_exists( $layerName, $egMapsLeafletLayersApiKeys )
182 15
				&& array_key_exists( $layerName, $egMapsLeafletLayerDependencies ) ) {
183
				$layerDependencies[] = '<script src="' . $egMapsLeafletLayerDependencies[$layerName] .
184
					$egMapsLeafletLayersApiKeys[$layerName] . '"></script>';
185
			}
186
		}
187
188 15
		return array_unique( $layerDependencies );
189
	}
190
191
}
192