Improved parsing. Now extra text at the end of coordintes is treated as error.
authorphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Mon, 30 Sep 2013 20:35:04 +0000 (20:35 +0000)
committerphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Mon, 30 Sep 2013 20:35:04 +0000 (20:35 +0000)
git-svn-id: http://www.winterrodeln.org/svn/servermediawiki/mediawiki_extensions/wrgeo/trunk@1639 7aebc617-e5e2-0310-91dc-80fb5f6d2477

wrgeo.body.php

index d93dce8eadc1e6da47d8ded6cb4e242765dc0416..9e264b473659beb00f1eb216870f8f668ed613fa 100644 (file)
@@ -8,14 +8,20 @@ class WrGeo {
        ///
        /// \throw exception if input is not formatted correctly with german UTF-8 error message. Don't forget to catch it!
        /// \param UTF-8 encoded input string.
-       /// \return array($latitude, $longitude)
+       /// \return array($longitude, $latitude)
        static function stringToGeo($input) {
-               if (!$input) throw new Exception(utf8_encode('Keine Koordinaten angegeben.'));
-               $parsed = sscanf($input, '%f %s %f %s');
-               if (count($parsed) != 4) throw new Exception(utf8_encode('Die Koordinaten sind falsch formatiert.'));
-               if ($parsed[1] != 'N') throw new Exception(utf8_encode('2. Parameter der Koordinaten muss N sein.'));
-               if ($parsed[3] != 'E') throw new Exception(utf8_encode('4. Parameter der Koordinaten muss E sein.'));
-               return array($parsed[0], $parsed[2]);
+               $matches = array();
+               $result = preg_match('/\s*(\d+\.?\d*)\s*N?\s+(\d+\.?\d*)\s*E?\s*$/', $input, $matches);
+               assert($result !== FALSE); // FALSE would mean syntax error
+
+               // found
+               if ($result === 1) {
+                       return array(floatval($matches[2]), floatval($matches[1]));
+               }
+
+               // not found
+               if (strlen($input) == 0) throw new Exception('Keine Koordinaten angegeben.');
+               throw new Exception('Das Koordinatenformat "' . $input . '" ist ungültig. Gültig wäre z.B. "47.236189 N 11.301471 E".');
        }
 
 
@@ -26,8 +32,8 @@ class WrGeo {
 
        /// Format inside <geo>...</geo> has to be like this: <geo>47.236189 N 11.301471 E</geo>
        public static function render($content, $args, $parser, $frame) {
-               try {list($latitude, $longitude) = WrGeo::stringToGeo($content);}
-               catch (Exception $e) {return '<span class="error">' . htmlspecialchars($content) . ' <small>(' . htmlspecialchars($e->getMessage()) . ')</small></span>';}
+               try {list($longitude, $latitude) = WrGeo::stringToGeo($content);}
+               catch (Exception $e) {return '<span class="error">' . htmlspecialchars($e->getMessage()) . '</span>';}
                return '<a href="http://maps.google.at/maps?q=' . sprintf('%F,%F', $latitude, $longitude) . '">' . WrGeo::geoToString($latitude, $longitude) . '</a>';
        }
 }