chiark
/
gitweb
/
~yarrgweb
/
ypp-sc-tools.db-live.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Some TODO list items now done
[ypp-sc-tools.db-live.git]
/
yarrg
/
yppedia-chart-parser
diff --git
a/yarrg/yppedia-chart-parser
b/yarrg/yppedia-chart-parser
index 228d1e2c4fae0f47cd058df5f1cbad73d5378a8c..41ef985e6b590801041dfbdcc2635f6d8d15e631 100755
(executable)
--- a/
yarrg/yppedia-chart-parser
+++ b/
yarrg/yppedia-chart-parser
@@
-55,7
+55,11
@@
my @msgkinds= qw(change warning error);
my %msgs;
my %msgprinted;
my %msgkindprinted;
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]); }
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"; }
}
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==1 or die;
-$ARGV[0] =~ m/^\-/ and die;
my $ocean= shift @ARGV;
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/\<--.*--\>//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);
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+)\| .*
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 ];
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) {
} 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;
#
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
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);
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 ($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".
printf DEBUG "%2d,%-2d arch-island-search %5s d2=%4d cc%-2d".
- " #cc=%2d c
cmulti=%d c
mp=%2d %s\n",
- $ax,$ay, $vertex, $d2, $ccix, scalar(@cc), $c
cmulti, $c
mp,
+ " #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;
$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);
}
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);
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};
}
my $dbarch= $dbisland2arch{$island};
@@
-399,10
+416,12
@@
sub compare_island_lists () {
change("island new in $wiarch: $island");
}
}
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");
+ }
}
}
}
}
@@
-423,7
+442,8
@@
sub shortest_path_reduction ($$) {
1. F is an undirected weighted graph with positive edge weights.
1. F is an undirected weighted graph with positive edge weights.
- 2. All graphs we will consider have the same vertices as F.
+ 2. All graphs we will consider have the same vertices as F
+ and none have self-edges.
3. G = Closure(F) is the graph of cliques whose edge weights
are the shortest paths in F, one clique for each connected
3. G = Closure(F) is the graph of cliques whose edge weights
are the shortest paths in F, one clique for each connected
@@
-480,6
+500,8
@@
END
my $result= Graph::Undirected->new();
foreach my $edge_ac ($g->edges()) {
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;
my $w_ac= $g->get_edge_weight(@$edge_ac);
my $edgename_ac= join ' .. ', @$edge_ac;
printf DEBUG "spr %s edge %s\n", $what, $edgename_ac;
my $w_ac= $g->get_edge_weight(@$edge_ac);
@@
-544,9
+566,14
@@
sub yppedia_ocean_fetch_done () {
}
sub yppedia_ocean_fetch_chart () {
}
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 () {
}
sub yppedia_ocean_fetch_text () {
@@
-708,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("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();
db_setocean($ocean);
db_connect();
@@
-738,15
+768,24
@@
for (;;) {
if (!%msgkindprinted) {
progress("updating database"); database_do_updates();
progress("updating _ocean-*.txt"); localtopo_rewrite();
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();
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)';
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;
$!=0; my $result= <STDIN>; defined $result or die $!;
$result =~ s/\s//g;
$result= $default?'y':'n' if !length $result;