Im Folgenden findet sich der Quelltext von geodata.php
vom Nutzer Mey2008 in der Fassung vom 3. Oktober 2017.
<!DOCTYPE html> <head> <title>Wikivoyage - Geodata</title> <meta charset="utf-8"> </head> <body> <?php /* Geodata - version 2017-10-03 Author: https://de.wikivoyage.org/wiki/User:Mey2008 Contributors: https://it.wikivoyage.org/wiki/Utente:Andyrom75 License: Affero GPL v3 or later http://www.gnu.org/licenses/agpl-3.0.html Recent changes: 2017-10-03: set_time_limit(480) 2017-08-01: other geteilt in other1 un other2 2016-12-03: + fi 2016-08-21: spezial script f0r zh 2016-04-18: copy data files first (ssl error) 2015-07-26: preg_match bug -> page[0] error 2015-04-28: he: תמונה = 2015-04-19: sv now lat/long from quickbar 2015-03-22: lat + long test zero or > 90 / 180 2015-03-17: all data in nn.articles.js 2015-03-16: article.js + photo ToDo: -- */ // PHP error reporting error_reporting (E_ALL | E_STRICT); ini_set ('display_errors' , 1); // DMS to DEC (DIR must be N, E, S or, W) function DMStoDEC($dms) { $part = preg_split("/[^\d\w\.]+/",$dms); $pnr = count($part); if ($pnr == 3) { $part[3] = $part[2]; $part[2] = 0; } elseif ($pnr == 2) { $part[3] = $part[1]; $part[1] = 0; $part[2] = 0; } $dec = $part[0] + ((($part[1]*60) + ($part[2]))/3600); if ($part[3] == "S" || $part[3] == "W") { $dec = $dec * -1; } return $dec; } $group = $_GET["group"]; if ($group == "de") { $lang = array("de"); } elseif ($group == "en") { $lang = array("en"); } elseif ($group == "other1") { $lang = array("el","es","fa","fi","fr","he"); } elseif ($group == "other2") { $lang = array("it","nl","pl","pt","ro","ru","sv","uk","vi","zh"); } else { $lang = array($group); // single language } // clear geodata.log all 2 hours if (time() - filemtime("geodata.log") > 7200) { $handle = fopen("geodata.log", "w"); fclose($handle); } for($i = 0; $i < count($lang); $i++) { error_log("\n" . $lang[$i] . " - " . date("Y-m-d - H:i:s") . " ----\n", 3, "geodata.log"); set_time_limit(480); $content = ""; $file = "http://dumps.wikimedia.org/" . $lang[$i] . "wikivoyage/latest/" . $lang[$i] . "wikivoyage-latest-pages-articles.xml.bz2"; copy ($file, "articles.bz2"); $file = "articles.bz2"; $bz = bzopen($file, "r") or die("$file could not be opened for reading"); // specific script "fr" & "it" & "sv"(no geo template) if($lang[$i] == "fr" || $lang[$i] == "it" || $lang[$i] == "sv") { while (!feof($bz)) { $content .= bzread($bz, 4096); } } else { while (!feof($bz)) { $line = fgets($bz); if (stripos($line,"{geo") !== false) { $line = str_ireplace(" ","",$line); $content = $content . $line; } elseif (stripos($line, ".jpg") !== false || stripos($line,"<title>") !== false || stripos($line,"<ns>") !== false || stripos($line, "</page>") !== false){ $content = $content . $line; } } } bzclose($bz); // specific script de if($lang[$i] == "de") { $content = str_ireplace(array('Geo|Breite', 'geodata', 'lat=', 'long='), array('', 'geo', '', ''), $content); } // specific script fr if($lang[$i] == "fr") { $content = preg_replace('/latitude\s*?=\s*?([.,\-,0-9]+)\s*?\|\s*?longitude\s*=\s*?([.,\-,0-9]+)/i', "{{Geo|$1|$2}}\n", $content); } // specific script it if($lang[$i] == "it") { $content = str_ireplace(array('"', '<!--Latitudine-->', '<!--Longitudine-->', "′", '″'), array('"', '', '', "'", '"'), $content); $content = preg_replace('/Lat(?: *)=(?: *)(.*)\n\|(?: *)Long(?: *)=(?: *)(.*)\n/i', '{{Geo|$1|$2}}', $content); } // specific script sv if($lang[$i] == "sv") { $content = str_ireplace(array('"', '<!--Latitud-->', '<!--Longitud-->', "′", '″'), array('"', '', '', "'", '"'), $content); $content = preg_replace('/Lat(?: *)=(?: *)(.*)\n\|(?: *)Long(?: *)=(?: *)(.*)\n/i', '{{Geo|$1|$2}}', $content); } // specific script zh if($lang[$i] == "zh") { $content = str_ireplace(array('北纬', '东经' ), array('', ''), $content); } // change special strings (workaround) $content = str_ireplace(array("}}}}", "after.jpg"), array("}}", "after.xxx"), $content); // strip spaces, comments and nowiki $content = preg_replace(array('@\s*?=\s*@', '@\s*?:\s*@', '/(?:<!--(?:.|\s)*?-->)/', '/(?:<nowiki(?:.|\s)*?nowiki>)/' ), array('=', ':', 'C', 'N'), $content); // translate image tags $content = str_ireplace(array('Tiedosto:', 'Plik:', 'grafika=', 'imagem:', 'Ficheiro:', 'Изображение:', 'Afbeelding:', 'Fichier:', 'Bestand:', 'Fișier:', 'Fil:', 'Immagine=', 'Image:', 'קובץ:', 'תמונה=', 'imagen=', 'Tập tin:', 'Файл:', 'Bild:', 'widok=', 'File:', 'Datei:'), 'Image=', $content); // echo "<xmp>" . $content . "</xmp>"; // *** TEST *** preg_match_all("/(<title>(.*)<\/title>|<ns>(.*)<\/ns>|{{geo\s*?\|(.*)}}|{{geodata\s*?\|(.*)}})/i", $content, $matches); // print_r($matches); // *** TEST *** $rows = (count($matches,1) / count($matches,0)) - 1; $fp = fopen("./data/" . $lang[$i] . "-articles.js","wb+"); fwrite($fp, "var addressPoints = [\n"); for($m = 1; $m <= $rows - 1; $m++) { if ($matches[3][$m-1] == "0" && strpos($matches[4][$m],"|") != 0) { $teile = explode("|", $matches[4][$m]); if (strpos($teile[0], "°")) { $teile[0] = DMStoDEC($teile[0]); } if (strpos($teile[1], "°")) { $teile[1] = DMStoDEC($teile[1]); } $teile[0] = trim($teile[0]); $teile[1] = trim($teile[1]); if(!is_numeric($teile[0]) or !is_numeric($teile[1]) or abs($teile[0]) > 90 or abs($teile[1]) > 180) { error_log($lang[$i] . " - " . $matches[2][$m-2] . " = " . $teile[0] . " | " . $teile[1] . "\n", 3, "geodata.log"); } else { fwrite($fp, '[' . number_format($teile[0],3) . ',' . number_format($teile[1],3) . ',"' . $matches[2][$m-2] . '",'); // search for image $test = '<title>' . addcslashes($matches[2][$m-2], '()/') . '<.*?</page>'; $pages = preg_match("@$test@is", $content, $page); if (!isset($page[0])) { $page[0] = substr($content, strpos($content, '<title>' . $matches[2][$m-2]), 1000); } $pics = preg_match('/Image=([^"\[{\|]*?.jpg)/i', $page[0], $pic); if (isset($pic[0])) { $image = substr($pic[0],6); // md5 hash of image name $image = str_replace(' ', '_', trim($image)); $md5 = md5($image); $md5path = substr($md5,0,1) . '/' . substr($md5,0,2) . '/'; $image= $md5path . $image; } else { $image = '7/7e/WV-logo-artmap.jpg'; // default } fwrite($fp, '"' . $image . '"' . "],\n"); } } } fwrite($fp, "];\n"); fclose($fp); copy("./data/" . $lang[$i] . "-articles.js","../w/data/" . $lang[$i] . "-articles.js"); } error_log("\n==== " . date("Y-m-d - H:i:s") . " ====\n", 3, "geodata.log"); copy("geodata.log","../w/geodata.log"); echo '<span style="font-family:Courier New"</span>'; echo "<h2>GEODATA.LOG</h2>"; $errorfile = fopen("geodata.log","r"); while(!feof($errorfile)) { $line = fgets($errorfile); echo $line . "<br>"; } fclose($errorfile); $delfile= fopen("articles.bz2", "w+"); fclose($delfile); // echo '<pre>'; print_r($GLOBALS); echo '</pre>'; // *** TEST *** ?> </body> </html>