Moved wrgeo extension to its own trunk folder.
[philipp/winterrodeln/mediawiki_extensions/wrgeo.git] / wrgeo.body.php
1 <?php
2
3 function wrGeoParserFirstCallInit() {
4         global $wgParser;
5         $wgParser->setHook('geo', 'geoParserHook');
6         return true;
7 }
8
9
10 /// \brief This function converts a string like "47.236189 N 11.301471 E" to geographical coordinates in degrees.
11 ///
12 /// Usage:
13 /// try {list($latitude, $longitude) = wrGeoStringToGeo("47.236189 N 11.301471 E");}
14 /// catch (Exception $e) {return $e->getMessage();}
15 ///
16 /// \throw exception if input is not formatted correctly with german UTF-8 error message. Don't forget to catch it!
17 /// \param UTF-8 encoded input string.
18 /// \return array($latitude, $longitude)
19 function wrGeoStringToGeo($input) {
20         if (!$input) throw new Exception(utf8_encode('Keine Koordinaten angegeben.'));
21         $parsed = sscanf($input, '%f %s %f %s');
22         if (count($parsed) != 4) throw new Exception(utf8_encode('Die Koordinaten sind falsch formatiert.'));
23         if ($parsed[1] != 'N') throw new Exception(utf8_encode('2. Parameter der Koordinaten muss N sein.'));
24         if ($parsed[3] != 'E') throw new Exception(utf8_encode('4. Parameter der Koordinaten muss E sein.'));
25         return array($parsed[0], $parsed[2]);
26 }
27
28
29 function wrGeoGeoToString($latitude, $longitude) {
30         return sprintf('%.6F N %.6F E', $latitude, $longitude);
31 }
32
33
34 /// Format inside <geo>...</geo> has to be like this: <geo>47.236189 N 11.301471 E</geo>
35 function geoParserHook($input, $args, $parser) {
36         try {list($latitude, $longitude) = wrGeoStringToGeo($input);}
37         catch (Exception $e) {return '<em>' . htmlspecialchars($input) . '</em> <small>(' . htmlspecialchars($e->getMessage()) . ')</small>';}
38         return '<a href="http://maps.google.at/maps?q=' . sprintf('%F,%F', $latitude, $longitude) . '">' . wrGeoGeoToString($latitude, $longitude) . '</a>';
39 }
40
41
42 ?>