8 my $dists= Graph::Undirected->new();
9 my $archs= Graph::Undirected->new();
13 open PO, ">/dev/null" or die $!;
15 sub nn_xy ($$) { return "n$_[0]x$_[1]"; }
17 sub parse_yppedia_map () {
18 # We don't even bother with tag soup; instead we do line-oriented parsing.
22 s/^\s*//; chomp; s/\s+$//; s/\s+/ /g;
24 s/\{\{Chart\ style\|[^{}]*\}\}//g;
25 next unless m/\{\{/; # only interested in chart template stuff
27 my ($x,$y, $arch,$island,$solid,$dirn);
28 my $nn= sub { return nn_xy($x,$y) };
31 m/^\{\{ chart\ label \|(\d+)\|(\d+)\| .*
32 \'\[\[ [^][\']* \| (\S+)\ archipelago \]\]\'*\}\}$/xi) {
33 printf PO "%d,%d arch %s\n", $x,$y,$arch;
34 push @arch_labels, [ $x,$y,$arch ];
35 } elsif (($x,$y,$island) =
36 m/^\{\{ chart\ island\ icon \|(\d+)\|(\d+)\|
37 (\S.*\S) \| .*\}\}$/xi) {
38 $islandname{$nn->()}= $island;
39 $dists->add_vertex($nn->());
40 $archs->add_vertex($nn->());
41 printf PO "%d,%d island %s\n", $x,$y,$island;
42 } elsif (($solid,$x,$y,$dirn) =
43 m/^\{\{ chart\ league((?:\ solid)?) \|(\d+)\|(\d+)\|
44 ([-\/\\o]) \| .*\}\}$/xi) {
47 my ($bx,$by) = ($x,$y);
48 if ($dirn eq '-') { $bx+=2; }
49 elsif ($dirn eq '\\') { $bx++; $by++; }
50 elsif ($dirn eq '/') { $bx--; $by++; }
53 $dists->add_edge($nn->(), nn_xy($bx,$by));
54 $archs->add_edge($nn->(), nn_xy($bx,$by)) if $solid;
56 printf PO "%d,%d league %s %s \n", $x,$y,
57 $solid?'solid':'dotted', $dirn;
59 m/^\{\{ chart\ head \}\}$/xi
63 warn "line $.: ignoring incomprehensible: $_\n";