Benutzer:Count Ypsilon/Skript:maplist.pl
Skript zur Erzeugung einer einfachen, semikolon-separierten Liste aller Felder.
Spalte 1=Gebietsname (leer, falls es sich um ein nicht begehbares Grenzfeld handelt) Spalten 2/3=x und y Spalte 4=NPC-Name (Feld ist mehrfach in Liste, wenn mehrere NPCs, und einfach mit "none" in Spalte 4, wenn kein NPC) Spalte 5=URL des Kartenfeld-Bildes
Achtung - Grenzfelder zwischen zwei Gebieten können mehrfach in der Liste auftauchen, einmal mit gesetzten Gebietsnamen beim Gebiet, zu dem sie gehören, und vorher/nachher noch einmal mit leeren Gebietsnamen im Kontext des Gebiets, bei dem sie als Grenzfeld gelistet sind.
Achtung - Quelltext unten enthält ein paar "nowiki"-Tags; auf der Ansichtsseite ist es korrekt, aber wenn man aus der Bearbeiten-Seite kopiert, muss man die entfernen.
#!/usr/bin/perl use strict; use LWP::UserAgent; use URI::Escape; use HTTP::Request; my $ua = LWP::UserAgent->new(); my $host = "http://www.fwwiki.de"; my $url = $host . "/index.php/Kategorie:Karten"; while($url ne "") { #print "GET $url\n"; my $request = HTTP::Request->new("GET", $url); my $response = $ua->simple_request($request); my $c = $response->content(); $url = ""; while($c =~ /<a([^>]*)>([^<]*)<\/a>/gm) { my ($anchor, $text) = ($1, $2); my $href; $href = $1 if ($anchor =~ /href\s*=\s*"([^"]*)"/); $href =~ s/&/&/g; my $title; $title = $1 if ($anchor =~ /title\s*=\s*"([^"]*)"/); $url = $host.$href if ($text =~ /n.*chste \d+/); fetchMap($1, $host.$href) if ($text =~ /Karte:\s*(.*)/); } } sub fetchMap { my ($text, $href) = @_; my $request = HTTP::Request->new("GET", $href."?action=edit"); my $response = $ua->simple_request($request); my $c = $response->content(); my @lines = split(/\n/, $c); my $firstx; my $curx; my $cury; my $opened; my $firstline = 1; foreach my $line(@lines) { next unless ($line =~ /\{\{Karte\/([^|{}\/]+)(\/([^|{}]+))?(\|([^{}]*))?\}\}(\{\{.*\}\})?/); my ($vorlage, $sub, $argl, $more) = ($1, $3, $5, $6); my @args = split(/\|/, $argl); if (!$opened) { $opened = 1 if ($vorlage eq "Beginn"); next; } if ($vorlage eq "Ende") { last; } elsif ($vorlage eq "NeueZeile") { $firstline = 0; $curx = $firstx; } elsif ($vorlage eq "Koord") { if (($firstline) && (!defined($firstx))) { $firstx = $args[0]; } else { $cury = $args[0]; } } elsif ($vorlage =~ /^Feld\d*$/) { my $img = shift(@args); push(@args, "none") if (scalar(@args) == 0); foreach my $npc(@args) { print "$text;$curx;$cury;$npc;$img\n" unless ($npc =~ /^Alt=/); } $curx++; } else { print STDERR "unbekannt: $vorlage in '$text'\n" unless ($vorlage =~ /^(Berg|Leer|Grenzfeld)$/); if ($vorlage eq "Berg") { my $img = "http://85.10.193.197/freewar/images/map/std.jpg"; print ";$curx;$cury;;$img\n" } elsif($vorlage eq "Grenzfeld") { my $img = shift(@args); print ";$curx;$cury;;$img\n" } $curx++; } } }