chiark / gitweb /
Break parse_master out into Commods.pm
[ypp-sc-tools.web-live.git] / pctb / Commods.pm
diff --git a/pctb/Commods.pm b/pctb/Commods.pm
new file mode 100644 (file)
index 0000000..dee9fbe
--- /dev/null
@@ -0,0 +1,81 @@
+
+package Commods;
+
+use strict;
+use warnings;
+
+BEGIN {
+    use Exporter ();
+    our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+    $VERSION     = 1.00;
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(%oceans %commods &parse_masters);
+    %EXPORT_TAGS = ( );
+
+    @EXPORT_OK   = qw();
+}
+
+our %oceans; # eg $oceans{'Midnight'}{'Ruby'}{'Eta Island'}= $sources
+our %commods; # eg $commods{'Fine black cloth'}= $sources;
+# $sources = 's[l]b';
+#       's' = Special Circumstances; 'l' = local ; B = with Bleach
+
+my %colours; # eg $colours{'c'}{'black'}= $sources
+my @rawcm; # eg $rawcm[0]='fine rum'; $rawcm[1]='fine %c cloth'
+
+sub parse_master_master1 ($$) {
+    my ($mmfn,$src)= @_;
+    my $mm= new IO::File $mmfn, 'r' or die "$mmfn $!";
+    my @ctx= ();
+    while (<$mm>) {
+       next if m/^\s*\#/;
+       next unless m/\S/;
+       s/\s+$//;
+       if (m/^\%(\w+)$/) {
+           my $colourkind= $1;
+           @ctx= (sub { $colours{$colourkind}{lc $_} .= $src; });
+       } elsif (m/^commods$/) {
+           @ctx= (sub { push @rawcm, lc $_; });
+       } elsif (m/^ocean (\w+)$/) {
+           my $ocean= $1;
+           @ctx= (sub {
+               $ocean or die; # ref to $ocean needed to work
+                              # around a perl bug
+               my $arch= $_;
+               $ctx[1]= sub {
+                   $oceans{$ocean}{$arch}{$_} .= $src;
+               };
+           });
+       } elsif (s/^ +//) {
+           my $indent= length $&;
+           die "wrong indent $indent" unless defined $ctx[$indent-1];
+           &{ $ctx[$indent-1] }();
+       } else {
+           die "bad syntax";
+       }
+    }
+    $mm->error and die $!;
+    close $mm or die $!;
+
+#print Dumper(\%oceans);
+#print Dumper(\@rawcm);
+       
+    %commods= ();
+    my $ca;
+    $ca= sub {
+       my ($s,$ss) = @_;
+#print "ca($s)\n";
+       if ($s !~ m/\%(\w+)/) { $commods{ucfirst $s} .= $ss; return; }
+       die "unknown $&" unless defined $colours{$1};
+       foreach my $c (keys %{ $colours{$1} }) {
+           &$ca($`.$c.$', $ss .'%'. $colours{$1}{$c});
+       }
+    };
+    foreach (@rawcm) { &$ca($_,$src); }
+}
+
+sub parse_masters () {
+    parse_master_master1('master-master.txt','s');
+}
+
+1;