Im Folgenden findet sich der Quelltext von poi2gpx.php
vom Nutzer Mey2008 in der Fassung vom 09. August 2017.
<?php /* multipoi2gpx - Version 2015-05-13 Author: https://de.wikivoyage.org/wiki/User:Mey2008 License: Affero GPL v3 or later http://www.gnu.org/licenses/agpl-3.0.html Recent changes: 2015-11-10: fixed path for translate 2015-05-13: character & masked as & - application/gpx+xml ToDo: -- */ //PHP error reporting *** TEST *** error_reporting (E_ALL | E_STRICT); ini_set ('display_errors' , 1); header( 'content-type: text/html; charset=utf-8' ); // 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; } // reading URL parameters $lang = $_GET["lang"]; $file = $_GET["name"]; $places = unserialize($file); $file_out = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> '; $file_out .= '<gpx version="1.1" creator="Wikivoyage" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> '; $fc = 0; foreach($places as $file) { $fc++; $file = str_replace(array("\'", " "), array("'", "_"), $file); // reading article data $content = file_get_contents("https://" . $lang . ".wikivoyage.org/w/index.php?title=" . $file . "&action=raw"); // strip comments and nowiki $content = preg_replace('/<!--(.|\s)*?-->/', '', $content); $content = preg_replace('/<nowiki(.|\s)*?nowiki>/', '', $content); // replace special strings $content = str_ireplace(array('[*', ']]', '| ', ' |', '= ', ' =', '=====', '===', '&', '{{Marker', '{{Listing', '{{vCard', '?lang=', '@', '{{Poi', '=listing' ), array('', '', '|', '|', '=', '=', 'XXXXX', 'XXX', '%26', '{{listing', '{{listing', '{{listing', 'XxxxxX', 'X', '{{poi', '=' ), $content); // poi to listing $content = preg_replace(array('/{{poi\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)[\||}](.*?)}}/i', '/{{poi\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)[\||}]/i'), array("{{listing|map=$1|type=$2|lat=$3|long=$4|name=$5|image=$6}}", "{{listing|map=$1|type=$2|lat=$3|long=$4|name=$5}}"), $content); // replace section 2 headers $content = preg_replace('/==.*==/', '{{listing|type=**h2**|name=**SECTION**}}', $content); // translate to english include 'trans/trans-' . $lang . '.php'; $content = str_ireplace(array_keys($trans), $trans, $content); // convert to {{listing| $content = preg_replace("/{{(go|see|do|buy|eat|drink|sleep|fun|vicinity|health|around|city|diplo)/", "{{listing|type=$1", $content); // strip unwanted templates $content = preg_replace("/{{(?!poi|listing|mapframe|mapmask|geo|photolist)(.|\s)*?}}/im", "", $content); // echo $content; // *** TEST *** // mapmask preg_match('/{{MapMask\|(.*?)}}/i', $content, $matches); if (isset($matches[1])) { $mask = '[[' . str_replace('|', '],[', $matches[1]) . ']]'; } else { $mask = '[[]]'; } // read parameters {{listing| $apart = explode('{{listing', $content); $nr = $nother = 0; // $groups, $grpmax only for de $groups = array('error', '**h2**', 'blue', 'buy', 'do', 'drink', 'eat', 'fun', 'go', 'gold', 'health', 'lime', 'listing', 'maroon', 'mediumaquamarine', 'other', 'red', 'see', 'silver', 'sleep', 'view', 'vicinity', 'health', 'around', 'city', 'diplo'); $grpmax = array_fill(0, 29, 0); $nr_pois = 0; for($i=1; $i < count($apart); $i++){ $text = explode('}}', $apart[$i]); $part = str_replace('|','&', $text[0]); $name = $map = $type = $group = $lat = $long = $image = ''; parse_str(str_replace('+', '%2B', $part)); // convert DMS to DEC if (strpos($lat, "°")) { $lat = DMStoDEC($lat); $long = DMStoDEC($long); } $n[$i] = (trim($name) ?: "NoName"); $p[$i] = (trim($map) ?: 0); $c[$i] = (trim($type) ?: "other"); $x[$i] = (trim($lat) + 0 ?: "0"); if ($x[$i] != 0) { $nr_pois++; } $y[$i] = (trim($long) + 0 ?: "0"); $f[$i] = (str_replace(" ","_",trim($image)) ?: "0/01/no"); if (substr($f[$i],1,1) != "/") { $md5 = md5($f[$i]); $f[$i] = substr($md5,0,1) . "/" . substr($md5,0,2) . "/" . $f[$i]; } // automatic numbering if ($lang == "de" ) { if ($x[$i] + 0 != 0 && $p[$i] == 0) { if ($group != '') { $c[$i] = trim($group); } $key = array_search($c[$i], $groups); $grpmax[$key]++; $p[$i] = $grpmax[$key]; } } else { if ($x[$i] + 0 != 0) { if ($c[$i] == "other") { $nother++; $p[$i] = $nother; } else { $nr++; $p[$i] = $nr; } } if ($c[$i] == "**h2**") { $nr = 0; } } } $max = $i - 1; // read nn-articles.js $geo = file('./data/' . $lang . '-articles.js'); $suchfile = str_replace(array("_", "(", ")", "/"), array(" ", "\(", "\)", "\/"), $file); $desti = preg_grep('/"' . $suchfile . '"/', $geo); $desti = array_values($desti); $desti_parts = explode(",",$desti[0]); $lat = substr($desti_parts[0],1); $lon = $desti_parts[1]; $line = ' <wpt lat="' . $lat . '" lon="' . $lon . '"> <name>' . str_replace("_", " ",$file) . ' (' . $nr_pois . ' POIs)</name> <type>01</type> <extensions> <color>#FF00FF</color> </extensions> </wpt> '; $file_out = $file_out . $line; for($i=1; $i <= $max; $i++) { if ($p[$i] != 0) { $lat = number_format($x[$i], 4); $lon = number_format($y[$i], 4); $number = str_pad($p[$i], 2 ,'0', STR_PAD_LEFT); $name = str_replace(array('"', "'", "<", ">", "&", "[["), array(""", "'", "<", ">", "&", ""), $n[$i]); $cat = $c[$i]; $color = str_ireplace(array('see', 'do', 'buy', 'eat', 'drink', 'sleep', 'other', 'city', 'go', 'view', 'vicinity', 'gold', 'lime', 'red', 'silver'), array('#4682b4', '#808080', '#008080', '#d2691e', '#810061', '#000080', '#228b22', '#0000ff', '#a52a2a', '#416941', '#800000', '#ffd700', '#00ff00', '#ff0000', '#c0c0c0'), $cat); if ($color == $cat) { // destination $color = "ffd700"; $line = ' <wpt lat="' . $lat . '" lon="' . $lon . '"> <name>' . $name . '</name> <type>' . str_pad($fc, 2, 0, STR_PAD_LEFT) . '-' . ucfirst($cat) . '</type> <extensions> <color>' . $color . '</color> </extensions> </wpt> '; } else { // POI $line = ' <wpt lat="' . $lat . '" lon="' . $lon . '"> <name>[' . ucfirst($cat) . ' ' . $number . '] ' . $name . '</name> <type>' . str_pad($fc, 2, 0, STR_PAD_LEFT) . '-' . ucfirst($cat) . '</type> <extensions> <color>' . $color . '</color> </extensions> </wpt> '; } $file_out = $file_out . $line; } } // read gpx $gpxcontent = ""; if ($lang == 'el' || $lang == 'en' || $lang == 'fr' || $lang == 'it' || $lang == 'nl' || $lang == 'ru') { // Gpx data --> Template:GPX/Articlename $gpxcontent = @file_get_contents("https://" . $lang . ".wikivoyage.org/w/index.php?title=Template:GPX/" . $file . "&action=raw"); } else { // Gpx data --> Articlename/Gpx $gpxcontent = @file_get_contents("https://" . $lang . ".wikivoyage.org/w/index.php?title=" . $file . "/Gpx&action=raw"); } if (!$gpxcontent) { $gpxcontent = ""; } $gpxcontent = str_replace("\n", "\r\n", $gpxcontent); $gpxcontent = preg_replace("/(.*)?<trk>/s", " <trk>", $gpxcontent); $gpxcontent = str_replace("</gpx>", "", $gpxcontent); $file_out = $file_out . $gpxcontent; } // end foreach $file_out = $file_out . "</gpx> "; $out = strlen($file_out); $filename = str_replace(array(":", "/", " "), "_", $places[0]) . "_etc_". $lang . ".gpx"; if (isset($file_out)) { header("Content-Length: $out"); header("Content-Type: application/gpx+xml"); header("Content-Disposition: attachment; filename=$filename"); header("Content-Transfer-Encoding: binary"); echo $file_out; } ?>