X-Git-Url: https://git.toastfreeware.priv.at/philipp/winterrodeln/mediawiki_extensions/wrmap.git/blobdiff_plain/733deada552afdd3cf266c4c6a8c5ebd58ebdef8..b5cadae61249b1b09a304d748f94c1e28c79ada9:/wrmap.body.php diff --git a/wrmap.body.php b/wrmap.body.php index 7188e4b..7b1f33c 100644 --- a/wrmap.body.php +++ b/wrmap.body.php @@ -3,20 +3,169 @@ require_once dirname(__FILE__) . '/../wrgeo/wrgeo.body.php'; # for the function function wrMapParserFirstCallInit() { global $wgParser; + // global $wrGoogleMaps; // is this necessary? + global $wgGoogleMapsKey; + $wrGoogleMaps = new WrGoogleMaps($wgGoogleMapsKey); $wgParser->setHook('wrmap', 'wrmapParserHook'); + $wgParser->setHook('wrgmap', array($wrGoogleMaps, 'render')); return true; } +// Tool functions +// -------------- + +/// List of markers - used by the functions wrMapReplaceByMarker and wrMapAfterTidy +$wrMapMarkerList = array(); + + +/// Returns a marker for a text and back-replaces the text in wrReportAfterTidy +function wrMapReplaceByMarker($text, $marker = 'wrMapMarker') { + $marker = $marker . mt_rand(1e5, 1e7); + global $wrMapMarkerList; + $wrMapMarkerList[$marker] = $text; + return $marker; +} + + +/// Replaces the markers by its contents +function wrMapParserAfterTidy(&$parser, &$text) { + // find markers in $text + // replace markers with actual output + global $wrMapMarkerList; + foreach ($wrMapMarkerList as $marker => $html) $text = str_replace($marker, $html, $text); + return true; +} + + + +// Java script +// ----------- + +// Global JavaScript functions +define(WRGMAPJSFUNCTIONS, << +//" + name + "");}); + return marker; +} +//]]> + +JAVASCRIPT +); + + +/** This class was inpired by the GoogleMaps class of the GoogleMaps extension. */ +class WrGoogleMaps { + /// the Google API key (obtained from + /// http://www.google.com/apis/maps/signup.html) + private $apiKey = null; + + /// How many tags are on the current page? + private $mapsCount = 0; + + /// Constructor + function WrGoogleMaps($apiKey) { + $this->apiKey = $apiKey; + } + + /// Renders the tag + /// @param $content string - the content of the tag + /// @param $args array - the array of attribute name/value pairs for the tag + /// @param $parser Parser - the MW Parser object for the current page + /// @param $localParser Parser - the parser for parsing local content + /// + /// @return string - the html for rendering the map + function render($content, $args, &$parser) { + ++$this->mapsCount; + + // Query database + $dbr = wfGetDB(DB_SLAVE); + $res = $dbr->select('wrsleddingcache', array('page_title', 'position_latitude', 'position_longitude')); + $sleddingRoutes = array(); + while ($sleddingRoute = $dbr->fetchRow($res)) $sleddingRoutes[] = $sleddingRoute; + $dbr->freeResult($res); + + // Load Google Maps Script and define functions + $output = ''; + if ($this->mapsCount == 1) { + $output .= '\n"; + return wrMapReplaceByMarker($output); + } + + // returns a string that creates a map object called 'map' + private function addMap($mapName) { + return "\tmap = new GMap2(document.getElementById($mapName));\n" . + "\tmap.addControl(new GLargeMapControl());\n" . + "\tmap.addControl(new GMapTypeControl());\n" . + "\tmap.addControl(new GScaleControl());\n" . + "\tmap.setCenter(new GLatLng(47.267648, 11.404655), 10);\n" . + "\tmap.setMapType(G_SATELLITE_MAP);\n" . + "\tmap.enableScrollWheelZoom();\n"; + } + + // returns a string with a add marker javascript call + private function addJsMarker($latitude, $longitude, $pageTitle) { + return "\tmap.AddOverlay(wrCreateMarker($latitude, $longitude, \"" . htmlspecialchars(addslashes($pageTitle)) . "\", wrSleddingIcon));\n"; + } + +} + + /// Format inside ... has to be like this: /// /// -/// Rodelbahn|47.143241,11.208959|Birgitzer Alm +/// Rodelbahn|47.143241 N 11.208959 E|Birgitzer Alm /// ... /// +/// +/// The extension produces a format like this: +/// +/// 47.241731, 11.358994, Birgitzer Alm +/// Die Birgitzer Alm ist nett +/// 47.17607, 11.542763, Naviser Hütte +/// Die Naviser Hütte +/// function wrmapParserHook($input, $args, $parser) { - $output = ''; + $debug = (isset($args['debug']) && $args['debug'] != '0'); + + $output = ''; $lines = explode("\n", $input); + $latitudes = array(); + $longitudes = array(); foreach ($lines as $line) { try { $l = trim($line); @@ -24,23 +173,26 @@ function wrmapParserHook($input, $args, $parser) { $columns = explode('|', $line); if (count($columns) != 3) throw new Exception(sprintf(utf8_encode('Die Anzahl der Spalten ist nicht 3 sondern %d'), count($columns))); $columns = list($type, $geo, $name) = $columns; + if (strlen(trim($geo)) == 0) continue; list($latitude, $longitude) = wrGeoStringToGeo($geo); - $output .= sprintf("%F,%F\n", $latitude, $longitude); + $latitudes[] = $latitude; + $longitudes[] = $longitude; + $output .= sprintf("%F, %F, %s\n", $latitude, $longitude, htmlspecialchars($name)); } catch (Exception $e) { return sprintf(utf8_encode('Ungültige Zeile in der Koordinatenliste: %s. %s'), htmlspecialchars($line), htmlspecialchars($e->getMessage())); } } - $output = $output .= "\n"; - /* - global $wgTitle, $wgUser; - $parser = new Parser(); - $parserOptions = new ParserOptions(); - $parserOptions->initialiseFromUser($wgUser); - $result = $parser->parse($output, $wgTitle, $parserOptions); // TODO: Make this call less complicated - */ - $result = $parser->recursiveTagParse($output); // TODO: Maybe this is already the solution? - - return $result->getText(); + if (count($latitudes) == 0) return utf8_encode('Keine Koordinaten eingetragen'); + $minLatitude = min($latitudes); + $centerLat = $minLatitude + (max($latitudes) - $minLatitude) / 2; + $minLongitude = min($longitudes); + $centerLon = $minLongitude + (max($longitudes) - $minLongitude) / 2; + + // TODO: Varable zoom level + $output = ''. "\n" . $output . "\n"; + + if ($debug) return "
$output
\n"; + return $parser->recursiveTagParse($output); }