chiark / gitweb /
WIP chart parser
[ypp-sc-tools.web-live.git] / yarrg / yppedia-chart-parser
1 #!/usr/bin/perl
2
3 use strict (qw(vars));
4 use warnings;
5
6 use Graph::Undirected;
7
8 my $dists= Graph::Undirected->new();
9 my $archs= Graph::Undirected->new();
10 my @arch_labels;
11 my %islandname;
12
13 open PO, ">/dev/null" or die $!;
14
15 sub nn_xy ($$) { return "n$_[0]x$_[1]"; }
16
17 sub parse_yppedia_map () {
18     # We don't even bother with tag soup; instead we do line-oriented parsing.
19
20     while (<>) {
21         s/\<--.*--\>//g;
22         s/^\s*//; chomp; s/\s+$//; s/\s+/ /g;
23         s/\<\/?(?:b|em)\>//g;
24         s/\{\{Chart\ style\|[^{}]*\}\}//g;
25         next unless m/\{\{/; # only interested in chart template stuff
26
27         my ($x,$y, $arch,$island,$solid,$dirn);
28         my $nn= sub { return nn_xy($x,$y) };
29     
30         if (($x,$y,$arch) =
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) {
45             next if $dirn eq 'o';
46
47             my ($bx,$by) = ($x,$y);
48             if ($dirn eq '-') { $bx+=2; }
49             elsif ($dirn eq '\\') { $bx++; $by++; }
50             elsif ($dirn eq '/') { $bx--; $by++; }
51             else { die; }
52
53             $dists->add_edge($nn->(), nn_xy($bx,$by));
54             $archs->add_edge($nn->(), nn_xy($bx,$by)) if $solid;
55
56             printf PO "%d,%d league %s %s \n", $x,$y,
57                 $solid?'solid':'dotted', $dirn;
58         } elsif (
59             m/^\{\{ chart\ head \}\}$/xi
60                  ) {
61             next;
62         } else {
63             warn "line $.: ignoring incomprehensible: $_\n";
64         }
65     }
66 }
67
68 parse_yppedia_map();