#!/usr/bin/perl use strict; use Getopt::Long; use LWP::Simple; use Image::WorldMap; use XML::Simple; $| = 1; my $opt_huge; my $opt_help; if (not GetOptions("huge!" => \$opt_huge, "help" => \$opt_help) or $opt_help) { exec "perldoc $0"; } my ($filein, $fileout, $label); if ($opt_huge) { $filein = '../earth-huge.ppm'; $fileout = 'mongers.png'; $label = "maian/6"; } else { $filein = '../earth-small.png'; $fileout = 'mongers-small.png'; } mirror("http://www.pm.org/groups/perl_mongers.xml", "perl_mongers.xml") unless -f "perl_mongers.xml"; my $map = Image::WorldMap->new($filein, $label); my $xml = XMLin('./perl_mongers.xml', cache => 'storable'); $xml = $xml->{group}; # Array of the group names for which we don't know the location my @missing; # Array containing all the group names my @groups; foreach my $name (keys %$xml) { my $group = $xml->{$name}; my $status = $group->{status} || 'not-specified-in-xml-file'; next unless $status eq 'active' || $status eq 'sleeping'; # next unless $group->{location}->{continent} eq 'Europe'; # SKIP my $longitude = $group->{location}->{longitude}; my $latitude = $group->{location}->{latitude}; push @groups, $name; if (ref($longitude) =~ /HASH/) { push @missing, $name; next; } # $name =~ s|&|&|g; # $name =~ s|&(.)acute;|$1|g; $name =~ s|&(.).+?;|$1|g; # Get rid of HTML accents $map->add($longitude, $latitude, $name); } $map->draw($fileout); print "Missing location information for " . scalar(@missing) . " of " . scalar(@groups) . " groups:\n"; print join ', ', sort @missing; print ".\n"; __END__ =head1 NAME draw.pl - draw the master copies of the Perl Monger World Maps =head1 SYNOPSIS draw.pl [-huge] =head1 DESCRIPTION This uses the two large earth.png, earth-small.png, and the Perl Monger Group XML file, perl_mongers.xml. It takes the longitude and latitude location information contained in the XML file and produces one of two image files: mongers.png and mongers-small.png. It also outputs a list of all the groups which do not current have location information. =head1 AUTHOR Leon Brocard, leon@astray.com =cut __END__ Example data structure for a group: $VAR1 = { 'location' => { 'state' => {}, 'country' => 'Ireland', 'latitude' => '52.664', 'region' => {}, 'city' => 'Limerick', 'longitude' => '-8.623', 'continent' => 'Europe' }, 'web' => {}, 'tsar' => { 'email' => { 'content' => 'foranp@tinet.ie', 'type' => 'personal' }, 'name' => 'Paul Foran' }, 'date' => { 'content' => '19990214', 'type' => 'inception' }, 'id' => '134', 'mailing-list' => { 'subscribe' => 'subscribe limerick-pm-list email_address', 'unsubscribe' => 'unsubscribe limerick-pm-list email_address', 'email' => [ { 'content' => 'limerick-pm-list@pm.org', 'type' => 'list' }, { 'content' => 'majordomo@pm.org', 'type' => 'list_admin' } ], 'name' => 'General Limerick.pm discussion' }, 'email' => { 'type' => 'group' } };