Completed
Push — master ( 46bd0e...bc5de7 )
by Jeroen De
01:27
created

LeafletService   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 175
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 94.29%

Importance

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