chiark / gitweb /
Minor html style changes
[ypp-sc-tools.db-test.git] / yarrg / yppedia-chart-parser
index 54a0e4577604592c6e365a1de0be7159c8446e08..41ef985e6b590801041dfbdcc2635f6d8d15e631 100755 (executable)
@@ -55,7 +55,11 @@ my @msgkinds= qw(change warning error);
 my %msgs;
 my %msgprinted;
 my %msgkindprinted;
-sub pmsg ($$) { push @{ $msgs{$_[0]} }, "$_[0]: $_[1]\n"; }
+sub pmsg ($$) {
+    my $m= "$_[0]: $_[1]\n";
+    print DEBUG "D $m";
+    push @{ $msgs{$_[0]} }, $m;
+}
 sub warning ($) { pmsg("warning",$_[0]); }
 sub error   ($) { pmsg("error",  $_[0]); }
 sub change  ($) { pmsg("change", $_[0]); }
@@ -73,17 +77,26 @@ sub print_messages () {
 }
 sub progress ($) { print "($_[0])\n"; }
 
-if (@ARGV && $ARGV[0] eq '--debug') {
-    shift @ARGV;
-    open DEBUG, ">&STDOUT" or die $!;
-    select(DEBUG); $|=1;
-} else {
-    open DEBUG, ">/dev/null" or die $!;
+my $stdin_chart=0;
+
+open DEBUG, ">/dev/null" or die $!;
+
+while (@ARGV) {
+    last unless $ARGV[0] =~ m/^-/;
+    $_= shift @ARGV;
+    last if m/^--$/;
+    if ($_ eq '--debug') {
+       open DEBUG, ">&STDOUT" or die $!;
+       select(DEBUG); $|=1; select(STDOUT);
+    } elsif ($_ eq '--stdin-chart') {
+       $stdin_chart=1;
+    } else {
+       die;
+    }
 }
-select(STDOUT); $|=1;
+$|=1;
 
 @ARGV==1 or die;
-$ARGV[0] =~ m/^\-/ and die;
 my $ocean= shift @ARGV;
 
 
@@ -105,7 +118,7 @@ sub yppedia_chart_parse () {
        s/\<--.*--\>//g;
        s/^\s*//; chomp; s/\s+$//; s/\s+/ /g;
        s/\<\/?(?:b|em)\>//g;
-       s/\{\{Chart\ style\|[^{}]*\}\}//g;
+       s/\{\{chart\ style\|[^{}]*\}\}//gi;
        next unless m/\{\{/; # only interested in chart template stuff
 
        my ($x,$y, $arch,$island,$solid,$dirn);
@@ -113,9 +126,15 @@ sub yppedia_chart_parse () {
     
        if (($x,$y,$arch) =
            m/^\{\{ chart\ label \|(\d+)\|(\d+)\| .*
-                   \'\[\[ [^][\']* \| (\S+)\ archipelago \]\]\'*\}\}$/xi) {
+                   (?: \<(?: big|center )\>)* \'+
+                   (?: \[\[ | \{\{ )
+                   [^][\']* \| ([^][\'|]+)\ archipelago
+                   (?: \]\] | \}\} )
+                   \'+ (?: \<\/(?: big|center )\>)* \}\}$/xi) {
            printf DEBUG "%2d,%-2d arch %s\n", $x,$y,$arch;
            push @wiarchlabels, [ $x,$y,$arch ];
+       } elsif (m/^\{\{ chart\ label \|\d+\|\d+\|
+                \<big\> \'+ \[\[ .* \b ocean \]\]/xi) {
        } elsif (($x,$y,$island) =
            m/^\{\{ chart\ island\ icon \|(\d+)\|(\d+)\|
                    ([^| ][^|]*[^| ]) \| .*\}\}$/xi) {
@@ -225,8 +244,7 @@ sub yppedia_archs_chart_labels () {
     #
     foreach my $label (@wiarchlabels) {
        my ($ax,$ay,$arch) = @$label;
-       my $best_ccmulti= -1;
-       my $best_d2= 0;
+       my $best_d2= 9999999;
        my $best_n;
 #      print DEBUG "$ax,$ay arch-island-search $arch\n";
        $ay += 1;  $ax += 2;  # coords are rather to the top left of label
@@ -234,19 +252,16 @@ sub yppedia_archs_chart_labels () {
            next unless exists $winode2island{$vertex};
            my $ccix= $wiarchs->connected_component_by_vertex($vertex);
            my @cc= $wiarchs->connected_component_by_index($ccix);
-           my $ccmulti= @cc > 1;
            my ($vx,$vy) = split /,/, $vertex;
            my $d2= ($vx-$ax)*($vx-$ax) + ($vy-$ay)*($vy-$ay);
-           my $cmp= $ccmulti <=> $best_ccmulti
-               ||   $best_d2 <=> $d2;
+           my $cmp= $best_d2 <=> $d2;
            printf DEBUG "%2d,%-2d arch-island-search %5s d2=%4d cc%-2d".
-                        " #cc=%2d ccmulti=%d cmp=%2d %s\n",
-               $ax,$ay, $vertex, $d2, $ccix, scalar(@cc), $ccmulti, $cmp,
+                        " #cc=%2d cmp=%2d %s\n",
+               $ax,$ay, $vertex, $d2, $ccix, scalar(@cc), $cmp,
                $winode2island{$vertex};
            next unless $cmp > 0;
            $best_n=       $vertex;
            $best_d2=      $d2;
-           $best_ccmulti= $ccmulti;
        }
        die 'no island vertices?!' unless defined $best_n;
        my $ccix= $wiarchs->connected_component_by_vertex($best_n);
@@ -381,11 +396,13 @@ sub compare_island_lists () {
     foreach my $island (sort keys %wiisland2node) {
        my $wtarch= $wtisland2arch{$island};
        my $wiarch= wiisland2arch($island);
-       if (!defined $wtarch) {
-           error("island from chart not found on ocean page: $island");
-       } elsif (defined $wiarch and $wtarch ne $wiarch) {
-           error("island in $wtarch on ocean page but".
-                 " concluded $wiarch from chart: $island");
+       if (!$stdin_chart) {
+           if (!defined $wtarch) {
+               error("island from chart not found on ocean page: $island");
+           } elsif (defined $wiarch and $wtarch ne $wiarch) {
+               error("island in $wtarch on ocean page but".
+                     " concluded $wiarch from chart: $island");
+           }
        }
 
        my $dbarch= $dbisland2arch{$island};
@@ -399,10 +416,12 @@ sub compare_island_lists () {
            change("island new in $wiarch: $island");
        }
     }
-    foreach my $island (sort keys %wtisland2arch) {
-       my $node= $wiisland2node{$island};
-       next if defined $node;
-       error("island on ocean page but not in chart: $island");
+    if (!$stdin_chart) {
+       foreach my $island (sort keys %wtisland2arch) {
+           my $node= $wiisland2node{$island};
+           next if defined $node;
+           error("island on ocean page but not in chart: $island");
+       }
     }
 }
 
@@ -481,6 +500,7 @@ END
 
     my $result= Graph::Undirected->new();
     foreach my $edge_ac ($g->edges()) {
+        $result->add_vertex($edge_ac->[0]); # just in case
         next if $edge_ac->[0] eq $edge_ac->[1];
        my $edgename_ac= join ' .. ', @$edge_ac;
        printf DEBUG "spr %s edge %s\n", $what, $edgename_ac;
@@ -546,9 +566,14 @@ sub yppedia_ocean_fetch_done () {
 }
 
 sub yppedia_ocean_fetch_chart () {
-    yppedia_ocean_fetch_start(1);
-    yppedia_chart_parse();
-    yppedia_ocean_fetch_done();
+    if ($stdin_chart) {
+       open OCEAN, "<& STDIN" or die $!;
+       yppedia_chart_parse();
+    } else {
+       yppedia_ocean_fetch_start(1);
+       yppedia_chart_parse();
+       yppedia_ocean_fetch_done();
+    }
 }
 
 sub yppedia_ocean_fetch_text () {
@@ -710,7 +735,10 @@ progress("computing shortest paths");       yppedia_graph_shortest_paths();
 progress("setting archs from labels");      yppedia_archs_chart_labels();
 progress("setting archs from nearby");      yppedia_archs_fillbynearest();
 progress("computing yppedia spr");          yppedia_graph_spr();
-progress("fetching yppedia ocean text");    yppedia_ocean_fetch_text();
+
+if (!$stdin_chart) {
+    progress("fetching yppedia ocean text");    yppedia_ocean_fetch_text();
+}
 
 db_setocean($ocean);
 db_connect();
@@ -740,15 +768,24 @@ for (;;) {
     if (!%msgkindprinted) {
        progress("updating database");         database_do_updates();
        progress("updating _ocean-*.txt");     localtopo_rewrite();
+       if ($stdin_chart) {
+           print STDERR "*** --stdin-chart, aborting!\n";
+           exit 1;
+       }
        progress("committing database");       $dbh->commit();
        progress("committing _ocean-*.txt");   localtopo_commit();
        exit 0;
     }
     $dbh->rollback();
-    
+
     my $default= !$msgkindprinted{'warning'};
     printf STDERR "*** confirm update %s ? ", $default?'(y/n)':'(n/y)';
 
+    if ($stdin_chart) {
+       printf STDERR "[--stdin-chart]\n";
+       exit 1;
+    }
+
     $!=0; my $result= <STDIN>;  defined $result or die $!;
     $result =~ s/\s//g;
     $result= $default?'y':'n' if !length $result;